使用策略生成器模板的几个疑问

ai
策略生成器
标签: #<Tag:0x00007f61eb46b1e0> #<Tag:0x00007f61eb46b0a0>

(pigirl) #1

本人之前使用其他量化研究平台,对量化是有一定经验,最近一直在使用BigQuant开发AI策略,现有几个疑问,希望工作人员能够答复,谢谢。

  • D.instruments(start_date, end_date),获取的是指定时间段内有效的股票代码列表,是指所有上市交易的A股?是否含ST,含停牌股?这些股票如果选出来,交易时怎么处理?如(停牌,涨跌停股)

  • label_expr是内部函数,如果收益率<-20%,则评分为0,如果-20%<收益率<20%,则评分为收益率*100+20,如果收益率>20%,则评分为40,则最后的评分在0到40之间,如果想修改评分范围参数,只需修改format()中的数字即可。 问题:如果分数在40的股票有很多,怎么选取股票?同时:

上图是否为整个交易期间股票得分的分布情况, 尾部很厚,是否说明分数设置不合理?

.

  • label_expr = ['return * 100', 'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(20)]
    m1 = M.fast_auto_labeler.v5(
    instruments=conf.instruments, start_date=conf.start_date, end_date=conf.end_date,
    label_expr=conf.label_expr, hold_days=conf.hold_days,
    benchmark='000300.SHA', sell_at='open', buy_at='open')

上面函数中,label_expr中的return是股票的绝对收益还是相对基准的超额收益?如果是绝对收益,下面m1的函数中的基准指标如何用?

  • context.ranker_prediction = context.options['ranker_prediction'].read_df()是加载所有的预测值吗?格式为dateframe,是否可以提供个格式样板?dateframe的index和culomn分别是什么?结果是已经根据得分情况排序好的吗?

(小Q) #2
克隆策略

问题1

D.instruments(start_date, end_date),获取的是指定 时间段内有效的股票代码列表,是指所有上市交易的A股?是否含ST,含停牌股?这些股票如果选出来,交易时怎么处理?(如停牌,涨跌停股)

In [1]:
ins = D.instruments('2016-01-01', '2016-10-01')
print('类型:', type(ins))
print('第一个元素:', ins[0])
print('ins长度:',len(ins))
类型: <class 'list'>
第一个元素: 000001.SZA
ins长度: 2934

因此,可以看出获取指定时间段的股票代码,返回一个list,元素为该时间段内A股所有股票代码,包括ST、*ST以及停牌股,如果某只股票在该时间段先上市再退市,那么返回的list也包含该退市股票代码。

为使得回测尽可能和真实交易保持一致,需要对涨跌停和停牌进行相应的处理。

如果是停牌,那么涉及到该股票的交易(买入或卖出)是无法完成的,因此我们在回测引擎内部进行了相应的处理:如果在handle_data函数里,生成了交易订单,那么在真正成交的时候,我们会取消该订单。

如果是涨跌停,那么需要对涨跌停的状态进行判别,如果是一字涨停,那么买单是无法成交的,因此真正成交的时候我们取消该订单;如果不是一字涨停,那么我们不会取消该买单,该订单会成交。同理,对于跌停的股票,如果是一字跌停,那么卖单无法成交,真正成交的时候我们会取消该订单;如果不是一字跌停,那么我们不会取消该卖单。在成交价格上,我们无法做到完全和真实交易情况完全一致,但我们可以尽量逼近真实交易,并采取‘从紧’处理,低估我们策略回测收益,例如:如果开盘涨停,盘中打开涨停板,这种情形下回测中仍然是开盘价(涨停)成交,回测结果就会比真实结果略差,这样处理以后,我们对回测结果将更有信心。

问题2

label_expr是内部函数,如果收益率<-20%,则评分为0,如果-20%<收益率<20%,则评分为收益率*100+20,如果收益率>20%,则评分为40,则最后的评分在0到40之间,如果想修改评 分范围参数,是否只需修改format()中的数字即可? 如果分数在40的股票有很多,怎么选取股票?

是的,直接修改format()中的数值即可,数字越大,模型将学得更细,能够将不同收益率的股票的差异性尽量学出来。如果label在40的股票很多,那说明可以尝试修改format()中的数值。

尾部很厚,是否说明分数设置不合理没有绝对的答案。

这里的分数是label的分数,尾部很厚,表面训练集里面很多股票都被标注成了0分或者40分,如果特别特别厚(比如比label为0的还要厚),那说明设置不合理,其他情形下都是没有问题的。

In [ ]:
label_expr = ['return * 100', 'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(20)]
m1 = M.fast_auto_labeler.v5(
instruments=conf.instruments, start_date=conf.start_date, end_date=conf.end_date,
label_expr=conf.label_expr, hold_days=conf.hold_days,
benchmark='000300.SHA', sell_at='open', buy_at='open')

问题3

上面函数中,label_expr中的return是股票的绝对收益还是相对基准的超额收益?如果是绝对收益,下面m1的函数中的benchmark这个参数如何使用?

在上面这个例子中,return是绝对收益。‘return*100’是标注函数,目前BigQuant支持多个标注函数,如下所示。在m1中,指定的benchmark主要是便于标注函数是相对收益情形的,如果是绝对收益,那么指定的benchmark不起作用。

In [12]:
# 相对收益
label_expr = ['(return-benchmark_return) * 100', 'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(20)] 
# 绝对收益
label_expr = ['return * 100', 'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(25)] 
# 风险调整后的收益
label_expr = ['(return / volatility**0.5) * 20', 'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(20)]   

问题4

context.ranker_prediction = context.options['ranker_prediction'].read_df()是加载所有的预测值吗?格式为dateframe,是否可以提供个格式样板?dateframe的index和culomn分别是什么?结果是已经根据得分情况排序好的吗?

StockRanker机器学习训练 m6 = M.stock_ranker_train.v2(training_ds=m5_training.data, features=conf.features)

对评估集做预测 m7 = M.stock_ranker_predict.v2(model_id=m6.model_id, data=m5_evaluation.data)

通过m6,我们在训练集数据上进行训练,得到模型,模型会有特有的一个ID。然后m7,我们获得模型在评估集数据上的预测结果,预测结果为m7.predictions.read_df(),是一个dataframe,你可以通过m7.predictions.read_df().head() 来查看该dataframe的index和column。通过这个dataframe,我们可以清楚地看到模型对于股票得分的预测结果,因此我们就可以买入得分较高的股票。虽然,我们已经得到了模型预测股票的得分数据,但是我们需要通过历史回测来验证模型选择的这些股票是否具有超额收益,因此我们需要借助BigQuant的回测引擎

在回测引擎中,context是一个全局变量,在M.backtest.v5函数中我们传入了参数options={'ranker_prediction': m7.predictions, 'hold_days': conf.hold_days},因此 context.ranker_prediction = context.options['ranker_prediction'].read_df()这一句其实实质上就是context.ranker_prediction = m7.predictions.read_df(),所以,context.ranker_prediction就是模型对股票得分的预测情况,在我们回测逻辑中,买入得分靠前的股票,卖出得分靠后的股票。


(disc) #3

请问,可以将下面这幅图介绍地更详细一点嘛,有点不太明白。


(matrixreloaded) #4

就是假设一共1000天400万条股票的收益数据的数据,按照hold_day天数统计,比如某只股票a,hold_day是10天,那就是10天后比当天收益是20%,那就是20,少于-20%,或者多于20%的算作两端,不再单独计数,都算在一起。两边高一点是因为有些长尾,数据越多越接近正态分布,这个因为边上有些超过几倍的方差还有有少量残余。但是并不是说分的越细越好,如果分的太细,两边的样本数不够也学习不出来什么东西。所以这个要做实验。


(chad) #5

D.instruments(start_date, end_date)获取的是A股所有股票,因为大小盘风格经常变换,因此想问下:如何只获取某一部分股票,比如只想获取沪深300股票?谢谢!