做VNPY这段时间,发现主要就是回测,和策略优化;然后就是有批量测试和参数集合效果导出excel分析要求。还有就是一个策略对不同品种效果验证。
然后想想,就自己写了一个BatchBackTest 类,其实很简答,就是输入品种队列,和策略队列,然后就会循环跑出结果,输出到指定路径excel。 还有就是策略是元组,是由一个策略和对应参数组合。
代码如下。使用方法就是在 vnpy/example/CtaBacktesting 路径下面新疆一个py,放入下面代码就可以
然后想想,就自己写了一个BatchBackTest 类,其实很简答,就是输入品种队列,和策略队列,然后就会循环跑出结果,输出到指定路径excel。 还有就是策略是元组,是由一个策略和对应参数组合。
代码如下。使用方法就是在 vnpy/example/CtaBacktesting 路径下面新疆一个py,放入下面代码就可以
点击(此处)折叠或打开
- # encoding: UTF-8
- from vnpy.trader.app.ctaStrategy.ctaBacktesting import BacktestingEngine, MINUTE_DB_NAME
- import pandas as pd
- from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy
- from vnpy.trader.app.ctaStrategy.strategy.strategyBollChannel import BollChannelStrategy
- from vnpy.trader.app.ctaStrategy.strategy.strategyDoubleMa import DoubleMaStrategy
- from vnpy.trader.app.ctaStrategy.strategy.strategyDualThrust import DualThrustStrategy
- from vnpy.trader.app.ctaStrategy.strategy.strategyKingKeltner import KkStrategy
- from vnpy.trader.app.ctaStrategy.strategy.strategyMultiSignal import MultiSignalStrategy
- from vnpy.trader.app.ctaStrategy.strategy.strategyMultiTimeframe import MultiTimeframeStrategy
-
- class BatchBackTest(object):
- def __init__(self):
- ""
- def calculateBacktesting(self,symbollist,strategylist):
- #填入品种队列和策略队列,返回结果resultlist, 为了输出方便检索,加入品种名称,策略名称和策略参数
- resultlist = []
- for symbol in symbollist:
- for strategy in strategylist:
- result = self.runBacktesting(symbol,strategy)
- #加入品种名称,策略名称和策略参数
- result["Symbolname"] = str(symbol["vtSymbol"])
- result["strategyname"] = str(strategy[0])
- result["strategysetting"] = str(strategy[1])
- resultlist.append(result)
- return resultlist
-
-
- def runBacktesting(self, symbol, strategy ):
- #写入测试品种和参数, 返回回测数据集包含回测结果
-
- # 在引擎中创建策略对象
- # 创建回测引擎
- engine = BacktestingEngine()
- # 设置引擎的回测模式为K线
- engine.setBacktestingMode(engine.BAR_MODE)
- # 设置回测用的数据起始日期
- engine.setStartDate(symbol["StartDate"])
- engine.setSlippage(symbol["Slippage"]) # 1跳
- engine.setRate(symbol["Rate"]) # 佣金大小
- engine.setSize(symbol["Size"]) # 合约大小
- engine.setPriceTick(symbol["Slippage"]) # 最小价格变动
- engine.setCapital(symbol["Capital"])
-
- # 设置使用的历史数据库
- engine.setDatabase(MINUTE_DB_NAME, symbol["vtSymbol"])
- #设置策略,策略元组中第一个是策略,第二个参数
- engine.initStrategy(strategy[0], strategy[1])
- engine.runBacktesting()
- df = engine.calculateDailyResult()
- result = []
- dfp,result = engine.calculateDailyStatistics(df)
- engine.output(u'输出统计数据')
- # engine.showDailyResult(dfp, result)
- return result
-
- def toExcel(self, resultlist, path = "C:\data\datframe.xlsx"):
- #按照输入统计数据队列和路径,输出excel,这里不提供新增模式,如果想,可以改
- #dft.to_csv(path,index=False,header=True, mode = 'a')
- summayKey = resultlist[0].keys()
- # summayValue = result.values()
-
- dft = pd.DataFrame(columns=summayKey)
- for result in resultlist:
- new = pd.DataFrame(result, index=["0"])
- dft = dft.append(new,ignore_index=True)
- dft.to_excel(path,index=False,header=True)
- print "回测统计结果输出到" + path
-
-
- if __name__ == "__main__":
- #创建品种队列,这里可以用json导入,为了方便使用直接写了。
- symbollist = [{
- "vtSymbol": 'm1809',
- "StartDate": "20180101",
- "Slippage": 1,
- "Size": 10,
- "Rate": 2 / 10000,
- "Capital": 10000
- },
- {
- "vtSymbol": 'rb0000',
- "StartDate": "20180101",
- "Slippage": 1,
- "Size": 10,
- "Rate": 2 / 10000,
- "Capital": 10000
- }]
- #这里定义策略,策略参数先为空;策略加参数是一个元组
- setting = {}
- Strategylist = [(AtrRsiStrategy, setting),
- (BollChannelStrategy, setting),
- (DoubleMaStrategy, setting),
- (DualThrustStrategy, setting),
- (KkStrategy, setting),
- (MultiSignalStrategy, setting),
- (MultiTimeframeStrategy, setting)]
- # 这里是同一个策略,不同参数的情况,当然可以有多个策略和多个参数组合
- Strategylist2 = []
- # 策略list
- settinglist =[
- {'kdlimit': 40, 'barmins': 9, 'cciWindow': 22},
- {'kdlimit': 30, 'barmins': 13, 'cciWindow': 20}]
- # 合并一个元组
- if settinglist != []:
- for para1 in settinglist:
- Strategylist2.append((BollChannelStrategy, para1))
-
- NT = BatchBackTest()
- resultlist = NT.calculateBacktesting(symbollist,Strategylist)
- #定义路径
- path = "C:\Project\BackTestResult.xlsx"
- NT.toExcel(resultlist,path)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22259926/viewspace-2156480/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22259926/viewspace-2156480/