所需库与工具:
import yfinance as yf
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
# 自定义众数函数(与讲义中相同)
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'
1a 随机数据集平均数
生成包含99个1-100随机整数的列表,计算其算术平均数:
np.random.seed(42)
l = [np.random.randint(1, 100) for _ in range(99)]
# 你的代码写在此处
# print(f"随机数据集的平均数: {_____}")
1b 股票收益率平均数
计算美国银行(BAC)2015-2020年的日收益率平均数:
# 获取数据
bac = yf.download('BAC', start='2015-01-01', end='2020-01-01')
# 计算收益率
returns = _____ # 提示:使用pct_change和dropna
# 你的代码写在此处
# print(f"BAC收益率平均数: {_____}")
2a 随机数据集中位数
使用练习1生成的随机列表,计算中位数:
# 你的代码写在此处
# print(f"随机数据集的中位数: {_____}")
2b 股票收益率中位数
计算花旗集团(C)2018-2023年收益率中位数:
citi = yf.download('C', start='2018-01-01', end='2023-01-01')
returns = _____
# 你的代码写在此处
# print(f"花旗收益率中位数: {_____}")
3a 随机数据集众数
计算练习1中随机列表的众数:
# 你的代码写在此处
# print(f"随机数据集的众数: {_____}")
3b 收益率众数分箱
分析标普500 ETF(SPY)近3年收益率的众数分箱:
spy = yf.download('SPY', start='2021-01-01', end='2024-01-01')
returns = _____
# 分箱处理(20个箱)
hist, bins = _____
# 找出最高频率分箱
maxfreq = _____
# 你的代码写在此处
# print(f"高频分箱区间: {_____}")
4a 随机几何平均数
计算练习1随机列表的几何平均数:
# 你的代码写在此处
# print(f"几何平均数: {_____}")
4b 长期收益率验证
验证苹果公司(AAPL)10年价格的几何平均增长率:
aapl = yf.download('AAPL', start='2013-01-01', end='2023-01-01')['Close']
# 计算几何平均收益率
ratios = _____ + 1
geo_mean = _____
# 验证价格计算
initial = aapl.iloc[0]
calculated = _____
# 你的验证代码写在此处
5a 随机调和平均数
计算练习1随机列表的调和平均数:
# 你的代码写在此处
# print(f"调和平均数: {_____}")
5b 交易策略应用
假设每月定投QQQ ETF,计算平均成本价(需用调和平均数):
qqq = yf.download('QQQ', start='2022-01-01', end='2023-01-01')['Close']
# 提取每月第一个交易日价格
monthly_prices = _____
# 你的计算代码写在此处
# print(f"定投平均成本价: {_____}")
6a 市场偏度判断
分析纳斯达克100(QQQ)近5年收益率的分布偏度:
qqq = yf.download('QQQ', start='2018-01-01', end='2023-01-01')['Close']
returns = _____
mean = _____
median = _____
mode_val = _____
# 你的判断逻辑写在此处
# if _____:
# print("正偏分布")
# elif _____:
# print("负偏分布")
# else:
# print("对称分布")
6b 收益率分布可视化
绘制上述收益率的直方图:
plt.figure(figsize=(10,6))
_____ # 绘制50个分箱的直方图
plt.xlabel('Daily Returns')
plt.ylabel('Frequency')
plt.title('QQQ Daily Returns Distribution')
plt.show()
提示:
yf.download(['AAPL', 'MSFT'], ...)
.pct_change().dropna()
组合numpy.histogram
返回值的结构完成所有练习后,可通过实际金融数据分析加深对不同集中趋势度量的理解。建议尝试更换不同股票和时间周期观察结果差异。