第 9 章:基金投资与资产配置理论¶
本章将视野从单一资产(股票、期货、期权)扩展到投资组合 (Portfolio)。对于大资金管理而言,资产配置 (Asset Allocation) 决定了 90% 以上的长期收益波动。本章将深入探讨场内基金 (ETF/LOF) 和可转债 (Convertible Bonds) 的微观机制,并基于现代投资组合理论 (MPT) 构建科学的配置策略。
9.1 场内基金 (Exchange Traded Funds)¶
9.1.1 交易机制与套利¶
ETF (Exchange Traded Fund) 是在交易所上市交易的开放式基金,其核心特征是一级市场申赎与二级市场买卖并存。
- IOPV (Intraday Indicative Optimized Portfolio Value):基金份额参考净值,由交易所实时计算并发布(通常每 15 秒一次)。
- 折溢价套利 (Arbitrage):
- 溢价套利 (Premium):\(Price > IOPV\)。买入一篮子股票 \(\rightarrow\) 申购 ETF 份额 \(\rightarrow\) 卖出 ETF 份额。
- 折价套利 (Discount):\(Price < IOPV\)。买入 ETF 份额 \(\rightarrow\) 赎回一篮子股票 \(\rightarrow\) 卖出股票。
这种套利机制保证了 ETF 价格紧贴净值波动,使 ETF 成为跟踪指数最有效的工具。
9.1.2 常用策略:网格交易 (Grid Trading)¶
网格交易是一种利用行情震荡获利的自动化策略,特别适合波动率高且长期不退市的宽基 ETF。
- 核心逻辑:将价格区间划分为若干网格。
- 执行动作:下跌触网买入,上涨触网卖出。
- 数学本质:在均值回归 (Mean Reversion) 的过程中,通过高频低吸高抛,赚取波动率收益 (Volatility Harvesting)。
"""
第 8 章:基金与可转债策略 (Funds & Convertible Bonds).
本示例展示了 **ETF 网格交易 (Grid Trading)** 策略。
ETF (Exchange Traded Fund) 是场内交易基金,交易规则与股票类似,但免收印花税,
非常适合高频网格策略。
策略逻辑:
1. **中枢定价**:以过去 20 日均线为中枢。
2. **分档挂单**:
- 每下跌 1%,买入一份。
- 每上涨 1%,卖出一份。
3. **收益来源**:在震荡市中,通过反复低吸高抛赚取差价。
适用标的:
- 宽基 ETF (如 510300 沪深300 ETF)
- 行业 ETF (如 512880 证券 ETF)
- 可转债 (T+0, 无涨跌停)
"""
from typing import Optional
import akquant as aq
import numpy as np
import pandas as pd
from akquant import Bar, Strategy
# 模拟数据生成 (震荡市)
def generate_etf_data(length: int = 200) -> pd.DataFrame:
"""生成 ETF 模拟数据."""
np.random.seed(42)
dates = pd.date_range(start="2023-01-01", periods=length, freq="D")
# 构造正弦波震荡
x = np.linspace(0, 4 * np.pi, length)
prices = 4.0 + 0.2 * np.sin(x) + np.random.normal(0, 0.05, length)
df = pd.DataFrame(
{
"date": dates,
"open": prices,
"high": prices + 0.05,
"low": prices - 0.05,
"close": prices,
"volume": 1000000,
"symbol": "510300", # 沪深300 ETF
}
)
return df
class ETFGridStrategy(Strategy):
"""ETF 网格交易策略."""
def __init__(self) -> None:
"""初始化策略."""
super().__init__()
self.grid_step = 0.01 # 网格间距 1%
self.lot_size = 1000 # 每次买卖 1000 股
self.last_buy_price: Optional[float] = None
def on_bar(self, bar: Bar) -> None:
"""收到 Bar 事件的回调."""
symbol = bar.symbol
price = bar.close
# 获取当前持仓
pos = self.get_position(symbol)
# 初始化建仓 (如果空仓)
if pos == 0 and self.last_buy_price is None:
self.log(f"初始建仓 @ {price:.3f}")
self.buy(symbol, self.lot_size * 5) # 底仓 5000 股
self.last_buy_price = price
return
if self.last_buy_price is None:
return
# 网格买入逻辑:比上次买入价跌了 step
if price < self.last_buy_price * (1 - self.grid_step):
self.log(f"网格买入: {price:.3f} < {self.last_buy_price:.3f} * (1-1%)")
self.buy(symbol, self.lot_size)
self.last_buy_price = price # 更新基准价
# 网格卖出逻辑:比上次买入价涨了 step
elif price > self.last_buy_price * (1 + self.grid_step):
if pos >= self.lot_size:
self.log(f"网格卖出: {price:.3f} > {self.last_buy_price:.3f} * (1+1%)")
self.sell(symbol, self.lot_size)
# 卖出后,基准价上移?或者保持不变?
# 简单网格通常卖出后不更新基准价,或者是基于中枢动态调整
# 这里为了演示简单,我们假设价格回升,基准价也随之上移
self.last_buy_price = price
if __name__ == "__main__":
df = generate_etf_data()
print("开始运行第 8 章 ETF 网格策略示例...")
# 基金回测配置:免印花税
result = aq.run_backtest(
strategy=ETFGridStrategy,
data=df,
initial_cash=100_000,
commission_rate=0.0001, # 基金佣金通常较低 (万一)
stamp_tax_rate=0.0, # ETF 免印花税
)
# 打印最终结果
metrics = result.metrics_df
end_value = (
metrics.loc["end_market_value", "value"]
if "end_market_value" in metrics.index
else 0.0
)
print(f"最终权益: {float(str(end_value)):.2f}")
9.2 可转债 (Convertible Bonds)¶
可转债是一种兼具债性 (Bond-like) 和股性 (Equity-like) 的混合融资工具。持有者有权在特定时期内按转股价将其转换为公司股票。
9.2.1 定价模型¶
可转债价格 \(P_{CB}\) 可以分解为:
- 纯债价值 (\(P_{Bond}\)):未来现金流(利息+本金)的贴现值。构成了转债价格的债底 (Bond Floor),提供了极高的安全边际。
- 期权价值 (\(P_{Option}\)):看涨期权 (Call Option) 的价值。当正股上涨时,转债价格随之上涨。
9.2.2 核心条款 (Clauses)¶
中国市场的可转债具有独特的“博弈条款”:
- 下修条款 (Downward Revision):当正股价持续低迷时,公司可下调转股价。这相当于降低了 Call Option 的行权价,提升了期权价值(送钱条款)。
- 强赎条款 (Redemption):当正股价持续高于转股价 130% 时,公司可强制赎回。这迫使持有人转股,实现“债转股”的融资目的。
- 回售条款 (Put):当正股价持续低迷且临近到期时,持有人可将债券按面值加利息回售给公司。
9.2.3 策略:双低轮动 (Double-Low Rotation)¶
双低指“低价格 + 低溢价率”。
- 低价格:贴近债底,防守性强。
- 低转股溢价率:股性强,进攻性好。
- 轮动逻辑:构建双低转债组合,定期剔除不再双低的标的,买入新的双低标的,实现“高抛低吸”。
9.3 现代投资组合理论 (Modern Portfolio Theory, MPT)¶
MPT 由 Harry Markowitz 提出,其核心思想是通过分散化 (Diversification) 降低非系统性风险。
9.3.1 均值-方差优化 (Mean-Variance Optimization)¶
假设投资组合由 \(N\) 个资产组成,权重向量为 \(w = [w_1, w_2, ..., w_N]^T\)。
- 组合预期收益:\(E(R_p) = w^T \mu\)
- 组合方差:\(\sigma_p^2 = w^T \Sigma w\) 其中 \(\mu\) 为资产预期收益率向量,\(\Sigma\) 为资产收益率的协方差矩阵 (Covariance Matrix)。
优化目标: 在给定风险水平 \(\sigma_{target}\) 下,最大化预期收益:
9.3.2 有效前沿 (Efficient Frontier)¶
所有最优组合在“风险-收益”平面上构成的曲线称为有效前沿。
- 全局最小方差组合 (GMVP):风险最低的点。
- 切点组合 (Tangency Portfolio):夏普比率 (Sharpe Ratio) 最高的点。
9.4 资产配置策略实战¶
9.4.1 固定比例配置 (Fixed Weight)¶
最经典的策略是 60/40 股债平衡:
- 60% 股票 ETF (如沪深300):负责进攻。
- 40% 债券 ETF (如国债指数):负责防守。
- 再平衡 (Rebalancing):定期(如每季度)将仓位恢复至 60/40。这强制实现了“卖高买低”的纪律。
9.4.2 风险平价 (Risk Parity)¶
桥水基金 (Bridgewater) 全天候策略的核心。不追求资金等权,而是追求风险贡献等权 (Equal Risk Contribution)。 由于债券波动率远低于股票,为了实现风险平价,通常需要对债券加杠杆。
9.5 风险平价深入 (Risk Parity Deep Dive)¶
传统的 60/40 组合看似分散,实则 90% 的风险都来自于股票(因为股票波动率远大于债券)。当股市崩盘时,债券的那点收益根本无法对冲股票的亏损。
9.5.1 风险贡献 (Risk Contribution, RC)¶
组合的总风险 \(\sigma_p\) 可以分解为各资产的风险贡献之和:
风险平价的目标是找到一组权重 \(w\),使得所有资产的 \(RC_i\) 相等。
9.5.2 优化求解¶
这是一个非线性凸优化问题。但在资产相关性为 0 的简化假设下,权重与波动率成反比:
实战意义:
- 低波动资产(债券):配以高权重(或加杠杆)。
- 高波动资产(股票):配以低权重。 这样,无论哪类资产发生波动,对组合净值的影响都是相同的。
9.6 Black-Litterman 模型¶
Markowitz 的均值-方差模型在实战中非常敏感:稍微修改一下预期收益率 \(\mu\),优化出来的权重就会剧烈变化(Corner Solution,即全仓某一个资产)。
Black-Litterman 模型通过贝叶斯框架解决了这个问题:
- 先验 (Prior):市场均衡状态下的预期收益(Implied Returns)。即假设当前市场权重就是最优的,反推大家的预期收益是多少。
- 观点 (Views):投资者的主观观点(如“我看好科技股跑赢大盘 5%”),并附带置信度(Confidence)。
- 后验 (Posterior):将先验与观点融合,得到新的预期收益向量 \(\mu_{BL}\) 和协方差矩阵 \(\Sigma_{BL}\)。
再用新的 \(\mu_{BL}\) 和 \(\Sigma_{BL}\) 进行均值-方差优化,得到的权重既尊重了市场,又体现了个人观点,且非常稳健。
9.7 分层风险平价 (Hierarchical Risk Parity, HRP)¶
De Prado 指出,传统的风险平价依赖于协方差矩阵的逆矩阵 \(\Sigma^{-1}\),这在样本外极不稳定。
HRP 利用机器学习中的聚类 (Clustering) 算法:
- 聚类:将相关性高的资产聚为一类(如所有科技股聚在一起,所有债券聚在一起)。构建一棵层次树 (Dendrogram)。
- 递归二分:从树的根节点开始,将资金在两个子类之间分配(分配比例由两个子类的方差决定)。
- 自上而下:逐层分配,直到每个叶子节点(具体资产)都分到了权重。
优势:HRP 不需要对协方差矩阵求逆,因此对噪音不敏感,样本外表现通常优于 Markowitz 和传统风险平价。
9.8 代码实现:股债轮动¶
下面的代码展示了如何在 akquant 中构建一个包含股票和债券 ETF 的投资组合,并定期进行再平衡。
"""
第 8 章:基金与资产配置 (Funds & Asset Allocation).
本示例展示了经典的 **股债平衡策略 (60/40 Portfolio)**。
这是资产配置中最基础也最有效的策略之一。
核心逻辑:
1. **资产选择**:
* 权益类 (Stock): 沪深300 ETF (高波动,高收益)
* 固收类 (Bond): 国债 ETF (低波动,稳健收益)
2. **目标配比**:60% 股票 + 40% 债券。
3. **再平衡 (Rebalancing)**:
* 定期(如每季度)检查持仓比例。
* 如果股票涨多了(占比 > 60%),卖出股票,买入债券。
* 如果股票跌多了(占比 < 60%),卖出债券,买入股票。
金融学原理:
通过持有相关性低(甚至负相关)的资产,可以在不显著降低预期收益的情况下,大幅降低组合波动率(马科维茨有效前沿)。
"""
import akquant as aq
import numpy as np
import pandas as pd
from akquant import Bar, Strategy
# 模拟数据生成 (股债双牛/股债跷跷板)
def generate_portfolio_data(length: int = 500) -> pd.DataFrame:
"""生成模拟数据."""
np.random.seed(42)
dates = pd.date_range(start="2022-01-01", periods=length, freq="D")
# 股票:波动大,长期向上但有回撤
stock_returns = np.random.normal(0.0005, 0.02, length) # 日均 0.05%, 波动 2%
stock_prices = 4.0 * np.cumprod(1 + stock_returns)
# 债券:波动小,稳健向上
bond_returns = np.random.normal(0.0001, 0.002, length) # 日均 0.01%, 波动 0.2%
bond_prices = 100.0 * np.cumprod(1 + bond_returns)
# 构造 DataFrame
df_stock = pd.DataFrame(
{
"date": dates,
"open": stock_prices,
"high": stock_prices * 1.01,
"low": stock_prices * 0.99,
"close": stock_prices,
"volume": 1000000,
"symbol": "510300", # Stock ETF
}
)
df_bond = pd.DataFrame(
{
"date": dates,
"open": bond_prices,
"high": bond_prices * 1.001,
"low": bond_prices * 0.999,
"close": bond_prices,
"volume": 100000,
"symbol": "511010", # Bond ETF
}
)
return pd.concat([df_stock, df_bond])
class RebalanceStrategy(Strategy):
"""股债平衡策略."""
def on_start(self) -> None:
"""策略启动回调."""
self.stock_symbol = "510300"
self.bond_symbol = "511010"
self.target_stock_weight = 0.6
self.rebalance_interval = 20 # 每 20 个交易日 (约1个月) 再平衡一次
self.days_counter = 0
def on_bar(self, bar: Bar) -> None:
"""收到 Bar 事件的回调."""
# 仅在股票的 Bar 触发逻辑 (避免同一天触发两次)
if bar.symbol != self.stock_symbol:
return
self.days_counter += 1
# 初始建仓 或 触发再平衡
if self.days_counter == 1 or self.days_counter % self.rebalance_interval == 0:
self.rebalance()
def rebalance(self) -> None:
"""执行再平衡."""
# 获取当前总资产 (现金 + 持仓市值)
# 注意:这里简化处理,假设当前时刻已获取到所有资产的最新价格
# 在实盘中可能需要先查询所有持仓市值
total_value = self.get_portfolio_value()
if total_value <= 0:
return
self.log(f"执行再平衡... 总资产: {total_value:.2f}")
# 计算目标市值
target_stock_val = total_value * self.target_stock_weight
target_bond_val = total_value * (1 - self.target_stock_weight)
# 调整仓位
# order_target_value 会自动计算买卖数量
self.order_target_value(target_stock_val, self.stock_symbol)
self.order_target_value(target_bond_val, self.bond_symbol)
if __name__ == "__main__":
df = generate_portfolio_data()
print("开始运行第 8 章 股债平衡策略示例...")
result = aq.run_backtest(
strategy=RebalanceStrategy,
data=df,
initial_cash=1_000_000,
commission_rate=0.0001, # ETF 低佣金
)
# 打印最终结果
metrics = result.metrics_df
print("\n回测指标:")
print(metrics.loc[["total_return_pct", "sharpe_ratio", "max_drawdown_pct"]])
9.9 FOF 组合管理 (Fund of Funds)¶
FOF 策略不是直接买卖股票,而是配置一篮子基金。
- 核心/卫星策略 (Core-Satellite):
- 核心:配置宽基指数 ETF(如沪深300),获取市场平均收益 (Beta)。
- 卫星:配置行业主题 ETF(如半导体、医药)或主动管理基金,获取超额收益 (Alpha)。
- 基金优选:
- 4P 分析法:People (团队), Philosophy (理念), Process (流程), Performance (业绩)。
- 量化筛选:夏普比率、最大回撤、Calmar 比率持续稳定。
9.10 流动性管理 (Liquidity Management)¶
对于大资金,流动性是必须考虑的约束。
- 冲击成本:买入成交量过小的 ETF 会导致巨大的滑点。
- 变现能力:在市场恐慌时,能否迅速将资产变现?
- Tier 1:现金、货币基金。
- Tier 2:国债 ETF、沪深300 ETF。
- Tier 3:小盘股、信用债、私募股权 (PE)。
本章小结: 本章从微观的基金交易机制上升到宏观的资产配置理论。通过组合不同相关性的资产(如股票、债券、商品),我们可以在不降低收益的前提下显著降低风险。这是“免费的午餐”。至此,第三部分:多资产策略开发 圆满结束。下一章,我们将进入 第四部分:评价与优化,学习如何科学地评估策略绩效。