AI算法如何回测到最近一天?


(disc) #1

我是一个BigQuant新手,只会用策略生成器结合我的实盘交易经验选某些特征来开发开发AI策略。我发现一个问题(下图所示):如果end_date = 2017-01-01 那么回测结果只能到2016年12月22号左右,并不能回测到2017-01-01,这是什么原因呢?我如何才能回测到2017-01-01呢?谢谢!


(小Q) #2

因为AI算法是监督型算法,需要对收益率进行标注,详情可以参考:

AI量化策略,我该如何理解你?
BigQuant平台学习第二篇:如何开发AI策略(上)

因为涉及到标注,所以在数据整理的过程中,样本数据的最后日期并不是到2017-01-01,那么利用最后日期是2016年12月的预测数据进行策略回测,回测结果就自然只能到2016年12月。如果,我们想回测2016-11-10到2017-03-01,我们新建一个cell,代码如下:

# 特征抽取,回测时间段为start_date到end_date。该时间段由用户决定,
# 比如想回测2017年第一季度的数据,直接传入start_date = 2016-11-10,end_date=2017-03-01即可
m2 = M.general_feature_extractor.v5(
    instruments=conf.instruments, start_date='2016-11-10', end_date='2017-03-01',
    features=conf.features)
# 特征数据需要进行一定的处理才能纳入算法
m3 = M.transform.v2(
    data=m2.data, transforms=T.get_stock_ranker_default_transforms(),
    drop_null=True, astype='int32', except_columns=['date', 'instrument'],
    clip_lower=0, clip_upper=200000000)
# 将之前m6训练出的模型在回测时间段上进行预测,m9.predictions.read_df()即为预测结果
m9 = M.stock_ranker_predict.v2(model_id=m6.model_id, data=m3.data) 
# 然后我们基于m9.predictions.read_df()回测检验策略的盈利性
m10 = M.backtest.v5(
    instruments=m9.instruments,
    start_date=m9.start_date,
    end_date=m9.end_date,
    initialize=initialize,
    handle_data=handle_data,
    order_price_field_buy='open',       # 表示 开盘 时买入
    order_price_field_sell='close',     # 表示 收盘 前卖出
    capital_base=100000,               # 初始资金
    benchmark='000300.SHA',             # 比较基准,不影响回测结果
    # 通过 options 参数传递预测数据和参数给回测引擎
    options={'ranker_prediction': m9.predictions, 'hold_days': conf.hold_days}
)

回测结果如下:

可以看出,一旦我们模型已经训练出来了,那么想在哪段时间做回测,直接传入日期参数就可以。


(flytomato) #3

你好,那怎么用模型做预测呢?教程里面的m7.predictions.read_df().head(12)返回的只是回测第一天的结果,我的思路是需要用M.stock_ranker_predict.v2建立一个预测数据集,其中的data是不需要label的吧?只要有feature就可以吗?不知是否可行?多谢


(disc) #4

你好,用模型做预测可以参考上面我的这个例子。如你所说,在实验预测函数M.stock_ranker_predict.v2使用时,传入的data并不需要label,通过抽取的feature,并经过M.transform.v2转换处理获得data,然后将这个data传入M.stock_ranker_predict.v2即可,这样就能得到该模型在新的数据集上的预测结果,将结果传入M.backtest.v5就可以回测获得收益曲线。


(flytomato) #5

你好,我测试了一下,发现这个独立的回测和原始的那个回测的结果是不一样的,误差很大


(disc) #6

相差很大?在相同的区间上测试结果应该是一致的。你可以从原来的回测结果上看看这段时间的表现。