Skip to content

第 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_{CB} = P_{Bond} + P_{Option} \]
  • 纯债价值 (\(P_{Bond}\)):未来现金流(利息+本金)的贴现值。构成了转债价格的债底 (Bond Floor),提供了极高的安全边际。
  • 期权价值 (\(P_{Option}\)):看涨期权 (Call Option) 的价值。当正股上涨时,转债价格随之上涨。

9.2.2 核心条款 (Clauses)

中国市场的可转债具有独特的“博弈条款”:

  1. 下修条款 (Downward Revision):当正股价持续低迷时,公司可下调转股价。这相当于降低了 Call Option 的行权价,提升了期权价值(送钱条款)。
  2. 强赎条款 (Redemption):当正股价持续高于转股价 130% 时,公司可强制赎回。这迫使持有人转股,实现“债转股”的融资目的。
  3. 回售条款 (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}\) 下,最大化预期收益:

\[ \max_w w^T \mu \quad \text{s.t.} \quad w^T \Sigma w = \sigma_{target}^2, \sum w_i = 1 \]

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\) 可以分解为各资产的风险贡献之和:

\[ \sigma_p = \sum_{i=1}^N RC_i = \sum_{i=1}^N w_i \frac{\partial \sigma_p}{\partial w_i} \]

风险平价的目标是找到一组权重 \(w\),使得所有资产的 \(RC_i\) 相等。

\[ RC_1 = RC_2 = ... = RC_N = \frac{\sigma_p}{N} \]

9.5.2 优化求解

这是一个非线性凸优化问题。但在资产相关性为 0 的简化假设下,权重与波动率成反比:

\[ w_i \propto \frac{1}{\sigma_i} \]

实战意义

  • 低波动资产(债券):配以高权重(或加杠杆)。
  • 高波动资产(股票):配以低权重。 这样,无论哪类资产发生波动,对组合净值的影响都是相同的。

9.6 Black-Litterman 模型

Markowitz 的均值-方差模型在实战中非常敏感:稍微修改一下预期收益率 \(\mu\),优化出来的权重就会剧烈变化(Corner Solution,即全仓某一个资产)。

Black-Litterman 模型通过贝叶斯框架解决了这个问题:

  1. 先验 (Prior):市场均衡状态下的预期收益(Implied Returns)。即假设当前市场权重就是最优的,反推大家的预期收益是多少。
  2. 观点 (Views):投资者的主观观点(如“我看好科技股跑赢大盘 5%”),并附带置信度(Confidence)。
  3. 后验 (Posterior):将先验与观点融合,得到新的预期收益向量 \(\mu_{BL}\) 和协方差矩阵 \(\Sigma_{BL}\)

再用新的 \(\mu_{BL}\)\(\Sigma_{BL}\) 进行均值-方差优化,得到的权重既尊重了市场,又体现了个人观点,且非常稳健。

9.7 分层风险平价 (Hierarchical Risk Parity, HRP)

De Prado 指出,传统的风险平价依赖于协方差矩阵的逆矩阵 \(\Sigma^{-1}\),这在样本外极不稳定。

HRP 利用机器学习中的聚类 (Clustering) 算法:

  1. 聚类:将相关性高的资产聚为一类(如所有科技股聚在一起,所有债券聚在一起)。构建一棵层次树 (Dendrogram)。
  2. 递归二分:从树的根节点开始,将资金在两个子类之间分配(分配比例由两个子类的方差决定)。
  3. 自上而下:逐层分配,直到每个叶子节点(具体资产)都分到了权重。

优势: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 策略不是直接买卖股票,而是配置一篮子基金。

  1. 核心/卫星策略 (Core-Satellite)
    • 核心:配置宽基指数 ETF(如沪深300),获取市场平均收益 (Beta)。
    • 卫星:配置行业主题 ETF(如半导体、医药)或主动管理基金,获取超额收益 (Alpha)。
  2. 基金优选
    • 4P 分析法:People (团队), Philosophy (理念), Process (流程), Performance (业绩)。
    • 量化筛选:夏普比率、最大回撤、Calmar 比率持续稳定。

9.10 流动性管理 (Liquidity Management)

对于大资金,流动性是必须考虑的约束。

  • 冲击成本:买入成交量过小的 ETF 会导致巨大的滑点。
  • 变现能力:在市场恐慌时,能否迅速将资产变现?
    • Tier 1:现金、货币基金。
    • Tier 2:国债 ETF、沪深300 ETF。
    • Tier 3:小盘股、信用债、私募股权 (PE)。

本章小结: 本章从微观的基金交易机制上升到宏观的资产配置理论。通过组合不同相关性的资产(如股票、债券、商品),我们可以在不降低收益的前提下显著降低风险。这是“免费的午餐”。至此,第三部分:多资产策略开发 圆满结束。下一章,我们将进入 第四部分:评价与优化,学习如何科学地评估策略绩效。