🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

第7讲:方差 (Variance)

💡

查看全集:💎Quantopia量化分析56讲


概述

离散度量用于量化数据分布的波动程度,在金融领域直接关联风险度量。本教程涵盖以下核心概念:

  1. 极差(Range)
  1. 平均绝对偏差(MAD)
  1. 方差与标准差
  1. 半方差与半标准差
  1. 目标半方差

准备工作

import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt

# 设置随机种子保证结果可复现
np.random.seed(121)

1. 极差(Range)

衡量数据分布的最大波动范围

随机数据示例

X = np.sort(np.random.randint(100, size=20))
print("数据集X:\n", X)
print("极差:", np.ptp(X))

金融数据应用(苹果股价波动)

# 获取苹果2022年股价数据
aapl = yf.download('AAPL', start='2022-01-01', end='2023-01-01')['Close']

print(f"\n苹果股价极差: ${aapl.max()-aapl.min():.2f}")
print(f"最大值日期: {aapl.idxmax().strftime('%Y-%m-%d')}")
print(f"最小值日期: {aapl.idxmin().strftime('%Y-%m-%d')}")

2. 平均绝对偏差(MAD)

衡量数据与均值的平均偏离程度

计算公式

MAD=1ni=1nxiμMAD = \frac{1}{n}\sum_{i=1}^n |x_i - \mu|

计算示例

mu = np.mean(X)
abs_dev = np.abs(X - mu)
print(f"\n平均绝对偏差: {np.mean(abs_dev):.2f}")

3. 方差与标准差

量化数据波动性的核心指标

随机数据计算

print(f"\n方差: {np.var(X):.2f}")
print(f"标准差: {np.std(X):.2f}")

股票收益率波动分析

# 获取特斯拉2022年收益率
tsla = yf.download('TSLA', start='2022-01-01', end='2023-01-01')['Close']
returns = tsla.pct_change().dropna()

plt.figure(figsize=(10,5))
plt.plot(returns.cumsum(), label='累计收益')
plt.fill_between(returns.index, returns, alpha=0.3, color='gray', label='日波动')
plt.title("特斯拉2022年收益率波动")
plt.legend()
plt.show()

print(f"\n特斯拉收益率标准差: {returns.std():.4f}")
print(f"年化波动率: {returns.std()*np.sqrt(252):.2%}")

4. 半方差与半标准差

专门衡量下行风险的指标

计算方法

lows = X[X <= mu]
semivar = np.sum((lows - mu)**2) / len(lows)
print(f"\n半方差: {semivar:.2f}")
print(f"半标准差: {np.sqrt(semivar):.2f}")

比特币下行风险分析

btc = yf.download('BTC-USD', start='2021-01-01', end='2023-01-01')['Close']
btc_returns = btc.pct_change().dropna()
mean_return = btc_returns.mean()

downside_returns = btc_returns[btc_returns < mean_return]
downside_volatility = np.sqrt(np.mean((downside_returns - mean_return)**2))

print(f"\n比特币下行标准差: {downside_volatility:.4f}")

5. 目标半方差

衡量低于特定目标值的波动性

计算示例(目标值B=50)

B = 50
lows_B = X[X <= B]
semivar_B = np.mean((lows_B - B)**2) if len(lows_B)>0 else 0
print(f"\n目标半方差(B={B}): {semivar_B:.2f}")

黄金价格风险分析(以1800美元为目标)

gold = yf.download('GC=F', start='2020-01-01', end='2023-01-01')['Close']
target_price = 1800
downside_prices = gold[gold < target_price]

if not downside_prices.empty:
    target_semivar = np.mean((downside_prices - target_price)**2)
    print(f"\n黄金目标半方差: {target_semivar:.2f}")
else:
    print("\n无低于目标价记录")

可视化工具

def plot_risk_metrics(symbol):
    data = yf.download(symbol, period='1y')['Close']
    returns = data.pct_change().dropna()

    plt.figure(figsize=(12,6))

    # 价格走势
    plt.subplot(211)
    plt.plot(data, label='Price')
    plt.title(f"{symbol} 价格走势与波动分析")

    # 收益率分布
    plt.subplot(212)
    plt.hist(returns, bins=50, alpha=0.7)
    plt.axvline(returns.mean(), color='red', linestyle='--')
    plt.xlabel('日收益率')
    plt.ylabel('频次')

    plt.tight_layout()
    plt.show()

    print(f"年度风险指标:")
    print(f"- 最大回撤: {returns.min():.2%}")
    print(f"- 波动率: {returns.std()*np.sqrt(252):.2%}")

# 示例使用:plot_risk_metrics('MSFT')

关键要点

  1. 标准差是衡量总体波动性的黄金标准
  1. 半方差更关注下行风险,适合保守型投资者
  1. 极差对异常值敏感,需结合其他指标分析
  1. 金融数据分析需考虑年化处理(√252个交易日)
  1. 不同资产类别需选择合适风险指标组合
# 综合案例分析:标普500 ETF
spy = yf.download('SPY', period='max')['Close']
spy_returns = spy.pct_change().dropna()

risk_metrics = {
    '年化波动率': spy_returns.std() * np.sqrt(252),
    '最大单日跌幅': spy_returns.min(),
    '下行标准差': np.sqrt(np.mean((spy_returns[spy_returns < 0])**2)) * np.sqrt(252),
    '10年最大回撤': (spy/spy.expanding().max() -1).min()
}

print("\n标普500 ETF风险指标:")
for k,v in risk_metrics.items():
    print(f"- {k}: {v:.2%}")

通过本教程,您已掌握:

  1. 使用Python计算各类离散指标
  1. 分析真实金融数据的波动特征
  1. 识别不同风险指标的应用场景
  1. 构建自定义风险分析工具

附:练习合集