您好,登錄后才能下訂單哦!
什么是指數增強?
指數增強策略并不是被動的跟蹤某個指數波動,而是采用量化增強模型,利用多因子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.wxbhnkyy39.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)
來源:掘金量化 , myquant.cn
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。