Warning: file_exists(): open_basedir restriction in effect. File(/www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/wp-content/db.php) is not within the allowed path(s): (/www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/:/tmp/:/proc/:/var/log/nginx/:/www/wwwroot/com.xiximiao.oa/com.cmstop/public/:/www/wwwroot/com.xiximiao.oa/com.cmstop/vendor/:/www/wwwroot/com.xiximiao.oa/com.cmstop/ppk/) in /www/wwwroot/com.xiximiao.oa/com.cmstop/public/www/wp-includes/load.php on line 707
2414 多资产加权动量 ETF 轮动策略 安全摸狗策略 » 轻知量化 QMT、PTrade、聚宽策略分享交流平台

2414 多资产加权动量 ETF 轮动策略 安全摸狗策略

策略为多资产动态动量轮动策略,核心逻辑如下:
  1. 动量计算体系
  • 改进型回归模型:对 25 日对数收益率进行加权线性回归(近期数据权重更高)
  • 复合动量指标:年化收益率 × 加权 R 平方,兼顾趋势强度和稳定性
  • 安全边际筛选:排除动量值 > 5 的过热品种,规避趋势末端风险
  1. 资产配置组合
  • 跨市场 ETF 覆盖:黄金(大宗商品)+ 纳指(科技股)+ 创业板(成长股)+ 上证 180(价值股)
  • 极端情况避险:当所有 ETF 动量值为负时自动切换防御品种
  • 单品种集中持仓:全仓配置当日最强动量 ETF,最大化趋势收益
  1. 交易执行优化
  • 高频调仓机制:每个交易日开盘立即调仓,及时捕捉趋势拐点
  • 智能滑点设置:0.1% 的固定滑点平衡冲击成本与成交概率
  • 低成本运作:基金交易佣金降至万 0.2,单笔最低 5 元
  1. 风险控制体系
  • 动量异常值过滤:剔除短期暴涨暴跌的不可持续趋势
  • 权重衰减设计:越早期的价格数据权重越低,降低噪声干扰
  • 自动止损机制:动量转弱即触发换仓,避免主观判断干扰

策略代码

import numpy as np
import pandas as pd

#初始化函数 
def initialize(context):
    # 设定基准
    set_benchmark('000300.XSHG')
    # 用真实价格交易
    set_option('use_real_price', True)
    # 打开防未来函数
    set_option("avoid_future_data", True)
    # 设置滑点 https://www.joinquant.com/view/community/detail/a31a822d1cfa7e83b1dda228d4562a70
    set_slippage(FixedSlippage(0.001))
    # 设置交易成本
    set_order_cost(OrderCost(open_tax=0, close_tax=0, open_commission=0.0002, close_commission=0.0002, close_today_commission=0, min_commission=5), type='fund')
    # 过滤一定级别的日志
    log.set_level('system', 'error')
    # 参数
    g.etf_pool = [
        '518880.XSHG', #黄金ETF(大宗商品)
        '513100.XSHG', #纳指100(海外资产)
        '159915.XSHE', #创业板100(成长股,科技股,中小盘)
        '510180.XSHG', #上证180(价值股,蓝筹股,中大盘)
    ]
    g.m_days = 25 #动量参考天数
    run_daily(trade, '9:30') #每天运行确保即时捕捉动量变化

关键函数解锁后查看:

# 交易
def trade(context):
    # 获取动量最高的一只ETF
    target_num = 1  
    target_list = get_rank(g.etf_pool)[:target_num]
    # 卖出    
    hold_list = list(context.portfolio.positions)
    for etf in hold_list:
        if etf not in target_list:
            order_target_value(etf, 0)
            print('卖出' + str(etf))
        else:
            print('继续持有' + str(etf))
            pass
    # 买入
    hold_list = list(context.portfolio.positions)
    if len(hold_list) < target_num:
        value = context.portfolio.available_cash / (target_num - len(hold_list))
        for etf in target_list:
            if context.portfolio.positions[etf].total_amount == 0:
                order_target_value(etf, value)
                print('买入' + str(etf))

2025-02-25
⚠️
本站资源大多来自网络,仅供网友学习交流,未经作者或上传书面授权,请勿作他用。
站长 vx: xiangyin615 或者 留言反馈 ,我们将尽快处理。
Notice: When you of the legal rights be violate, please stir to vx: xiangyin615
个人中心
购物车
优惠劵
搜索