策略思想
纳指ETF和创业板ETF 20日涨幅大的持有
20日涨幅>0.1%
两个20日涨幅均小于-0.1%则清仓买入招商双债
# 初始化函数,全局只运行一次
def init(context):
# 设置基准收益:无基准
set_benchmark('000300.SH') # 设置一个通用基准,如沪深300指数
log.info('策略开始运行,初始化函数全局只运行一次')
# 设置股票每笔交易的手续费为万分之二
set_commission(PerShare(type='stock', cost=0.0002))
# # 设置股票交易滑点0.1%
set_slippage(PriceSlippage(0.001))
# 设置要操作的标的
context.security_1 = '513100.SH' # 513100代码
context.security_2 = '159915.SZ' # 159915代码
context.security_3 = '161716.SZ' # 招商双债LOF代码
# 设置观察周期
context.observation_period = 20 # 20个交易日
context.threshold_positive = 0.001 # 涨幅阈值0.1%
context.threshold_negative = -0.001 # 涨幅阈值-0.1%
# 初始化持仓状态
context.current_position = None
# 每日开盘时运行函数
def handle_bar(context, bar_dict):
# 获取两个标的近20日的收盘价数据
data_1 = history(context.security_1, ['close'], context.observation_period, '1d', skip_paused=False, fq='pre')
data_2 = history(context.security_2, ['close'], context.observation_period, '1d', skip_paused=False, fq='pre')
# 计算涨幅
security_1_return = (data_1['close'][-1] / data_1['close'][0] - 1)
security_2_return = (data_2['close'][-1] / data_2['close'][0] - 1)
# 判断逻辑
if security_1_return > security_2_return:
target_security = context.security_1
target_return = security_1_return
else:
target_security = context.security_2
target_return = security_2_return
# 检查是否需要调整持仓
if security_1_return < context.threshold_negative and security_2_return < context.threshold_negative:
# 如果两个标的涨幅都小于-0.1%,则清仓当前持仓,买入招商双债
if context.current_position != context.security_3:
log.info("两个标的涨幅都小于-0.1%,清仓当前持仓,买入招商双债")
# 先清仓当前持仓
if context.current_position:
order_target_percent(context.current_position, 0)
# 全仓买入招商双债
order_target_percent(context.security_3, 1)
context.current_position = context.security_3
elif target_return > context.threshold_positive:
# 如果任一标的涨幅大于0.1%,买入涨幅较高的标的
if context.current_position != target_security:
log.info("任一标的涨幅大于0.1%,买入涨幅较高的标的")
# 先清仓当前持仓
if context.current_position:
order_target_percent(context.current_position, 0)
# 全仓买入涨幅较高的标的
order_target_percent(target_security, 1)
context.current_position = target_security
else:
log.info("当前持仓符合策略要求,保持不动")
else:
log.info("标的涨幅不符合条件,保持不动")
年化16% 还可以 (注意滑点对收益的影响)