跳到主内容
研究工具量化研究工具与数据基础 · 第1–5讲1/5模块导览 →
讲义

第1讲:研究入门 (Introduction to Research)

介绍 Notebook 研究环境、代码执行、文档查询和性能监控,并用价格数据展示可复现分析的基本流程。

完成状态保存在当前浏览器,可随时取消。

一、研究环境概览#

IPython Notebook(Jupyter Notebook)提供交互式数据分析环境,本指南将用yfinance获取真实金融数据,演示基础分析流程。

二、环境基础操作#

1. 单元格类型#

  • 代码单元格:灰色背景,可执行Python代码

  • Markdown单元格:白色背景,编写说明文档

  • 切换方式:工具栏"Cell Type"下拉菜单选择

2. 执行代码#

  • 快捷键:Shift + Enter

  • 运行指示:[ ]未执行,[*]执行中,[数字]已执行顺序

code
# 示例代码
2 + 2  # 显示最后一个表达式结果
X = 2  # 赋值语句无输出
print(2 + 2)  # 强制输出
3 + 3

3. 性能监控#

长时间运行代码时观察星号标记:

code
total = 0
for i in range(10_000_000):
    total += i
total  # 输出累加结果

三、核心工具库#

1. 库导入规范#

code
import numpy as np   # 数值计算
import pandas as pd  # 数据分析
import matplotlib.pyplot as plt  # 可视化

2. 自动补全功能#

  • Tab键显示可用函数/属性列表

  • 示例尝试:输入np.random.后按Tab

3. 文档查询#

code
help(np.random.normal)  # 显示函数文档

四、数据分析基础#

1. 数据生成#

code
# 生成正态分布样本
sample_data = np.random.normal(loc=0, scale=1, size=100)

2. 基础可视化#

code
plt.plot(sample_data)
plt.xlabel('Sequence')
plt.ylabel('Value')
plt.title('Random Sample Series');

五、真实金融数据处理#

1. 数据获取#

code
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. 价格序列提取#

code
# 获取苹果收盘价
aapl_close = stock_data['Close']['AAPL'].dropna()

3. 价格走势可视化#

code
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. 收益计算#

code
daily_returns = aapl_close.pct_change().dropna()

2. 收益分布直方图#

code
plt.hist(daily_returns, bins=50, density=True)
plt.xlabel('Daily Return')
plt.ylabel('Frequency')
plt.title('AAPL Daily Returns Distribution');

3. 统计指标#

code
return_mean = np.mean(daily_returns)
return_std = np.std(daily_returns)
print(f"日均收益率: {return_mean:.4%}")
print(f"日收益波动率: {return_std:.4%}")

七、正态性检验#

1. 生成理论分布#

code
normal_returns = np.random.normal(return_mean, return_std, 10000)

2. 对比可视化#

code
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. 移动平均线#

code
ma_60 = aapl_close.rolling(window=60).mean()

2. 价格与均线可视化#

code
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');

九、练习环节#

  1. 获取特斯拉(TSLA)2020年至今的日线数据

  2. 计算20日移动平均线并绘制价格对比图

  3. 统计收益率分布的峰度(使用scipy.stats.kurtosis

  4. 比较不同窗口长度(20日 vs 60日)均线的平滑效果差异

code
# 练习参考答案示例
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}")

十、关键概念回顾#

  1. 收盘价:当日交易结束时的最后成交价

  2. 日收益率Rt=PtPt1Pt1R_t = \frac{P_t - P_{t-1}}{P_{t-1}}

  3. 移动平均MA(n)t=1ni=0n1PtiMA(n)_t = \frac{1}{n}\sum_{i=0}^{n-1}P_{t-i}

  4. 波动率:收益率的标准差,衡量风险

  5. 峰度:分布形态的陡缓程度,正峰度代表尖峰厚尾

十一、注意事项#

  1. 使用dropna()处理缺失值

  2. 金融时间序列需保持时间顺序

  3. 年化波动率计算需考虑交易日数量

  4. 移动平均窗口选择影响信号灵敏度

  5. 真实收益率常呈现尖峰厚尾特征

十二、研究可复现性检查清单#

把图表做出来并不等于完成研究。提交任何结论前,至少逐项确认:

  1. 时点可得性:每个价格、基本面字段和股票池成分在信号生成时确实已经公开,不能使用后来修订或事后补齐的数据

  2. 价格口径:明确使用原始价还是复权价,并单独处理分红、拆股、退市和停牌,避免把公司行动误判为收益

  3. 时间口径:固定时区、交易日历、截面时间和缺失值规则;信号、成交与收益之间必须留出真实可执行的时间差

  4. 实验留痕:记录数据版本、代码版本、参数、随机种子和运行环境,使另一位研究员能够独立复现结果

  5. 验证隔离:按时间划分训练、验证和最终留出集;最终留出集只用于一次性确认,不参与参数选择

  6. 现实约束:在宣称策略有效前加入费用、滑点、冲击、成交量与借券限制,并报告结果对关键假设的敏感度

本指南展示了完整的研究工作流程:从数据获取、清洗处理、统计分析到可视化呈现。建议读者扩展练习时尝试不同参数设置,并思考各指标在实际交易中的应用场景。

下一讲