8.1 大小盘轮动 · 新手上路 -- 二八ETF择时轮动策略2.0
start = '2013-05-01' # 回测起始时间
end = '2015-09-01' # 回测结束时间
benchmark = 'HS300' # 策略参考标准
universe = ['510300.XSHG' ,'510500.XSHG' ] # 证券池,支持股票和基金
HS300 ,SZ500 = universe
capital_base = 100000 # 起始资金
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测
refresh_rate = 1 # 调仓频率,表示执行handle_data的时间间隔,由于freq = 'd',时间间隔的单位为交易日
max_retracement = 0.01 # 最大回撤比例
def initialize (account ): # 初始化虚拟账户状态
pass
def handle_data (account ): # 每个交易日的买入卖出指令
# 周末进行交换
if account .current_date .weekday () != 4 :
return
# 有停牌的话,今天就跳过。
if len (account .universe ) < 2 : return
hist = account .get_attribute_history ('closePrice' , 19 )
if len (hist ) < 2 :
return
# 如果HS300四周内涨幅大于SZ500
if hist [HS300 ][- 1 ]/ hist [HS300 ][0 ] > hist [SZ500 ][- 1 ]/ hist [ SZ500 ][0 ]:
# 且为正收益
if hist [HS300 ][- 1 ]/ hist [HS300 ][0 ] > 1 :
if account .avail_secpos .has_key (SZ500 ):
order_pct_to (SZ500 , 0 )
order_pct_to (HS300 , 0.99 )
elif hist [HS300 ][- 1 ]/ hist [HS300 ][0 ] < 1 - max_retracement :
# 负收益,清盘
if account .avail_secpos .has_key (SZ500 ):
order_pct_to (SZ500 , 0 )
if account .avail_secpos .has_key (HS300 ):
order_pct_to (HS300 , 0 )
# 如果HS300四周内涨幅小于SZ500
elif hist [HS300 ][- 1 ]/ hist [HS300 ][0 ] < hist [SZ500 ][- 1 ]/ hist [ SZ500 ][0 ]:
# 且为正收益
if hist [SZ500 ][- 1 ]/ hist [SZ500 ][0 ] > 1 :
if account .avail_secpos .has_key (HS300 ):
order_pct_to (HS300 , 0 )
order_pct_to (SZ500 , 0.99 )
elif hist [SZ500 ][- 1 ]/ hist [SZ500 ][0 ] < 1 - max_retracement :
# 负收益,清盘
if account .avail_secpos .has_key (SZ500 ):
order_pct_to (SZ500 , 0 )
if account .avail_secpos .has_key (HS300 ):
order_pct_to (HS300 , 0 )