diff --git a/examples/CtaBacktesting/.ipynb_checkpoints/backtesting_IF-checkpoint.ipynb b/examples/CtaBacktesting/.ipynb_checkpoints/backtesting_IF-checkpoint.ipynb index b6b586ee..008c1e94 100644 --- a/examples/CtaBacktesting/.ipynb_checkpoints/backtesting_IF-checkpoint.ipynb +++ b/examples/CtaBacktesting/.ipynb_checkpoints/backtesting_IF-checkpoint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -11,7 +11,7 @@ "%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\n", + "from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy\n", "#from vnpy.trader.app.ctaStrategy.strategy.strategyMultiTimeframe import MultiTimeframeStrategy\n", "from vnpy.trader.app.ctaStrategy.strategy.strategyMultiSignal import MultiSignalStrategy" ] @@ -39,14 +39,14 @@ "# 设置回测使用的数据\n", "engine.setBacktestingMode(engine.BAR_MODE) # 设置引擎的回测模式为K线\n", "engine.setDatabase(MINUTE_DB_NAME, 'IF0000') # 设置使用的历史数据库\n", - "engine.setStartDate('20100101') # 设置回测用的数据起始日期" + "engine.setStartDate('20130101') # 设置回测用的数据起始日期" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -60,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": { "collapsed": false }, @@ -75,25 +75,11 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2017-12-15 23:01:54.728000\t开始载入数据\n", - "2017-12-15 23:01:54.765000\t载入完成,数据量:0\n", - "2017-12-15 23:01:54.765000\t开始回测\n", - "2017-12-15 23:01:54.765000\t策略初始化完成\n", - "2017-12-15 23:01:54.765000\t策略启动完成\n", - "2017-12-15 23:01:54.765000\t开始回放数据\n", - "2017-12-15 23:01:54.766000\t数据回放结束\n" - ] - } - ], + "outputs": [], "source": [ "# 运行回测\n", "engine.runBacktesting() # 运行回测" @@ -139,23 +125,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2018-01-08 17:21:35.783000\t------------------------------\n", + "2018-01-08 17:21:35.784000\t优化结果:\n", + "2018-01-08 17:21:35.784000\t参数:{'rsiLength': 5, 'atrMa': 20, 'atrLength': 12},目标:0\n", + "2018-01-08 17:21:35.784000\t参数:{'rsiLength': 5, 'atrMa': 25, 'atrLength': 12},目标:0\n", + "2018-01-08 17:21:35.784000\t参数:{'rsiLength': 5, 'atrMa': 30, 'atrLength': 12},目标:0\n", + "2018-01-08 17:21:35.784000\t参数:{'rsiLength': 5, 'atrMa': 20, 'atrLength': 14},目标:0\n", + "2018-01-08 17:21:35.784000\t参数:{'rsiLength': 5, 'atrMa': 25, 'atrLength': 14},目标:0\n", + "2018-01-08 17:21:35.784000\t参数:{'rsiLength': 5, 'atrMa': 30, 'atrLength': 14},目标:0\n", + "2018-01-08 17:21:35.784000\t参数:{'rsiLength': 5, 'atrMa': 20, 'atrLength': 16},目标:0\n", + "2018-01-08 17:21:35.784000\t参数:{'rsiLength': 5, 'atrMa': 25, 'atrLength': 16},目标:0\n", + "2018-01-08 17:21:35.784000\t参数:{'rsiLength': 5, 'atrMa': 30, 'atrLength': 16},目标:0\n", + "耗时:214.858999968\n" + ] + } + ], "source": [ "# 优化配置\n", "setting = OptimizationSetting() # 新建一个优化任务设置对象\n", - "setting.setOptimizeTarget('capital') # 设置优化排序的目标是策略净盈利\n", - "setting.addParameter('atrLength', 12, 20, 2) # 增加第一个优化参数atrLength,起始12,结束20,步进2\n", + "setting.setOptimizeTarget('totalNetPnl') # 设置优化排序的目标是策略净盈利\n", + "setting.addParameter('atrLength', 12, 16, 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", "start = time.time()\n", - "engine.runParallelOptimization(AtrRsiStrategy, setting)\n", + "resultList = engine.runParallelOptimization(AtrRsiStrategy, setting)\n", "print u'耗时:%s' %(time.time()-start)" ] }, @@ -166,7 +171,11 @@ "collapsed": true }, "outputs": [], - "source": [] + "source": [ + "# 显示优化的所有统计数据\n", + "for result in resultList:\n", + " print u'参数:%s,目标:%s,统计数据:%s' %(result[0], result[1], result[2])" + ] } ], "metadata": { diff --git a/examples/CtaBacktesting/backtesting_IF.ipynb b/examples/CtaBacktesting/backtesting_IF.ipynb index f48b87fc..c0a3849a 100644 --- a/examples/CtaBacktesting/backtesting_IF.ipynb +++ b/examples/CtaBacktesting/backtesting_IF.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -11,7 +11,7 @@ "%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\n", + "from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy\n", "#from vnpy.trader.app.ctaStrategy.strategy.strategyMultiTimeframe import MultiTimeframeStrategy\n", "from vnpy.trader.app.ctaStrategy.strategy.strategyMultiSignal import MultiSignalStrategy" ] @@ -39,14 +39,14 @@ "# 设置回测使用的数据\n", "engine.setBacktestingMode(engine.BAR_MODE) # 设置引擎的回测模式为K线\n", "engine.setDatabase(MINUTE_DB_NAME, 'IF0000') # 设置使用的历史数据库\n", - "engine.setStartDate('20100101') # 设置回测用的数据起始日期" + "engine.setStartDate('20130101') # 设置回测用的数据起始日期" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -75,25 +75,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2017-12-15 23:03:42.343000\t开始载入数据\n", - "2017-12-15 23:03:42.364000\t载入完成,数据量:39389\n", - "2017-12-15 23:03:42.364000\t开始回测\n", - "2017-12-15 23:03:42.364000\t策略初始化完成\n", - "2017-12-15 23:03:42.364000\t策略启动完成\n", - "2017-12-15 23:03:42.364000\t开始回放数据\n", - "2017-12-15 23:03:46.010000\t数据回放结束\n" - ] - } - ], + "outputs": [], "source": [ "# 运行回测\n", "engine.runBacktesting() # 运行回测" @@ -101,52 +87,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2017-12-15 23:03:46.017000\t计算按日统计结果\n", - "2017-12-15 23:03:46.369000\t------------------------------\n", - "2017-12-15 23:03:46.369000\t首个交易日:\t2010-04-16\n", - "2017-12-15 23:03:46.369000\t最后交易日:\t2010-11-23\n", - "2017-12-15 23:03:46.370000\t总交易日:\t146\n", - "2017-12-15 23:03:46.370000\t盈利交易日\t63\n", - "2017-12-15 23:03:46.370000\t亏损交易日:\t83\n", - "2017-12-15 23:03:46.370000\t起始资金:\t1000000\n", - "2017-12-15 23:03:46.370000\t结束资金:\t988,845.07\n", - "2017-12-15 23:03:46.370000\t总收益率:\t-1.12\n", - "2017-12-15 23:03:46.371000\t总盈亏:\t-11,154.93\n", - "2017-12-15 23:03:46.371000\t最大回撤: \t-241,691.12\n", - "2017-12-15 23:03:46.371000\t总手续费:\t242,094.93\n", - "2017-12-15 23:03:46.371000\t总滑点:\t541,680.0\n", - "2017-12-15 23:03:46.371000\t总成交金额:\t8,069,830,980.0\n", - "2017-12-15 23:03:46.371000\t总成交笔数:\t7,039.0\n", - "2017-12-15 23:03:46.371000\t日均盈亏:\t-76.4\n", - "2017-12-15 23:03:46.371000\t日均手续费:\t1,658.18\n", - "2017-12-15 23:03:46.371000\t日均滑点:\t3,710.14\n", - "2017-12-15 23:03:46.371000\t日均成交金额:\t55,272,814.93\n", - "2017-12-15 23:03:46.371000\t日均成交笔数:\t48.21\n", - "2017-12-15 23:03:46.371000\t日均收益率:\t-0.0%\n", - "2017-12-15 23:03:46.371000\t收益标准差:\t3.01%\n", - "2017-12-15 23:03:46.371000\tSharpe Ratio:\t-0.01\n" - ] - }, - { - "data": { - "image/png": "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\npXM17B655ppr2L17N4mJiSiKQkhICOvWreP999/noYceQq/Xk5GRwe23345KpWLt2rVs3LgRRVFY\nuXIlhYWF/PDDD6xYsYJTp04RHh7OAw88gF6v55133mHt2rUoikJVVRULFixwi/YFp9vZarUGfDME\nAoFAIBAIznR8En8CgUAgEAgEguAk6CMmFEXhrrvuorq6msWLF/Pdd98N9pIGDbvdzi233MLChQuZ\nN28eb731Ft9++y2XXHIJl156KXffffdgL3FQ+eGHH5g8eTL79+8X+3Kaxx57jOrqaubOncsLL7wg\n9gXn52jZsmVUV1dz6aWXDvv3y6effsqiRYsAutyHv/71r8ydO5fq6mreeeedQVrpwNJxX/7zn/+w\ncOFCFi9ezJVXXklNTQ0g9qWNV1991ZUhBMS+1NTUcM0117Bo0SIuueQSl24Z0H1RgpzXX39dufXW\nWxVFUZTt27crV1999SCvaPB44YUXlF/96leKoijKiRMnlMmTJytXXXWV8vHHHyuKoih33nmn8sYb\nbwzmEgcNm82mXHvttco555yjfPXVV2JfFEX56KOPlKuuukpRFEVpaGhQHnnkEbEviqK8+eabyo03\n3qgoiqJs2rRJue6664btvjz++OPK+eefr8yfP19RFMXrPhw9elQ5//zzFZvNptTV1Snnn3++0tLS\nMpjL7nc678ull16qfPHFF4qiKMqGDRuUe++9V+zLaXbu3KlcdtllrjaxL4py6623Kv/3f/+nKIqi\nfPjhh8o777wz4PsS9JY/kQOwnXPPPZcbbrgBAIfDgUqlYteuXa5o7LZ8isOR++67jwULFhATE4Oi\nKGJfgPfee4+srCyuueYarr76aiZPniz2BUhNTcXhcKAoCnV1dajV6mG7LykpKaxbt871eOfOnW77\n8P777/PZZ58xduxY1Go1ZrOZ1NRU1/nsM5XO+/LQQw+5gh/tdjtarVbsC1BbW8uaNWtc6eAAsS/A\ntm3b+O9//8vll1/O3//+d0pLSwd8X4Je/NXX13vNATgcMRgMGI1G6uvrueGGG/jZz36G0uFIZ1s+\nxeHGiy++SGRkJOXl5a796PgeGa77Ultby44dO3j44YdZtWoVy5cvF/uC83kfOHCAGTNmcOedd7Jo\n0aJh+zmqrKxEpVK5Hnfeh845W6E9P+uZTOd9iYqKApxf6s888ww/+tGPPL6bhtu+tLa2cvvtt3Pr\n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\nABzlpGv+unfvrkWLFlndn376qd577z1dd911mjVrlqqrq7VlyxYQqF2LAAAgAElEQVTl5+fL5XIp\nOTlZeXl52rZtm0pLS612OIMGDdKGDRtUVVUlj8ejnJwcSdIll1yidevWqbS0VAMGDJB0/NlbXq/X\nqikEAABAy5x0+Bs6dKiio6Ot7vPOO0+/+93v9PTTTys3N1clJSWqqqpSSkqK1U9iYqKqqqpUXV2t\n5ORkSVJSUpIqKyttnwV+3tA4AAAA0HJBu9v3sssus0LaZZddpt///ve66KKLbEGturpaqampSk5O\nth6u6gt3SUlJ9fpNS0tTTEyM1a9//w0pLS0N1uwAAAC0uvz8/DafZtDC36RJk3TPPfeoT58+Wr9+\nvc4991z16dNHjzzyiGpqanTs2DF99dVXOuuss3TBBRdo9erV6tOnj1avXq1+/fopOTlZsbGxKi8v\nV05OjtauXaspU6YoOjpaDz30kCZOnKhdu3bJNE2lp6efsByBCzErJ0vunW5lds3U7m92B2t2AQAA\nTkmoKq2CFv7mzJmj++67TzExMerUqZPmzZunpKQkFRcXq6ioSKZpaurUqYqNjVVhYaFmzJihoqIi\nxcbGauHChZKkuXPnavr06fJ6vRowYID69u0r6Xigu/baa2Wapu69994Wlcu90y3Nkdxz3MGaVQAA\ngIjVrp7zV1paWq/mzzAMaY6kOSd+ij8AAEBbayi3tAVe7wYAAOAghD8AAAAHIfwBAAA4COEPAADA\nQQh/AAAADkL4AwAAcBDCHwAAgIMQ/gAAAByE8AcAAOAghD8AAAAHIfwBAAA4COEPAADAQQh/AAAA\nDkL4AwAAcBDCHwAAgIMQ/gAAAByE8AcAAOAghD8AAAAHIfwBAAA4COEPAADAQQh/AAAADkL4AwAA\ncBDCHwAAgIMQ/gAAAByE8AcAAOAghD8AAAAHIfwBAAA4COEPAADAQQh/AAAADkL4AwAAcJBTCn+b\nN29WcXGxJKmsrExFRUW67rrrNHfuXKuflStXatSoURo7dqzee+89SdKxY8d06623aty4cbrpppt0\n4MABSdKmTZt0zTXXqKioSCUlJdY4SkpKNGbMGBUWFmrLli2nUmQAAABHO+nwt2TJEs2aNUsej0eS\ntGDBAk2dOlVPP/20vF6v3n77be3bt0/Lli3TihUrtGTJEi1cuFAej0fPPfecevbsqWeeeUZXX321\nHn/8cUnSnDlz9PDDD+vZZ5/Vli1btG3bNm3dulUbN27UqlWr9PDDD2vevHnBmXMAAAAHOunw1717\ndy1atMjq/vTTT9WvXz9J0qBBg/T+++9ry5Ytys/Pl8vlUnJysvLy8rRt2zaVlpZq0KBBVr8bNmxQ\nVVWVPB6PcnJyJEmXXHKJ1q1bp9LSUg0YMECS1KVLF3m9XqumEAAAAC1z0uFv6NChio6OtrpN07T+\nTkpKUlVVlaqrq5WSkmJ9npiYaH2enJxs9VtZWWn7LPDzhsYBAACAlnMFa0RRUT/kyOrqaqWmpio5\nOdkW1Pw/r66utj5LSUmxAqN/v2lpaYqJibH69e8fAAAALRe0u3179+6tjz76SJK0Zs0a5efnq0+f\nPiotLVVNTY0qKyv11Vdf6ayzztIFF1yg1atXS5JWr16tfv36KTk5WbGxsSovL5dpmlq7dq3y8/N1\nwQUXaO3atTJNUxUVFTJNU+np6cEqNgAAgKMEreZvxowZuueee+TxeNSjRw9dccUVMgxDxcXFKioq\nkmmamjp1qmJjY1VYWKgZM2aoqKhIsbGxWrhwoSRp7ty5mj59urxerwYMGKC+fftKkvLz83XttdfK\nNE3de++9wSoyAACA4ximf2O9CFdaWqr8/HzbZ4ZhSHMkzbG3SwQAAAilhnJLW+AhzwAAAA5C+AMA\nAHAQwh8AAICDEP6ACJGVlSfDMJSVlRfqogAAIljQ7vYF0Lrc7h2STLndRqiLAgCIYNT8AQAAOAjh\nDwAAwEEIfwAAAA5C+AMAAHAQwh8AAICDEP4AAAAchPAHAADgIIQ/AAAAByH8AQAAOAjhDwAAwEEI\nfwAAAA5C+AMAAHAQwh8AAO1MVlaWDMNQVlZWqIuCMET4AwCgnXG73bb/AX+EPwAAAAch/AEAADgI\n4Q8AACBIsrLyvm9vmRfqopyQK9QFAAAAaC/c7h2STLndRqiLckLU/AEAEAaycr6/QzeHO3TRugh/\nAACEAfdOtzTn+/+BVkT4AwAAjpb3/XMR8xzyXETa/AEAAEfb4XbLlGQ45LmI1PwBAAA4COEPAADA\nQQh/AAAADkL4AwAAjuL0x+oE/YaPX/3qV0pOTpYk5eTk6Oabb9add96pqKgonXXWWZo9e7YkaeXK\nlVqxYoViYmJ0880369JLL9WxY8d0xx136Ntvv1VycrIeeOABZWRkaNOmTZo/f75cLpf69++vKVOm\nBLvYAADAIazH6sxp3g0e3bK6qdxdrtzMXJXtLmvdwrWBoNb81dTUSJKWLl2qpUuXav78+VqwYIGm\nTp2qp59+Wl6vV2+//bb27dunZcuWacWKFVqyZIkWLlwoj8ej5557Tj179tQzzzyjq6++Wo8//rgk\nac6cOXr44Yf17LPPasuWLdq2bVswix3xIuFVMgAARKpyd7ne1bsqd5eHuihBEdTwt23bNh0+fFiT\nJk3ShAkTtHnzZm3dulX9+vWTJA0aNEjvv/++tmzZovz8fLlcLiUnJysvL0/btm1TaWmpBg0aZPW7\nYcMGVVVVyePxKCcnR5J0ySWX6P333w9mscNOt27Hq6O7dWtedfQPr5LZ0boFAwAAES+ol33j4+M1\nadIkjRkzRtu3b9cNN9wg0zSt75OSklRVVaXq6mqlpKRYnycmJlqf+y4ZJyUlqbKy0vaZ7/Nvvvkm\nmMUOO+Xlbr37rjR4sDOeNwQAANpOUGv+8vLyNGLECOvv9PR0ffvtt9b31dXVSk1NVXJysqqqqhr8\nvLq62vosJSXFCoyB/SI4umV1O17LmNUt1EUBAEQAzhuRL6jh74UXXtADDzwgSXK73aqqqtKAAQP0\n4YcfSpLWrFmj/Px89enTR6WlpaqpqVFlZaW++uornXXWWbrgggu0evVqSdLq1avVr18/JScnKzY2\nVuXl5TJNU2vXrlV+fn4wi+1o7a0dAwCgdXHeiHxBvew7evRozZw5U0VFRYqKitIDDzyg9PR0zZo1\nSx6PRz169NAVV1whwzBUXFysoqIimaapqVOnKjY2VoWFhZoxY4aKiooUGxurhQsXSpLmzp2r6dOn\ny+v1asCAAerbt28wiw0AAOAYQQ1/MTExeuihh+p9vmzZsnqfjRkzRmPGjLF9Fh8frz/+8Y/1+u3b\nt69WrFgRvIICAAA4FA95BgAAcBDCH8JSVtb3T1/PcubT14FQ4JmhgDME/Q0fQDC43W7b/wBa3w/P\nDDVCXRQArYiaPwCO0NKHpwNAe0X4Q9A4/UXZCG++h6eXl1ObDMDZCH8IGutF2Ts5uQIAEK4IfwAA\nAA5C+AOAZqBZA4D2gvAHAM1As4bG8b5XIHIQ/loJtQQAnIT3vQKRg/DXSqglcKa87x9OncfDqQFE\nCCornIfwBwTRDrdb5vf/A0AkoLLCeQh/pyArK4/XIJ0C2ghFDl77BaegFgxOQPg7BW73ju9fh4ST\n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\nBdq7zMzucrvD62YHEP7QQuzIOFVlZbR/BZwiHG92AOEvZDJzc+WOwCemsyMDLUdtJ4BwEtTwN2jQ\nIOXl5UmSLrjgAt1+++3atGmT5s+fL5fLpf79+2vKlCmSpJKSEq1evVoul0szZ85U3759deDAAU2f\nPl3Hjh1T586dtWDBAsXFxemdd97R448/LpfLpVGjRmnMmDHBLHZI8MR0wDmo7QQQToIW/srKynTu\nuedq8eLFts/nzJmjkpIS5eTk6MYbb9S2bdvk9Xq1ceNGrVq1Srt27dJvf/tbPf/881q0aJGGDx+u\nkSNH6qmnntLy5cs1btw4PfDAA3rxxRcVFxenwsJC/fznP1eHDh2CVXQAAADHCNqjXj755BO53W6N\nHz9eN910k7Zv366qqip5PB7l5ORIki655BKtW7dOpaWlGjBggCSpS5cu8nq92r9/v/71r39p4MCB\nko7XIq5fv15ffvmlunfvruTkZMXExCg/P18fffRRsIoNAADgKCdV8/f888/rr3/9q+2z2bNn66ab\nbtLll1+u0tJSTZ8+XYsWLVJycrLVT1JSksrLyxUfH6/09HTb51VVVaqurlZKSor1WWVlpe0z/8/D\nDTdCAACASHBS4W/06NEaPXq07bOjR48qOjpakpSfn6+9e/daoc6nurpaaWlpiomJUXV1tfV5VVWV\nUlNTrf47dOhghb7k5OR640hNTT2ZYrcqboQAAACRIGiXfUtKSqzawG3btqlLly5KTk5WbGysysvL\nZZqm1q5dq/z8fF1wwQVau3atTNNURUWFTNNUenq6LrzwQq1Zs0aStGbNGvXr109nnHGGduzYoUOH\nDqmmpkYfffSRzj///GAVGwAA4KRlZmba/o8EQbvh48Ybb9Qdd9xh3cG7YMECScdv+Jg+fbq8Xq8G\nDBigvn37SjpeO3jttdfKNE3de++9kqTf/OY3mjFjhlauXKmMjAwtXLjQuht44sSJMk1TY8aMUefO\nnYNVbAAAgJO2e3fk3c1vmKZphroQwVJaWqr8/PxQFwMnYBiG9O670uDBauvNzjAMSWrz6QIATk5W\nt25yl5crMze3zR+P1tT5yjAM39endF4JVW7hIc8AACDshPJ5uJH6IobmIvyhzbT3nQkA0D609xcx\nEP7QZtr7zgQAQCQI2t2+AAAACH+EPwAAAAch/AEAADgI4Q8AAMBBCH8AAAAOQvgDAABwEMIfAACA\n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\nJSXpl7/8pfWdb9v3b9rh21+k+rXeUVFRtlrE2NhYq0bUdznG/3Kiry2UdHzd+NceBbYVjY6OttZ7\nTEyMraY1JibGtp8lJCTYtm//8fqWn7/A7dN/PTe0/TU2rP/+K8l2yS47O9s2/4HbZ/fu3W3j+tnP\nfmb7PvBYEbi9+e8XcXFx9doq+pct8FJ3dHS0rdbWv2yBl/P8mwZJ9mYbknTZZZfZuv3L5Tsp+8qW\nkZFhOy4FHhsaagvqK4vvGbe+5RAfH99o+2zJ3nTDdzL3H7fv2OOrDfZ9f8YZZ9j299/97ne2aZ11\n1lm2/cJ/m+vdu7dte01MTLRd+p4+fbptn3zqqadsZZ4yZYr1t8vlsq3XwON8Xl6ebds/55xzbN2D\nBg2yNZfyb46SlJRka07VoUMH2/6fkpKin/70p7b58t9HMzIybNvN3Xffbbt0O2HCBKs7JyfHdi6N\nj4+31ca7XC5rW/BdzvcdU6Ojo9W9e3ervWNmZqZycnLUoUMHJSQkKC4uTj169FBMTIx+9KMf6eKL\nL1ZKSop+/OMfKycnxxqHy+VSQUGBdYk/JydHZ555pkaMGKHs7GxdddVVGjBggOLi4lRcXKzBgwcr\nLS1NvXr10p133qnRo0fr/PPP17x58yT9cBxq6g1obVrzd//99+v111+3GjiWlZWppqZGHo9Hpmla\nbbp8tUx1dXVWO6OjR49alxh8CTwmJkY1NTXWTKakpNju2JHq/2rwpfXA/wO11a9/OFek1EqEy74Q\nLuUAnCRS97uWHF+b6te3DHy1enFxcTp69Ki6desmt9tttevMysqy7sb97rvvFBcXJ6/Xa90YeejQ\nIaWnp8vj8ahXr176+uuvdejQIZ1++ulKTEzUoUOH1K1bN6WkpOjKK6/U/fffL6/Xq7KyMnXp0kXV\n1dXWeDt06KA9e/YoNzdXnTp10o4dO9S5c2fFxMRo1KhRGjNmTKPzzHP+AAAAHKRNL/sCAAAgtAh/\nAAAADkL4AwAAcBDCHwAAgIMQ/gAAAByE8AcAAOAghD8A0PHXTA0ZMuSE369cuTIi3mwDAE0h/AGA\nGn6HsL8nnniC8AegXXA13QsAtE+HDx/W9OnTVVlZab0y7aOPPlJJSYlM09Thw4e1cOFCffTRR9q3\nb5+mTp2qkpISPfzwwyotLVVdXZ0mTJigK664IsRzAgDNR80fAMdavny5evbsqWXLlmns2LEyTVNf\nfPGFHnroIS1dulRDhw7VG2+8odGjR6tTp0565JFHtGbNGu3cuVPPPPOMli5dqieeeEJVVVWhnhUA\naDZq/gA41vbt23XppZdKkvr27auYmBh17txZ9913n5KSkuR2u3XhhRdKOn5Z2DRNff755/rkk080\nfvx46x3k33zzjXr16hXCOQGA5iP8AXCsHj166OOPP9aQIUO0detWeTwe3XvvvXrrrbeUmJioO++8\n0+o3OjpaXq9XZ5xxhn7yk59o3rx5Mk1Tjz/+uLp16xbCuQCAluGyLwDHKiwsVHl5ucaNG6fnnntO\ncXFxGjFihIqKilRUVKTDhw9rz549kqT8/HzdeOONGjJkiBITEzVu3DiNGjVKhmEoMTExxHMCAM1n\nmKZphroQAAAAaBvU/AEIip07d6p3794qKChQQUGBRowYoVGjRunll19u1vAFBQWqqqrSSy+9pJtv\nvrnZ0/3www913nnnqaCgQL/61a80cuRIjR49Wu+++26Tww4ZMkSffvppvc+Li4v185//XAUFBRo5\ncqSuuuoqzZ07V9XV1ZKkTz75RLfddluj4/5//+//afbs2Q1+5z/8zJkz9ec//7nJsgaaNGmSDh48\nKEm66aab9OWXX7Z4HACciTZ/AIImPj5eL730ktVdUVGhCRMmKCkpSUOHDm10WP/hWqpbt2624bdt\n26bCwkK98847ysjIOKlx3nnnnVaZ6+rqdN9992natGl64okn9KMf/Uh//OMfGx3+P//5j9xud4Pf\nNWf4pqxbt876+8knnzylcQFwFmr+ALSa7Oxs3XrrrVqyZIkk6euvv9bEiRM1duxYDRkyRJMnT1ZN\nTY0kqVevXlZNliTt2rVLF154oe0xKpdffrn+/e9/NzndXr16KSEhQRUVFSopKdHMmTM1adIkDRs2\nTOPGjdPevXubHId/i5jo6GjNnDlTGzdu1Ndff60PP/xQw4cPlyRt3LhRY8aM0ahRozR69Gi99dZb\n2r17tx577DGVlpbqrrvu0ocffqirr75aY8eO1ciRI7V27VpreN84rr32Wl111VWaP3++vF5vg8vE\n1z1z5kxJ0vjx47V7925bDeaKFSs0fPhwjRw5UpMmTdKOHTskHa9h/P3vf6/x48frF7/4hW6++WYd\nOXKkyeUAoP0h/AFoVb169dLnn38uSVq1apUKCgq0fPlyvfnmmyovL9fq1aslqd7bNbp06aL+/fvr\n1VdflSStX79eGRkZOvvss5uc5ptvvqmoqCideeaZkqTS0lI99thjev3115WamqoVK1a0eD7i4uKU\nl5dnzYtPSUmJfv3rX+uFF17Q/fffrw0bNigrK0u33nqr8vPzNX/+fEnSF198oUcffVQvv/yyYmNj\nbeNwu91aunSpXn75ZW3btk0rV65scJn4uhcsWCBJWrZsmbKysqzvN2zYoD/96U9atmyZXn75ZV11\n1VW65ZZbrO+3bt2qP/3pT3rttde0Z88evfHGGy1eDgAiH+EPQKsyDEMJCQmSpDvuuEMZGRlasmSJ\n5syZo71791rt6Bq696yoqEirVq2SdPzduoWFhQ1Oo6yszGqfN3z4cK1atUqLFy9WXFycJOmiiy6y\n7sjt3bu3rTatpfMSHx9v+2zYsGGaN2+epk+frk8//VS33357g8NmZWXZgpq/q6++WnFxcXK5XBox\nYoTef/99SfWXSVPd//znPzVs2DClp6dLOt6Ocs+ePdq5c6ckaeDAgXK5XHK5XOrZs6e+++67Zs45\ngPaENn8AWtWWLVvUs2dPSdLtt98ur9erYcOGafDgwdq1a5fVX0Pv1e3fv7+OHDmi9evXa+PGjfrD\nH/7Q4DQC2/wF8g9sjb2/tzFHjhzRl19+qZ49e6q8vNz6/Nprr9WQIUO0bt06rVmzRiUlJXrllVfq\nDd/Y42Cion74HW6aplwul61bkjweT73hAufFd7k48LPa2lpJ9ZcDD3sAnImaPwBBExgmvv76ay1e\nvFgTJ06UJL3//vuaPHmyhg0bJtM0tXnzZtXV1TU4rE9hYaFmzZql4cOH17tc2laOHj2qBQsW6NJL\nL1WXLl1s340dO1Zbt27VyJEjNW/ePFVWVurQoUOKjo62QldTXnvtNdXU1OjYsWN66aWXNGjQIEnS\naaedpk8++UTS8UvZ/mHP5XLVC4QDBw7U66+/rv3790uSXnjhBWVkZKh79+4nPe8A2h9q/gAETU1N\njQoKCiQdr1mKi4vT9OnTrTBz++23a/LkyUpPT1dCQoIuuugilZWVWf03ZOTIkXrwwQc1duzYoJe3\nsVrABx98UIsXL5ZhGKqrq1P//v01a9asev3dcccduv/++/XHP/5RhmFoypQpys7O1gUXXKBHH31U\nv/3tb1VcXNxoOXJyclRUVKQjR45o6NChGjlypCTp7rvv1ty5c5WamqoBAwaoU6dO1jCXXXaZioqK\ntGjRIms++vfvr+uvv17XX3+9JCkjI4M7gQHUE7YPed68ebMeeughLVu2zPrs1Vdf1TPPPKPly5eH\nsGQA2tLf//53vfLKK3rqqadCXRQAaBfCsuZvyZIl+tvf/qakpCTrs61bt+qFF14IYakAtLXi4mLt\n379f//3f/x3qogBAuxGWbf66d++uRYsWWd0HDhzQo48+qrvvvjuEpQLQ1pYtW6b//d//VY8ePUJd\nFABoN8Iy/A0dOlTR0dGSjt+pNmvWLN15551KSEjg7jQAAIBTEJbhz9+nn36qsrIyzZkzR9OmTdOX\nX35pPeAUAAAALROWbf58TNNUnz59rCf879y5U9OmTbNebRSotLS0LYsHAABwSvLz89t8mmEd/k7m\nYayhWIg4dRUVFcrOzg51MULi+Hbe3OYMzXswb2uMszFOXn/tAesvcrHuIluoKq3C9rJv165d6z3S\npaHPAAAA0HxhG/4AAAAQfIQ/AAAAByH8AQAAOAjhDwAAwEEIfwAAAA5C+AMAAHAQwh8AAICDEP4A\nAAAchPAHAADgIIQ/AAAAByH8AQAAOAjhDwAAwEEIfwAAAA5C+AMAAHAQwh8AAICDEP4AAAAchPAH\nAADgIIQ/AAAAByH8AQAAOAjhDwAAwEHCNvxt3rxZxcXFkqTPPvtM48aN0/jx4/Vf//Vf2r9/f4hL\nBwAAEJnCMvwtWbJEs2bNksfjkSTNnz9f9957r5YuXaqhQ4fqqaeeCnEJAQAAIlNYhr/u3btr0aJF\nVvcjjzyis88+W5JUW1uruLi4UBUNAAAgooVl+Bs6dKiio6Ot7o4dO0qS/vWvf+nZZ5/VhAkTQlQy\nAACAyOYKdQGa67XXXtOTTz6pp556ShkZGSfsr6Kiog1LhWCprKxk3TVT8JdTnAzDaLKvTp1ytWnT\nhga/Y/1FNtZf5GLd4WRERPj729/+ppUrV2rZsmVKTU1ttN/s7Ow2KhWCqaKignXXTMFfTsckmU32\ntXevccJps/4iG+svcrHuItuuXbtCMt2wD39er1fz589Xdna2Jk+eLMMwdNFFF2nKlCmhLhoAAEDE\nCdvw17VrVy1fvlyS9MEHH4S4NAAAAO1DWN7wAQAAgNZB+AMAAHAQwh8AAICDEP4AAAAchPAHAADg\nIIQ/AAAAByH8AQAAOAjhDwAAwEEIfwAAAA5C+AMAAHAQwh8AAICDEP4AAAAchPAHAADgIIQ/AAAA\nByH8AQAAOAjhDwAAwEEIfwAAAA5C+AMAAHAQwh8AAICDEP4AAAAcJGzD3+bNm1VcXCxJKisrU1FR\nka677jrNnTs3xCUDAACIXGEZ/pYsWaJZs2bJ4/FIkhYsWKCpU6fq6aefltfr1dtvvx3iEgIAAESm\nsAx/3bt316JFi6zuTz/9VP369ZMkDRo0SOvXrw9V0QAAACJaWIa/oUOHKjo62uo2TdP6OykpSZWV\nlaEoFgAAQMRzhboAzREV9UNGra6uVmpq6gn7raioaIsiIcgqKytZd80UyuV0ommfyvo7//yLtXdv\neZP9deqUq02bNpzUNNA49r/IxbrDyYiI8Ne7d2999NFH+vGPf6w1a9bo4osvPmG/2dnZbVgyBEtF\nRQXrrplCuZxONO1TWX/Hg5/ZjP4MtpFWwv4XuVh3kW3Xrl0hmW5EhL8ZM2bonnvukcfjUY8ePXTF\nFVeEukgAAAARKWzDX9euXbV8+XJJUl5enpYtWxbiEgEAAES+sLzhAwAAAK2D8AcAAOAghD8AAAAH\nIfwBAAA4COEPAADAQQh/AAAADkL4AwAAcBDCHwAAgIMQ/gAAAByE8AcAAOAghD8AESJOhmE0619W\nVl6oCwsAYSts3+0LAHbHJJnN6tPtNlq3KAAQwaj5AwAAcBDCHwAAgIMQ/gAAAByE8AcAAOAghD8A\nAAAHIfwBAAA4COEPAADAQQh/AAAADhIxD3mura3VjBkztHPnTrlcLt133306/fTTQ10sAACAiBIx\nNX+rV6+W1+vV8uXLdcstt+iRRx4JdZEAAAAiTsSEv7y8PNXV1ck0TVVWViomJibURQIAAIg4EXPZ\nNykpSd98842uuOIKHTx4UE8++WSoiwQAABBxIib8/eUvf9HAgQN1++23y+12a/z48Xr11VcVGxtr\n66+ioiJEJcSpqKysZN01S5wMwwj7aXfqlKtNmza0cnkax/bUfOx/kYt1h5MRMeEvLS1NLtfx4qak\npKi2tlZer7def9nZ2W1dNARBRUUF665Zjkkym9FfawTE5k5b2rvXCPn6DPX0Iwn7X+Ri3UW2Xbt2\nhWS6ERP+rr/+et11110aN26camtrNW3aNMXHx4e6WAAAABElYsJfYmKiHn300VAXAwAAIKJFzN2+\nAAAAOHWEPwAAAAch/AEAADgI4Q8AAMBBCH8AAAAOQvgDAABwEMIfAACAgxD+AAAAHITwBwAA4CCE\nPwAAAAch/AFAEGVl5ckwjGb9y8rKC3VxAThQxLzbFwAigdu9Q5LZzH6N1i0MADSAmj8AAAAHIfwB\nAAA4COEPAADAQQh/AAAADkL4AwAAcBDCHwAAgIMQ/gAAABwkop7z99RTT+mdd96Rx+NRUVGRRo0a\nFeoiAQAARJSICX8ffvihPv74Yy1fvlyHDx/Wn/70p1AXCQAAIOJETPhbu3atevbsqVtuuUXV1dX6\n3e9+F+oiAQAARJyICX8HDhxQRUWFnnzySZWXl+s3v/mN3njjjVAXCwAAIKJETPhLT09Xjx495HK5\ndPrppysuLk779+9Xhw4dQl00AACAiBEx4S8/P1/Lli3ThAkT5Ha7dfToUWVkZNTrr6KiIgSlw6mq\nrKwM6bo7//yLtXdveZP9deqUq02bNgR1nO1VqPfFUE+/ucKhnKHe/3DyWHc4GRET/i699FJt3LhR\no0ePlmmamj17tgzDqNdfdnZ2CEqHU1VRURHSdXc8pJnN6M9odjmbO06p/nbcHoR6Xwz19JsrHMoZ\n6v0PJ491F9l27doVkulGTPiTpOnTp4e6CAAAABGNhzwDAAA4COEPAADAQQh/AAAADkL4AwAAcBDC\nHwAAgIMQ/gAAAByE8AcAAOAghD8AAAAHIfwBAAA4COEPAADAQQh/iDhZWXkyDKPJf1lZea0w9bhm\nTbuh9047C8sJAMJVRL3bF5Akt3uHJLMZ/bVGsDjWrGkf5+Rgw3ICgHBFzR8AAICDEP4AAAAchPAH\nAADgIIQ/AAAAByH8AQAAOAjhDwAAwEEIfwAAAA5C+AMAAHCQiAp/3377rS699FJ9/fXXoS4KAABA\nRIqY8FdbW6vZs2crPj4+1EUBAACIWBET/v7whz+osLBQnTt3DnVRAAAAIlZEhL8XX3xRp512mgYM\nGCDTbO77QgEAABDIFeoCNMeLL74owzC0bt06bdu2TTNmzNDixYt12mmn1eu3oqIiBCXEqaqsrGyV\ndcf24FRxMgyjyb4MI1GmebhZY2xJvy0RDttoa+1/aH2sO5yMiAh/Tz/9tPV3cXGx5s2b12Dwk6Ts\n7Oy2KhaCqKKiolXWHduDUx2T1PRVAtM0mtVfy/ptOnT6C4dttLX2P7Q+1l1k27VrV0imGxGXff01\n59c8AAAAGhYRNX/+li5dGuoiAAAARKyIq/kDAADAySP8AQAAOAjhDwAAwEEIfwAAAA5C+AMAAHAQ\nwh8AAICDEP4AAAAchPAHAADgIIQ/AAAAByH8AQAAOAjhDwDCXFZWngzDaNa/rKy8Fo+za9eujY4z\nOjopqNMGEFoR925fAHAat3uHJLOZ/RpBH6fXazSr3+ZOG0BoUfMHAADgIIQ/AAAAByH8AQAAOAjh\nDwAAwEEIfwAAAA5C+AMAAHAQwh8AAICDEP4AAAAcJCIe8lxbW6u77rpLO3fulMfj0c0336whQ4aE\nulgAAAARJyLC3yuvvKKMjAw9+OCD+u677zRy5EjCHwAAwEmIiPA3bNgwXXHFFZIkr9crlysiig0A\nABB2IiJFJSQkSJKqqqp022236fbbbw9xiQAAACJTRIQ/Sdq1a5emTJmi6667TldeeeUJ+6uoqGjD\nUjnT+edfrL17y5vVr2EkyjQPN9lfx4452rz5g1MtWj1sDwh3rbGNhnK7b+60m3sc6dQpV5s2bTjV\nYrVblZWVHOfQYoZpmmaoC9GUffv2afz48br33nt18cUXn7C/0tJS5efnt2HJnMkwDEnN3Wya26+h\n5m6KzZ9+64yzNebdueMM9fRDP87mbKMt3edaY5yRsB87UUVFhbKzs0NdDJykUOWWiHjUy5NPPqlD\nhw7p8ccfV3FxscaPH6+amppQFwsAACDiRMRl37vvvlt33313qIsBAAAQ8SKi5g8AAADBQfgDAABw\nEMIfAACAgxD+AAAAHITwBwAA4CCEPwAAAAch/AEAADgI4Q8AAMBBCH8AAAAOEhFv+Ag3Bw8e1OzZ\n96umxtNkv0lJCZo7d5aSkpLaoGQAAACNI/ydhPfff19PPfV3HT16U5P9xsc/ql/9arj69+/fZL9Z\nWXlyu3c0qwyZmd21e/f2ZvUbGeK+f9F7uI8TCCa2+6Y1f36i/n979xfS5NvGAfybbUty+ZtBgmBo\nhUFG+WejgyzpQCnBlyg1U/pHYk7o4JcpKphaavMgj1LBOrDopKToKAiNSvFPaItZ/uug0CxBxITc\nwk3Y9R6EQ3sn2evmNvf9HPnc3jw+t9euy4s9e24DNsNu//nHee6on/5dv/2Xr8adzd//adOmHZib\n+3cF81pWfM5fLyBZ4dz1VNwBwIqVrh1Y6drdcU4iV1rpa/RvXp/uOKcnrTyP7fYNK5rrjvrp3/Xb\nf/lq3PmZPyIiIiI/wuaPiIiIyI+w+SMiIiLyI2z+iIiIiPwImz8iIiIiP8Lmj4iIiMiPsPkjIiIi\n8iM+s8+fiKCyshIfP36ESqVCTU0Ntm/f7unLIiIiyucR3QAABwFJREFUIvIpPvPO34sXL2Cz2fDw\n4UNcvXoVBoPB05dERERE5HN8pvkzGo04fPgwACAmJgYDAwMeviIiIiIi3+MzzZ/ZbMaWLVscxwqF\nAna73YNXREREROR7fOYzf2q1GhaLxXFst9sREOCZ3lWpVMJqfYvg4P/8ce7c3DCUSuUaXBURERHR\nn20QkZX9R2IPa21txatXr2AwGGAymdDY2Ig7d+4smWM0Gj10dURERER/T6vVrvnP9Jnmb/HTvgBg\nMBiwY8cOD18VERERkW/xmeaPiIiIiFbPZx74ICIiIqLV8+oHPtra2vD8+XPU1dUBAPr7+1FTUwOF\nQoGDBw/i8uXLAID6+nq0t7dDoVCgtLQU+/fvx8zMDAoLC2G1WhEaGgqDwYBNmzbh5cuXaGxshEKh\nQFpaGjIyMriBtBslJiYiMjISABAXF4crV67AZDLh5s2bLo8jrT3mjvc5efIk1Go1ACA8PBx6vR4l\nJSUICAhAVFQUKioqAAAtLS149OgRlEol9Ho9jhw5AqvViqKiIkxPT0OtVqO2thYhISHL5iy5Rn9/\nP27duoUHDx7gy5cvbouXsxpLq7c4fsPDw8jLy3P83cvKykJKSor3xU+8VHV1taSkpEhBQYFj7Pjx\n4zI+Pi4iIrm5uTI8PCyDg4Ny/vx5ERGZmJiQtLQ0ERGpqqqSp0+fiohIU1OT3Lt3T+bn5yU5OVlm\nZ2fFZrNJWlqaTE9PS2trq5SUlIiIiMlkkvz8/DVc6fo1NjYmer3+f8bdFUdae8wd72K1WuXEiRNL\nxvR6vfT19YmISHl5ubS1tcnU1JSkpqbK/Py8zM7OSmpqqthsNmlubpbbt2+LiMizZ8+kurpaRJzn\nLLnG3bt3JTU1VTIzM0XEffFarsbS6vwev5aWFmlubl4yxxvj57W3fePj41FZWek4NpvNmJ+fR3h4\nOADg0KFD6OrqgtFoREJCAgAgLCwMdrsd379/x7t37xybQicmJqKnpwefPn1CREQE1Go1lEoldDod\nent7uYG0mwwMDGBychLnzp1DXl4eRkdH3RJHrVaLvr4+j63TnzF3vMvIyAh+/vyJnJwcXLhwAf39\n/RgaGoJOpwPwK4e6u7vx/v17aLVaKBQKqNVqREZGYmRkBEajEYmJiY65b968cZqz3d3dHlvjehMR\nEYGGhgbH8eDgoMvjtVyNnZmZWePVrj/O4vf69WucOXMGZWVlsFgsXhk/j9/2ffz4Me7fv79kzGAw\nICUlBb29vY4xi8XiuJUBAEFBQRgfH0dgYCA0Gs2ScbPZDIvF4tgUOigoCLOzs0vGAGDz5s1Oxxc2\nkPbUPoK+yFkcKyoqkJeXh6NHj8JoNKKwsBANDQ0uj+PCOK295TZfZ+54RmBgIHJycpCRkYHR0VHk\n5uZCFj3T5yyvgF+1cGF8IT8X59vvOfv169e1W9Q6l5ycjG/fvjmO3REvZzV24RwhISHuXN6693v8\nYmJicOrUKURHR6OpqQn19fXYs2eP18XP481feno60tPT/zhvIQkWWCwW/PPPP1AqlUs2fzabzQgO\nDnbM37p1qyNx1Gq103N40wbSvspZHOfm5rBx40YAv/Yxmpqaclscg4OD3bxCcoa5410iIyMRERHh\n+Fqj0WBoaMjx/YVcWS6HFsdzId+c5SzzzX0W54+r4uWsxv7eUJJrJCUlOX6vSUlJqK6uxoEDB7wu\nfj5TpdVqNVQqFcbHxyEi6OzshFarRVxcHDo7OyEimJiYgIhAo9EgPj4eHR0dAICOjg7odDrs3LkT\nY2Nj+PHjB2w2G96+fYvY2FjExcWhvb0dAGAymbB7925PLnXdqK+vd7wbODIygrCwMLfEsa+vD7Gx\nsZ5cqt+Kj49n7niRJ0+eoLa2FgAwOTkJs9mMhIQEx12Ujo4OaLVa7Nu3D0ajETabDbOzs/j8+TOi\noqKW1ML29nbodLplc5bcIzo62vExFlfGa7kaS66Vk5ODDx8+AAB6enqwd+9er4yfx9/5+xvXr19H\nYWEh7HY7EhISHE+6aLVaZGZmQkRQXl4OAMjPz0dxcTFaWloQEhKCuro6xxMyFy9ehIggPT0doaGh\nSE5ORldXF06fPg3g121nWr1Lly6hqKjI8XTSwu+1srLSpXHMyMhAaGiox9bpz5g73iU9PR2lpaXI\nzs5GQEAAamtrodFoUFZWhvn5eezatQvHjh3Dhg0bcPbsWWRnZ0NEUFBQAJVKhaysLBQXFyM7Oxsq\nlcqx08JytZdcr7i4GNeuXXNLvJzVWHKtyspKVFVVQalUYtu2bbhx4waCgoK8Ln7c5JmIiIjIj/jM\nbV8iIiIiWj02f0RERER+hM0fERERkR9h80dERETkR9j8EREREfkRNn9EREREfoTNHxEREZEfYfNH\nRERE5Ef+C7b2NNUO8XIuAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# 显示逐日回测结果\n", "engine.showDailyResult()" @@ -180,26 +125,285 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2018-01-08 17:25:47.836000\t------------------------------\n", + "2018-01-08 17:25:47.836000\t优化结果:\n", + "2018-01-08 17:25:47.837000\t参数:{'rsiLength': 5, 'atrMa': 20, 'atrLength': 14},目标:1012046.4324\n", + "2018-01-08 17:25:47.837000\t参数:{'rsiLength': 5, 'atrMa': 25, 'atrLength': 14},目标:1012046.4324\n", + "2018-01-08 17:25:47.837000\t参数:{'rsiLength': 5, 'atrMa': 30, 'atrLength': 14},目标:1012046.4324\n", + "2018-01-08 17:25:47.837000\t参数:{'rsiLength': 5, 'atrMa': 20, 'atrLength': 12},目标:1004664.3888\n", + "2018-01-08 17:25:47.837000\t参数:{'rsiLength': 5, 'atrMa': 25, 'atrLength': 12},目标:1004664.3888\n", + "2018-01-08 17:25:47.837000\t参数:{'rsiLength': 5, 'atrMa': 30, 'atrLength': 12},目标:1004664.3888\n", + "2018-01-08 17:25:47.837000\t参数:{'rsiLength': 5, 'atrMa': 20, 'atrLength': 16},目标:983785.8654\n", + "2018-01-08 17:25:47.837000\t参数:{'rsiLength': 5, 'atrMa': 25, 'atrLength': 16},目标:983785.8654\n", + "2018-01-08 17:25:47.837000\t参数:{'rsiLength': 5, 'atrMa': 30, 'atrLength': 16},目标:983785.8654\n", + "耗时:207.414000034\n" + ] + } + ], "source": [ "# 优化配置\n", "setting = OptimizationSetting() # 新建一个优化任务设置对象\n", - "setting.setOptimizeTarget('capital') # 设置优化排序的目标是策略净盈利\n", - "setting.addParameter('atrLength', 12, 20, 2) # 增加第一个优化参数atrLength,起始12,结束20,步进2\n", + "setting.setOptimizeTarget('totalNetPnl') # 设置优化排序的目标是策略净盈利\n", + "setting.addParameter('atrLength', 12, 16, 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", "start = time.time()\n", - "engine.runParallelOptimization(AtrRsiStrategy, setting)\n", + "resultList = engine.runParallelOptimization(AtrRsiStrategy, setting)\n", "print u'耗时:%s' %(time.time()-start)" ] }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "------------------------------\n", + "参数:{'rsiLength': 5, 'atrMa': 20, 'atrLength': 14},目标:1012046.4324\n", + "统计数据:\n", + "startDate:2010-04-16\n", + "totalDays:1761\n", + "endBalance:2012046.4324\n", + "endDate:2017-07-14\n", + "dailyTurnover:5160203.81601\n", + "totalNetPnl:1012046.4324\n", + "dailyCommission:154.80611448\n", + "returnStd:0.891698573803\n", + "totalTradeCount:9587\n", + "dailyReturn:0.0394081002553\n", + "dailySlippage:326.6439523\n", + "lossDays:901\n", + "dailyNetPnl:574.699848041\n", + "dailyTradeCount:5.44406587166\n", + "profitDays:859\n", + "totalReturn:101.20464324\n", + "totalTurnover:9087118920.0\n", + "totalSlippage:575220.0\n", + "maxDrawdown:-183004.5084\n", + "sharpeRatio:0.684656992748\n", + "totalCommission:272613.5676\n", + "------------------------------\n", + "参数:{'rsiLength': 5, 'atrMa': 25, 'atrLength': 14},目标:1012046.4324\n", + "统计数据:\n", + "startDate:2010-04-16\n", + "totalDays:1761\n", + "endBalance:2012046.4324\n", + "endDate:2017-07-14\n", + "dailyTurnover:5160203.81601\n", + "totalNetPnl:1012046.4324\n", + "dailyCommission:154.80611448\n", + "returnStd:0.891698573803\n", + "totalTradeCount:9587\n", + "dailyReturn:0.0394081002553\n", + "dailySlippage:326.6439523\n", + "lossDays:901\n", + "dailyNetPnl:574.699848041\n", + "dailyTradeCount:5.44406587166\n", + "profitDays:859\n", + "totalReturn:101.20464324\n", + "totalTurnover:9087118920.0\n", + "totalSlippage:575220.0\n", + "maxDrawdown:-183004.5084\n", + "sharpeRatio:0.684656992748\n", + "totalCommission:272613.5676\n", + "------------------------------\n", + "参数:{'rsiLength': 5, 'atrMa': 30, 'atrLength': 14},目标:1012046.4324\n", + "统计数据:\n", + "startDate:2010-04-16\n", + "totalDays:1761\n", + "endBalance:2012046.4324\n", + "endDate:2017-07-14\n", + "dailyTurnover:5160203.81601\n", + "totalNetPnl:1012046.4324\n", + "dailyCommission:154.80611448\n", + "returnStd:0.891698573803\n", + "totalTradeCount:9587\n", + "dailyReturn:0.0394081002553\n", + "dailySlippage:326.6439523\n", + "lossDays:901\n", + "dailyNetPnl:574.699848041\n", + "dailyTradeCount:5.44406587166\n", + "profitDays:859\n", + "totalReturn:101.20464324\n", + "totalTurnover:9087118920.0\n", + "totalSlippage:575220.0\n", + "maxDrawdown:-183004.5084\n", + "sharpeRatio:0.684656992748\n", + "totalCommission:272613.5676\n", + "------------------------------\n", + "参数:{'rsiLength': 5, 'atrMa': 20, 'atrLength': 12},目标:1004664.3888\n", + "统计数据:\n", + "startDate:2010-04-16\n", + "totalDays:1761\n", + "endBalance:2004664.3888\n", + "endDate:2017-07-14\n", + "dailyTurnover:5179549.71039\n", + "totalNetPnl:1004664.3888\n", + "dailyCommission:155.386491312\n", + "returnStd:0.887696038596\n", + "totalTradeCount:9619\n", + "dailyReturn:0.0391993739583\n", + "dailySlippage:327.734241908\n", + "lossDays:899\n", + "dailyNetPnl:570.507886882\n", + "dailyTradeCount:5.46223736513\n", + "profitDays:861\n", + "totalReturn:100.46643888\n", + "totalTurnover:9121187040.0\n", + "totalSlippage:577140.0\n", + "maxDrawdown:-201527.1462\n", + "sharpeRatio:0.684101385707\n", + "totalCommission:273635.6112\n", + "------------------------------\n", + "参数:{'rsiLength': 5, 'atrMa': 25, 'atrLength': 12},目标:1004664.3888\n", + "统计数据:\n", + "startDate:2010-04-16\n", + "totalDays:1761\n", + "endBalance:2004664.3888\n", + "endDate:2017-07-14\n", + "dailyTurnover:5179549.71039\n", + "totalNetPnl:1004664.3888\n", + "dailyCommission:155.386491312\n", + "returnStd:0.887696038596\n", + "totalTradeCount:9619\n", + "dailyReturn:0.0391993739583\n", + "dailySlippage:327.734241908\n", + "lossDays:899\n", + "dailyNetPnl:570.507886882\n", + "dailyTradeCount:5.46223736513\n", + "profitDays:861\n", + "totalReturn:100.46643888\n", + "totalTurnover:9121187040.0\n", + "totalSlippage:577140.0\n", + "maxDrawdown:-201527.1462\n", + "sharpeRatio:0.684101385707\n", + "totalCommission:273635.6112\n", + "------------------------------\n", + "参数:{'rsiLength': 5, 'atrMa': 30, 'atrLength': 12},目标:1004664.3888\n", + "统计数据:\n", + "startDate:2010-04-16\n", + "totalDays:1761\n", + "endBalance:2004664.3888\n", + "endDate:2017-07-14\n", + "dailyTurnover:5179549.71039\n", + "totalNetPnl:1004664.3888\n", + "dailyCommission:155.386491312\n", + "returnStd:0.887696038596\n", + "totalTradeCount:9619\n", + "dailyReturn:0.0391993739583\n", + "dailySlippage:327.734241908\n", + "lossDays:899\n", + "dailyNetPnl:570.507886882\n", + "dailyTradeCount:5.46223736513\n", + "profitDays:861\n", + "totalReturn:100.46643888\n", + "totalTurnover:9121187040.0\n", + "totalSlippage:577140.0\n", + "maxDrawdown:-201527.1462\n", + "sharpeRatio:0.684101385707\n", + "totalCommission:273635.6112\n", + "------------------------------\n", + "参数:{'rsiLength': 5, 'atrMa': 20, 'atrLength': 16},目标:983785.8654\n", + "统计数据:\n", + "startDate:2010-04-16\n", + "totalDays:1761\n", + "endBalance:1983785.8654\n", + "endDate:2017-07-14\n", + "dailyTurnover:5153400.2385\n", + "totalNetPnl:983785.8654\n", + "dailyCommission:154.602007155\n", + "returnStd:0.92264098262\n", + "totalTradeCount:9579\n", + "dailyReturn:0.0386421451957\n", + "dailySlippage:326.371379898\n", + "lossDays:902\n", + "dailyNetPnl:558.651825894\n", + "dailyTradeCount:5.4395229983\n", + "profitDays:858\n", + "totalReturn:98.37858654\n", + "totalTurnover:9075137820.0\n", + "totalSlippage:574740.0\n", + "maxDrawdown:-212996.1012\n", + "sharpeRatio:0.648834758585\n", + "totalCommission:272254.1346\n", + "------------------------------\n", + "参数:{'rsiLength': 5, 'atrMa': 25, 'atrLength': 16},目标:983785.8654\n", + "统计数据:\n", + "startDate:2010-04-16\n", + "totalDays:1761\n", + "endBalance:1983785.8654\n", + "endDate:2017-07-14\n", + "dailyTurnover:5153400.2385\n", + "totalNetPnl:983785.8654\n", + "dailyCommission:154.602007155\n", + "returnStd:0.92264098262\n", + "totalTradeCount:9579\n", + "dailyReturn:0.0386421451957\n", + "dailySlippage:326.371379898\n", + "lossDays:902\n", + "dailyNetPnl:558.651825894\n", + "dailyTradeCount:5.4395229983\n", + "profitDays:858\n", + "totalReturn:98.37858654\n", + "totalTurnover:9075137820.0\n", + "totalSlippage:574740.0\n", + "maxDrawdown:-212996.1012\n", + "sharpeRatio:0.648834758585\n", + "totalCommission:272254.1346\n", + "------------------------------\n", + "参数:{'rsiLength': 5, 'atrMa': 30, 'atrLength': 16},目标:983785.8654\n", + "统计数据:\n", + "startDate:2010-04-16\n", + "totalDays:1761\n", + "endBalance:1983785.8654\n", + "endDate:2017-07-14\n", + "dailyTurnover:5153400.2385\n", + "totalNetPnl:983785.8654\n", + "dailyCommission:154.602007155\n", + "returnStd:0.92264098262\n", + "totalTradeCount:9579\n", + "dailyReturn:0.0386421451957\n", + "dailySlippage:326.371379898\n", + "lossDays:902\n", + "dailyNetPnl:558.651825894\n", + "dailyTradeCount:5.4395229983\n", + "profitDays:858\n", + "totalReturn:98.37858654\n", + "totalTurnover:9075137820.0\n", + "totalSlippage:574740.0\n", + "maxDrawdown:-212996.1012\n", + "sharpeRatio:0.648834758585\n", + "totalCommission:272254.1346\n" + ] + } + ], + "source": [ + "# 显示优化的所有统计数据\n", + "for result in resultList:\n", + " print '-' * 30\n", + " print u'参数:%s,目标:%s' %(result[0], result[1])\n", + " print u'统计数据:'\n", + " for k, v in result[2].items():\n", + " print u'%s:%s' %(k, v)" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/CtaTrading/runCtaTrading.py b/examples/CtaTrading/runCtaTrading.py index b34960d9..7f315e08 100644 --- a/examples/CtaTrading/runCtaTrading.py +++ b/examples/CtaTrading/runCtaTrading.py @@ -1,5 +1,9 @@ # encoding: UTF-8 +import sys +reload(sys) +sys.setdefaultencoding('utf8') + import multiprocessing from time import sleep from datetime import datetime, time diff --git a/examples/QuantosDataService/dataService.py b/examples/QuantosDataService/dataService.py index 5d3268ee..470a3e16 100644 --- a/examples/QuantosDataService/dataService.py +++ b/examples/QuantosDataService/dataService.py @@ -56,10 +56,7 @@ def generateVtBar(row): bar.volume = row['volume'] bar.date = str(row['trade_date']) - if row['time'] == 0: - bar.time = '00:00:00' - else: - bar.time = str(row['time']) + bar.time = str(row['time']).rjust(6, '0') bar.datetime = datetime.strptime(' '.join([bar.date, bar.time]), '%Y%m%d %H%M%S') return bar diff --git a/examples/ShcifcoDataService/config.json b/examples/ShcifcoDataService/config.json index 7523143f..6f1e00a3 100644 --- a/examples/ShcifcoDataService/config.json +++ b/examples/ShcifcoDataService/config.json @@ -3,7 +3,7 @@ "MONGO_PORT": 27017, "SHCIFCO_IP": "180.169.126.123", - "SHCIFCO_PORT": "45065", + "SHCIFCO_PORT": "10083", "SHCIFCO_TOKEN": "请联系上海中期申请", "SYMBOLS": ["cu1707", "cu1708", "cu1709", "cu1712", diff --git a/vnpy/data/shcifco/vnshcifco.py b/vnpy/data/shcifco/vnshcifco.py index 34ae549d..e7ace167 100644 --- a/vnpy/data/shcifco/vnshcifco.py +++ b/vnpy/data/shcifco/vnshcifco.py @@ -22,8 +22,8 @@ class ShcifcoApi(object): self.ip = ip self.port = port self.token = token - - self.service = 'ShcifcoApi' + + self.service = 'shcifco/dataapi' self.domain = 'http://' + ':'.join([self.ip, self.port]) #---------------------------------------------------------------------- @@ -59,7 +59,7 @@ class ShcifcoApi(object): 'askPrice': float(l[4]), 'askVolume': int(l[5]), 'volume': int(l[6]), - 'openInterest': int(l[7]) + 'openInterest': int(float(l[7])) } return d @@ -97,14 +97,14 @@ class ShcifcoApi(object): 'low': float(l[4]), 'close': float(l[5]), 'volume': int(l[6]), - 'openInterest': int(l[7]) + 'openInterest': int(float(l[7])) } return d #---------------------------------------------------------------------- def getHisBar(self, symbol, num, date='', period=''): """获取历史K线数据""" - path = 'hisbar' + path = 'hisminbar' # 默认参数 params = { @@ -139,7 +139,7 @@ class ShcifcoApi(object): 'low': float(barData[5]), 'close': float(barData[6]), 'volume': int(barData[7]), - 'openInterest': int(barData[8]), + 'openInterest': int(float(barData[8])), 'date': barData[9] # natural day } barList.append(d) diff --git a/vnpy/pricing/bs.py b/vnpy/pricing/bs.py new file mode 100644 index 00000000..36bcb0fd --- /dev/null +++ b/vnpy/pricing/bs.py @@ -0,0 +1,153 @@ +# encoding: UTF-8 + +''' +Black-Scholes期权定价模型,主要用于标的物为股票的欧式期权的定价 + +变量说明 +s:标的物股票价格 +k:行权价 +r:无风险利率 +t:剩余到期时间(年) +v:隐含波动率 +cp:期权类型,+1/-1对应call/put +price:期权价格 + +出于开发演示的目的,本文件中的希腊值计算基于简单数值差分法, +运算效率一般,实盘中建议使用更高速的算法。 + +本文件中的希腊值计算结果没有采用传统的模型价格数值,而是采用 +了实盘交易中更为实用的百分比变动数值,具体定义如下 +delta:当f变动1%时,price的变动 +gamma:当f变动1%时,delta的变动 +theta:当t变动1天时,price的变动(国内交易日每年240天) +vega:当v涨跌1个点时,price的变动(如从16%涨到17%) +''' + +from __future__ import division + +from scipy import stats +from math import (log, pow, sqrt, exp) + +cdf = stats.norm.cdf + + +# 计算希腊值和隐含波动率时用的参数 +STEP_CHANGE = 0.001 +STEP_UP = 1 + STEP_CHANGE +STEP_DOWN = 1 - STEP_CHANGE +STEP_DIFF = STEP_CHANGE * 2 + +DX_TARGET = 0.00001 + + +#---------------------------------------------------------------------- +def calculatePrice(s, k, r, t, v, cp): + """计算期权价格""" + # 如果波动率为0,则直接返回期权空间价值 + if v <= 0: + return max(0, cp * (s - k)) + + d1 = (log(s / k) + (r + 0.5 * pow(v, 2)) * t) / (v * sqrt(t)) + d2 = d1 - v * sqrt(t) + price = cp * (s * cdf(cp * d1) - k * cdf(cp * d2) * exp(-r * t)) + return price + +#---------------------------------------------------------------------- +def calculateDelta(s, k, r, t, v, cp): + """计算Delta值""" + price1 = calculatePrice(s*STEP_UP, k, r, t, v, cp) + price2 = calculatePrice(s*STEP_DOWN, k, r, t, v, cp) + delta = (price1 - price2) / (s * STEP_DIFF) * (s * 0.01) + return delta + +#---------------------------------------------------------------------- +def calculateGamma(s, k, r, t, v, cp): + """计算Gamma值""" + delta1 = calculateDelta(s*STEP_UP, k, r, t, v, cp) + delta2 = calculateDelta(s*STEP_DOWN, k, r, t, v, cp) + gamma = (delta1 - delta2) / (s * STEP_DIFF) * pow(s, 2) * 0.0001 + return gamma + +#---------------------------------------------------------------------- +def calculateTheta(s, k, r, t, v, cp): + """计算Theta值""" + price1 = calculatePrice(s, k, r, t*STEP_UP, v, cp) + price2 = calculatePrice(s, k, r, t*STEP_DOWN, v, cp) + theta = -(price1 - price2) / (t * STEP_DIFF * 240) + return theta + +#---------------------------------------------------------------------- +def calculateVega(s, k, r, t, v, cp): + """计算Vega值""" + vega = calculateOriginalVega(s, k, r, t, v, cp) / 100 + return vega + +#---------------------------------------------------------------------- +def calculateOriginalVega(s, k, r, t, v, cp): + """计算原始vega值""" + price1 = calculatePrice(s, k, r, t, v*STEP_UP, cp) + price2 = calculatePrice(s, k, r, t, v*STEP_DOWN, cp) + vega = (price1 - price2) / (v * STEP_DIFF) + return vega + +#---------------------------------------------------------------------- +def calculateGreeks(s, k, r, t, v, cp): + """计算期权的价格和希腊值""" + price = calculatePrice(s, k, r, t, v, cp) + delta = calculateDelta(s, k, r, t, v, cp) + gamma = calculateGamma(s, k, r, t, v, cp) + theta = calculateTheta(s, k, r, t, v, cp) + vega = calculateVega(s, k, r, t, v, cp) + return price, delta, gamma, theta, vega + +#---------------------------------------------------------------------- +def calculateImpv(price, s, k, r, t, cp): + """计算隐含波动率""" + # 检查期权价格必须为正数 + if price <= 0: + return 0 + + # 检查期权价格是否满足最小价值(即到期行权价值) + meet = False + + if cp == 1 and (price > (s - k) * exp(-r * t)): + meet = True + elif cp == -1 and (price > k * exp(-r * t) - s): + meet = True + + # 若不满足最小价值,则直接返回0 + if not meet: + return 0 + + # 采用Newton Raphson方法计算隐含波动率 + v = 0.3 # 初始波动率猜测 + + for i in range(50): + # 计算当前猜测波动率对应的期权价格和vega值 + p = calculatePrice(s, k, r, t, v, cp) + + vega = calculateOriginalVega(s, k, r, t, v, cp) + + # 如果vega过小接近0,则直接返回 + if not vega: + break + + # 计算误差 + dx = (price - p) / vega + + # 检查误差是否满足要求,若满足则跳出循环 + if abs(dx) < DX_TARGET: + break + + # 计算新一轮猜测的波动率 + v += dx + + # 检查波动率计算结果非负 + if v <= 0: + return 0 + + # 保留4位小数 + v = round(v, 4) + + return v + \ No newline at end of file diff --git a/vnpy/pricing/crr.py b/vnpy/pricing/crr.py new file mode 100644 index 00000000..0f80591e --- /dev/null +++ b/vnpy/pricing/crr.py @@ -0,0 +1,181 @@ +# encoding: UTF-8 + +''' +Cox-Ross-Rubinstein二叉树期权定价模型,主要用于标的物为期货的美式期权的定价 + +变量说明 +f:标的物期货价格 +k:行权价 +r:无风险利率 +t:剩余到期时间(年) +v:隐含波动率 +cp:期权类型,+1/-1对应call/put +n: 二叉树高度 +price:期权价格 + +出于开发演示的目的,本文件中的希腊值计算基于简单数值差分法, +运算效率一般,实盘中建议使用更高速的算法。 + +本文件中的希腊值计算结果没有采用传统的模型价格数值,而是采用 +了实盘交易中更为实用的百分比变动数值,具体定义如下 +delta:当f变动1%时,price的变动 +gamma:当f变动1%时,delta的变动 +theta:当t变动1天时,price的变动(国内交易日每年240天) +vega:当v涨跌1个点时,price的变动(如从16%涨到17%) +''' + +from __future__ import division + +import numpy as np +from math import (isnan, exp, sqrt, pow) + + +# 计算希腊值和隐含波动率时用的参数 +STEP_CHANGE = 0.001 +STEP_UP = 1 + STEP_CHANGE +STEP_DOWN = 1 - STEP_CHANGE +STEP_DIFF = STEP_CHANGE * 2 + +DX_TARGET = 0.00001 + + + +#---------------------------------------------------------------------- +def generateTree(f, k, r, t, v, cp, n): + """生成二叉树""" + dt = t / n + u = exp(v * sqrt(dt)) + d = 1 / u + a = exp(r * dt) + uTree = np.zeros((n+1,n+1)) + oTree = np.zeros((n+1,n+1)) + + # 计算风险平价概率 + p = (a - d) / (u - d) + p1 = p / a + p2 = (1 - p) / a + + # 计算标的树 + uTree[0, 0] = f + + for i in range(1, n+1): + uTree[0, i] = uTree[0, i-1] * u + for j in range(1, i+1): + uTree[j, i] = uTree[j-1, i-1] * d + + # 计算期权树 + for j in range(n+1): + oTree[j, n] = max(0, cp * (uTree[j, n]-k)) + + for i in range(n-1,-1,-1): + for j in range(i+1): + oTree[j, i] = max((p1 * oTree[j, i+1] + p2 * oTree[j+1, i+1]), # 美式期权存续价值 + cp * (uTree[j, i] - k)) # 美式期权行权价值 + + # 返回期权树和标的物树结果 + return oTree, uTree + +#---------------------------------------------------------------------- +def calculatePrice(f, k, r, t, v, cp, n=15): + """计算期权价格""" + oTree, uTree = calculatePrice(f, k, r, t, v, cp) + return oTree[0, 0] + +#---------------------------------------------------------------------- +def calculateDelta(f, k, r, t, v, cp, n=15): + """计算Delta值""" + price1 = calculatePrice(f*STEP_UP, k, r, t, v, cp, n) + price2 = calculatePrice(f*STEP_DOWN, k, r, t, v, cp, n) + delta = (price1 - price2) / (f * STEP_DIFF) * (f * 0.01) + return delta + +#---------------------------------------------------------------------- +def calculateGamma(f, k, r, t, v, cp, n=15): + """计算Gamma值""" + delta1 = calculateDelta(f*STEP_UP, k, r, t, v, cp, n) + delta2 = calculateDelta(f*STEP_DOWN, k, r, t, v, cp, n) + gamma = (delta1 - delta2) / (f * STEP_DIFF) * pow(f, 2) * 0.0001 + return gamma + +#---------------------------------------------------------------------- +def calculateTheta(f, k, r, t, v, cp, n=15): + """计算Theta值""" + price1 = calculatePrice(f, k, r, t*STEP_UP, v, cp, n) + price2 = calculatePrice(f, k, r, t*STEP_DOWN, v, cp, n) + theta = -(price1 - price2) / (t * STEP_DIFF * 240) + return theta + +#---------------------------------------------------------------------- +def calculateVega(f, k, r, t, v, cp, n=15): + """计算Vega值""" + vega = calculateOriginalVega(f, k, r, t, v, cp, n) / 100 + return vega + +#---------------------------------------------------------------------- +def calculateOriginalVega(f, k, r, t, v, cp, n=15): + """计算原始vega值""" + price1 = calculatePrice(f, k, r, t, v*STEP_UP, cp, n) + price2 = calculatePrice(f, k, r, t, v*STEP_DOWN, cp, n) + vega = (price1 - price2) / (v * STEP_DIFF) + return vega + +#---------------------------------------------------------------------- +def calculateGreeks(f, k, r, t, v, cp, n=15): + """计算期权的价格和希腊值""" + price = calculatePrice(f, k, r, t, v, cp, n) + delta = calculateDelta(f, k, r, t, v, cp, n) + gamma = calculateGamma(f, k, r, t, v, cp, n) + theta = calculateTheta(f, k, r, t, v, cp, n) + vega = calculateVega(f, k, r, t, v, cp, n) + return price, delta, gamma, theta, vega + +#---------------------------------------------------------------------- +def calculateImpv(price, f, k, r, t, cp, n=15): + """计算隐含波动率""" + # 检查期权价格必须为正数 + if price <= 0: + return 0 + + # 检查期权价格是否满足最小价值(即到期行权价值) + meet = False + + if cp == 1 and (price > (f - k) * exp(-r * t)): + meet = True + elif cp == -1 and (price > k * exp(-r * t) - f): + meet = True + + # 若不满足最小价值,则直接返回0 + if not meet: + return 0 + + # 采用Newton Raphson方法计算隐含波动率 + v = 0.3 # 初始波动率猜测 + + for i in range(50): + # 计算当前猜测波动率对应的期权价格和vega值 + p = calculatePrice(f, k, r, t, v, cp, n) + + vega = calculateOriginalVega(f, k, r, t, v, cp, n) + + # 如果vega过小接近0,则直接返回 + if not vega: + break + + # 计算误差 + dx = (price - p) / vega + + # 检查误差是否满足要求,若满足则跳出循环 + if abs(dx) < DX_TARGET: + break + + # 计算新一轮猜测的波动率 + v += dx + + # 检查波动率计算结果非负 + if v <= 0: + return 0 + + # 保留4位小数 + v = round(v, 4) + + return v \ No newline at end of file diff --git a/vnpy/trader/app/ctaStrategy/ctaBacktesting.py b/vnpy/trader/app/ctaStrategy/ctaBacktesting.py index 9a69ff5c..7455d0e9 100644 --- a/vnpy/trader/app/ctaStrategy/ctaBacktesting.py +++ b/vnpy/trader/app/ctaStrategy/ctaBacktesting.py @@ -877,15 +877,15 @@ class BacktestingEngine(object): targetValue = d[targetName] except KeyError: targetValue = 0 - resultList.append(([str(setting)], targetValue)) + resultList.append(([str(setting)], targetValue, d)) # 显示结果 resultList.sort(reverse=True, key=lambda result:result[1]) self.output('-' * 30) self.output(u'优化结果:') for result in resultList: - self.output(u'%s: %s' %(result[0], result[1])) - return result + self.output(u'参数:%s,目标:%s' %(result[0], result[1])) + return resultList #---------------------------------------------------------------------- def runParallelOptimization(self, strategyClass, optimizationSetting): @@ -917,7 +917,9 @@ class BacktestingEngine(object): self.output('-' * 30) self.output(u'优化结果:') for result in resultList: - self.output(u'%s: %s' %(result[0], result[1])) + self.output(u'参数:%s,目标:%s' %(result[0], result[1])) + + return resultList #---------------------------------------------------------------------- def updateDailyClose(self, dt, price): @@ -970,6 +972,7 @@ class BacktestingEngine(object): df['return'] = (np.log(df['balance']) - np.log(df['balance'].shift(1))).fillna(0) df['highlevel'] = df['balance'].rolling(min_periods=1,window=len(df),center=False).max() df['drawdown'] = df['balance'] - df['highlevel'] + df['ddPercent'] = df['drawdown'] / df['highlevel'] * 100 # 计算统计结果 startDate = df.index[0] @@ -981,6 +984,7 @@ class BacktestingEngine(object): endBalance = df['balance'].iloc[-1] maxDrawdown = df['drawdown'].min() + maxDdPercent = df['ddPercent'].min() totalNetPnl = df['netPnl'].sum() dailyNetPnl = totalNetPnl / totalDays @@ -998,6 +1002,7 @@ class BacktestingEngine(object): dailyTradeCount = totalTradeCount / totalDays totalReturn = (endBalance/self.capital - 1) * 100 + annualizedReturn = totalReturn / totalDays * 240 dailyReturn = df['return'].mean() * 100 returnStd = df['return'].std() * 100 @@ -1015,6 +1020,7 @@ class BacktestingEngine(object): 'lossDays': lossDays, 'endBalance': endBalance, 'maxDrawdown': maxDrawdown, + 'maxDdPercent': maxDdPercent, 'totalNetPnl': totalNetPnl, 'dailyNetPnl': dailyNetPnl, 'totalCommission': totalCommission, @@ -1026,6 +1032,7 @@ class BacktestingEngine(object): 'totalTradeCount': totalTradeCount, 'dailyTradeCount': dailyTradeCount, 'totalReturn': totalReturn, + 'annualizedReturn': annualizedReturn, 'dailyReturn': dailyReturn, 'returnStd': returnStd, 'sharpeRatio': sharpeRatio @@ -1052,9 +1059,11 @@ class BacktestingEngine(object): self.output(u'起始资金:\t%s' % self.capital) self.output(u'结束资金:\t%s' % formatNumber(result['endBalance'])) - self.output(u'总收益率:\t%s' % formatNumber(result['totalReturn'])) + self.output(u'总收益率:\t%s%%' % formatNumber(result['totalReturn'])) + self.output(u'年化收益:\t%s%%' % formatNumber(result['annualizedReturn'])) self.output(u'总盈亏:\t%s' % formatNumber(result['totalNetPnl'])) - self.output(u'最大回撤: \t%s' % formatNumber(result['maxDrawdown'])) + self.output(u'最大回撤: \t%s' % formatNumber(result['maxDrawdown'])) + self.output(u'百分比最大回撤: %s%%' % formatNumber(result['maxDdPercent'])) self.output(u'总手续费:\t%s' % formatNumber(result['totalCommission'])) self.output(u'总滑点:\t%s' % formatNumber(result['totalSlippage'])) @@ -1271,5 +1280,5 @@ def optimize(strategyClass, setting, targetName, targetValue = d[targetName] except KeyError: targetValue = 0 - return (str(setting), targetValue) + return (str(setting), targetValue, d) \ No newline at end of file diff --git a/vnpy/trader/app/ctaStrategy/ctaEngine.py b/vnpy/trader/app/ctaStrategy/ctaEngine.py index 73938707..3773752a 100644 --- a/vnpy/trader/app/ctaStrategy/ctaEngine.py +++ b/vnpy/trader/app/ctaStrategy/ctaEngine.py @@ -416,20 +416,23 @@ class CtaEngine(object): self.tickStrategyDict[strategy.vtSymbol] = l l.append(strategy) - # 订阅合约 - contract = self.mainEngine.getContract(strategy.vtSymbol) - if contract: - req = VtSubscribeReq() - req.symbol = contract.symbol - req.exchange = contract.exchange - - # 对于IB接口订阅行情时所需的货币和产品类型,从策略属性中获取 - req.currency = strategy.currency - req.productClass = strategy.productClass - - self.mainEngine.subscribe(req, contract.gatewayName) - else: - self.writeCtaLog(u'%s的交易合约%s无法找到' %(name, strategy.vtSymbol)) + #---------------------------------------------------------------------- + def subscribeMarketData(self, strategy): + """订阅行情""" + # 订阅合约 + contract = self.mainEngine.getContract(strategy.vtSymbol) + if contract: + req = VtSubscribeReq() + req.symbol = contract.symbol + req.exchange = contract.exchange + + # 对于IB接口订阅行情时所需的货币和产品类型,从策略属性中获取 + req.currency = strategy.currency + req.productClass = strategy.productClass + + self.mainEngine.subscribe(req, contract.gatewayName) + else: + self.writeCtaLog(u'%s的交易合约%s无法找到' %(strategy.name, strategy.vtSymbol)) #---------------------------------------------------------------------- def initStrategy(self, name): @@ -440,6 +443,8 @@ class CtaEngine(object): if not strategy.inited: strategy.inited = True self.callStrategyFunc(strategy, strategy.onInit) + self.loadSyncData(strategy) # 初始化完成后加载同步数据 + self.subscribeMarketData(strategy) # 加载同步数据后再订阅行情 else: self.writeCtaLog(u'请勿重复初始化策略实例:%s' %name) else: @@ -520,8 +525,6 @@ class CtaEngine(object): for setting in l: self.loadStrategy(setting) - - self.loadSyncData() #---------------------------------------------------------------------- def getStrategyVar(self, name): @@ -594,21 +597,20 @@ class CtaEngine(object): self.writeCtaLog(content) #---------------------------------------------------------------------- - def loadSyncData(self): + def loadSyncData(self, strategy): """从数据库载入策略的持仓情况""" - for strategy in self.strategyDict.values(): - flt = {'name': strategy.name, - 'vtSymbol': strategy.vtSymbol} - syncData = self.mainEngine.dbQuery(POSITION_DB_NAME, strategy.className, flt) - - if not syncData: - continue - - d = syncData[0] - - for key in strategy.syncList: - if key in d: - strategy.__setattr__(key, d[key]) + flt = {'name': strategy.name, + 'vtSymbol': strategy.vtSymbol} + syncData = self.mainEngine.dbQuery(POSITION_DB_NAME, strategy.className, flt) + + if not syncData: + return + + d = syncData[0] + + for key in strategy.syncList: + if key in d: + strategy.__setattr__(key, d[key]) #---------------------------------------------------------------------- def roundToPriceTick(self, priceTick, price): diff --git a/vnpy/trader/app/dataRecorder/drEngine.py b/vnpy/trader/app/dataRecorder/drEngine.py index 1f488873..21f8d7c5 100644 --- a/vnpy/trader/app/dataRecorder/drEngine.py +++ b/vnpy/trader/app/dataRecorder/drEngine.py @@ -10,10 +10,12 @@ import json import csv import os import copy +import traceback from collections import OrderedDict from datetime import datetime, timedelta from Queue import Queue, Empty from threading import Thread +from pymongo.errors import DuplicateKeyError from vnpy.event import Event from vnpy.trader.vtEvent import * @@ -241,7 +243,10 @@ class DrEngine(object): #self.mainEngine.dbUpdate(dbName, collectionName, d, flt, True) # 使用insert模式更新数据,可能存在时间戳重复的情况,需要用户自行清洗 - self.mainEngine.dbInsert(dbName, collectionName, d) + try: + self.mainEngine.dbInsert(dbName, collectionName, d) + except DuplicateKeyError: + self.writeDrLog(u'键值重复插入失败,报错信息:' %traceback.format_exc()) except Empty: pass diff --git a/vnpy/trader/app/riskManager/rmEngine.py b/vnpy/trader/app/riskManager/rmEngine.py index 7b595b8b..a486728e 100644 --- a/vnpy/trader/app/riskManager/rmEngine.py +++ b/vnpy/trader/app/riskManager/rmEngine.py @@ -224,8 +224,8 @@ class RmEngine(object): %(orderReq.symbol, self.orderCancelDict[orderReq.symbol], self.orderCancelLimit)) return False - # 检查保证金比例 - if gatewayName in self.marginRatioDict and self.marginRatioDict[gatewayName] >= self.marginRatioLimit: + # 检查保证金比例(只针对开仓委托) + if orderReq.offset == OFFSET_OPEN and gatewayName in self.marginRatioDict and self.marginRatioDict[gatewayName] >= self.marginRatioLimit: self.writeRiskLog(u'%s接口保证金占比%s,超过限制%s' %(gatewayName, self.marginRatioDict[gatewayName], self.marginRatioLimit)) return False diff --git a/vnpy/trader/gateway/xtpGateway/xtpGateway.py b/vnpy/trader/gateway/xtpGateway/xtpGateway.py index e44f5dd1..95a30581 100644 --- a/vnpy/trader/gateway/xtpGateway/xtpGateway.py +++ b/vnpy/trader/gateway/xtpGateway/xtpGateway.py @@ -261,6 +261,16 @@ class XtpMdApi(QuoteApi): content = (u'行情服务器连接断开,原因:%s' %reason) self.writeLog(content) + # 重新连接 + n = self.login(self.address, self.port, self.userID, self.password, 1) + if not n: + self.connectionStatus = True + self.loginStatus = True + self.gateway.mdConnected = True + self.writeLog(u'行情服务器登录成功') + else: + self.writeLog(u'行情服务器登录失败,原因:%s' %n) + #---------------------------------------------------------------------- def onError(self, error): """错误回报""" @@ -418,7 +428,6 @@ class XtpMdApi(QuoteApi): os.makedirs(path) self.createQuoteApi(clientID, path) - print address, port, userID, password n = self.login(address, port, userID, password, 1) if not n: self.connectionStatus = True @@ -501,6 +510,18 @@ class XtpTdApi(TraderApi): content = (u'交易服务器连接断开,原因:%s' %reason) self.writeLog(content) + # 发起重新连接 + n = self.login(self.address, self.port, self.userID, self.password, 1) + + if n: + self.sessionID = n + self.connectionStatus = True + self.loginStatus = True + self.gateway.tdConnected = True + self.writeLog(u'交易服务器登录成功,会话编号:%s' %n) + else: + self.writeLog(u'交易服务器登录失败') + #---------------------------------------------------------------------- def onError(self, data): """错误回报""" diff --git a/vnpy/trader/uiMainWindow.py b/vnpy/trader/uiMainWindow.py index 9d97f60d..38f52333 100644 --- a/vnpy/trader/uiMainWindow.py +++ b/vnpy/trader/uiMainWindow.py @@ -112,6 +112,10 @@ class MainWindow(QtWidgets.QMainWindow): appMenu = menubar.addMenu(vtText.APPLICATION) for appDetail in self.appDetailList: + # 如果没有应用界面,则不添加菜单按钮 + if not appDetail['appWidget']: + continue + function = self.createOpenAppFunction(appDetail) action = self.createAction(appDetail['appDisplayName'], function, loadIconPath(appDetail['appIco'])) appMenu.addAction(action) diff --git a/vnpy/trader/vtEngine.py b/vnpy/trader/vtEngine.py index 58181d83..b3c0482e 100644 --- a/vnpy/trader/vtEngine.py +++ b/vnpy/trader/vtEngine.py @@ -1,5 +1,7 @@ # encoding: UTF-8 +from __future__ import division + import os import shelve import logging @@ -491,7 +493,8 @@ class DataEngine(object): if vtSymbol in self.detailDict: detail = self.detailDict[vtSymbol] else: - detail = PositionDetail(vtSymbol) + contract = self.getContract(vtSymbol) + detail = PositionDetail(vtSymbol, contract) self.detailDict[vtSymbol] = detail # 设置持仓细节的委托转换模式 @@ -647,9 +650,19 @@ class PositionDetail(object): MODE_TDPENALTY = 'tdpenalty' # 平今惩罚 #---------------------------------------------------------------------- - def __init__(self, vtSymbol): + def __init__(self, vtSymbol, contract=None): """Constructor""" self.vtSymbol = vtSymbol + self.symbol = EMPTY_STRING + self.exchange = EMPTY_STRING + self.name = EMPTY_UNICODE + self.size = 1 + + if contract: + self.symbol = contract.symbol + self.exchange = contract.exchange + self.name = contract.name + self.size = contract.size self.longPos = EMPTY_INT self.longYd = EMPTY_INT @@ -657,6 +670,8 @@ class PositionDetail(object): self.longPosFrozen = EMPTY_INT self.longYdFrozen = EMPTY_INT self.longTdFrozen = EMPTY_INT + self.longPnl = EMPTY_FLOAT + self.longPrice = EMPTY_FLOAT self.shortPos = EMPTY_INT self.shortYd = EMPTY_INT @@ -664,6 +679,10 @@ class PositionDetail(object): self.shortPosFrozen = EMPTY_INT self.shortYdFrozen = EMPTY_INT self.shortTdFrozen = EMPTY_INT + self.shortPnl = EMPTY_FLOAT + self.shortPrice = EMPTY_FLOAT + + self.lastPrice = EMPTY_FLOAT self.mode = self.MODE_NORMAL self.exchange = EMPTY_STRING @@ -720,8 +739,10 @@ class PositionDetail(object): self.longYd += self.longTd self.longTd = 0 - # 汇总今昨 + # 汇总 + self.calculatePrice(trade) self.calculatePosition() + self.calculatePnl() #---------------------------------------------------------------------- def updateOrder(self, order): @@ -745,10 +766,14 @@ class PositionDetail(object): self.longPos = pos.position self.longYd = pos.ydPosition self.longTd = self.longPos - self.longYd + self.longPnl = pos.positionProfit + self.longPrice = pos.price elif pos.direction is DIRECTION_SHORT: self.shortPos = pos.position self.shortYd = pos.ydPosition self.shortTd = self.shortPos - self.shortYd + self.shortPnl = pos.positionProfit + self.shortPrice = pos.price #self.output() @@ -772,6 +797,34 @@ class PositionDetail(object): # 计算冻结量 self.calculateFrozen() + + #---------------------------------------------------------------------- + def updateTick(self, tick): + """行情更新""" + self.lastPrice = tick.lastPrice + self.calculatePnl() + + #---------------------------------------------------------------------- + def calculatePnl(self): + """计算持仓盈亏""" + self.longPnl = self.longPos * (self.lastPrice - self.longPrice) * self.size + self.shortPnl = self.shortPos * (self.shortPrice - self.lastPrice) * self.size + + #---------------------------------------------------------------------- + def calculatePrice(self, trade): + """计算持仓均价(基于成交数据)""" + # 只有开仓会影响持仓均价 + if trade.offset == OFFSET_OPEN: + if trade.direction == DIRECTION_LONG: + cost = self.longPrice * self.longPos + cost += trade.volume * trade.price + newPos = self.longPos + trade.volume + self.longPrice = cost / newPos + else: + cost = self.shortPrice * self.shortPos + cost += trade.volume * trade.price + newPos = self.shortPos + trade.volume + self.shortPrice = cost / newPos #---------------------------------------------------------------------- def calculatePosition(self):