查看全课大纲(第 2 / 52 节)
  1. 1.量化分析基本概念:从咖啡馆到华尔街
  2. 2.量化交易员学习路线:从零基础到策略开发
  3. 3.量化策略生命周期:数据分析的五大流程
  4. 4.量化数据类型:数值型与类别型数据
  5. 5.量化沙盒搭建(1):Python与Anaconda安装
  6. 6.量化沙盒搭建(2):Jupyter Notebook与库配置
  7. 7.本地多源数据:量化历史回测的基石
  8. 8.TXT数据流操作:处理金融交易日志
  9. 9.JSON数据流操作:解析股票行情API响应
  10. 10.CSV行情文件操作:读取与存储历史K线
  11. 11.Excel报表操作:清洗财报与财务指标
  12. 12.量化数据库:SQL常用查询语法
  13. 13.量化数据库:Python连接与写入
  14. 14.量化多表连接:关联股票信息与行情
  15. 15.实战:小象咖啡店营业数据与个股财务指标的多源数据分析
  16. 16.量化数据采集:爬虫工作原理与合规
  17. 17.量化爬虫核心:URL管理与去重策略
  18. 18.量化网页下载:防反爬与请求头伪装
  19. 19.网页解析(1):使用XPath定位财经新闻
  20. 20.网页解析(2):使用CSS选择器与ItemLoader
  21. 21.Scrapy框架:构建工业级量化爬虫
  22. 22.Scrapy实战(1):新建项目与数据模型定义
  23. 23.Scrapy实战(2):编写财经爬虫逻辑
  24. 24.Scrapy实战(3):启用数据管道清洗行情
  25. 25.Scrapy实战(4):防反爬中间件配置
  26. 26.实战:构建每日热门个股行情自动采集系统
  27. 27.NumPy与SciPy:加速量化矩阵计算
  28. 28.NumPy数组:构建股票价格矩阵
  29. 29.数组切片:提取特定股票与交易日数据
  30. 30.NumPy常用方法:计算均值与波动率
  31. 31.向量化计算:摆脱缓慢的For循环
  32. 32.通用函数ufunc:计算对数收益率与累计收益
  33. 33.实战:股票组合资产收益率与协方差矩阵计算
  34. 34.Pandas Series:管理单只股票收盘价
  35. 35.Pandas DataFrame:构建多只股票行情面板
  36. 36.Pandas Index:时间序列索引与对齐
  37. 37.DataFrame索引操作:loc与iloc定位行情
  38. 38.索引总结:量化多字段筛选与定位
  39. 39.运算与对齐:合并不同交易日的数据
  40. 40.Pandas map:对股票代码与状态做映射
  41. 41.Pandas apply:滚动计算技术指标
  42. 42.排序操作:按市盈率与收益率对股票排名
  43. 43.数据清洗:填充与剔除停牌股票缺失值
  44. 44.数据清洗:剔除重复报价与异常交易数据
  45. 45.常用统计:量化最大回撤与分位数风险评估
  46. 46.极值定位:寻找历史最高价与最低价的发生日
  47. 47.风险与累计收益:计算年化波动率与累计回报
  48. 48.实战:小象咖啡店营业数据与热门个股时间序列清洗分析
  49. 49.Series索引操作:按位置与标签访问行情数据
  50. 50.文件读写操作:CSV行情数据导入导出
  51. 51.数据清洗:替换异常报价数据
  52. 52.常用统计:sum/mean/median/count聚合指标

量化交易员学习路线:从零基础到策略开发

约 8 分钟

小象实战讲义 · 量化交易Python入门:从咖啡馆到华尔街

成为一名能独立开发策略的量化交易员,需要按什么顺序补齐哪些能力?本节给出一张从零基础到策略开发的完整学习路线:先打牢 Python 与数据分析基本功,再依次掌握数据采集、数值计算、统计分析与建模,最终落到策略回测与迭代。对照这张路线图,你可以随时定位自己所处的阶段,安排后续学习节奏。

💡 核心导读

本节将系统介绍数据分析师的成长路径,从基础工具掌握到商业思维培养的完整知识体系。重点掌握:1) 数据分析的四大核心阶段 2) Python 技术栈的渐进式学习方案 3) 真实业务场景的模拟训练方法。通过配套的代码示例,读者将完成从数据清洗到可视化的完整流程演练。


技术能力成长路径

基础工具三件套

import pandas as pd
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

print("当前环境版本:")
print(f"Pandas {pd.__version__}, NumPy {np.__version__}, Matplotlib {plt.matplotlib.__version__}")
当前环境版本:
Pandas 3.0.6, NumPy 2.5.3, Matplotlib 3.11.2

数据分析核心流程

  1. 数据采集:API/爬虫/日志收集
  2. 清洗转换:处理缺失值与异常值
  3. 分析建模:描述统计与机器学习
  4. 可视化呈现:制作交互式报表
import pandas as pd
import numpy as np

raw_data = {
    '用户ID': [101, 102, 103, 104],
    '消费金额': [150, None, 300, -50],
    '注册日期': ['2023-01', '2023-02', '2023-03', '2023-04']
}

df = pd.DataFrame(raw_data)
print("清洗前数据:")
print(df)
print()

df['消费金额'] = df['消费金额'].clip(lower=0)
df['消费金额'] = df['消费金额'].fillna(df['消费金额'].median())

print("清洗后数据:")
print(df)

实战项目演进路线

阶段式项目设计

清洗前数据:
   用户ID   消费金额     注册日期
0   101  150.0  2023-01
1   102    NaN  2023-02
2   103  300.0  2023-03
3   104  -50.0  2023-04

清洗后数据:
   用户ID   消费金额     注册日期
0   101  150.0  2023-01
1   102  150.0  2023-02
2   103  300.0  2023-03
3   104    0.0  2023-04

典型项目示例

import pandas as pd
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

# 在块内构造示例数据,模拟电商行为日志
data = {
    'user_id': [1001, 1002, 1003, 1001, 1004, 1002, 1005, 1003],
    'paid': [True, False, True, True, False, True, True, False],
    'price': [120.5, 0, 89.0, 150.0, 0, 75.5, 200.0, 0],
    'pay_time': ['2023-10-01 09:15:00', None, '2023-10-01 14:30:00',
                 '2023-10-01 16:45:00', None, '2023-10-01 20:00:00',
                 '2023-10-01 22:10:00', None]
}
df = pd.DataFrame(data)

# 计算关键指标
uv = df['user_id'].nunique()
conversion_rate = df['paid'].mean()
avg_order_value = df.loc[df['paid'], 'price'].mean()

print("电商数据分析结果:")
print(f"独立访客数 (UV): {uv}")
print(f"转化率: {conversion_rate:.2%}")
print(f"客单价: ¥{avg_order_value:.2f}")
print()

# 可视化部分:构造每小时订单量数据
hourly_orders = pd.Series({9: 1, 14: 1, 16: 1, 20: 1, 22: 1})
fig, ax = plt.subplots()
hourly_orders.plot(kind='bar', ax=ax)
ax.set_title('模拟每小时订单量分布')
ax.set_xlabel('小时')
ax.set_ylabel('订单数')
print("已生成每小时订单量分布图(图表对象已创建)")
plt.close(fig)
电商数据分析结果:
独立访客数 (UV): 5
转化率: 62.50%
客单价: ¥127.00

已生成每小时订单量分布图(图表对象已创建)

📝 动手练一练

第 1 题 · 概念应用

你正在构建一个简单的股票因子分析流程,需要计算过去一个月内多只股票的日收益率,并找出收益率波动率(标准差)最低的股票作为“低波动因子”的候选。以下哪个选项正确描述了完成此任务最合理的 Python 库使用顺序?

  • A. 先用 Matplotlib 从网络 API 下载股票行情数据,再用 Scikit-learn 的 StandardScaler 计算标准差,最后用 Pandas 筛选股票。
  • B. 先用 Pandas 读取并清洗包含日期、股票代码和收盘价的 CSV 数据,再用 NumPy 的 std 函数对分组后的收益率序列进行向量化计算,最后用 Pandas 进行排序和筛选。
  • C. 直接用 Scikit-learn 的 fetch_openml 获取金融数据集,并用其 Pipeline 一次性完成数据加载、计算和可视化。
  • D. 仅使用 Python 内置的 statistics 模块计算每只股票的标准差,因为 Pandas 和 NumPy 在处理时间序列时过于复杂。
👉 点击查看参考答案

答案:B(先用 Pandas 读取并清洗包含日期、股票代码和收盘价的 CSV 数据,再用 NumPy 的 std 函数对分组后的收益率序列进行向量化计算,最后用 Pandas 进行排序和筛选。)

推理过程:

  1. 数据获取与清洗:金融时间序列数据(如CSV格式的行情数据)通常包含缺失值、异常价格(如停牌)和需要转换的格式(如字符串日期)。Pandas 是处理这类结构化数据的行业标准工具,擅长数据读取、清洗、分组和转换。
  2. 核心计算:计算每只股票收益率序列的标准差是一个数值计算问题。NumPy 提供了高效、向量化的 std 函数,当与 Pandas 的 groupby 和 apply 结合时,可以快速对每个分组(每只股票)进行计算,性能远优于纯 Python 循环。
  3. 结果处理:计算出的波动率结果通常是一个 Series 或 DataFrame,需要按值排序并筛选出波动率最低的股票。Pandas 提供了强大的数据排序和索引功能来完成这一步。

选项 A 混淆了库的职责,Matplotlib 主要用于绘图而非数据获取。选项 C 中,fetch_openml 不一定能获取到所需的特定股票行情数据,且用机器学习 Pipeline 处理基础统计计算是“杀鸡用牛刀”。选项 D 忽略了 Pandas 和 NumPy 在处理批量数据时的巨大效率优势,内置模块在数据量大时速度慢且不便。

💡 小象贴士:在量化分析中,清晰的工具分工是高效开发的关键:Pandas 管“数据”,NumPy 管“计算”,Matplotlib 管“画图”,Scikit-learn 管“模型”。


第 2 题 · 代码填空

在回测一个简单的动量策略时,你需要计算一只股票过去5个交易日的简单收益率。给定一个包含收盘价的 Pandas Series prices,请补全下面使用向量化方法计算收益率的代码。

import pandas as pd
import numpy as np

# 模拟股票收盘价数据
prices = pd.Series([100.0, 102.5, 101.0, 105.0, 106.5, 108.0], 
                   index=pd.date_range('2024-01-01', periods=6, freq='D'))
print("原始收盘价:")
print(prices)
print()

# 计算简单收益率:(当前价 - 前一期价) / 前一期价
# 请补全下面这行代码
returns = prices.______()

print("每日收益率(第一个值为NaN):")
print(returns.round(4))
👉 点击查看参考答案

空位应填:pct_change

补全后的完整可运行代码如下:

import pandas as pd
import numpy as np

# 模拟股票收盘价数据
prices = pd.Series([100.0, 102.5, 101.0, 105.0, 106.5, 108.0], 
                   index=pd.date_range('2024-01-01', periods=6, freq='D'))
print("原始收盘价:")
print(prices)
print()

# 计算简单收益率:(当前价 - 前一期价) / 前一期价
# 使用 pandas 内置的 pct_change 方法进行向量化计算
returns = prices.pct_change()

print("每日收益率(第一个值为NaN):")
print(returns.round(4))
原始收盘价:
2024-01-01    100.0
2024-01-02    102.5
2024-01-03    101.0
2024-01-04    105.0
2024-01-05    106.5
2024-01-06    108.0
Freq: D, dtype: float64

每日收益率(第一个值为NaN):
2024-01-01       NaN
2024-01-02    0.0250
2024-01-03   -0.0146
2024-01-04    0.0396
2024-01-05    0.0143
2024-01-06    0.0141
Freq: D, dtype: float64

解释:

  • prices.pct_change() 是 Pandas 中专门用于计算百分比变化(收益率)的向量化方法。它等价于 (prices - prices.shift(1)) / prices.shift(1)。
  • 使用内置方法不仅代码简洁,而且执行效率高,是处理金融时间序列收益率的标准做法。
  • 结果中第一个值为 NaN 是因为第一期没有前一期数据可用于计算。
  • 注意:在真实的策略回测中,需警惕使用未来数据(前视偏差)。pct_change 的计算是严格基于历史数据的,符合要求。

本章小结

📋 行动清单

  • 在本地Jupyter中运行数据清洗示例,尝试修改不同的异常值处理策略
  • 下载公开数据集(如Kaggle TMDB 5000)重复电商分析流程
  • 使用Matplotlib制作包含标题、图例、坐标轴标签的完整销售趋势图

—— 小象教研组