2. 金融组合基础:投资组合基本概念、风险因子识别、收益与风险度量指标(VaR、CVaR、标准差)

2.1 投资组合基本概念

投资组合(Portfolio)是指投资者持有的多种金融资产的集合。其核心思想是通过资产间的低相关性或负相关性,在保持预期收益的同时降低整体风险,即“不要把所有鸡蛋放在同一个篮子里”。

组合构建三要素:
  • 资产选择:确定纳入组合的资产类别(股票、债券、衍生品等)及具体标的。
  • 权重分配:决定每项资产在组合中的资金占比,权重之和为 1(或 100%)。
  • 再平衡策略:定期调整权重以维持目标风险收益特征。

组合的预期收益率是各资产预期收益率的加权平均,而组合风险(方差)则不仅取决于各资产自身的方差,还取决于资产间的协方差。

-- 组合预期收益率计算(SQL 示例)
SELECT 
    SUM(weight * expected_return) AS portfolio_expected_return
FROM portfolio_weights pw
JOIN asset_expected_returns ar ON pw.asset_id = ar.asset_id;

2.2 风险因子识别

风险因子(Risk Factors)是驱动资产价格变动的底层经济或市场变量。识别关键风险因子是组合风险归因的前提。常见的风险因子分类如下:

因子类别 典型因子 影响资产示例
市场因子 股票市场指数收益率、波动率 股票、股票型基金
利率因子 国债收益率曲线水平、斜率、曲率 债券、利率互换
信用因子 信用利差、违约概率 信用债、CDS
商品因子 原油价格、黄金价格、农产品指数 商品期货、能源股
汇率因子 主要货币对汇率(USD/CNY、EUR/USD) 外汇资产、跨国企业股票
波动率因子 VIX 指数、隐含波动率 期权、波动率衍生品
SQL 实践提示:在风险因子数据库中,通常使用 factor_returns 表存储每日因子收益率,通过 factor_exposures 表存储各资产对因子的敏感度(Beta)。组合对某因子的总暴露 = Σ(资产权重 × 资产对该因子的 Beta)。
风险因子传导与组合风险归因流程 市场因子 利率因子 信用因子 汇率因子 资产A收益率 资产B收益率 资产C收益率 资产D收益率 组合收益率 = Σ(权重 × 资产收益率) 风险度量:标准差 | VaR | CVaR

2.3 收益与风险度量指标

2.3.1 标准差(Standard Deviation)

标准差衡量资产或组合收益率的历史波动程度,是最基础的风险度量指标。标准差越大,收益率的不确定性越高。

-- 计算组合收益率的标准差(SQL 示例)
WITH daily_returns AS (
    SELECT 
        date,
        SUM(weight * asset_return) AS portfolio_return
    FROM portfolio_weights pw
    JOIN asset_daily_returns ar ON pw.asset_id = ar.asset_id
    GROUP BY date
)
SELECT 
    STDDEV(portfolio_return) AS portfolio_std
FROM daily_returns;
注意:标准差假设收益率服从正态分布,但金融数据常具有“厚尾”特征,单纯依赖标准差可能低估极端损失风险。

2.3.2 在险价值(Value at Risk, VaR)

VaR 表示在给定置信水平和持有期内,组合可能遭受的最大预期损失。例如,95% VaR 为 100 万元,意味着有 95% 的把握认为组合在下一个交易日损失不超过 100 万元。

VaR 计算方法 原理 优点 缺点
参数法(方差-协方差法) 假设收益率服从正态分布,利用均值和标准差计算分位数 计算简单、速度快 依赖正态假设,无法捕捉厚尾
历史模拟法 直接使用历史收益率分布的分位数 无需分布假设,保留真实尾部 依赖历史数据长度,对极端事件反应滞后
蒙特卡洛模拟法 随机生成大量情景,模拟组合损益分布 灵活,可处理非线性资产 计算量大,模型风险高
-- 历史模拟法计算 95% VaR(SQL 示例)
WITH daily_pnl AS (
    SELECT 
        date,
        SUM(weight * asset_return) * portfolio_value AS daily_pnl_amount
    FROM portfolio_weights pw
    JOIN asset_daily_returns ar ON pw.asset_id = ar.asset_id
    CROSS JOIN (SELECT 1000000 AS portfolio_value) pv
    GROUP BY date
)
SELECT 
    PERCENTILE_CONT(0.05) WITHIN GROUP (ORDER BY daily_pnl_amount ASC) AS VaR_95
FROM daily_pnl;

2.3.3 条件在险价值(Conditional VaR, CVaR)

CVaR(又称 Expected Shortfall)衡量的是损失超过 VaR 阈值的平均损失,弥补了 VaR 无法反映尾部损失严重程度的缺陷。CVaR 满足次可加性(Subadditivity),是更一致的风险度量指标。

VaR 与 CVaR 对比:
  • VaR:回答“最坏情况下我能亏多少(给定概率)?”——只关注分位数点。
  • CVaR:回答“如果亏损真的发生了,平均会亏多少?”——关注尾部均值。
  • 数学关系:CVaR = E[损失 | 损失 ≥ VaR]
-- 历史模拟法计算 95% CVaR(SQL 示例)
WITH daily_pnl AS (
    SELECT 
        date,
        SUM(weight * asset_return) * portfolio_value AS daily_pnl_amount
    FROM portfolio_weights pw
    JOIN asset_daily_returns ar ON pw.asset_id = ar.asset_id
    CROSS JOIN (SELECT 1000000 AS portfolio_value) pv
    GROUP BY date
),
var_calc AS (
    SELECT 
        PERCENTILE_CONT(0.05) WITHIN GROUP (ORDER BY daily_pnl_amount ASC) AS VaR_95
    FROM daily_pnl
)
SELECT 
    AVG(daily_pnl_amount) AS CVaR_95
FROM daily_pnl, var_calc
WHERE daily_pnl_amount <= var_calc.VaR_95;
VaR 与 CVaR 对比示意图(95% 置信水平) VaR₉₅ CVaR₉₅ 尾部损失 5% 区域 CVaR = 尾部损失的期望值(均值)

2.4 风险度量指标在 SQL 中的实现路径

在实际金融风控系统中,上述指标通常通过以下 SQL 数据管道计算:

  1. 数据层:asset_prices 表存储日频价格,portfolio_holdings 表存储持仓数量。
  2. 计算层:通过 JOIN 计算每日组合损益,存入 portfolio_daily_pnl 表。
  3. 聚合层:使用 STDDEV、PERCENTILE_CONT、AVG 等窗口函数计算风险指标。
  4. 归因层:将组合风险拆解到各风险因子,识别主要风险来源。
性能优化建议:对于大规模组合(如 10,000+ 资产),建议使用 GROUP BY 配合 HASH JOIN,并将历史模拟法的分位数计算下推到数据库引擎,避免在应用层逐行遍历。