vnpy/examples/CtaBacktesting/backtesting.ipynb

229 lines
110 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"from vnpy.trader.app.ctaStrategy.ctaBacktesting import BacktestingEngine, OptimizationSetting, MINUTE_DB_NAME\n",
"from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 创建回测引擎对象\n",
"engine = BacktestingEngine()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# 设置回测使用的数据\n",
"engine.setBacktestingMode(engine.BAR_MODE) # 设置引擎的回测模式为K线\n",
"engine.setDatabase(MINUTE_DB_NAME, 'IF0000') # 设置使用的历史数据库\n",
"engine.setStartDate('20120101') # 设置回测用的数据起始日期"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 配置回测引擎参数\n",
"engine.setSlippage(0.2) # 设置滑点为股指1跳\n",
"engine.setRate(0.3/10000) # 设置手续费万0.3\n",
"engine.setSize(300) # 设置股指合约大小 \n",
"engine.setPriceTick(0.2) # 设置股指最小价格变动 \n",
"engine.setCapital(1000000) # 设置回测本金"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 在引擎中创建策略对象\n",
"d = {'atrLength': 11} # 策略参数配置\n",
"engine.initStrategy(AtrRsiStrategy, d) # 创建策略对象"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2017-07-14 20:13:38.855000\t开始载入数据\n",
"2017-07-14 20:13:39.021000\t载入完成数据量331890\n",
"2017-07-14 20:13:39.021000\t开始回测\n",
"2017-07-14 20:13:39.041000\t策略初始化完成\n",
"2017-07-14 20:13:39.041000\t策略启动完成\n",
"2017-07-14 20:13:39.041000\t开始回放数据\n",
"2017-07-14 20:14:03.242000\t数据回放结束\n"
]
}
],
"source": [
"# 运行回测\n",
"engine.runBacktesting() # 运行回测"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2017-07-14 20:16:24.541000\t计算按日统计结果\n",
"2017-07-14 20:16:24.610000\t------------------------------\n",
"2017-07-14 20:16:24.610000\t首个交易日\t2012-01-11\n",
"2017-07-14 20:16:24.610000\t最后交易日\t2017-03-20\n",
"2017-07-14 20:16:24.610000\t总交易日\t1259\n",
"2017-07-14 20:16:24.610000\t盈利交易日\t617\n",
"2017-07-14 20:16:24.610000\t亏损交易日\t641\n",
"2017-07-14 20:16:24.610000\t起始资金\t1000000\n",
"2017-07-14 20:16:24.610000\t结束资金\t1,681,826.5\n",
"2017-07-14 20:16:24.610000\t总收益率\t68.18\n",
"2017-07-14 20:16:24.610000\t总盈亏\t681,826.5\n",
"2017-07-14 20:16:24.610000\t最大回撤: \t-185,949.45\n",
"2017-07-14 20:16:24.610000\t总手续费\t216,553.5\n",
"2017-07-14 20:16:24.610000\t总滑点\t449,940.0\n",
"2017-07-14 20:16:24.610000\t总成交金额\t7,218,450,000.0\n",
"2017-07-14 20:16:24.610000\t总成交笔数\t7,498.0\n",
"2017-07-14 20:16:24.610000\t日均盈亏\t541.56\n",
"2017-07-14 20:16:24.611000\t日均手续费\t172.0\n",
"2017-07-14 20:16:24.611000\t日均滑点\t357.38\n",
"2017-07-14 20:16:24.611000\t日均成交金额\t5,733,478.95\n",
"2017-07-14 20:16:24.611000\t日均成交笔数\t5.96\n",
"2017-07-14 20:16:24.611000\t日均收益率\t0.04%\n",
"2017-07-14 20:16:24.611000\t收益标准差\t1.09%\n",
"2017-07-14 20:16:24.611000\tSharpe Ratio\t0.6\n"
]
},
{
"data": {
"image/png": "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\n7165jhaRUPlhY5jTSuV
"text/plain": [
"<matplotlib.figure.Figure at 0x1d7477b0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 显示逐日回测结果\n",
"df = engine.showDailyResult()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# 显示逐笔回测结果\n",
"engine.showBacktestingResult()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# 显示前10条成交记录\n",
"for i in range(10):\n",
" print engine.tradeDict[str(i+1)].__dict__"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# 优化配置\n",
"setting = OptimizationSetting() # 新建一个优化任务设置对象\n",
"setting.setOptimizeTarget('capital') # 设置优化排序的目标是策略净盈利\n",
"setting.addParameter('atrLength', 12, 20, 2) # 增加第一个优化参数atrLength起始12结束20步进2\n",
"setting.addParameter('atrMa', 20, 30, 5) # 增加第二个优化参数atrMa起始20结束30步进5\n",
"setting.addParameter('rsiLength', 5) # 增加一个固定数值的参数\n",
"\n",
"# 执行多进程优化\n",
"import time\n",
"engine.runParallelOptimization(AtrRsiStrategy, setting)\n",
"print u'耗时:%s' %(time.time()-start)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 0
}