🚀 AI 一键生成 joinquant 策略代码
立即体验

聚宽平台如何实现哈利·布朗永久组合?(附 Python 源码与 ETF 配置指南)

joinquant | 发布时间: 2026/8/13
以下内容由 EasyQuant 生成。

问题描述

聚宽哈利·布朗永久组合:如何用 ETF 配置股票、债券、黄金和现金?
如何在聚宽中实现哈利·布朗永久投资组合,并按固定比例管理股票、债券、黄金和现金类 ETF?

解决方案

聚宽哈利·布朗永久组合:如何用 ETF 配置股票、债券、黄金和现金?

哈利·布朗(Harry Browne)的永久组合(Permanent Portfolio)是一种经典的资产配置策略。它通过将资产均分为四等份(各 25%),分别配置于股票、国债、黄金和现金,以应对繁荣、通胀、通缩和衰退这四种不同的经济周期。

在 A 股市场中,我们可以通过交易所上市的 ETF 基金 来低成本、高流动性地构建这一组合。本文将详细介绍如何在聚宽(JoinQuant)平台上,利用 Python 编写一个自动定期再平衡的永久组合策略。


一、 永久组合的 ETF 标的选择

在 A 股市场,我们可以选择以下代表性强、流动性好的 ETF 来替代四类资产:

  1. 股票 (25%):选择沪深 300 ETF,如 510300.XSHG,代表中国 A 股核心资产。
  2. 债券 (25%):选择十年期国债 ETF,如 511260.XSHG,提供通缩和衰退保护。
  3. 黄金 (25%):选择黄金 ETF,如 518880.XSHG,用以对抗通货膨胀。
  4. 现金 (25%):选择货币 ETF,如 511880.XSHG(银华日利),在危机时提供避险与流动性。

二、 聚宽策略实现逻辑

  1. 初始化:设定初始资金,开启动态复权(真实价格)模式,并设置交易税费。
  2. 定时触发:由于资产配置策略无需频繁交易,我们使用 run_monthly 设置每月第一个交易日进行一次再平衡检查。
  3. 再平衡机制
    • 计算当前账户的总资产(Total Value)。
    • 计算每只 ETF 的目标持有价值(总资产 * 25%)。
    • 使用 order_target_value 调整各标的仓位至目标价值。

三、 聚宽 Python 策略源码

请在聚宽回测环境中复制并运行以下代码:

# 导入聚宽函数库
import pandas as pd
from jqdata import *

def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 过滤掉比error级别低的log
    log.set_level('order', 'error')
    
    # 定义永久组合的四个核心 ETF 标的
    g.portfolio_dict = {
        '510300.XSHG': 0.25,  # 股票:沪深300 ETF
        '511260.XSHG': 0.25,  # 债券:十年国债 ETF
        '518880.XSHG': 0.25,  # 黄金:黄金 ETF
        '511880.XSHG': 0.25   # 现金:银华日利货币 ETF
    }
    
    # 设置基金交易手续费(场内基金免印花税,佣金一般无最低限制,此处按万三设置)
    set_order_cost(OrderCost(close_tax=0, open_commission=0.0003, close_commission=0.0003, min_commission=0), type='fund')
    
    # 每月第一个交易日开盘时运行再平衡函数
    run_monthly(rebalance, monthday=1, time='09:30', reference_security='000300.XSHG')

def before_trading_start(context):
    # 盘前打印当前日期
    log.info("今日日期:%s" % str(context.current_dt.date()))

def rebalance(context):
    log.info("--- 开始执行永久组合再平衡 ---")
    
    # 获取当前账户总资产
    total_value = context.portfolio.total_value
    log.info("当前账户总资产: %.2f 元" % total_value)
    
    # 1. 先处理需要减仓或清仓的标的,释放可用资金
    for security, weight in g.portfolio_dict.items():
        target_val = total_value * weight
        current_val = context.portfolio.positions[security].value
        
        # 如果当前持仓价值大于目标价值,进行减仓
        if current_val > target_val:
            log.info("标的 %s 当前价值 %.2f 大于目标价值 %.2f,执行减仓" % (security, current_val, target_val))
            order_target_value(security, target_val)
            
    # 2. 再处理需要加仓的标的
    for security, weight in g.portfolio_dict.items():
        target_val = total_value * weight
        current_val = context.portfolio.positions[security].value
        
        # 如果当前持仓价值小于目标价值,进行加仓
        if current_val < target_val:
            log.info("标的 %s 当前价值 %.2f 小于目标价值 %.2f,执行加仓" % (security, current_val, target_val))
            order_target_value(security, target_val)
            
    log.info("--- 再平衡执行完毕 ---")

四、 策略优化建议

  1. 宽限期再平衡(Band Rebalancing)
    每月强制再平衡会产生不必要的交易摩擦成本。可以引入偏离度阈值(如 $\pm 5%$)。只有当某一资产的实际权重偏离 $25%$ 超过 $5%$(即低于 $20%$ 或高于 $30%$)时,才触发再平衡。
  2. 货币基金替代
    在回测中,由于货币 ETF(如银华日利)的日内波动极小,且部分回测系统对货基支持有差异,若想简化,也可以直接将现金部分保留为账户的 available_cash(可用现金),不买入具体货基,从而获取无风险利息或直接留存。