一、研究环境概览#
IPython Notebook(Jupyter Notebook)提供交互式数据分析环境,本指南将用yfinance获取真实金融数据,演示基础分析流程。
二、环境基础操作#
1. 单元格类型#
-
代码单元格:灰色背景,可执行Python代码
-
Markdown单元格:白色背景,编写说明文档
-
切换方式:工具栏"Cell Type"下拉菜单选择
2. 执行代码#
-
快捷键:Shift + Enter
-
运行指示:[ ]未执行,[*]执行中,[数字]已执行顺序
# 示例代码
2 + 2 # 显示最后一个表达式结果
X = 2 # 赋值语句无输出
print(2 + 2) # 强制输出
3 + 33. 性能监控#
长时间运行代码时观察星号标记:
total = 0
for i in range(10_000_000):
total += i
total # 输出累加结果三、核心工具库#
1. 库导入规范#
import numpy as np # 数值计算
import pandas as pd # 数据分析
import matplotlib.pyplot as plt # 可视化2. 自动补全功能#
-
Tab键显示可用函数/属性列表
-
示例尝试:输入
np.random.后按Tab
3. 文档查询#
help(np.random.normal) # 显示函数文档四、数据分析基础#
1. 数据生成#
# 生成正态分布样本
sample_data = np.random.normal(loc=0, scale=1, size=100)2. 基础可视化#
plt.plot(sample_data)
plt.xlabel('Sequence')
plt.ylabel('Value')
plt.title('Random Sample Series');五、真实金融数据处理#
1. 数据获取#
import yfinance as yf
# 获取多股票数据
start_date = '2019-01-01'
end_date = '2022-01-01'
tickers = ['AAPL', 'MSFT']
stock_data = yf.download(tickers, start=start_date, end=end_date)数据结构解析:#
-
多级列索引:第一层(Open, High, Low, Close, Volume),第二层(股票代码)
-
行索引:DatetimeIndex
2. 价格序列提取#
# 获取苹果收盘价
aapl_close = stock_data['Close']['AAPL'].dropna()3. 价格走势可视化#
plt.figure(figsize=(10,6))
plt.plot(aapl_close.index, aapl_close.values)
plt.ylabel('Price (USD)')
plt.title('AAPL Closing Price 2019-2021');六、收益分析#
1. 收益计算#
daily_returns = aapl_close.pct_change().dropna()2. 收益分布直方图#
plt.hist(daily_returns, bins=50, density=True)
plt.xlabel('Daily Return')
plt.ylabel('Frequency')
plt.title('AAPL Daily Returns Distribution');3. 统计指标#
return_mean = np.mean(daily_returns)
return_std = np.std(daily_returns)
print(f"日均收益率: {return_mean:.4%}")
print(f"日收益波动率: {return_std:.4%}")七、正态性检验#
1. 生成理论分布#
normal_returns = np.random.normal(return_mean, return_std, 10000)2. 对比可视化#
plt.hist(daily_returns, bins=50, density=True, alpha=0.6, label='Actual')
plt.hist(normal_returns, bins=50, density=True, alpha=0.5, label='Normal')
plt.legend()
plt.title('Actual vs Normal Distribution');八、技术指标计算#
1. 移动平均线#
ma_60 = aapl_close.rolling(window=60).mean()2. 价格与均线可视化#
plt.figure(figsize=(12,6))
plt.plot(aapl_close, label='Price')
plt.plot(ma_60, label='60-day MA')
plt.ylabel('Price')
plt.legend()
plt.title('Price with Moving Average');九、练习环节#
-
获取特斯拉(TSLA)2020年至今的日线数据
-
计算20日移动平均线并绘制价格对比图
-
统计收益率分布的峰度(使用
scipy.stats.kurtosis) -
比较不同窗口长度(20日 vs 60日)均线的平滑效果差异
# 练习参考答案示例
from scipy.stats import kurtosis
# 获取TSLA数据
tsla = yf.download('TSLA', start='2020-01-01')['Close']
# 计算移动平均
ma_20 = tsla.rolling(20).mean()
ma_60 = tsla.rolling(60).mean()
# 绘图比较
plt.figure(figsize=(12,6))
plt.plot(tsla, label='Price')
plt.plot(ma_20, label='20-day MA')
plt.plot(ma_60, label='60-day MA')
plt.legend()
plt.show()
# 计算统计量
returns = tsla.pct_change().dropna()
print(f"峰度系数: {kurtosis(returns):.2f}")十、关键概念回顾#
-
收盘价:当日交易结束时的最后成交价
-
日收益率:
-
移动平均:
-
波动率:收益率的标准差,衡量风险
-
峰度:分布形态的陡缓程度,正峰度代表尖峰厚尾
十一、注意事项#
-
使用
dropna()处理缺失值 -
金融时间序列需保持时间顺序
-
年化波动率计算需考虑交易日数量
-
移动平均窗口选择影响信号灵敏度
-
真实收益率常呈现尖峰厚尾特征
十二、研究可复现性检查清单#
把图表做出来并不等于完成研究。提交任何结论前,至少逐项确认:
-
时点可得性:每个价格、基本面字段和股票池成分在信号生成时确实已经公开,不能使用后来修订或事后补齐的数据
-
价格口径:明确使用原始价还是复权价,并单独处理分红、拆股、退市和停牌,避免把公司行动误判为收益
-
时间口径:固定时区、交易日历、截面时间和缺失值规则;信号、成交与收益之间必须留出真实可执行的时间差
-
实验留痕:记录数据版本、代码版本、参数、随机种子和运行环境,使另一位研究员能够独立复现结果
-
验证隔离:按时间划分训练、验证和最终留出集;最终留出集只用于一次性确认,不参与参数选择
-
现实约束:在宣称策略有效前加入费用、滑点、冲击、成交量与借券限制,并报告结果对关键假设的敏感度
本指南展示了完整的研究工作流程:从数据获取、清洗处理、统计分析到可视化呈现。建议读者扩展练习时尝试不同参数设置,并思考各指标在实际交易中的应用场景。