一、认识数据 ------ OHLCV(日线行情五件套)
每一行 = 一个交易日,每一列 = 当天市场记录的一个数字。

💡 为什么量化里最爱用收盘价?
因为一天交易下来,经过多空双方充分博弈,收盘价是市场用真金白银投票出来的"最终共识"。算收益率、画趋势线、做回测,默认都用 Close。
第二部分:核心指标 ------ 收益率
1、先忘掉股票,用生活例子理解
昨天苹果 10 元/斤,今天 11 元/斤。
涨了 1 块钱,但更关键的是:1 块钱相对于昨天的 10 块钱,涨了 10%。
这个 10%,就是收益率。
也就是:今天比昨天"多出来的部分",除以"昨天的价格"。
2、为什么不用"涨了多少钱",非要用"收益率"?
- 茅台:昨天 1000 元,今天涨了 10 元 → 涨幅 1%
- 小破股:昨天 10 元,今天涨了 5 元 → 涨幅 50%
- 只看钱数,你会觉得茅台更猛;但算收益率,小破股才是真正的"暴涨"。
- 收益率让你能公平对比不同价位的股票。
第三部分:小实验 ------ 谁波动更大?
实验逻辑
- 同时下载 苹果(AAPL)、特斯拉(TSLA)、英伟达(NVDA) 近一年的日线数据。
- 分别算出各自的日收益率。
- 计算各自收益率序列的
- 标准差(σ)。 谁的 σ 大,谁波动更猛。
标准差(σ)到底是个啥?
简单说:收益率平均偏离"平均值"的幅度。
σ 越大,说明每天的收益率散得越开,今天可能涨 5%,明天可能跌 4%。
σ 越小,说明每天的收益率都紧贴着平均值,涨跌都很温和。
bash
# ========== 三只股票收益率对比图 ==========
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
colors = ['tab:blue', 'tab:orange', 'tab:green']
for (name, series), c in zip(all_rets.items(), colors):
axes[0].plot(series.index, series.values, label=name, alpha=0.75, linewidth=0.8)
axes[0].axhline(0, color='black', linestyle='--', linewidth=0.6)
axes[0].set_title('日收益率对比', fontsize=13)
axes[0].set_xlabel('日期')
axes[0].set_ylabel('日收益率')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
axes[1].bar(vol.index, vol.values * 100, color=colors[: len(vol)], edgecolor='white')
axes[1].set_title('波动大小对比(标准差 %)', fontsize=13)
axes[1].set_ylabel('标准差 (%)')
axes[1].grid(True, axis='y', alpha=0.3)
for i, v in enumerate(vol.values):
axes[1].text(i, v * 100 + 0.02, f'{v:.2%}', ha='center', fontsize=11)
plt.tight_layout()
plt.show()
winner = vol.index[0]
print(f'\n在本实验设定下({period} 日线),波动最大的是:{winner}')

在本实验设定下(1y 日线),波动最大的是:特斯拉
bash
# ========== 三只股票 Histogram 并排对比 ==========
fig, axes = plt.subplots(1, 3, figsize=(15, 4), sharey=True)
for ax, (name, series), c in zip(axes, all_rets.items(), colors):
ax.hist(series.values, bins=35, color=c, alpha=0.75, edgecolor='white')
ax.axvline(0, color='black', linestyle='--', linewidth=0.6)
ax.set_title(f'{name}\nσ = {series.std():.2%}')
ax.set_xlabel('日收益率')
axes[0].set_ylabel('天数')
fig.suptitle('三只股票:日收益率 Histogram 对比', fontsize=14, y=1.02)
plt.tight_layout()
plt.show()

作业:
bash
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# ---------- 【修改区】在这里替换 'AAPL' 为你的最爱 ----------
# 示例:换微软 MSFT,或谷歌 GOOGL,或 AMD
tickers = {
'MSFT': '微软', # <--- 这里改!原来这里是 'AAPL': '苹果'
'TSLA': '特斯拉',
'NVDA': '英伟达',
}
# ---------------------------------------------------------
period = '1y' # 时间长度,可改成 '6mo'、'2y'
all_rets = {}
print("⏳ 正在下载数据...")
for symbol, name in tickers.items():
# 下载数据(progress=False 隐藏进度条)
data = yf.download(symbol, period=period, progress=False, multi_level_index=False).dropna()
# 计算日收益率,去掉第一行 NaN
all_rets[name] = data['Close'].pct_change().dropna()
print(f'✅ {name} ({symbol}): {len(all_rets[name])} 个交易日')
# 计算波动(标准差)并降序排列
vol = pd.Series({name: s.std() for name, s in all_rets.items()}).sort_values(ascending=False)
print('\n=== 📊 日收益率波动(标准差,越大越猛)===')
for name, v in vol.items():
print(f' 🚀 {name}: {v:.3%}')
print(f'\n🏆 波动最大的是:{vol.index[0]}')
# ---------- 画直方图对比 ----------
fig, axes = plt.subplots(1, 3, figsize=(15, 4), sharey=True)
colors = ['tab:blue', 'tab:orange', 'tab:green']
for ax, (name, series), c in zip(axes, all_rets.items(), colors):
ax.hist(series.values, bins=35, color=c, alpha=0.75, edgecolor='white')
ax.axvline(0, color='black', linestyle='--', linewidth=0.6)
ax.set_title(f'{name}\nσ = {series.std():.2%}')
ax.set_xlabel('日收益率')
axes[0].set_ylabel('天数')
fig.suptitle('📈 三只股票:日收益率 Histogram 对比', fontsize=14, y=1.02)
plt.tight_layout()
plt.show()
想拉长周期看趋势,把 period='1y' 改成 '2y'(两年)或 '5y'(五年)