量化理财不是预测涨跌,而是用规则替代情绪,用分散替代押注,用再平衡替代追涨杀跌。一套专业的个人量化理财体系包含四层:资产配置、标的选择、再平衡策略、风险监控。核心目标不是收益最大化,而是在可承受回撤下获取长期稳定回报。
第一,资产分散:股票、债券、黄金、现金的低相关性组合,降低组合波动。第二,规则化:买入、卖出、再平衡全部由预设规则触发,杜绝主观干预。第三,低成本:优先指数 ETF,管理费与交易成本直接侵蚀复利。第四,可回测:任何策略上线前必须经过历史数据验证。第五,可执行:每月只需十分钟操作,避免过度交易。
用 yfinance 拉取 ETF 历史数据,计算收益率矩阵:
import yfinance as yf
import pandas as pd
import numpy as np
TICKERS = {
"VTI": "美股全市场", "VXUS": "国际股票",
"BND": "美国债券", "GLD": "黄金", "VNQ": "REITs"
}
def load_returns(start="2015-01-01"):
data = yf.download(list(TICKERS), start=start,
auto_adjust=True)["Close"]
data = data.dropna()
returns = data.pct_change().dropna()
return data, returns
prices, returns = load_returns()
print(returns.describe())数据必须做复权处理(auto_adjust=True),否则分红会导致收益率失真。
经典 60/40 组合在极端行情下回撤巨大。专业做法用风险平价,让每类资产贡献相同风险:
def risk_parity_weights(returns: pd.DataFrame) -> pd.Series:
cov = returns.cov() * 252
n = len(cov)
def risk_budget(w):
port_var = w @ cov.values @ w
marginal = cov.values @ w
risk_contrib = w * marginal / np.sqrt(port_var)
target = np.ones(n) / n
return ((risk_contrib / risk_contrib.sum() - target) ** 2).sum()
from scipy.optimize import minimize
cons = [{"type": "eq", "fun": lambda w: w.sum() - 1}]
bounds = [(0.02, 0.5)] * n
res = minimize(risk_budget, np.ones(n)/n,
bounds=bounds, constraints=cons)
return pd.Series(res.x, index=cov.index)
weights = risk_parity_weights(returns)
print(weights.round(3))风险平价天然偏向低波动资产,组合更稳健。若追求收益,可叠加均值方差优化,但需警惕协方差矩阵估计误差。
再平衡有两种触发方式:日历触发(每季度)与阈值触发(偏离超过 5%)。阈值触发更高效:
def should_rebalance(current: pd.Series, target: pd.Series,
threshold: float = 0.05) -> bool:
drift = (current - target).abs()
return bool((drift > threshold).any())
def rebalance_trades(current_value: pd.Series,
target_w: pd.Series, total: float) -> pd.Series:
target_value = target_w * total
return (target_value - current_value).round(2)再平衡的本质是强制低买高卖:涨多的资产自动减仓,跌多的自动补仓。这比任何择时策略都可靠。
用历史数据模拟组合表现,计算年化收益、波动率、夏普与最大回撤:
def backtest(returns: pd.DataFrame, weights: pd.Series,
rebalance_freq: int = 63, cost: float = 0.001):
port_ret, current_w = [], weights.copy()
for i, (date, ret) in enumerate(returns.iterrows()):
if i % rebalance_freq == 0 and i > 0:
turnover = (current_w - weights).abs().sum()
port_ret.append(port_ret[-1] - turnover * cost)
current_w = weights.copy()
daily = (current_w * ret).sum()
port_ret.append(daily)
# 权重随收益漂移
current_w = current_w * (1 + ret)
current_w /= current_w.sum()
series = pd.Series(port_ret, index=returns.index)
cum = (1 + series).cumprod()
ann_ret = cum.iloc[-1] ** (252 / len(series)) - 1
ann_vol = series.std() * np.sqrt(252)
sharpe = ann_ret / ann_vol
max_dd = (cum / cum.cummax() - 1).min()
return {"年化收益": round(ann_ret, 4), "年化波动": round(ann_vol, 4),
"夏普": round(sharpe, 2), "最大回撤": round(max_dd, 4)}
print(backtest(returns, weights))回测必须扣除交易成本,否则再平衡策略会被高估。若最大回撤超出心理承受范围,需调整配置而非优化参数。
每月检查三项指标:组合回撤、资产相关性漂移、实际权重偏离。触发阈值即执行再平衡。执行时用限价单,避开开盘与收盘的高波动时段。
def monthly_check(prices: pd.DataFrame, target_w: pd.Series):
latest = prices.iloc[-1]
current_value = latest # 简化:假设每类资产持有相同份额
total = current_value.sum()
current_w = current_value / total
if should_rebalance(current_w, target_w, 0.05):
trades = rebalance_trades(current_value, target_w, total)
return {"action": "rebalance", "trades": trades.round(2)}
return {"action": "hold", "drift": (current_w - target_w).round(3)}
print(monthly_check(prices, weights))总结:量化理财的收益来自资产分散、低成本与长期纪律,而非复杂模型。代码的价值在于把规则固化、把回测可复现、把执行自动化。真正的护城河,是你在市场恐慌时依然按规则再平衡的那份冷静。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。