查看全集:💎Quantopia量化分析56讲
离散度量用于量化数据分布的波动程度,在金融领域直接关联风险度量。本教程涵盖以下核心概念:
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
# 设置随机种子保证结果可复现
np.random.seed(121)
衡量数据分布的最大波动范围
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')}")
衡量数据与均值的平均偏离程度
mu = np.mean(X)
abs_dev = np.abs(X - mu)
print(f"\n平均绝对偏差: {np.mean(abs_dev):.2f}")
量化数据波动性的核心指标
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%}")
专门衡量下行风险的指标
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}")
衡量低于特定目标值的波动性
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}")
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')
# 综合案例分析:标普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%}")
通过本教程,您已掌握: