#!/usr/bin/env python # coding: utf-8 # In[1]: import sys sys.path.insert(0, "../../") from pyecharts import online online() # 演示必要的准备代码,使用该库时不需重复此单元格命令 # In[2]: import xalpha as xa import pandas as pd # # 策略制定类 # 生成简单的策略投资交易单,并储存在 self.status 中 # ### 一次性买入并持有 # In[19]: jshs = xa.fundinfo('000311') # 选择投资标的 # In[20]: bah = xa.policy.buyandhold(jshs, start='2017-01-01', totmoney=100000) # 简单的一次性买入类,从 start 日买入后就一直持有,始终选择分红再投入 # In[21]: bah.status # 第二三列表示此两日恰为分红日,选择了分红再投入 # In[22]: jshs.fenhongdate # 验证该两日确实分红 # In[23]: bah.sellout('2018-06-01') # 选定日期全部卖出 # In[24]: bah.status # In[25]: jshstrade = xa.trade(jshs, bah.status) # 尝试交易一下 # In[26]: jshstrade.xirrrate() # ### 定投类 # In[27]: # 依旧先制定标的 zzcm = xa.fundinfo('164818') zzcm # In[28]: auto = xa.policy.scheduled(zzcm, 1000, pd.date_range('2015-07-01','2018-07-01',freq='W-THU')) # 按照每周四定额定投1000,生成交易单 # In[29]: # 按上面的策略单子交易下 cm_t3 = xa.trade(zzcm, auto.status) # In[30]: cm_t3.v_tradevolume() # 交易情况可视化,那些明显的缝隙对应了小长假等,当次定投下单会被自动延后到下一个交易日 # In[31]: cm_t3.dailyreport('2018-08-03') ## 截止到2018.08.03, 定投已经浮亏了 40% 多 # 还可以根据指数位置设置定期不定额的定投策略生成,这里就不仔细展开,只给一个例子: # In[32]: auto2 = xa.policy.scheduled_tune(zzcm, 1000, pd.date_range('2015-07-01','2018-07-01',freq='M'), [(0.9,2),(1.2,1)]) # 净值0.9以下加倍定投,1.2以上不再定投,中间正常定投 # In[33]: cm_t4 = xa.trade(zzcm, auto2.status) # In[34]: cm_t4.v_tradevolume() # ### 网格类 # In[3]: gfc = xa.fundinfo('002903') gfc # 场外网格最好选择基金的C份额 # In[4]: gr = xa.policy.grid(gfc,[3,3,3,3,3,3],[6,6,6,6,6,6],'2017-01-01', '2018-08-03') # 制定一个 17年开始,18年8月结束的,以开始日期价格为基准,每下跌3%买入一仓,每仓买入上涨6%后卖出的网格策略,一共设置6档 ## 注意网格对应的总金额可通过 totmoney= 参数设置,这里默认值是100000 ## 卖出实际并不严格对应每次买入的份额,而是买入均分金额分仓,卖出均分持有份额分仓 # In[6]: gr.sellpts,gr.buypts # 网格计划对应的卖点和买点净值 # In[7]: gfc.price.iloc[-4:-1] # 事实上中证500已大幅跌破网格底线 # In[5]: gfc_t = xa.trade(gfc, gr.status) # 请开始你的交易 # In[9]: gfc_t.v_tradevolume(bar_category_gap="90%") # 交易情况可视化 # In[10]: gfc_t.xirrrate('2018-04-01') # 截止指定日期的年化收益率超过50% # In[11]: gfc_t.xirrrate() # 随着18年六七月份市场大跌,网格被跌穿,收益年化转负 # In[12]: gfc_t.v_totvalue() # 网格投资持有基金的总值情况 # In[9]: # 考虑到网格的闲置资金可以在货基中吃收益,于是使用投资组合分析 gfc_cb = xa.mulfix(gfc_t,cashobj=xa.cashinfo(start='2016-10-01')) # 恰好 mulfix 类的默认 totmoney 也是 100000,我们无需在额外设置 # In[10]: gfc_cb.combsummary() # In[11]: gfc_cb.xirrrate() # 系统总计收益年化勉强为正 # ### 技术指标交叉类 # 利用模块内置的海量技术指标,可以制定各种基于不同技术指标的交叉进行交易的策略,同样的也可以指定基于净值和单个技术指标交叉的策略 # In[3]: hs300 = xa.indexinfo('0000300') # 获取指数作为假想的无摩擦成本的投资标的 # In[4]: hs300.ma(window=14) # 生成指数14天的均线 # In[5]: hs300.price.iloc[-1] # 此时 info 类的 price 表将自动添加一列 MA14 # In[13]: hs300.v_techindex(col=['MA14'],is_symbol_show=False) # 均线和指数的纠缠 # In[6]: st = xa.policy.indicator_cross(hs300, start = '2013-01-01', col=('netvalue','MA14')) # col 参量为一个两字符串的 tuple,每个代表标的价格表的一列名,当前者上穿后者时买入,反之卖出 # 具体到这里,就是最经典的一个趋势短线策略,价格涨过某条均线就买入,反之卖出 # In[7]: hs300_t = xa.trade(hs300, st.status) #模拟真实交易 # In[8]: hs300_t.dailyreport() # 盈利一般 # In[9]: hs300_t.v_tradevolume() # 交易详情,相当高频,换手率 16 代表每笔的持有时间约为 1/16 年,即不到一个月 # In[11]: hs300_t.v_tradecost(is_symbol_show=False) # 持仓成本降低缓慢 # In[12]: sti = xa.policy.indicator_cross(hs300, start = '2013-01-01', col=('MA14','netvalue')) # 我们看下交易策略彻底反转会发生什么 # In[14]: hs300_ti = xa.trade(hs300, sti.status) # In[15]: hs300_ti.dailyreport() # 跌穿均线买入涨出均线卖出,果然赔钱,噗 # ### 基于技术指标点位的策略 # 除了指标间的交叉,我们还可以给定几个不同的点位来买卖,其中也可以不给卖的点位,这相当于可以模拟熊市的网格底仓 # In[18]: hs300.roc(window=20) # 先生成一个追涨杀跌的动量类变动率指标 # In[26]: st = xa.policy.indicator_points(hs300, start = '2016-01-01', col='ROC20', buy = [(-0.08,1),(-0.11,2)], sell = [(0.06,1),(0.1,1)], buylow=True) # 这个策略的含义时,跌破点位买,涨破点位跌, 这是 buylow 这个布尔量的意义,默认就是 true # 点位看的是 ROC20 一栏,这是 col 参数决定的,交易从 16年开始,默认昨天结束 # 买点分别是 ROC 的值为 -8% 和 -11%, 分别买1/3,和2/3 # 卖点分别是 ROC 为 6% 和 8%, 各卖一半 # In[27]: hs300_t = xa.trade(hs300,st.status) # In[28]: hs300_t.dailyreport() # 追跌杀涨好像效果一般 # In[29]: hs300_t.v_totvalue() # 持有总金额的变化