VeighNa量化社区
你的开源社区量化交易平台
Member
离线
13 帖子
声望: 0

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之后还有半个小时的数据。。。。大神知道这是怎么回事么?是米筐的数据问题?

description

我发现只要vt_symbols中有郑商所的合约就会有KeyError.
比如回测自带的PairTradingStrategy, 如果合约是['FG99.CZCE', 'RB99.SHFE'],会产生如下错误
试了其他几个交易所的组合没有这个问题,有没有朋友遇到同样问题?
description

青青子荆 wrote:

  1. 请问用的是哪个版本?
  2. 可以load_bars()比load_bar()少一天试试看。
  1. 是2.3.0.
  2. 应该不是load_bars()的问题:)

用Python的交易员 wrote:

dionysos wrote:

简单的双均线策略,一个用ctastrategy模板写一个用portfoliostrategy写,但回测时都只用一个合约,应该得到完全一致的结果。
但是calculate_results()回来的统计结果并不一样

多合约引擎跑出来的是这样

description

单合约是这样

description

起始时间均为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()回来的统计结果并不一样

多合约引擎跑出来的是这样

description

单合约是这样

description

起始时间均为2019-5-1 -- 2020-5-1。注意两个结果中的turnover其实是一样的,但是在日期上错位了。请问这是不是两个引擎之一的编写有bug?

青青子荆 wrote:

  1. 不是的,这个只是每五分钟推一次on_bar,不是5分钟bar。
  2. portfolio strategy模块合成N分钟K线可参考【投资组合策略7天入门】课程。
  1. 这个我知道,我的意思是如果在注释位置把合成五分钟bar写出来是不是就可以了?
    比如可不可以继续用BarGenerator来实现?
    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的策略逻辑
  1. 合成5min bar的部分相当于BarGenerator的update_bar()函数?这么理解正确么?
  2. 这样做实盘也可以么?还是在on_tick中也要做相应变动?

vn station回测app里可以直接点击下载数据。请问如果用脚本或notebook做回测该如何从rqdata下载数据?谢谢!

请问如果要合成90min bar该怎么办呢?可以用1.5 hour么?

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】