这篇文章主要介绍在VNPY中策略中如何使用分钟线合成日K线,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
在论坛里面看到不少关于分钟合成日线的讨论,也试着实现了。这里是针对vnpy2.0的,1.92其实基本也差不多。
这里把合成的日线HLOC信息放在pandas.DataFrame里面,因为日线分析的话,对运算时间要求不是特别高,DataFrame足矣
合成过程放在on_bar方法里面,对每个传入的分钟进行日线合并处理;
这里用了trading == False进行判断,就是只在策略初始化过程对于历史数据进行日线合并。在交易过程中,不对当天传入分钟数据进行处理。因为日线是长周期数据,放在程序启动时候调用使用就可以,不必要盘中分析,如果打算真要,注释掉这个就可以。
这里只是提供了这个DataFrame 放置日线数据,具体如何分析还是要看使用者了
定于dayFrame存储日线数据,在策略定义中插入全局变量
class *********Strategy(CtaTemplate): author = "用Python的交易员" import pandas as pd dayFrame = pd.DataFrame(columns=['datetime', 'high', 'low', 'open', 'close'])
合并过程,在on_bar 方法中插入下面代码
def on_bar(self, bar: BarData): """ """if self.trading == False: # adjustedBarTime = bar.datetime + timedelta(hours = 5) if self.dayFrame.empty: # 如果dayFrame 为空,先加入一条 self.dayFrame = self.dayFrame.append({'datetime': bar.datetime.date(), 'high':bar.high_price, 'low': bar.low_price, 'open': bar.open_price, 'close': bar.close_price}, ignore_index=True) else: self.dayFrame = self.dayFrame.sort_values(['datetime']).reset_index(drop=True) # 如果dayFrame 不为空,先按照日期排序, if bar.datetime.date() in self.dayFrame['datetime'].values: # 如果是已有日期,对比high,low更新,并使用新close self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'high'] = \ max(max(self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'high'].values),bar.high_price) self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'low'] = \ min(min(self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'low'].values),bar.low_price) self.dayFrame.loc[self.dayFrame['datetime'] == bar.datetime.date(), 'close'] = bar.close_price else: # 如果是新的日期,新建一条 self.dayFrame = self.dayFrame.append( {'datetime': bar.datetime.date(), 'high': bar.high_price, 'low': bar.low_price, 'open': bar.open_price, 'close': bar.close_price}, ignore_index=True)
另外,这里默认就是自然日。如果想按照国内期货期货时间,就是晚上九点开盘时间就是第二天的话。有个取巧的方法,就是把bar时间加上5个小时,那么下午9点就变成明天1点,这样dataframe就会存储为下一天数据。而当天15点加上5点20点还是当天数据。
不过这样改很粗糙,只能支持国内时间和国内期货,如果服务器再其他时区,或者其他产品就另外分析。
修改方法,定义局部变量adjustedBarTime,是传入bar.datetime 时间加5;代替后面新增代码中所有用到bar.datetime地方。
周五时候想到一个问题,对于国内期货,周五晚上数据属于周一的,想想还真是头大,这里还要加上一天判断是否第二天是周六,如果是就要改到加两天,幸好一般节假日之前的交易日晚上无夜盘,不然更麻烦。
from datetime import datetime, timedeltaif self.trading == False: adjustedBarTime = bar.datetime + timedelta(hours = 5) if adjustedBarTime.weekday() is 5: adjustedBarTime = adjustedBarTime + timedelta(days= 2)
会插入如下数据,按照初始化使用天数,就会有多少条,
以上是“在VNPY中策略中如何使用分钟线合成日K线”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!