导致历史回测和实盘差异的重要原因——未来函数问题

用户头像左岸右转AA
2024-03-28 发布

相信大家看到下边这类策略的走势,一定心潮澎湃的希望拿到策略代码去实盘吧,给大家泼一盆冷水,巴老爷子的年化不过20%,难道真的存在不论市场风格如何切换,回撤不仅小,收益还如此之高的策略?

懂代码的朋友看过策略这类sharpe极高的策略,大概率会发现达成高收益很有可能是因为未来函数的问题,下边讲讲未来函数是什么,为什么在回测中能产生如此高的收益,但是实盘就不行了?

9bc3ccb45b02a4cfe92ae064260f73e9.png

未来函数:即在回测中使用了未来的数据,举个例子:

策略A:

买入策略:在开盘9:31分,买入涨幅超过3%,按照市值从小到大排列前3

卖出策略:-5%止损

筛选满足条件的股票常用两种方式:

1.问财:get_iwencai('买入涨幅超过3%,按照市值从小到大排列前3') #自然语句选出股票池 ;

2.获取行情数据自己计算:

stocklist = list(get_all_securities('stock',date = datetime.datetime.now()).index) #获取所有股票

data=get_price(stocklist,None,datetime.datetime.now(), '1d',['open','high','low','volume','turnover','close','quote_rate'], bar_count =1, is_panel=False) #按日查询行情

假设我们正在回测20240327这天的数据,按照真实情况应该是,获取到在9:31分涨幅>3%的股票,按照市值从小到大排列买入前3

但是,如果按照上述的两种方式获取行情数据,实际上拿到的是20240327的收盘数据!!!

如此一来回测就变成了提前知道今天收盘xx股票会涨3%以上,然后在9:31开盘买入,这样收益自然会很高

卖出策略同理,提前知道今天收盘之后xx股票会打到止损线-5%,提前在9:31开盘卖出,提前规避了大跌

这就是未来函数造成回测和实盘差异的问题所在,那么怎么解决这个问题使得回测和实盘保持一致呢?

解决方案:只使用策略执行时间节点之前的数据,还是上边这个例子,因为策略是9:31执行,那么获取的最新数据也是9:31的数据

获取行情的方法改为:

get_price(stock, None, get_datetime().strftime("%Y-%m-%d")+' 09:31:00', '1m', ['close'], True, None, 1, is_panel=1)

至此问题解决,如果大家有更好的解决方案欢迎交流

评论

用户头像
2024-03-29 15:12:50

这个可以设置其他时间吗,比如获取10点或者其他的价格,自己设置交易时间

评论
用户头像
2024-09-11 08:43:31

这个可以设置其他时间吗,比如获取10点或者其他的价格,自己设置交易时间

评论
用户头像
2025-02-09 11:18:20

这个可以设置其他时间吗,比如获取10点或者其他的价格,自己设置交易时间

评论
用户头像
2025-02-14 02:16:40

这个可以设置其他时间吗,比如获取10点或者其他的价格,自己设置交易时间

评论