3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
哈利·布朗(Harry Browne)的永久组合(Permanent Portfolio)是一种经典的资产配置策略。它通过将资产均分为四等份(各 25%),分别配置于股票、国债、黄金和现金,以应对繁荣、通胀、通缩和衰退这四种不同的经济周期。
在 A 股市场中,我们可以通过交易所上市的 ETF 基金 来低成本、高流动性地构建这一组合。本文将详细介绍如何在聚宽(JoinQuant)平台上,利用 Python 编写一个自动定期再平衡的永久组合策略。
在 A 股市场,我们可以选择以下代表性强、流动性好的 ETF 来替代四类资产:
510300.XSHG,代表中国 A 股核心资产。511260.XSHG,提供通缩和衰退保护。518880.XSHG,用以对抗通货膨胀。511880.XSHG(银华日利),在危机时提供避险与流动性。run_monthly 设置每月第一个交易日进行一次再平衡检查。order_target_value 调整各标的仓位至目标价值。请在聚宽回测环境中复制并运行以下代码:
# 导入聚宽函数库
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("--- 再平衡执行完毕 ---")
available_cash(可用现金),不买入具体货基,从而获取无风险利息或直接留存。