复制了官方公众号rsjstrategy源码,本地回测时曲线和策略的bilistrategy完全不一样,是亏的,请问是哪里出错了吗?还是说文章图中的bilistrategy是另一套策略?
谢谢
源码为:https://mp.weixin.qq.com/s/2KF61mAJO1Ff8zS61aHlHw
xiaohe wrote:
请问你的问题是无法保存数据是吗?
可以在rqdata的query_history函数下打印一下row.name看看,你报错是说这个是个元组,正常情况下应该是timestamp
是指在rqdata的query_history函数体内加入print row.name的代码么?
请教用rqdata下载时出现问题,可以正常连接rqdata,但无法保持数据?
貌似模块里有方法出错了??求解
谢谢
日线级别的海龟策略如何实现:1前一天收盘运行你的脚本,生成下单信号; 2第二天开盘用AlgoTrading模块挂好STOP算法委托?
具体用no_ui方法实现如何实现??
THANKS
AttributeError Traceback (most recent call last)
<ipython-input-53-aff6de7ed614> in <module>
1 dfp = df1 + df2
2 dfp =dfp.dropna()
----> 3 show_portafolio(dfp)
<ipython-input-52-9b0c05b4f9b4> in show_portafolio(df)
20 def show_portafolio(df):
21 engine = BacktestingEngine()
---> 22 engine.calculate_statistics(df)
23 engine.show_chart(df)
c:\vnstudio\lib\site-packages\vnpy_ctastrategy\backtesting.py in calculate_statistics(self, df, output)
394
395 total_return = (end_balance / self.capital - 1) 100
--> 396 annual_return = total_return / total_days self.annual_days
397 daily_return = df["return"].mean() 100
398 return_std = df["return"].std() 100
AttributeError: 'BacktestingEngine' object has no attribute 'annual_days'
源码我没有改,我看源码应该是有annual_days的,不知道为啥报错??vnpy版本为最新
痛并快乐着 wrote:
先看一下原版的 on_tick 逻辑以及问题点:
def on_tick(self, tick: TickData): """ Callback of new tick data update. """ if ( self.last_tick_time and self.last_tick_time.minute != tick.datetime.minute ): bars = {} for vt_symbol, bg in self.bgs.items(): bars[vt_symbol] = bg.generate() self.on_bars(bars) bg: BarGenerator = self.bgs[tick.vt_symbol] bg.update_tick(tick) self.last_tick_time = tick.datetime
问题1:在订阅多个品种的时候,无法保证多品种的 tick 推送到 on_tick 里面的先后顺序,进而会出现 前一个 tick时间戳是第59秒, 后一个 tick时间戳变为了第0秒,然后再下一个时间戳又变为了第59秒的问题。每当tick的时间戳反复跨越第0秒时,会导致 bg.generate() 在很短的时间内,被多次被调用,每次被调用 bg.generate() 后,bg,bar 就会被清空为 None值了,进而导致第二次推到 on_bars 里面的 bars 大部分为None,因为在很短的时间内,几乎没有任何新的tick数据 调用了 bg.update_tick(tick)。
问题2:self.last_tick_time = tick.datetime, 这个写法在多合约订阅的时候,问题如上,这个写法不能保证,tick.datetime 的时间戳就一定比 self.last_tick_time 更晚。
问题3: 某些不活跃的合约,特别是期权合约,会存在一分钟之内没有新的tick过来的情况,如果直接调用 bg.generate() 的话,同样得到的Bar数据会为None
改进版的写法:
def on_tick(self, tick: TickData): """ Callback of new tick data update. """ if ( self.last_tick_time and tick.datetime > self.last_tick_time and self.last_tick_time.minute != tick.datetime.minute ): bars = {} for vt_symbol, bg in self.bgs.items(): if bg.bar is not None: bars[vt_symbol] = bg.generate() bg.last_bar = bars[vt_symbol] elif bg.last_bar is not None: bars[vt_symbol] = bg.last_bar else: bars[vt_symbol] = None self.on_bars(bars) bg: BarGenerator = self.bgs[tick.vt_symbol] bg.update_tick(tick) if self.last_tick_time is None: self.last_tick_time = tick.datetime elif self.last_tick_time and self.last_tick_time < tick.datetime: self.last_tick_time = tick.datetime
改进点1: 保证了 缓存中的 last_tick_time 时间戳,一定晚于 新来的 tick的时间戳,并且只有当 tick的时间戳 晚于 last_tick_time 时间戳时,才会合成 bars
改进点2: 每个品种的 bar里面,都缓存了 last_bar的属性,用于某些不活跃的品种 一分钟内没有新tick过来而无法合成 bars的情况。这个情况下,直接用上一个非None 的last_bar 推到 on_bars()里面改完之后,on_bars里面已经很少会出现 bar 为 None的情况了。 如果还有什么考虑不周的地方,欢迎大家来指正共同改进~~
请问您在修改完此模块后是否能正常收到bars?我也遇到相同问题
xiaohe wrote:
请问跑示例策略会出同样的错吗?如果不会,可以比较一下示例策略和自己的策略。如果会,可以提供一下示例策略的名字和你交易的品种,然后附一下完整报错截图看看
我用示例策略也出现了相似问题,我的品种是rb,i,ma,ta,m,a,IF的主力
xiaohe wrote:
你update_bar传进去的是None,请问是否修改了on_init函数或者去掉了load_bar函数?
1没修改on_init,2也没去掉load_bar
策略回测无任何问题,实盘运行时报错如下:
报错:
File "c:\vnpy\lib\site-packages\vnpy\trader\utility.py", line 464, in update_bar
self.open_array[-1] = bar.open_price
AttributeError: 'NoneType' object has no attribute 'open_price'
请教大家 可能是哪里的错误?
请教 连接正常 但是无法下单,报错账单未确认,请问如何确认账单?报错代码514607
每次在cta策略模块点击停止策略后就会出现下列错误:
File "c:\vnpy\lib\json\encoder.py", line 179, in default
raise TypeError(f'Object of type {o.class.name} '
TypeError: Object of type ndarray is not JSON serializable
我vnpy安装在c盘,这个策略我把arraymanager的array参数调为true,是不是和这个有关?
这个策略回测完全没报错
请教!谢谢
删掉vntrader中data.json后已解决!
加密后把pyd放入strategies文件夹,然后启动cta strategy模块后就报错如下:
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 46 column 26 (char 1061)
谢谢,请教各位该如何解决呢?