概述#
离散度量用于量化数据分布的波动程度,在金融领域直接关联风险度量。本教程涵盖以下核心概念:
-
极差(Range)
-
平均绝对偏差(MAD)
-
方差与标准差
-
半方差与半标准差
-
目标半方差
准备工作#
code
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
# 设置随机种子保证结果可复现
np.random.seed(121)1. 极差(Range)#
衡量数据分布的最大波动范围
随机数据示例#
code
X = np.sort(np.random.randint(100, size=20))
print("数据集X:\n", X)
print("极差:", np.ptp(X))金融数据应用(苹果股价波动)#
code
# 获取苹果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)#
衡量数据与均值的平均偏离程度
计算公式#
计算示例#
code
mu = np.mean(X)
abs_dev = np.abs(X - mu)
print(f"\n平均绝对偏差: {np.mean(abs_dev):.2f}")3. 方差与标准差#
量化数据波动性的核心指标
随机数据计算#
code
print(f"\n方差: {np.var(X):.2f}")
print(f"标准差: {np.std(X):.2f}")股票收益率波动分析#
code
# 获取特斯拉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. 半方差与半标准差#
专门衡量下行风险的指标
计算方法#
code
lows = X[X <= mu]
semivar = np.sum((lows - mu)**2) / len(lows)
print(f"\n半方差: {semivar:.2f}")
print(f"半标准差: {np.sqrt(semivar):.2f}")比特币下行风险分析#
code
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)#
code
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美元为目标)#
code
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无低于目标价记录")可视化工具#
code
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')关键要点#
-
标准差是衡量总体波动性的黄金标准
-
半方差更关注下行风险,适合保守型投资者
-
极差对异常值敏感,需结合其他指标分析
-
金融数据分析需考虑年化处理(√252个交易日)
-
不同资产类别需选择合适风险指标组合
code
# 综合案例分析:标普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%}")通过本教程,您已掌握:
-
使用Python计算各类离散指标
-
分析真实金融数据的波动特征
-
识别不同风险指标的应用场景
-
构建自定义风险分析工具