In [1]:
%matplotlib inline

from vnpy.trader.app.ctaStrategy.ctaBacktesting import BacktestingEngine, MINUTE_DB_NAME

def runBacktesting(strategyClass, settingDict, symbol, 
                   startDate, endDate, slippage, 
                   rate, size, priceTick):
    """运行单标的回测"""
    engine = BacktestingEngine()
    engine.setBacktestingMode(engine.BAR_MODE)
    engine.setDatabase(MINUTE_DB_NAME, symbol)
    engine.setStartDate(startDate)
    engine.setEndDate(endDate)
    engine.setSlippage(slippage)
    engine.setRate(rate)   
    engine.setSize(size)         
    engine.setPriceTick(priceTick)
    
    engine.initStrategy(strategyClass, settingDict)
    engine.runBacktesting()
    df = engine.calculateDailyResult()
    return df

In [2]:
# 运行IF回测,交易1手
from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy
df1 = runBacktesting(AtrRsiStrategy, {}, 'IF0000', 
                     '20120101', '20170630', 0.2, 
                     0.3/10000, 300, 0.2)


2017-10-07 23:24:11.493000	开始载入数据
2017-10-07 23:24:11.661000	载入完成,数据量:348690
2017-10-07 23:24:11.661000	开始回测
2017-10-07 23:24:11.703000	策略初始化完成
2017-10-07 23:24:11.703000	策略启动完成
2017-10-07 23:24:11.703000	开始回放数据
2017-10-07 23:24:42.412000	数据回放结束
2017-10-07 23:24:42.412000	计算按日统计结果

In [3]:
# 运行rb回测,交易16手
from vnpy.trader.app.ctaStrategy.strategy.strategyBollChannel import BollChannelStrategy
settingDict = {'fixedSize': 16}
df2 = runBacktesting(BollChannelStrategy, settingDict, 'rb0000', 
                     '20120101', '20170630', 1, 
                     1/10000, 10, 1)


2017-10-07 23:24:43.174000	开始载入数据
2017-10-07 23:24:43.340000	载入完成,数据量:300224
2017-10-07 23:24:43.340000	开始回测
2017-10-07 23:24:43.347000	策略初始化完成
2017-10-07 23:24:43.347000	策略启动完成
2017-10-07 23:24:43.347000	开始回放数据
2017-10-07 23:24:58.453000	数据回放结束
2017-10-07 23:24:58.453000	计算按日统计结果

In [4]:
# 合并获得组合回测结果
dfp = df1 + df2

# 注意如果被抛弃的交易日位于回测的前后,即两者不重合的日期中,则不会影响组合曲线正确性
# 但是如果被抛弃的交易日位于回测的中部,即两者重合的日期中,组合曲线会出现错误(丢失交易日)
dfp = dfp.dropna()   

# 创建回测引擎,并设置组合回测初始资金后,显示结果
engine = BacktestingEngine()
engine.setCapital(1000000)
reuslt, dfp = engine.calculateDailyStatistics(dfp)
engine.showDailyResult(dfp, result)


2017-10-07 23:24:58.504000	------------------------------
2017-10-07 23:24:58.504000	首个交易日:	2012-01-11
2017-10-07 23:24:58.504000	最后交易日:	2017-06-30
2017-10-07 23:24:58.504000	总交易日:	1328
2017-10-07 23:24:58.504000	盈利交易日	679
2017-10-07 23:24:58.504000	亏损交易日:	649
2017-10-07 23:24:58.504000	起始资金:	1000000
2017-10-07 23:24:58.504000	结束资金:	2,543,440.99
2017-10-07 23:24:58.504000	总收益率:	154.34
2017-10-07 23:24:58.504000	总盈亏:	1,543,440.99
2017-10-07 23:24:58.504000	最大回撤: 	-155,832.39
2017-10-07 23:24:58.504000	总手续费:	216,619.01
2017-10-07 23:24:58.505000	总滑点:	535,820.0
2017-10-07 23:24:58.505000	总成交金额:	7,476,566,620.0
2017-10-07 23:24:58.505000	总成交笔数:	8,041.0
2017-10-07 23:24:58.505000	日均盈亏:	1,162.23
2017-10-07 23:24:58.505000	日均手续费:	163.12
2017-10-07 23:24:58.505000	日均滑点:	403.48
2017-10-07 23:24:58.505000	日均成交金额:	5,629,944.74
2017-10-07 23:24:58.505000	日均成交笔数:	6.05
2017-10-07 23:24:58.505000	日均收益率:	0.07%
2017-10-07 23:24:58.505000	收益标准差:	0.96%
2017-10-07 23:24:58.505000	Sharpe Ratio:	1.15

In [ ]: