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)。
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;
2.4 风险度量指标在 SQL 中的实现路径
在实际金融风控系统中,上述指标通常通过以下 SQL 数据管道计算:
- 数据层:
asset_prices表存储日频价格,portfolio_holdings表存储持仓数量。 - 计算层:通过 JOIN 计算每日组合损益,存入
portfolio_daily_pnl表。 - 聚合层:使用
STDDEV、PERCENTILE_CONT、AVG等窗口函数计算风险指标。 - 归因层:将组合风险拆解到各风险因子,识别主要风险来源。
性能优化建议:对于大规模组合(如 10,000+ 资产),建议使用
GROUP BY 配合 HASH JOIN,并将历史模拟法的分位数计算下推到数据库引擎,避免在应用层逐行遍历。