vnpy/examples/CtaBacktesting/backtesting.ipynb

258 lines
45 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": 3,
"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": 4,
"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) # 设置股指最小价格变动 "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# 在引擎中创建策略对象\n",
"d = {'atrLength': 11} # 策略参数配置\n",
"engine.initStrategy(AtrRsiStrategy, d) # 创建策略对象"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2017-07-06 23:15:17.471000\t开始载入数据\n",
"2017-07-06 23:15:17.485000\t载入完成数据量0\n",
"2017-07-06 23:15:17.485000\t开始回测\n",
"2017-07-06 23:15:17.485000\t策略初始化完成\n",
"2017-07-06 23:15:17.485000\t策略启动完成\n",
"2017-07-06 23:15:17.485000\t开始回放数据\n",
"2017-07-06 23:15:17.486000\t数据回放结束\n"
]
}
],
"source": [
"# 运行回测\n",
"engine.runBacktesting() # 运行回测"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2017-06-02 16:09:14.068000\t计算回测结果\n",
"2017-06-02 16:09:14.134000\t------------------------------\n",
"2017-06-02 16:09:14.134000\t第一笔交易\t2012-01-11 10:18:00\n",
"2017-06-02 16:09:14.134000\t最后一笔交易\t2017-03-20 09:31:00\n",
"2017-06-02 16:09:14.134000\t总交易次数\t3,749.0\n",
"2017-06-02 16:09:14.134000\t总盈亏\t683,717.31\n",
"2017-06-02 16:09:14.134000\t最大回撤: \t-215,542.46\n",
"2017-06-02 16:09:14.134000\t平均每笔盈利\t182.37\n",
"2017-06-02 16:09:14.134000\t平均每笔滑点\t120.0\n",
"2017-06-02 16:09:14.134000\t平均每笔佣金\t57.75\n",
"2017-06-02 16:09:14.134000\t胜率\t\t37.24%\n",
"2017-06-02 16:09:14.134000\t盈利交易平均值\t8,539.01\n",
"2017-06-02 16:09:14.134000\t亏损交易平均值\t-4,775.5\n",
"2017-06-02 16:09:14.134000\t盈亏比\t1.79\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAakAAAE/CAYAAAD8EzwFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXuYFMXVuN+zu4AIsqDioiALeEeNiBFJvCwSRdREk5go\niYlgks9EjRo1UVDjgjGJmHiLiRrjDS8RjJiIXxSRyPolPwUxiqByU+MFBLyCokFhOb8/qobpme2Z\nnd2dnu6dPe/z9DPV1dVVp6p7+nRVnzolqophGIZhJJGKuAUwDMMwjFyYkjIMwzASiykpwzAMI7GY\nkjIMwzASiykpwzAMI7GYkjIMwzASS+xKSkTOFZEXRGShiNwjIp1FpJeIzBKRpSLyqIhUB9JPEJHl\nIrJYREYF4of6PJaJyLWB+M4iMtWf85SI9A8cG+vTLxWRU0pXa8MwDKMQYlVSIrITcBYwVFU/B1QB\n3wLGA7NVdQ/gcWCCTz8YOBHYCzgauEFExGd3I/B9Vd0d2F1EjvLx3wfeV9XdgGuBK31evYBLgQOB\ng4D6oDI0DMMw4if2nhRQCXQTkSqgK7ASOB6Y4o9PAb7qw8cBU1V1k6q+BiwHholIH2AbVZ3v090Z\nOCeY1/3ASB8+CpilqutUdS0wCxgdQf0MwzCMVhKrklLVt4CrgDdwymmdqs4GalR1jU+zGtjBn9IX\neDOQxUof1xdYEYhf4eMyzlHVRmCdiGybJy/DMAwjIcQ93NcT19OpBXbC9ahOBrJ9NRXTd5M0n8Qw\nDMNIAlUxl38E8Kqqvg8gIn8FvgisEZEaVV3jh/Le9ulXAjsHzu/n43LFB895S0QqgR6q+r6IrARG\nZJ0zJ0xIETEHh4ZhGHlQ1Ug6AHF/k3oDGC4iW3kDiC8BLwEzgHE+zVjgQR+eAYzxFnsDgV2Bp/2Q\n4DoRGebzOSXrnLE+/E2cIQbAo8CRIlLtjSiO9HGhqGqit/r6+thlMBlNTpOxY8oYJXF/k3oaZ8zw\nHPA8bijuZmAyToEsxSmuK3z6l4D7cIrsYeAMTbfQmcCtwDJguarO9PG3AtuLyHLgJzjLQVT1A+AX\nwDPAPGCSOgMKwzCM1vGtb8Ezz4Qf++wz2LQJVq9Oxz3/PIQ95DdsiEa+dkjcPSlwZuEvAJ2AzwND\ncd+gNvvjSmHfqDRrC8ZvDglnn2MYhtF61q2DqVPhwANBBPbdF/70J3jhBbj5Zjj/fOjUCXbcESZO\ndMppyBD47W/hr39N5/PQQ9C1K6xfH1tVEkUCuol3AKf6cBVQjetJXeDjLgSu8OHBuF5XFTAAeBkQ\nf2wecKAPPwwc5cOnAzf48Ek4E3aAXsArvryeqXAOGTXpzJkzJ24RmsVkLB7tQc6iyvjII6rf/a5q\nY2PuNLfdpjp7tuq0aaqbN6vecYfqkiXp47Nnu/ioZHRqp/nte99zv6edlhmfku3LX3b7991XXBk3\nb1a97jrV3r2btENb8c/IaHREVBkXVDj0AF4JiV+CM0MH6AMs8eHxwIWBdI/gJuL2AV4KxI8BbvTh\nmcBBPlwJvJ2dxu/fCJyUQ87WXjvDMNrKSy+lH+SXX6767LMuPH266sqVqrffnl8prFnjttT+k0+6\n39mziyfj+++7PB9/XPWaa5wyUFX96KN0uWvXptOffrqL++lPVefMUT3sMNVx41RPPdXFz5uneuSR\nLu2HH6r27Km6116qV1+tesEFTlmvX99Ujk2bwuX75JO0HAcdVLx6e8pZSe3ne0C3A8/ivkdtDXyQ\nle59/3s98O1A/C3A14EDcBNzU/GHADN8eBGwU+DYcmBb4HzgokD8JcB5OeRs/dUzDCM/69erfutb\nqhs2qDY0ND1+4onuUfWvf+VXRqBaW+sUwHnnuQf7LrvkT//yy8WpQ3ZvKMiGDU3jP/vMpV+50u1P\nmZIpl6rqoEHN1/fAA93vokWqc+eqVlaqXnJJZlkNDen0GzcWp75ZRKmk8n6TEpGHRGRGri3fuQVS\nhfsG9QdVHQp8jOst2Twpw0gaq1bBMcfAu+8WN9/u3eHee+EXv4ARI+DNN6GhATp3dt927rsP9tkH\nDjgAPvgAHngAPv4Yfv7zdB5Tp8LcufDii3D11XDVVS7tsmXu+BlnwJFHwttvw0svwUcfuW9Ee+0F\n11wDQ4e69Jv9J+vly50M2fz97+GGDgDvv+/kzaZLl6bxnTrBxo2w005u/5RTYO1a9x1q3ToXN39+\nOv3cua7clSvhkUdg5MjMNPvuC8OHQ2MjXH45TJ8Ou+3mDDVGjID993f5VsU966jlpL7nhB8Uqct3\nsqo+0abCRWqAp1R1kN8/BKekdgFGaHqe1BxV3UtExrtidbJPPxOoB15PpfHxY4A6VT09lUZV5/l5\nUqtUdQefZoSq/sifc5PPY1qInFpfX79lf8SIEYwYMaItVTeMZKAa/mAN45574DvfSZ/36afuAdzS\n8ubOheuvh//+FwYPdkroj3+EL33JyaLqlMazz0KvXrDLLpkP7Gw2b4aKPO/bt93mFNTOOzc9Flb3\nm2+G005z4Y8/hq23duE33oDaWhf+9FOnRAEWL3b12Ly58LYsFq+95mS6/XZ4/XW47LJ0GwYJylsE\nGhoaaAgo8UmTJqERzZOKdbjPK8gngN19uB5nNDEZ/+2JcMOJzsBAMg0n5gLDcD2lh4HRPv4M0oYT\nYwg3nEiFe+aQsQUdX6Ps2bSp6B+eI6V/f9WPP3bhl19OD5/dfbf7/fzn3ZDb3Xfnzyf1TSg43PTi\ni4XJsGmTG/ZauDB82CqV/wUXpOOeeCL6dg6WddllqjU16bh99lHt1El15kyXdvbs9LE//MHFnXtu\nOm0SaGxU/fRT1WuvVV2xQvXSS1WXLo28WOL+JgXshpvP9BLwamorigDuu9R8YAHwgFca2wKzgaU4\nx689A+kneOW0GBgViD8A9/1pOXBdIL4Lbm7Vcq/IBgSOjfPxy4BT8shYhMtolA17751+sAbZvNl9\na0gSmzeHK4V8269+1TSfK65wx959V/X++9Npf/lL1Ycfdspv82b3QA/7zvPDH6bPufBC1UcfdeFn\nnlH9z39cmv/+1ymzBx5wxzZsiLRpcgKqRx/truUll7j9BQvc7wknuDoOH+6MJFJ1Wr06HlkTQhKU\n1L9wk2oX4vzsTQQui0qopG2mpIwM+vVzf5099nAP5jvvVK2uTj+w3nvPfaBetMhZdxXK5s3OOKCY\nfPih6u67ZyohkXR4jz1Uzz/fhb/yFdVu3Vz4N79R/eAD1wP74AMXN3x4Zr5z5+ZWdO++6xRQirFj\nVSsq3LEw44gk07Vrul6zZrnrNHCg6rBhTuEaiVBS//a/i7LjiiKEm1T8LGmLvF6+B7UU56qoOpB2\ngu/9ZPekhnolugy4NhDfGZjqz3kK6B84NtanX2o9KSMva9Y4U+jUA/v1193vkUdmPpxT1lbB7d57\nm8//44+dpVcqb1VnKn3aabnPmT49d2/j5JNVr7wyLcNnnzkz6RSbN6sOHux6DJ9+qhk9l7q6pnXo\n3Dm8nFtuccerqpqec9hhTlmD632uXh1uNp10Fi9W/f73VX/+83TcRRe5en3ySXxyJYgkKKknvSJ5\nAPgx8DVgadGEgHOBuwNKyibzGslg40b3YP3KV9zfZexY3TLUN3OmC++6q5uguWBB5nyU7G8uYXkv\nW5aewzNtWjp9cJgu1xAiqI4YkRn3la+o/va3mWU//HDz9cwerho/PjOP3/wmdx0eeCAzLnuSamrL\nNxHXaNckQUkdCHTHeQq/HZiOnyDbZgFcno/hPJKnlJRN5jWSwWGHpR+ywYd/issuU121KvOcxkbV\nd95xCmjRItWttnK9o6uv1i29rbVrMz/Sp7YxY9zveeepHn98Ov6tt9I9o88+c72eMEWYrVg+/LDt\nbQCuF9lSUr2N3r1dr80oW6JUUoUazQ9Qt+rteuBUABH5pu+9tJVrgJ/hejQpMhY9FJHgoodPBdKl\nFircRIGLHoqILXpo5Gf
"text/plain": [
"<matplotlib.figure.Figure at 0x206d91f0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 显示回测结果\n",
"engine.showBacktestingResult()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'orderID': '1', 'direction': u'\\u591a', 'gatewayName': '', 'tradeID': '1', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-11 09:18:00', 'rawData': None, 'vtTradeID': '1', 'offset': u'\\u5f00\\u4ed3', 'vtOrderID': '1', 'dt': datetime.datetime(2012, 1, 11, 9, 18), 'price': 2464.4, 'vtSymbol': ''}\n",
"{'orderID': '2', 'direction': u'\\u7a7a', 'gatewayName': '', 'tradeID': '2', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-11 10:18:00', 'rawData': None, 'vtTradeID': '2', 'offset': u'\\u5e73\\u4ed3', 'vtOrderID': '2', 'dt': datetime.datetime(2012, 1, 11, 10, 18), 'price': 2448.8, 'vtSymbol': ''}\n",
"{'orderID': '3', 'direction': u'\\u7a7a', 'gatewayName': '', 'tradeID': '3', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-11 10:19:00', 'rawData': None, 'vtTradeID': '3', 'offset': u'\\u5f00\\u4ed3', 'vtOrderID': '3', 'dt': datetime.datetime(2012, 1, 11, 10, 19), 'price': 2448.4, 'vtSymbol': ''}\n",
"{'orderID': '4', 'direction': u'\\u591a', 'gatewayName': '', 'tradeID': '4', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-11 14:21:00', 'rawData': None, 'vtTradeID': '4', 'offset': u'\\u5e73\\u4ed3', 'vtOrderID': '4', 'dt': datetime.datetime(2012, 1, 11, 14, 21), 'price': 2456.2000000000003, 'vtSymbol': ''}\n",
"{'orderID': '5', 'direction': u'\\u591a', 'gatewayName': '', 'tradeID': '5', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-11 14:22:00', 'rawData': None, 'vtTradeID': '5', 'offset': u'\\u5f00\\u4ed3', 'vtOrderID': '5', 'dt': datetime.datetime(2012, 1, 11, 14, 22), 'price': 2455.6, 'vtSymbol': ''}\n",
"{'orderID': '6', 'direction': u'\\u7a7a', 'gatewayName': '', 'tradeID': '6', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-11 14:57:00', 'rawData': None, 'vtTradeID': '6', 'offset': u'\\u5e73\\u4ed3', 'vtOrderID': '6', 'dt': datetime.datetime(2012, 1, 11, 14, 57), 'price': 2444.0, 'vtSymbol': ''}\n",
"{'orderID': '7', 'direction': u'\\u7a7a', 'gatewayName': '', 'tradeID': '7', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-11 14:58:00', 'rawData': None, 'vtTradeID': '7', 'offset': u'\\u5f00\\u4ed3', 'vtOrderID': '7', 'dt': datetime.datetime(2012, 1, 11, 14, 58), 'price': 2445.8, 'vtSymbol': ''}\n",
"{'orderID': '8', 'direction': u'\\u591a', 'gatewayName': '', 'tradeID': '8', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-12 09:51:00', 'rawData': None, 'vtTradeID': '8', 'offset': u'\\u5e73\\u4ed3', 'vtOrderID': '8', 'dt': datetime.datetime(2012, 1, 12, 9, 51), 'price': 2452.8, 'vtSymbol': ''}\n",
"{'orderID': '9', 'direction': u'\\u591a', 'gatewayName': '', 'tradeID': '9', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-12 09:52:00', 'rawData': None, 'vtTradeID': '9', 'offset': u'\\u5f00\\u4ed3', 'vtOrderID': '9', 'dt': datetime.datetime(2012, 1, 12, 9, 52), 'price': 2452.0, 'vtSymbol': ''}\n",
"{'orderID': '10', 'direction': u'\\u7a7a', 'gatewayName': '', 'tradeID': '10', 'exchange': '', 'symbol': '', 'volume': 0, 'tradeTime': '2012-01-12 10:31:00', 'rawData': None, 'vtTradeID': '10', 'offset': u'\\u5e73\\u4ed3', 'vtOrderID': '10', 'dt': datetime.datetime(2012, 1, 12, 10, 31), 'price': 2455.2000000000003, 'vtSymbol': ''}\n"
]
}
],
"source": [
"# 显示前10条成交记录\n",
"for i in range(10):\n",
" print engine.tradeDict[str(i+1)].__dict__"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2017-06-02 16:13:08.744000\t------------------------------\n",
"2017-06-02 16:13:08.744000\t优化结果\n",
"2017-06-02 16:13:08.744000\t{'rsiLength': 5, 'atrMa': 20, 'atrLength': 20}: 957797.864155\n",
"2017-06-02 16:13:08.744000\t{'rsiLength': 5, 'atrMa': 25, 'atrLength': 20}: 957797.864155\n",
"2017-06-02 16:13:08.744000\t{'rsiLength': 5, 'atrMa': 30, 'atrLength': 20}: 957797.864155\n",
"2017-06-02 16:13:08.744000\t{'rsiLength': 5, 'atrMa': 20, 'atrLength': 18}: 883361.518728\n",
"2017-06-02 16:13:08.744000\t{'rsiLength': 5, 'atrMa': 25, 'atrLength': 18}: 883361.518728\n",
"2017-06-02 16:13:08.744000\t{'rsiLength': 5, 'atrMa': 30, 'atrLength': 18}: 883361.518728\n",
"2017-06-02 16:13:08.744000\t{'rsiLength': 5, 'atrMa': 20, 'atrLength': 16}: 790520.582818\n",
"2017-06-02 16:13:08.744000\t{'rsiLength': 5, 'atrMa': 25, 'atrLength': 16}: 790520.582818\n",
"2017-06-02 16:13:08.744000\t{'rsiLength': 5, 'atrMa': 30, 'atrLength': 16}: 790520.582818\n",
"2017-06-02 16:13:08.745000\t{'rsiLength': 5, 'atrMa': 20, 'atrLength': 14}: 768931.704634\n",
"2017-06-02 16:13:08.745000\t{'rsiLength': 5, 'atrMa': 25, 'atrLength': 14}: 768931.704634\n",
"2017-06-02 16:13:08.745000\t{'rsiLength': 5, 'atrMa': 30, 'atrLength': 14}: 768931.704634\n",
"2017-06-02 16:13:08.745000\t{'rsiLength': 5, 'atrMa': 20, 'atrLength': 12}: 758396.03149\n",
"2017-06-02 16:13:08.745000\t{'rsiLength': 5, 'atrMa': 25, 'atrLength': 12}: 758396.03149\n",
"2017-06-02 16:13:08.745000\t{'rsiLength': 5, 'atrMa': 30, 'atrLength': 12}: 758396.03149\n"
]
},
{
"ename": "NameError",
"evalue": "name 'start' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-11-19c5bd4ce28f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[0mengine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrunParallelOptimization\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mAtrRsiStrategy\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msetting\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[1;32mprint\u001b[0m \u001b[1;34mu'耗时:%s'\u001b[0m \u001b[1;33m%\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mstart\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'start' is not defined"
]
}
],
"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
}