VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 9
声望: 1

在通过日线合成周线的过程中,通过判断bar日期属于第几周进行判断,当出现周数不同的时候,就合成周线,同时开始新的周线,问题是,只能在新k线来的时候(正常是周一的k线)才能判断出是不属于同一周的,那么按照vnpy的交易逻辑,第二根k线进行交易,所有周线的交易全部都变成周二了,正常应该是周一的时候进行交易,这个问题有什么好的解决办法吗

description

Member
avatar
加入于:
帖子: 4887
声望: 294

可以不用下一根日线做判断,可以update_tick的时候收到下一周tick就判断推送

Member
avatar
加入于:
帖子: 9
声望: 1

xiaohe wrote:

可以不用下一根日线做判断,可以update_tick的时候收到下一周tick就判断推送

不是很明白,我这个是跑回测的日线数据,没有tick数据啊,怎么判断下一周的tick

Member
avatar
加入于:
帖子: 20
声望: 4

如果回测数据是每天的bar,可以用最新的bar是周几来判断(bar.datetime.isocalendar()[2]表示周几)。
在拿到周五的bar的时候,一周结束。
但是有少数情况周五不是一周的最后一个交易日。

Member
avatar
加入于:
帖子: 9
声望: 1

alvinli512 wrote:

如果回测数据是每天的bar,可以用最新的bar是周几来判断(bar.datetime.isocalendar()[2]表示周几)。
在拿到周五的bar的时候,一周结束。
但是有少数情况周五不是一周的最后一个交易日。

对呀,就怕是有节假日,周五没数据,这种方法就不行了,有可能吧两周合成一周了

Member
avatar
加入于:
帖子: 9
声望: 1

有没有大神分享下周线合成的方法,是不是合成周线都存在这个问题呢

Member
avatar
加入于:
帖子: 9
声望: 1

经过专家指导,分享下通过日线合成周线方法,测试应该是可以的
if self.interval == Interval.WEEKLY.value:

        # Get public holidays data from Shanghai Stock Exchange
        cn_calendar: exchange_calendars.ExchangeCalendar = exchange_calendars.get_calendar('XSHG')
        holidays: list = [x.to_pydatetime() for x in cn_calendar.precomputed_holidays()]
        #print(holidays)
        # Filter future public holidays
        start: datetime = bar.datetime.replace(tzinfo=None)
        PUBLIC_HOLIDAYS = [x for x in holidays if x >= start]
        #print(PUBLIC_HOLIDAYS)

        if not self.window_bar:
            dt: datetime = bar.datetime.replace(hour=0, minute=0, second=0, microsecond=0)
            self.window_bar = BarData(
                symbol=bar.symbol,
                exchange=bar.exchange,
                datetime=dt,
                gateway_name=bar.gateway_name,
                open_price=bar.open_price,
                high_price=bar.high_price,
                low_price=bar.low_price
            )
            print("k线合成开始第{}周,星期{},日期{}".format(bar.datetime.isocalendar()[1], bar.datetime.isocalendar()[2], bar.datetime))
        # Otherwise, update high/low price into window bar
        else:
            self.window_bar.high_price = max(
                self.window_bar.high_price,
                bar.high_price
            )
            self.window_bar.low_price = min(
                self.window_bar.low_price,
                bar.low_price
            )
            print("这是第{}周,星期{},日期{}".format(bar.datetime.isocalendar()[1], bar.datetime.isocalendar()[2], bar.datetime))

        # Update close price/volume/turnover into window bar
        self.window_bar.close_price = bar.close_price
        self.window_bar.volume += bar.volume
        self.window_bar.turnover += bar.turnover
        self.window_bar.open_interest = bar.open_interest
        self.week_num = bar.datetime.isocalendar()[2]
        if bar.datetime.isocalendar()[2] == 5:
            print("第{}周推送".format(bar.datetime.isocalendar()[1]))
            self.on_window_bar(self.window_bar)
            self.window_bar = None
            self.week_num = 0
        elif bar.datetime.isocalendar()[2] < 5:
            days = 1
            # tomorrow = bar.datetime + timedelta(days=1)
            tomorrow: datetime = bar.datetime.replace(hour=0, minute=0, second=0, microsecond=0,tzinfo=None)
            tomorrow += timedelta(days=1)

            while tomorrow in PUBLIC_HOLIDAYS:
                print("明天是周{}".format(tomorrow.isocalendar()[2]))
                if tomorrow.isocalendar()[2] == 5:
                    print("明天假期,第{}周强制推送".format(bar.datetime.isocalendar()[1]))
                    self.on_window_bar(self.window_bar)
                    self.window_bar = None
                    break
                tomorrow += timedelta(days=1)
Member
avatar
加入于:
帖子: 54
声望: 1

每个bar里面应该都有weekofyear变量,看新来的那根与上次的一不一样就可以判断了

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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