{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 7.02 s\n" ] } ], "source": [ "%matplotlib inline\n", "%time from hikyuu.interactive.interactive import *\n", "use_draw_engine('matplotlib')\n", "#use_draw_engine('echarts')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 一、策略分析\n", "\n", "## 原始描述\n", "\n", "建仓条件:expma周线exp1跟exp2金叉向上使用使用 B=50% 的资金买入股票,建仓成功后,卖出条件才能起作用\n", "\n", "卖出条件S1:expma日线exp1和exp2死叉向下时卖出持仓股 S=50%\n", "\n", "买入条件B1:expma日线exp1和exp2金叉向上时买入股票数为S(卖出条件S1卖出股数)\n", "\n", "S1和B1就这样循环\n", "\n", "清仓条件为:expma周线exp1和exp2死叉时\n", "\n", "\n", "## 策略分析\n", "\n", "市场环境:无\n", "\n", "系统有效性:周线EMA1(快线)和EMA2(慢线)金叉向上直到两者死叉,系统有效时建立初始仓位\n", "\n", "信号指示器:\n", "- 买入:日线EMA1(快线)和EMA2(慢线)金叉向上\n", "- 卖出:日线EMA1(快线)和EMA2(慢线)死叉向下\n", "\n", "止损/止盈:无\n", "\n", "资金管理:\n", "- 初次建仓:使用50%的资金\n", "- 买入:初次建仓时持股数的50%\n", "- 卖出:初次建仓时持股数的50%\n", "\n", "盈利目标:无\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 二、实现系统部件\n", "\n", "## 自定义系统有效性策略" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def getNextWeekDateList(week):\n", " from datetime import timedelta\n", " py_week = week.datetime()\n", " next_week_start = py_week + timedelta(days = 7 - py_week.weekday())\n", " next_week_end = next_week_start + timedelta(days=5)\n", " return getDateRange(Datetime(next_week_start), Datetime(next_week_end))\n", "#ds = getNextWeekDateList(Datetime(201801010000))\n", "#for d in ds:\n", "# print(d)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def DEMO_CN(self):\n", " \"\"\" DIF > DEA 时,系统有效\n", " 参数:\n", " fast_n:周线dif窗口\n", " slow_n: 周线dea窗口\n", " \"\"\"\n", " k = self.getTO()\n", " if (len(k) <= 1):\n", " return\n", " \n", " #-----------------------------\n", " # 周线 \n", " #-----------------------------\n", " week_q = QueryByDate(k[0].datetime, k[-1].datetime, kType=Query.WEEK)\n", " week_k = k.getStock().getKData(week_q)\n", " \n", " n1 = self.getParam(\"week_macd_n1\")\n", " n2 = self.getParam(\"week_macd_n2\")\n", " n3 = self.getParam(\"week_macd_n3\")\n", " m = MACD(CLOSE(week_k), n1, n2, n3)\n", " fast = m.getResult(0)\n", " slow = m.getResult(1)\n", "\n", " x = fast > slow\n", " for i in range(x.discard, len(x)-1):\n", " if (x[i] >= 1.0):\n", " #需要被扩展到日线(必须是后一周)\n", " date_list = getNextWeekDateList(week_k[i].datetime)\n", " for d in date_list:\n", " self._addValid(d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 自定义信号指示器" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#这个例子不需要,已经有内建的SG_Cross函数可直接使用" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 自定义资金管理策略" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class DEMO_MM(MoneyManagerBase):\n", " \"\"\"\n", " 初次建仓:使用50%的资金\n", " 买入:初次建仓时持股数的50%\n", " 卖出:初次建仓时持股数的50%\n", " \"\"\"\n", " def __init__(self):\n", " super(DEMO_MM, self).__init__(\"MACD_MM\")\n", " self.setParam(\"init_position\", 0.5) #自定义初始仓位参数,占用资金百分比\n", " self.next_buy_num = 0\n", " \n", " def _reset(self):\n", " self.next_buy_num = 0\n", " #pass\n", " \n", " def _clone(self):\n", " mm = DEMO_MM()\n", " mm.next_buy_num = self.next_buy_num\n", " #return DEMO_MM()\n", " \n", " def _getBuyNumber(self, datetime, stk, price, risk, part_from):\n", " tm = self.getTM()\n", " cash = tm.currentCash\n", " \n", " #如果信号来源于系统有效条件,建立初始仓位\n", " if part_from == System.Part.CONDITION:\n", " #return int((cash * 0.5 // price // stk.atom) * stk.atom) #MoneyManagerBase其实已经保证了买入是最小交易数的整数\n", " self.next_buy_num = 0 #清理掉上一周期建仓期间滚动买卖的股票数\n", " return int(cash * self.getParam(\"init_position\") // price)\n", " \n", " #非初次建仓,买入同等数量\n", " return self.next_buy_num\n", " \n", " def _getSellNumber(self, datetime, stk, price, risk, part_from):\n", " tm = self.getTM()\n", " position = tm.getPosition(stk)\n", " current_num = int(position.number * 0.5)\n", " \n", " #记录第一次卖出时的股票数,以便下次以同等数量买入\n", " if self.next_buy_num == 0:\n", " self.next_buy_num = current_num \n", " \n", " return current_num #返回类型必须是整数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 三、构建并运行系统\n", "\n", "## 修改设定公共参数\n", "\n", "每个系统部件以及TradeManager都有自己的公共参数会影响系统运行,具体可以查看帮助及试验。\n", "\n", "比如:这个例子当前使用系统有效条件进行初始建仓,那么必须设置系统公共参数cn_open_position为True。否则,没有建立初始仓位的话,后续没有卖出,不会有任何交易。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#System参数\n", "#delay=True #(bool) : 是否延迟到下一个bar开盘时进行交易\n", "#delay_use_current_price=True #(bool) : 延迟操作的情况下,是使用当前交易时bar的价格计算新的止损价/止赢价/目标价还是使用上次计算的结果\n", "#max_delay_count=3 #(int) : 连续延迟交易请求的限制次数\n", "#tp_monotonic=True #(bool) : 止赢单调递增\n", "#tp_delay_n=3 #(int) : 止盈延迟开始的天数,即止盈策略判断从实际交易几天后开始生效\n", "#ignore_sell_sg=False #(bool) : 忽略卖出信号,只使用止损/止赢等其他方式卖出\n", "#ev_open_position=False #(bool): 是否使用市场环境判定进行初始建仓\n", "\n", "cn_open_position=True #(bool): 是否使用系统有效性条件进行初始建仓\n", "\n", "#MoneyManager公共参数\n", "#auto-checkin=False #(bool) : 当账户现金不足以买入资金管理策略指示的买入数量时,自动向账户中补充存入(checkin)足够的现金。\n", "#max-stock=20000 #(int) : 最大持有的证券种类数量(即持有几只股票,而非各个股票的持仓数)\n", "#disable_ev_force_clean_position=False #(bool) : 禁用市场环境失效时强制清仓\n", "#disable_cn_force_clean_position=False #(bool) : 禁用系统有效条件失效时强制清仓\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 设定私有参数及待测试标的" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#账户参数\n", "init_cash = 500000 #账户初始资金\n", "init_date = '1990-1-1' #账户建立日期\n", "\n", "#信号指示器参数\n", "week_n1 = 12\n", "week_n2 = 26\n", "week_n3 = 9\n", "\n", "#选定标的,及测试区间\n", "stk = sm['sz000002']\n", "\n", "#如果是同一级别K线,可以使用索引号,使用了不同级别的K线数据,建议还是使用日期作为参数\n", "#另外,数据量太大的话,matplotlib绘图会比较慢\n", "start_date = Datetime('2016-01-01') \n", "end_date = Datetime()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## 构建系统实例" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#创建模拟交易账户进行回测,初始资金30万\n", "my_tm = crtTM(datetime=Datetime(init_date), initCash = init_cash)\n", "\n", "#创建系统实例\n", "my_sys = SYS_Simple()\n", "\n", "my_sys.setParam(\"cn_open_position\", cn_open_position)\n", "\n", "my_sys.tm = my_tm\n", "my_sys.cn = crtCN(DEMO_CN, \n", " {'week_macd_n1': week_n1, 'week_macd_n2': week_n2, 'week_macd_n3': week_n3}, \n", " 'DEMO_CN') \n", "my_sys.sg = SG_Cross(OP(EMA(n=week_n1)), OP(EMA(n=week_n2)))\n", "my_sys.mm = DEMO_MM()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 运行系统" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "q = QueryByDate(start_date, end_date, kType=Query.DAY)\n", "my_sys.run(stk, q)\n", "\n", "#将交易记录及持仓情况,保存在临时目录,可用Excel查看\n", "#临时目录一般设置在数据所在目录下的 tmp 子目录\n", "#如果打开了excel记录,再次运行系统前,记得先关闭excel文件,否则新的结果没法保存\n", "my_tm.tocsv(sm.tmpdir())" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "# 四、查看资金曲线及绩效统计" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nkRmdPQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#绘制资金收益曲线\n", "x = my_tm.getProfitCurve(stk.getDatetimeList(q), KQuery.DAY)\n", "#x = my_tm.getFundsCurve(stk.getDatetimeList(q), KQuery.DAY) #资金净值曲线\n", "PRICELIST(x).plot()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "帐户初始金额: 500000.00\n", "累计投入本金: 500000.00\n", "累计投入资产: 0.00\n", "累计借入现金: 0.00\n", "累计借入资产: 0.00\n", "累计红利: 0.00\n", "现金余额: 692882.00\n", "未平仓头寸净值: 0.00\n", "当前总资产: 692882.00\n", "已平仓交易总成本: 0.00\n", "已平仓净利润总额: 192882.00\n", "单笔交易最大占用现金比例%: 49.80\n", "交易平均占用现金比例%: 44.45\n", "已平仓帐户收益率%: 38.58\n", "帐户年复合收益率%: 24.08\n", "帐户平均年收益率%: 25.51\n", "赢利交易赢利总额: 192882.00\n", "亏损交易亏损总额: 0.00\n", "已平仓交易总数: 2.00\n", "赢利交易数: 2.00\n", "亏损交易数: 0.00\n", "赢利交易比例%: 100.00\n", "赢利期望值: 96441.00\n", "赢利交易平均赢利: 96441.00\n", "亏损交易平均亏损: 0.00\n", "平均赢利/平均亏损比例: 0.00\n", "净赢利/亏损比例: 0.00\n", "最大单笔赢利: 130416.00\n", "最大单笔亏损: 0.00\n", "赢利交易平均持仓时间: 84.50\n", "赢利交易最大持仓时间: 141.00\n", "亏损交易平均持仓时间: 0.00\n", "亏损交易最大持仓时间: 0.00\n", "空仓总时间: 384.00\n", "空仓时间/总时间%: 69.00\n", "平均空仓时间: 192.00\n", "最长空仓时间: 195.00\n", "最大连续赢利笔数: 2.00\n", "最大连续亏损笔数: 0.00\n", "最大连续赢利金额: 192882.00\n", "最大连续亏损金额: 0.00\n", "R乘数期望值: 0.33\n", "交易机会频率/年: 1.32\n", "年度期望R乘数: 0.44\n", "赢利交易平均R乘数: 0.33\n", "亏损交易平均R乘数: 0.00\n", "最大单笔赢利R乘数: 0.52\n", "最大单笔亏损R乘数: 0.00\n", "最大连续赢利R乘数: 0.33\n", "最大连续亏损R乘数: 0.00\n", "\n" ] } ], "source": [ "#回测统计\n", "per = Performance()\n", "print(per.report(my_tm, Datetime.now()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 五、或许想看下图形" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#自己写吧" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# 六、或许想看看所有股票的情况" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 13.2 s\n" ] } ], "source": [ "import pandas as pd\n", "def calTotal(blk, q):\n", " per = Performance()\n", " s_name = []\n", " s_code = []\n", " x = []\n", " for stk in blk:\n", " my_sys.run(stk, q)\n", " per.statistics(my_tm, Datetime.now())\n", " s_name.append(stk.name)\n", " s_code.append(stk.market_code)\n", " x.append(per.get(\"当前总资产\".encode('gb2312')))\n", " return pd.DataFrame({'代码': s_code, '股票': s_name, '当前总资产': x})\n", "\n", "%time data = calTotal(blocka, q)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
代码当前总资产股票
0SH600103417709.75青山纸业
1SH601588503639.50北辰实业
2SH600770419561.75综艺股份
3SZ300667500000.00必创科技
4SH603708443588.25家家悦
5SH600990487067.68四创电子
6SH600083729500.00博信股份
7SH600102500000.00莱钢股份
8SH600771551084.00广誉远
9SZ300666500000.00江丰电子
\n", "
" ], "text/plain": [ " 代码 当前总资产 股票\n", "0 SH600103 417709.75 青山纸业\n", "1 SH601588 503639.50 北辰实业\n", "2 SH600770 419561.75 综艺股份\n", "3 SZ300667 500000.00 必创科技\n", "4 SH603708 443588.25 家家悦\n", "5 SH600990 487067.68 四创电子\n", "6 SH600083 729500.00 博信股份\n", "7 SH600102 500000.00 莱钢股份\n", "8 SH600771 551084.00 广誉远\n", "9 SZ300666 500000.00 江丰电子" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#保存到CSV文件\n", "#data.to_csv(sm.tmpdir() + '/统计.csv')\n", "data[:10]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.3" } }, "nbformat": 4, "nbformat_minor": 2 }