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

复制了官方公众号rsjstrategy源码,本地回测时曲线和策略的bilistrategy完全不一样,是亏的,请问是哪里出错了吗?还是说文章图中的bilistrategy是另一套策略?
谢谢
源码为:https://mp.weixin.qq.com/s/2KF61mAJO1Ff8zS61aHlHw

description

xiaohe wrote:

请问你的问题是无法保存数据是吗?
可以在rqdata的query_history函数下打印一下row.name看看,你报错是说这个是个元组,正常情况下应该是timestamp
是指在rqdata的query_history函数体内加入print row.name的代码么?

请教用rqdata下载时出现问题,可以正常连接rqdata,但无法保持数据?
貌似模块里有方法出错了??求解
谢谢
description

日线级别的海龟策略如何实现: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)

谢谢,请教各位该如何解决呢?

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

沪公网安备 31011502017034号

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