您的位置:首页 > 其它

什么是指数增强?股票指数增强策略(附源码)

2018-06-08 11:09 337 查看

指数增强

指数增强是什么意思?

​ 指数增强策略并不是被动的跟踪某个指数波动,而是采用量化增强模型,利用多因子alpha模型预测股票超额回报,同时力求进行有效的风险控制、降低交易成本、优化投资组合。指数增强策略不会对跟踪标的成分股进行完全复制,而是会对部分看好的股票增加权重,不看好的股票则减少权重,甚至完全去掉。通过对交易成本模型的不断监测,尽可能让交易成本降到最小。综合来看,就是既做到超额收益,又控制主动风险。

策略实现(基于掘金量化平台

策略思想

  • 本策略以0.8为初始权重跟踪指数标的沪深300中权重大于0.35%的成份股。

  • 个股所占的百分比为:(0.8 X 成份股权重) /选择的成分股权重总和 X 100%。

  • 然后根据个股是否连续上涨5天;连续下跌5天,来判定个股是否为强势股/弱势股,并对其把权重由0.8调至1.0或0.6

策略主要步骤实现

获取沪深300成分股及信息

[code]stock300 = get_history_constituents(index='SHSE.000300', start_date=last_day,end_date=last_day)[0]['constituents']
= get_history_constituents(index='SHSE.000300', start_date=last_day,end_date=last_day)[0]['constituents'][/code]

​ 获取指数成分股可调用函数

get_history_constituents
或者
get_constituents
,返回值类型为
list[dict]
,字典的键为股票代码,值为所占权重。这里调用
get_history_constituents
是因为再回测时需要获取上一交易日的成分股,而
get_constituents
只能获取最新的成分股:

  • index
    需要设置获取指数的代码。

  • start_date
    end_date
    需设置获取成分股的开始与结束日期。

订阅数据

[code]subscribe(symbols=stock300_symbol, frequency='1d', count=5, wait_group=True)
(symbols=stock300_symbol, frequency='1d', count=5, wait_group=True)[/code]

​ 订阅数据需要在定义

init
函数里面设置,并调用
subscribe
函数,这里注意,我们需要通过计算前三十根bars来作为开平仓的标准,并在当前bar上做出开平仓操作,所以需要获取31根bar:

  • symbols
    需要设置订阅的标的代码。

  • frequency
    需设置订阅数据的周期级别,这里设置
    1d
    表示以一天为周期。

  • count
    需要设置获取的bar的数量

数据获取

[code]recent_data = context.data(symbol=symbol, frequency='1d', count=5, fields='close')['close'].tolist()
= context.data(symbol=symbol, frequency='1d', count=5, fields='close')['close'].tolist()[/code]

​ 订阅数据之后,需要获取已经订阅的数据来进行操作,这时需调用

context.data
函数:

  • symbols
    需要设置订阅的标的代码。

  • frequency
    需设置订阅数据的周期级别,这里设置
    1d
    表示以一天为周期。

  • count
    需要设置获取的bar的数量

  • fields
    需要设置返回值的种类

获取持仓信息

[code]position = context.account().position(symbol=symbol, side=PositionSide_Long)
= context.account().position(symbol=symbol, side=PositionSide_Long)[/code]

​ 在判断平仓或者加仓条件时,需要获取持仓信息,这就需要调用

context.account().position
函数:

  • symbols
    需要设置订阅的标的代码。

  • side
    需要设置持仓方向,有
    PositionSide_Long
    PositionSide_Short
    两个选择。

回测报告

分析

​ 我们选取了2017年10月至2017年12月作为回测周期,可以看出:

  • 胜率(具有盈利的平仓次数与总平仓次数之比)达到了66%。

  • 卡玛比率(年化收益率与历史最大回撤之比)是使用最大回撤率来衡量风险。采用最大回撤率来衡量风险,关注的是最极端的情况。卡玛比率越高表示策略承受每单位最大损失获得的报酬越高。在这里卡玛比率达到了6.7。

  • 夏普比率(年化收益率减无风险收益率的差收益波动率之比)达到2.77。

  • 策略收益曲线与沪深三百指数具有很大相关性,指数增强策略的关键点在于选出成分股中优质的股票,以达到增强指数收益的目的。

指数增强策略源码(股票):

 
  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. import numpy as np
  4. from gm.api import *
  5. from pandas import DataFrame
  6.  
  7. '''
  8. 本策略以0.8为初始权重跟踪指数标的沪深300中权重大于0.35%的成份股.
  9. 个股所占的百分比为(0.8*成份股权重)*100%.然后根据个股是否:
  10. 1.连续上涨5天 2.连续下跌5天
  11. 来判定个股是否为强势股/弱势股,并对其把权重由0.8调至1.0或0.6
  12. 回测时间为:2017-07-01 08:50:00到2017-10-01 17:00:00
  13. '''
  14.  
  15.  
  16. def init(context):
  17. # 资产配置的初始权重,配比为0.6-0.8-1.0
  18. context.ratio = 0.8
  19. # 获取沪深300当时的成份股和相关数据
  20. stock300 = get_history_constituents(index='SHSE.000300', start_date='2017-06-30', end_date='2017-06-30')[0][
  21. 'constituents']
  22. stock300_symbol = []
  23. stock300_weight = []
  24.  
  25. for key in stock300:
  26. # 保留权重大于0.35%的成份股
  27. if (stock300[key] / 100) > 0.0035:
  28. stock300_symbol.append(key)
  29. stock300_weight.append(stock300[key] / 100)
  30.  
  31. context.stock300 = DataFrame([stock300_weight], columns=stock300_symbol, index=['weight']).T
  32. print('选择的成分股权重总和为: ', np.sum(stock300_weight))
  33. subscribe(symbols=stock300_symbol, frequency='1d', count=5, wait_group=True)
  34.  
  35.  
  36. def on_bar(context, bars):
  37. # 若没有仓位则按照初始权重开仓
  38. for bar in bars:
  39. symbol = bar['symbol']
  40. position = context.account().position(symbol=symbol, side=PositionSide_Long)
  41. if not position:
  42. buy_percent = context.stock300['weight'][symbol] * context.ratio
  43. order_target_percent(symbol=symbol, percent=buy_percent, order_type=OrderType_Market,
  44. position_side=PositionSide_Long)
  45. print(symbol, '以市价单开多仓至仓位:', buy_percent)
  46. else:
  47. # 获取过去5天的价格数据,若连续上涨则为强势股,权重+0.2;若连续下跌则为弱势股,权重-0.2
  48. recent_data = context.data(symbol=symbol, frequency='1d', count=5, fields='close')['close'].tolist()
  49. if all(np.diff(recent_data) > 0):
  50. buy_percent = context.stock300['weight'][symbol] * (context.ratio + 0.2)
  51. order_target_percent(symbol=symbol, percent=buy_percent, order_type=OrderType_Market,
  52. position_side=PositionSide_Long)
  53. print('强势股', symbol, '以市价单调多仓至仓位:', buy_percent)
  54. elif all(np.diff(recent_data) < 0):
  55. buy_percent = context.stock300['weight'][symbol] * (context.ratio - 0.2)
  56. order_target_percent(symbol=symbol, percent=buy_percent, order_type=OrderType_Market,
  57. position_side=PositionSide_Long)
  58. print('弱势股', symbol, '以市价单调多仓至仓位:', buy_percent)
  59.  
  60.  
  61. if __name__ == '__main__':
  62. '''
  63. strategy_id策略ID,由系统生成
  64. filename文件名,请与本文件名保持一致
  65. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  66. token绑定计算机的ID,可在系统设置-密钥管理中生成
  67. backtest_start_time回测开始时间
  68. backtest_end_time回测结束时间
  69. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  70. backtest_initial_cash回测初始资金
  71. backtest_commission_ratio回测佣金比例
  72. backtest_slippage_ratio回测滑点比例
  73. '''
  74. run(strategy_id='strategy_id',
  75. filename='main.py',
  76. mode=MODE_BACKTEST,
  77. token='token_id',
  78. backtest_start_time='2017-07-01 08:50:00',
  79. backtest_end_time='2017-10-01 17:00:00',
  80. backtest_adjust=ADJUST_PREV,
  81. backtest_initial_cash=10000000,
  82. backtest_commission_ratio=0.0001,
  83. backtest_slippage_ratio=0.0001)

文章来源:掘金量化交易平台 ;转载请注明出处!

----------------------------------------------------------------------------------------------------------------------------------------------------------

更多经典股票/期货量化策略源码查看:

1 双均线策略(期货)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/153
2 alpha对冲(股票+期货)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/101
3 集合竞价选股(股票) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/102
4 多因子选股(股票)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/103
5 网格交易(期货)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/104
6 指数增强(股票)  量化策略源码 https://www.myquant.cn/docs/python_strategyies/105
7 跨品种套利(期货)量化策略源码 https://www.myquant.cn/docs/python_strategyies/106
8 跨期套利(期货) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/107
9 日内回转交易(股票)量化策略源码 https://www.myquant.cn/docs/python_strategyies/108
10 做市商交易(期货) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/109
11 海龟交易法(期货) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/110
12 行业轮动(股票) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/111
13 机器学习(股票) 量化策略源码 https://www.myquant.cn/docs/python_strategyies/112
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: