问答交流

【代码报错】代码问题——for循环

由asdgj创建,最终由small_q 被浏览 32 用户

老师,您好。 我把代码改了下,发现新出了一个问题,for循环算出来的【jieguo】,与不用循环,直接让i,j等于一组具体的数算出来的【jieguo】不一样,比如i=120,j取91这一组,试了试只有第一组[5,60]是正常的,这是那块还有问题么?烦请老师指点

data = DataSource("bar1d_index_CN_STOCK_A").read('SW270000.HIX',start_date="2004-02-11", end_date="2023-09-14")[['date','close','volume']]
data['涨跌幅'] = data['close'].pct_change()

result = pd.DataFrame(columns=['date', 'future_return', 'win_rate'])
jieguo =  pd.DataFrame(columns=['参数','平均绝对收益', '平均胜率','信号次数','总交易天数'])
# 计算未来收益和胜率
for i in [3,5,10,20,40,60,120]:
    for j in [60,65,70,75,80,85,90,91,93,95,97,99]:
        data['{}d成交量'.format(i)] = data['volume'].rolling(i).mean()
        data['{}d_{}阈值'.format(i,j)] = data['volume'].rolling(252*5).apply(lambda x: np.percentile(x, j))
        
        data['signal_{}d_{}'.format(i, j)] = np.where(data['{}d成交量'.format(i)] > data['{}d_{}阈值'.format(i,j)], 1, 0)

        signal_dates = data[data['signal_{}d_{}'.format(i, j)] == 1]['date'].tolist()
        for m in range(len(signal_dates)):
            signal_date = signal_dates[m]
  
            signal_index= data[data['date']==signal_date].index[0] 

    #计算未来一个月的指数收益率
            future_return = (data.loc[signal_index+1:signal_index+20,'涨跌幅']+1).prod()-1  
    ##计算当月跌幅为负的天数!
            diefu_count = data.loc[signal_index+1:signal_index+20,'涨跌幅'].apply(lambda x :1 if x<0 else 0).sum() 
            win_rate = diefu_count / 20
            result = result.append({'date': signal_date, 'future_return': future_return, 'win_rate': win_rate}, ignore_index=True)

# 显示结果
##print(result)

        a1 = '%dd成交量_%d阈值'%(i,j) 
        b1 = result['future_return'].mean() 
        c1 = result['win_rate'].mean()
        d1 = len(signal_dates)
        e1 = data['date'].count()
        
        jieguo= jieguo.append({'参数':a1, '平均绝对收益':b1, '平均胜率':c1,'信号次数':d1,'总交易天数':e1},ignore_index = True)
print(result)
print(jieguo)

s

评论
  • 1、这一步要滚动5年的数据
  • dz['成交量%d分位数'%j] = dz['volume'].rolling(252*5).apply(lambda x :np.percentile(x,j))
  • 2、执行dropna后只剩5年的数据了
  • dz =dz.dropna()
  • 3、循环下次执行到第1步,所有计算结果都是空的,再dropna就没有数据了。你可以尝试把每步结果打印出来,也能发现问题的。
  • 好的,老师。谢谢,非常感谢!
  • 老师,您好。我修改了下又遇到一个问题,已编辑更新上述代码和描述,麻烦请老师看看问题出在哪里
  • 排查问题的时候,建议不要搞那么多循环,例如
  • for i in [3:
  • for j in [60]:
  • 你先一个流程走通,看有没有问题,如果没有问题,再加一个,例如 for j in [60,65],逐渐把循环加上去,这样你就好排查了
{link}