vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 71
声望: 0

大佬们
我看cta的例子里面是在def on_init(self):里面self.load_bar(10) ,即获取十天的bar数据

我现想在def on_bar(self, bar: BarData):函数中,向前取2个月的数据(1分钟bardata),这时候我应该用哪个函数api来获取呢?
并同时将这两个月的1分钟bardata转为dataframe形式使用,请教一下各位大佬!

Member
avatar
加入于:
帖子: 71
声望: 0

最近问题比较多,主要就是怕自己实现的方法走弯路,低效,

所以才想跟大佬们请教一下是否是简洁有效的写法,不浪费性能,感谢

关于在策略里读取历史数据并生成dataframe的方法我写了一个初稿,请各位大佬斧正

    def load_select_bar_data_from_mongodb(self,symbol: str,
                                          exchange: Exchange,
                                          interval: Interval,
                                          start: datetime,
                                          end: datetime,
                                          collection_name: str = None):


        df = pd.DataFrame(database_manager.load_bar_data(symbol, exchange, interval, start, end, collection_name))
        df = df.rename(index=str, columns={"open_price": "open",
                                           "high_price": "high",
                                           "low_price": "low",
                                           "close_price": "close",
                                           })
        data_select_columns = ["open", "high", "low", "close", "open_interest", "volume"]
        df = df.set_index('datetime')[data_select_columns]
        print(df)

        return df

我是准备在on_bar触发的时候调用这个函数取得想要的起止日期的dataframe

有如下两方面具体问题请请教大佬
1这个函数方法是否有必要写到比如vnpy-2.1.7\vnpy\app\cta_strategy\strategies\atr_rsi_strategy.py策略文件中 ,并设置为一个策略类的属性方法?还是说我放在类外面独立为一个单独的函数就够了?
2回测中反复从MongoDB中读取数据生成dataframe是否是一种低效的方式?有办法改进么,在同实盘保持接轨的思路下(策略是1分钟级别)?

Member
avatar
加入于:
帖子: 71
声望: 0

2020-11-29 23:26:59.647871 开始加载历史数据
2020-11-29 23:27:00.047876 加载进度:########## [100%]
2020-11-29 23:27:00.047876 历史数据加载完成,数据量:4560
2020-11-29 23:27:00.047876 触发异常,回测终止
2020-11-29 23:27:00.051934 Traceback (most recent call last):
File "D:\vnpy-2.1.7\vnpy\app\cta_strategy\backtesting.py", line 344, in run_backtesting
self.callback(data)
File "D:\vnpy-2.1.7\vnpy\app\cta_strategy\strategies\atr_rsi_strategy.py", line 126, in on_bar
self.load_select_bar_data_from_mongodb(self.vt_symbol,self.exchange,self.interval,(bar.datetime-timedelta(days=3)),bar.datetime,self.collection_name)
AttributeError: 'AtrRsiStrategy' object has no attribute 'exchange'

这个代码写的还不够严禁 部分属性有问题

Member
avatar
加入于:
帖子: 2013
声望: 133

这些数据在am里取应该就可以了吧。比如am默认size=100,am.close就能输出close_price的array(最新100个值)

Administrator
avatar
加入于:
帖子: 4595
声望: 262
  1. 你的策略类没有定义self.exchange,所以出现报错
  2. self.load_bar(60),就可以加载之前60天的K线来做初始化
  3. 不应该在CTA策略中使用pandas.DataFrame这种速度很慢的数据结构
Member
avatar
加入于:
帖子: 2
声望: 0

策略初始化时 有self.am = ArrayManager() 你可以在am里面定义一个np.ndarray转pandas.dataframe的函数 在策略on_bar里即可am.调用

Member
avatar
加入于:
帖子: 29
声望: 0

stan_133652 wrote:

策略初始化时 有self.am = ArrayManager() 你可以在am里面定义一个np.ndarray转pandas.dataframe的函数 在策略on_bar里即可am.调用

请问如何找到ArrayManager()的代码细节呢?(在哪个文件夹里面呀?)。我有类似需求,需要再onbar()里面直接调出open high low close 还有volume 的价格,并且每个是一个numpy array。应该如何做呢?

Member
avatar
加入于:
帖子: 2013
声望: 133

代码在vnpy.trader.utility下

description

description
am默认的size是100,可以根据自己需要进行调整

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

沪公网安备 31011502017034号