作为策略锦集第二篇,我们以沪深A股市场出了名的“二八轮动”现象为基础,向大家介绍经典择时策略:二八轮动策略。
import pandas as pd
import numpy as np
# 初始化函数,全局只运行一次
def init(context):
context.day = 20 #设置数据获取长度为20
context.security = ['000300.SH','000905.SH']#设沪深300指数,中证500指数
context.ETF300 = '510300.OF' #沪深300ETF基金
context.ETF500 = '510500.OF' #中证500ETF基金
run_weekly(handle_bar,date_rule=1)
## 开盘时运行函数
def handle_bar(context, bar_dict):
#获取信号值
signal=get_signal(context,bar_dict)
hs300=signal[0]
zz500=signal[1]
#根据信号值,来调整至相应仓位
#空仓
if hs300 <= 0 and zz500 <= 0:
if len(context.portfolio.stock_account.positions) > 0:
for stock in list(context.portfolio.stock_account.positions):
order_target(stock, 0)
#沪深300
elif hs300 > zz500:
if context.ETF500 in list(context.portfolio.stock_account.positions):
order_target(context.ETF500, 0)
if len(context.portfolio.stock_account.positions) < 1:
order_target_value(context.ETF300, context.portfolio.available_cash)
#中证500
elif hs300 < zz500:
if context.ETF300 in list(context.portfolio.stock_account.positions):
order_target(context.ETF300, 0)
if len(context.portfolio.stock_account.positions) < 1:
order_target_value(context.ETF500, context.portfolio.available_cash)
#信号获取函数
def get_signal(context,bar_dict):
#获取沪深300与中证500过去20日的收盘价
close=history(context.security, ['close'], 20, '1d', False, 'pre', is_panel=1)['close']
#计算涨跌幅
h=(close.iloc[-1]-close.iloc[0])/close.iloc[0]
h300=h['000300.SH']
h500=h['000905.SH']
return h300,h500