给vnTrader 1.92版本加入lru_cache缓存读取提速优化回测

时间:2021-09-09 06:36:17   收藏:0   阅读:16

VnTrader 2.0版本有不少提速措施,其中lru_cache是提高回测速度一个利器,让我用1.92为主的我很是羡慕。看说这个是python 3.5.2提供的功能,也就没多想。

 

最近才发现其实有第三方在也支持python 2.7的版本,比如 functools32。还有一个用 C 语言实现的,更快的,同时兼容 Python2 和 Python3 的第三方模块 fastcache 能够实现同样的功能,这里就用fastcache。

 

安装

 

很简单,pip直接安装就可以。

 

pip install fastcache --upgrade

 

测试是否正确安装

 

import fastcache
fastcache.test()

 

简单使用

 

 

使用clru_cache, 更新trader/app/ctaStrategy/ctaBacktesting.py, 让回测历史数据缓存到内存,不用反复读取

 

 

@clru_cache(maxsize=9999)
def load_data(dbName, symbol, dataStartDate, strategyStartDate, dataEndDate, dataClass):
    dbClient = pymongo.MongoClient(globalSetting[‘mongoHost‘], globalSetting[‘mongoPort‘])
    collection = dbClient[dbName][symbol]
    # 载入初始化需要用的数据
    flt = {‘datetime‘: {‘$gte‘: dataStartDate,
                        ‘$lt‘: strategyStartDate}}
    initCursor = collection.find(flt).sort(‘datetime‘)
    initData = []  # 清空initData列表
    for d in initCursor:
        data = dataClass()
        data.__dict__ = d
        initData.append(data)
    # 载入回测数据
    if not dataEndDate:
        flt = {‘datetime‘: {‘$gte‘: strategyStartDate}}  # 数据过滤条件
    else:
        flt = {‘datetime‘: {‘$gte‘: strategyStartDate,
                            ‘$lte‘: dataEndDate}}
    BackData = []
    dbCursor = collection.find(flt).sort(‘datetime‘)
    for dc in dbCursor:
        data = dataClass()
        data.__dict__ = dc
        BackData.append(data)
    count = len(initData) + len(BackData)
    return initData, BackData, count

 

 

    def loadHistoryData(self):
        """载入历史数据"""
        self.output(u‘开始载入数据‘)
        # 首先根据回测模式,确认要使用的数据类
        # load_data(dbName, symbol, dataStartDate, strategyStartDate, dataEndDate, dataClass)
        if self.mode == self.BAR_MODE:
            dataClass = VtBarData
            func = self.newBar
            self.initData,self.BackTestData, count = load_data(self.dbName,self.symbol, self.dataStartDate, self.strategyStartDate, self.dataEndDate, dataClass)
        else:
            dataClass = VtTickData
            func = self.newTick
            self.initData, self.BackTestData, count = load_data(self.dbName, self.symbol, self.dataStartDate, self.strategyStartDate, self.dataEndDate, dataClass)
        # 载入初始化需要用的数据
        if self.hdsClient:
            initCursor = self.hdsClient.loadHistoryData(self.dbName,
                                                        self.symbol,
                                                        self.dataStartDate,
                                                        self.strategyStartDate)
            # 将数据从查询指针中读取出,并生成列表
            self.initData = []  # 清空initData列表
            for d in initCursor:
                data = dataClass()
                data.__dict__ = d
                self.initData.append(data)
            # 载入回测数据
            self.dbCursor = self.hdsClient.loadHistoryData(self.dbName,
                                                           self.symbol,
                                                           self.strategyStartDate,
                                                           self.dataEndDate)
            for dc in self.dbCursor:
                data = dataClass()
                data.__dict__ = dc
                self.BackTestData.append(data)
        self.output(u‘载入完成,数据量:%s‘ % count)

 

没有使用之前,优化约为100组参数约为运行时间 323.0888239 秒,使用cache优化后运行时间 190.762839 秒

原文:https://www.cnblogs.com/chenguopa/p/15240057.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!