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
2372 桥水 全天候策略 增加一致性度量ES 风险控制 41908 » 轻知量化 QMT、PTrade、聚宽策略分享交流平台

2372 桥水 全天候策略 增加一致性度量ES 风险控制 41908

策略名称"多资产风险平价动态再平衡策略"

策略逻辑说明

本策略为多资产风险平价动态配置策略,核心逻辑如下:
  1. 资产配置框架:配置股票 (30%)、中期债券 (15%)、长期债券 (40%)、黄金 (7.5%)、大宗商品 (7.5%) 五大类资产,每类资产配置多个 ETF 标的并设置上市时间阈值。
  2. 风险平价模型
  • 使用预期损失 (ES) 指标衡量资产风险
  • 基于 120 天历史收益率数据计算 ES 值
  • 采用 99% 置信水平 (g.confidencelevel=2.58)
  • 按资产风险倒数分配资金,风险越低配置比例越高
  1. 动态再平衡机制
  • 每月检查持仓,每年强制再平衡一次 (g.period=12)
  • 设置 30% 涨幅触发再平衡 (g.raise_rate=0.3)
  • 自动剔除不符合时间阈值的 ETF 标的
  • 严格按风险调整后的比例调整仓位
  1. 风险控制
  • 持仓品种严格限定在预先设定的 ETF 池
  • 使用真实价格避免未来函数
  • 动态调整确保各类资产风险贡献均衡
 

策略代码

# 标题:桥水 全天候策略 增加一致性度量ES 风险控制

# 回测资金需要 1000000

# 导入函数库
from jqdata import *

# 初始化函数,设定基准等等
def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 输出内容到日志 log.info()
    log.info('初始函数开始运行且全局只运行一次')
    # 过滤掉order系列API产生的比error级别低的log
    # log.set_level('order', 'error')
    set_option("avoid_future_data", True)

    ### 股票相关设定 ###
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    set_order_cost(OrderCost(open_commission=0.0003, close_commission=0.0003, min_commission=5), type='fund')

    g.confidencelevel = 2.58
    g.rebalanced_asset_values = {}
    g.raise_rate = -1 #0.3 #触发rebalance的上涨比例, <=0不触发
    g.period = 12
    g.run_count = 0
    
    g.pool = {
        'stock': {'rate':0.3, 'codes':[
                    { 
                      '510310.XSHG':datetime.datetime(2013,3,25),
                      '513100.XSHG':datetime.datetime(2013,5,15),
                      '513500.XSHG':datetime.datetime(2014,1,15),
                    },
                    
                ]},
        
        'mid_bond':{'rate':0.15, 'codes':[
                    {
                     '511010.XSHG':datetime.datetime(2013,3,25)
                    }
                ]},
        
        'long_bond':{'rate':0.4, 'codes':[
                    {'511260.XSHG':datetime.datetime(2017,8,24) #10years
                    },
                    
                ]},
        'gold':{'rate':0.075, 'codes':[
                    {'518880.XSHG':datetime.datetime(2013,7,29)
                    },
                    
                ]},
        'goods':{'rate':0.075, 'codes':[
                    {
                     '510170.XSHG':datetime.datetime(2011,1,25)
                    },
                    
                ]},
    }
    
    g.stock_map_asset = init_stock_map_asset(g.pool)
    
    ## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
      # 开盘前运行
    #run_daily(before_market_open, time='before_open', reference_security='000001.XSHG')
      # 开盘时运行
    run_monthly(market_open, monthday=1, time='open', reference_security='000001.XSHG')
      # 收盘后运行
    #run_daily(after_market_close, time='after_close', reference_security='000001.XSHG')

def init_stock_map_asset(pool):
    stock_map_asset = {}
    for asset in pool:
        for stocks in pool[asset]['codes']:
            for code in stocks:
                stock_map_asset[code] = asset
    return stock_map_asset
    
## 开盘前运行函数
def before_market_open(context):
    # 输出运行时间
    #log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))

    # 给微信发送消息(添加模拟交易,并绑定微信生效)
    # send_message('美好的一天~')

    # 要操作的股票:平安银行(g.为全局变量)
    #g.security = '000001.XSHE'
    pass

def get_trade_target(context):
    dt=context.current_dt
    ret = []
    for asset in g.pool:
        stock_pool = g.pool[asset]['codes']
        target_stocks = []
        for stocks in stock_pool:
            cur_stocks_isOK = False
            for start_dt in stocks.values():
                if dt >= start_dt:
                    cur_stocks_isOK = True
                    break
            if cur_stocks_isOK:
                target_stocks = [k for k in stocks.keys()]
                break
        ret.extend( target_stocks )
    return ret

def calc_asset_max_raise(context):
    asset_values = {}
    for code in context.portfolio.positions:
        asset = g.stock_map_asset[code]
        pos = context.portfolio.positions[code]
        if asset not in asset_values:
            asset_values[asset] = pos.value
        else:
            asset_values[asset] += pos.value
    
    max_raise_ratio = 0
    for asset in g.rebalanced_asset_values:
        if asset in asset_values:
            ratio = asset_values[asset] / g.rebalanced_asset_values[asset]
            if ratio > max_raise_ratio:
                max_raise_ratio = ratio 
    
    return max_raise_ratio
    
## 开盘时运行函数
def market_open(context):
    #log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
    if g.run_count % g.period == 0:
        asset_alloc = get_trade_target(context)
        #print(asset_alloc)
        rebalance(context, asset_alloc)
    elif g.raise_rate > 0 and calc_asset_max_raise(context) > g.raise_rate:
            #增加 g.raise_rate > 0 是为了测试的时候
            #可以去掉涨幅触发rebalance的逻辑
            asset_alloc = get_trade_target(context)
            #print(asset_alloc)
            rebalance(context, asset_alloc)
    g.run_count += 1

关键函数解锁后查看:

## 收盘后运行函数
def after_market_close(context):
    #log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
    #得到当天所有成交记录
    #trades = get_trades()
    #for _trade in trades.values():
    #    log.info('成交记录:'+str(_trade))
    #log.info('一天结束')
    #log.info('##############################################################')
    pass

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