什麼是指數增強

   什麼是指數增強?

   指數增強策略並不是被動的跟蹤某個指數波動,而是採用量化增強模型,利用多因子alpha模型預測股票超額回報,同時力求進行有效的風險控制、降低交易成本、優化投資組合。指數增強策略不會對跟蹤標的成分股進行完全複製,而是會對部分看好的股票增加權重,不看好的股票則減少權重,甚至完全去掉。通過對交易成本模型的不斷監測,儘可能讓交易成本降到最小。綜合來看,就是既做到超額收益,又控制主動風險。

  策略實現(基於掘金量化平臺)

  策略思想

  • 本策略以0.8爲初始權重跟蹤指數標的滬深300中權重大於0.35%的成份股。

  • 個股所佔的百分比爲:(0.8 X 成份股權重) /選擇的成分股權重總和 X 100%。

  • 然後根據個股是否連續上漲5天;連續下跌5天,來判定個股是否爲強勢股/弱勢股,並對其把權重由0.8調至1.0或0.6

  策略主要步驟實現

  獲取滬深300成分股及信息

  stock300 = get_history_constituents(index='SHSE.000300',

  start_date=last_day,end_date=last_day)[0]['constituents']

  獲取指數成分股可調用函數get_history_constituents或者get_constituents,返回值類型爲list[dict],字典的鍵爲股票代碼,值爲所佔權重。這裏調用get_history_constituents是因爲再回測時需要獲取上一交易日的成分股,而get_constituents只能獲取最新的成分股:

  • index需要設置獲取指數的代碼。

  • start_date和end_date需設置獲取成分股的開始與結束日期。

  訂閱數據

  subscribe(symbols=stock300_symbol, frequency='1d', count=5, wait_group=True)

  訂閱數據需要在定義init函數裏面設置,並調用subscribe函數,這裏注意,我們需要通過計算前三十根bars來作爲開平倉的標準,並在當前bar上做出開平倉操作,所以需要獲取31根bar:

  • symbols 需要設置訂閱的標的代碼。

  • frequency需設置訂閱數據的週期級別,這裏設置1d 表示以一天爲週期。

  • count需要設置獲取的bar的數量

  數據獲取

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

  訂閱數據之後,需要獲取已經訂閱的數據來進行操作,這時需調用context.data函數:

  • symbols 需要設置訂閱的標的代碼。

  • frequency需設置訂閱數據的週期級別,這裏設置1d表示以一天爲週期。

  • count需要設置獲取的bar的數量

  • fields需要設置返回值的種類

  獲取持倉信息

  position = context.account().position(symbol=symbol, side=PositionSide_Long)

  在判斷平倉或者加倉條件時,需要獲取持倉信息,這就需要調用context.account().position函數:

  • symbols 需要設置訂閱的標的代碼。

  • side需要設置持倉方向,有PositionSide_Long和PositionSide_Short兩個選擇。

  回測報告

  分析

   我們選取了2017年10月至2017年12月作爲回測週期,可以看出:

  • 勝率(具有盈利的平倉次數與總平倉次數之比)達到了66%。

  • 卡瑪比率(年化收益率與歷史最大回撤之比)是使用最大回撤率來衡量風險。採用最大回撤率來衡量風險,關注的是最極端的情況。卡瑪比率越高表示策略承受每單位最大損失獲得的報酬越高。在這裏卡瑪比率達到了6.7。

  • 夏普比率(年化收益率減無風險收益率的差收益波動率之比)達到2.77。

  • 策略收益曲線與滬深三百指數具有很大相關性,指數增強策略的關鍵點在於選出成分股中優質的股票,以達到增強指數收益的目的。

  附:指數增強策略源碼

  # coding=utf-8

  from __future__ import print_function, absolute_import, unicode_literals

  import numpy as np

  from gm.api import *

  from pandas import DataFrame

  '''

  本策略以0.8爲初始權重跟蹤指數標的滬深300中權重大於0.35%的成份股.

  個股所佔的百分比爲(0.8*成份股權重)*100%.然後根據個股是否

  連續上漲5天;連續下跌5天

  來判定個股是否爲強勢股/弱勢股,並對其把權重由0.8調至1.0或0.6

  回測數據爲:SHSE.000300中權重大於0.35%的成份股

  回測時間爲:2017-07-01 08:50:00到2017-10-01 17:00:00

  '''

  def init(context):

  # 資產配置的初始權重,配比爲0.6-0.8-1.0

  context.ratio = 0.8

  # 獲取滬深300當時的成份股和相關數據

  stock300 = get_history_constituents(index='SHSE.000300', start_date='2017-06-30', end_date='2017-06-30')[0][

  'constituents']

  stock300_symbol = []

  stock300_weight = []

  for key in stock300:

  # 保留權重大於0.35%的成份股

  if (stock300[key] / 100) > 0.0035:

  stock300_symbol.append(key)

  stock300_weight.append(stock300[key] / 100)

  context.stock300 = DataFrame([stock300_weight], columns=stock300_symbol, index=['weight']).T

  context.sum_weight = np.sum(stock300_weight)

  print('選擇的成分股權重總和爲: ', context.sum_weight)

  subscribe(symbols=stock300_symbol, frequency='1d', count=5, wait_group=True)

  def on_bar(context, bars):

  # 若沒有倉位則按照初始權重開倉

  for bar in bars:

  symbol = bar['symbol']

  position = context.account().position(symbol=symbol, side=PositionSide_Long)

  if not position:

  buy_percent = context.stock300['weight'][symbol] / context.sum_weight * context.ratio

  order_target_percent(symbol=symbol, percent=buy_percent, order_type=OrderType_Market,

  position_side=PositionSide_Long)

  print(symbol, '以市價單開多倉至倉位:', buy_percent * 100)

  else: 無錫婦科醫院排名 http://www.csfk0731.com/

  # 獲取過去5天的價格數據,若連續上漲則爲強勢股,權重+0.2;若連續下跌則爲弱勢股,權重-0.2

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

  if all(np.diff(recent_data) > 0):

  buy_percent = context.stock300['weight'][symbol] / context.sum_weight * (context.ratio + 0.2)

  order_target_percent(symbol=symbol, percent=buy_percent, order_type=OrderType_Market,

  position_side=PositionSide_Long)

  print('強勢股', symbol, '以市價單調多倉至倉位:', buy_percent * 100)

  elif all(np.diff(recent_data) < 0):

  buy_percent = context.stock300['weight'][symbol] / context.sum_weight * (context.ratio - 0.2)

  order_target_percent(symbol=symbol, percent=buy_percent, order_type=OrderType_Market,

  position_side=PositionSide_Long)

  print('弱勢股', symbol, '以市價單調多倉至倉位:', buy_percent * 100)

  if __name__ == '__main__':

  '''

  本策略基於掘金量化交易平臺 網址:www.myquant.cn

  strategy_id策略ID,由系統生成

  filename文件名,請與本文件名保持一致

  mode實時模式:MODE_LIVE回測模式:MODE_BACKTEST

  token綁定計算機的ID,可在系統設置-密鑰管理中生成

  backtest_start_time回測開始時間

  backtest_end_time回測結束時間

  backtest_adjust股票復權方式不復權:ADJUST_NONE前復權:ADJUST_PREV後復權:ADJUST_POST

  backtest_initial_cash回測初始資金

  backtest_commission_ratio回測佣金比例

  backtest_slippage_ratio回測滑點比例

  '''

  run(strategy_id='c722244f-eaa9-11e7-8618-9cd21ef04ea9',

  filename='指數增強.py',

  mode=MODE_BACKTEST,

  token='c395247a76e8a5caeee699d668d6f550213bc418',

  backtest_start_time='2017-10-01 08:50:00',

  backtest_end_time='2017-12-01 17:00:00',

  backtest_adjust=ADJUST_PREV,

  backtest_initial_cash=10000000,

  backtest_commission_ratio=0.0001,

  backtest_slippage_ratio=0.0001


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章