xiaohe wrote:
因为组合策略中需要对多合约同时下单交易
所以呢?哪个成交返回就推个on_trade(trade)不完了?
没太理解文档中的解释:
“在于组合策略中需要对多合约同时下单交易,在回测时无法判断某一段K线内部每个合约委托成交的先后时间顺序,因此无法提供on_order和on_trade获取委托成交推送,而只能在每次on_bars回调时通过get_pos和get_order来进行相关的状态查询。”
为何需要判断委托成交的先后顺序??有没有大神给解释清楚一点?给个具体的例子?
青青子荆 wrote:
郑商所夜盘时间是到11点半的吧?
刚查了2019年是到11点半LOL。。。。现在不是了。谢谢打扰了哈
xiaohe wrote:
可以去打印一下self.priceticks,看下是否有这几个报错合约的记录
我不小心把这句注释掉了才有这个问题。。。if self.leg1_symbol not in bars or self.leg2_symbol not in bars: return
奇怪的是这个问题是因为玻璃在11:00pm之后还有半个小时的数据。。。。大神知道这是怎么回事么?是米筐的数据问题?
我发现只要vt_symbols中有郑商所的合约就会有KeyError.
比如回测自带的PairTradingStrategy, 如果合约是['FG99.CZCE', 'RB99.SHFE'],会产生如下错误
试了其他几个交易所的组合没有这个问题,有没有朋友遇到同样问题?
用Python的交易员 wrote:
dionysos wrote:
简单的双均线策略,一个用ctastrategy模板写一个用portfoliostrategy写,但回测时都只用一个合约,应该得到完全一致的结果。
但是calculate_results()回来的统计结果并不一样多合约引擎跑出来的是这样
单合约是这样
起始时间均为2019-5-1 -- 2020-5-1。注意两个结果中的turnover其实是一样的,但是在日期上错位了。请问这是不是两个引擎之一的编写有bug?
请在Github开个Issue吧,我们安排同事来查下
大概找到了问题所在:
多合约的run_backtesting() 里面 day_count = 0; 单合约里面day_count = 1. 比如前者该为1可解决前面提到的错位问题。
还发现了一个问题:多合约里面的total trade days会把load_bars(n)中的n天加进去。虽然收益等结果不变,但是所有用到总交易天数的指标都会有问题。
排查发现是因为多合约里面在处理前n天的时候call self.new_bars(), 里面会更新daily results. 但是单合约里面call 的是策略的on_bar()所以没有这个问题。
两个问题都修正后目前所有统计结果都一致。见 issue #2992。谢谢
简单的双均线策略,一个用ctastrategy模板写一个用portfoliostrategy写,但回测时都只用一个合约,应该得到完全一致的结果。
但是calculate_results()回来的统计结果并不一样
多合约引擎跑出来的是这样
单合约是这样
起始时间均为2019-5-1 -- 2020-5-1。注意两个结果中的turnover其实是一样的,但是在日期上错位了。请问这是不是两个引擎之一的编写有bug?
青青子荆 wrote:
- 不是的,这个只是每五分钟推一次on_bar,不是5分钟bar。
- portfolio strategy模块合成N分钟K线可参考【投资组合策略7天入门】课程。
def on_bar(bar: BarData):
pass
for symbol in symbols:
self.bgs[symbol] = BarGenerator(on_bar, 5, on_5min_bar)
然后
def on_bars(bars):
for symbol in symbols:
self.bgs[symbol].update_bar(bars[symbol])
这样做会有什么问题么?比如我要写一个基于5min bar的双合约策略。按照我对pair_trading_strategy示例的理解,要自己在on_bars()里面合成5min bar:
def on_bars(self, bars: Dict[str, BarData]):
if (leg1_bar.datetime.minute + 1) % 5:
return
#合成5min bar
#基于5min bar的策略逻辑
vn station回测app里可以直接点击下载数据。请问如果用脚本或notebook做回测该如何从rqdata下载数据?谢谢!
请问如果要合成90min bar该怎么办呢?可以用1.5 hour么?