相信大家看到下边这类策略的走势,一定心潮澎湃的希望拿到策略代码去实盘吧,给大家泼一盆冷水,巴老爷子的年化不过20%,难道真的存在不论市场风格如何切换,回撤不仅小,收益还如此之高的策略?
懂代码的朋友看过策略这类sharpe极高的策略,大概率会发现达成高收益很有可能是因为未来函数的问题,下边讲讲未来函数是什么,为什么在回测中能产生如此高的收益,但是实盘就不行了?

未来函数:即在回测中使用了未来的数据,举个例子:
策略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)
至此问题解决,如果大家有更好的解决方案欢迎交流

