重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
小编今天带大家了解VNPY 批量策略回测和统计结果的excel输出是怎样的,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“VNPY 批量策略回测和统计结果的excel输出是怎样的”的知识吧。
为五峰等地区用户提供了全套网页设计制作服务,及五峰网站建设行业解决方案。主营业务为做网站、网站建设、五峰网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!做VNPY这段时间,发现主要就是回测,和策略优化;然后就是有批量测试和参数集合效果导出excel分析要求。还有就是一个策略对不同品种效果验证。
然后想想,就自己写了一个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)
感谢大家的阅读,以上就是“VNPY 批量策略回测和统计结果的excel输出是怎样的”的全部内容了,学会的朋友赶紧操作起来吧。相信创新互联小编一定会给大家带来更优质的文章。谢谢大家对创新互联网站的支持!