<aside> 💡
查看全集:Quantopia量化分析56讲
</aside>
本教程将介绍如何使用单一数值来概括数据集,核心目标是捕捉数据分布的关键信息。
# 导入必要的库
import yfinance as yf
import scipy.stats as stats
import numpy as np
# 定义自定义众数计算函数
def mode(l):
counts = {}
for e in l:
counts[e] = counts.get(e, 0) + 1
maxcount = max(counts.values(), default=0)
if maxcount < 1 and len(l) > 1:
return 'No mode'
modes = [k for k, v in counts.items() if v == maxcount]
return modes if maxcount > 1 or len(l) == 1 else 'No mode'
最常用的集中趋势度量,计算公式为:
$$ \text{Mean} = \frac{1}{n}\sum_{i=1}^n x_i
$$
# 示例数据集
x1 = [1, 2, 2, 3, 4, 5, 5, 7]
x2 = x1 + [100]
print(f'x1的平均数: {np.mean(x1):.2f}')
print(f'x2的平均数: {np.mean(x2):.2f}')
将数据排序后位于中间位置的值,对异常值不敏感:
print(f'x1的中位数: {np.median(x1)}')
print(f'x2的中位数: {np.median(x2)}')
出现频率最高的值,适用于类别数据:
print(f'x1的众数: {mode(x1)}')
print(f'x2的众数: {mode(x2)}')
适用于增长率计算,计算公式:
$$ \sqrt[n]{\prod_{i=1}^{n} x_i} $$
print(f'x1的几何平均数: {stats.gmean(x1):.2f}')
print(f'x2的几何平均数: {stats.gmean(x2):.2f}')
# 获取标普500指数数据
start = '2014-01-01'
end = '2015-01-01'
data = yf.download('SPY', start=start, end=end)
prices = data['Close']
# 计算日收益率
returns = prices.pct_change().dropna()
# 展示基本统计量
print('\\n金融数据分析:')
print(f'收益率均值: {returns.mean():.4f}')
print(f'收益率中位数: {returns.median():.4f}')
print(f'收益率众数: {mode(returns.round(4))}') # 四舍五入便于分组
# 几何平均收益率计算
geo_mean_return = stats.gmean(returns + 1) - 1
print(f'几何平均收益率: {geo_mean_return:.4f}')
# 验证几何平均计算
initial_price = prices.iloc[0]
final_price = prices.iloc[-1]
T = len(returns)
calculated_price = initial_price * (1 + geo_mean_return)**T
print(f'实际最终价格: {final_price:.2f}')
print(f'几何平均计算价格: {calculated_price:.2f}')