查看全课大纲(第 1 / 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 入门:从咖啡馆到华尔街》。本节先把地基打牢:什么是数据分析、什么是量化分析,「凭经验拍脑袋」和「让数据说话」两种决策方式差在哪里。我们会从小象咖啡馆的日常经营场景出发,看同一个问题在数据视角下如何被拆解成可度量、可验证的指标——这是后续所有策略思维的起点。

💡 核心导读

本节将介绍数据分析的核心概念体系,包括数据分类、分析流程和基础技术栈。通过理解结构化/非结构化数据的区别,掌握数据清洗的典型操作,并实践使用Pandas完成数据探索的完整过程。重点培养数据思维框架和基础工具链的应用能力。


数据分类与特征

结构化数据

以二维表形式存储的规整数据,常见于数据库和CSV文件:

import pandas as pd

data = {
    '股票代码': [101, 102, 103],
    '证券简称': ['小象咖啡', '腾讯控股', '贵州茅台'],
    '行业板块': ['科技板块', '消费板块', '医药板块'],
    '上市年份': [2019, 2020, 2018]
}
df = pd.DataFrame(data)

print("结构化数据示例:")
print(df)

执行后输出(ASCII表格格式):

结构化数据示例:
   股票代码  证券简称  行业板块  上市年份
0   101  小象咖啡  科技板块  2019
1   102  腾讯控股  消费板块  2020
2   103  贵州茅台  医药板块  2018

非结构化数据

包括文本、图像、音频等,需要特殊处理:

import re

text_data = ["2023-07-15 订单号:XYZ123 金额:¥599", "客户反馈:产品体验优秀"]

def clean_text(text):
    # 移除非字母数字字符
    return re.sub(r'[^\w\s]', '', text)

print("\n清洗前:", text_data)
print("清洗后:", [clean_text(t) for t in text_data])
清洗前: ['2023-07-15 订单号:XYZ123 金额:¥599', '客户反馈:产品体验优秀']
清洗后: ['20230715 订单号XYZ123 金额599', '客户反馈产品体验优秀']

数据分析流程

标准工作流

  1. 数据采集:通过API、爬虫或文件导入
  2. 数据清洗:处理缺失值、异常值
  3. 特征工程:创建衍生特征
  4. 建模分析:应用统计/机器学习方法
  5. 结果可视化
import pandas as pd
import numpy as np

# 构造示例数据,模拟金融数据清洗与分组
np.random.seed(42)  # 固定随机种子,确保输出确定性
dates = pd.date_range('2024-01-01', periods=10, freq='D')
data = {
    'date': dates,
    'ticker': ['AAPL', 'GOOG', 'MSFT'] * 3 + ['AAPL'],
    'close': np.random.uniform(100, 500, 10).round(2),
    'volume': np.random.randint(1000, 10000, 10),
    'pe_ratio': [15.2, 28.5, 35.0, 12.8, 60.5, 22.1, 95.0, 18.3, 45.7, 10.2]
}
df = pd.DataFrame(data)

# 清洗:过滤掉PE过高的数据,并创建估值分组
clean_data = df[df['pe_ratio'] < 100].copy()
clean_data['pe_ratio_group'] = pd.cut(clean_data['pe_ratio'],
                                      bins=[0, 18, 60, 100],
                                      labels=['低估值', '合理估值', '高估值'])

print("\n处理后数据结构(抽样5行):")
print(clean_data[['ticker', 'close', 'pe_ratio', 'pe_ratio_group']].sample(5, random_state=42))
处理后数据结构(抽样5行):
  ticker   close  pe_ratio pe_ratio_group
8   MSFT  340.45      45.7           合理估值
1   GOOG  480.29      28.5           合理估值
5   MSFT  162.40      22.1           合理估值
0   AAPL  249.82      15.2            低估值
7   GOOG  446.47      18.3           合理估值

核心工具链

Python数据分析栈

import sys

print(f"Python版本: {sys.version.split()[0]}\n")

libs = ['numpy', 'pandas', 'matplotlib', 'scipy']
for lib in libs:
    try:
        module = __import__(lib)
        print(f"{lib:>10} 版本: {module.__version__}")
    except ImportError:
        print(f"{lib:>10} 未安装")
Python版本: 3.14.5

     numpy 版本: 2.5.3
    pandas 版本: 3.0.6
matplotlib 版本: 3.11.2
     scipy 版本: 1.18.1

数据探索基础

import pandas as pd

print("\n数据概览方法:")
df = pd.DataFrame({'A': range(1, 6), 'B': ['x', 'y', 'z', 'x', 'y']})
print("1. 前N行数据:")
print(df.head(2))
print("\n2. 数据类型:")
print(df.dtypes)
print("\n3. 描述统计:")
print(df.describe())
数据概览方法:
1. 前N行数据:
   A  B
0  1  x
1  2  y

2. 数据类型:
A    int64
B      str
dtype: object

3. 描述统计:
              A
count  5.000000
mean   3.000000
std    1.581139
min    1.000000
25%    2.000000
50%    3.000000
75%    4.000000
max    5.000000

📝 动手练一练

第 1 题 · 概念应用

小象咖啡馆的店长正在分析一款新饮品的销售数据。他手头有两份资料:一份是过去30天该饮品每日的销售数量、单价和总销售额的Excel表格;另一份是社交媒体上关于这款饮品的100条用户评论。为了预测下个月的销量,他计划先对数据进行预处理。

请问,以下关于这两份数据类型的描述,哪一项是正确的?

  • A. 销售数据表格是非结构化数据,因为它来自Excel文件;用户评论是结构化数据,因为可以统计关键词频率。
  • B. 销售数据表格是结构化数据,因为它以行和列的形式规整存储;用户评论是非结构化数据,因为原始文本没有固定的格式。
  • C. 两者都属于半结构化数据,因为它们都同时包含数字和文字信息。
  • D. 两者都属于非结构化数据,都需要经过复杂的特征工程才能用于分析。
👉 点击查看参考答案

答案:B(销售数据表格是结构化数据,因为它以行和列的形式规整存储;用户评论是非结构化数据,因为原始文本没有固定的格式。)

推理过程:

  • 结构化数据通常指能够以二维表格形式(行代表记录,列代表属性)规整存储的数据。销售数据表格(日期、销量、单价、销售额)完全符合此定义。
  • 非结构化数据没有预定义的数据模型或格式,如纯文本、图像、音频。原始的用户评论文本属于此类,需要经过自然语言处理(如分词、情感分析)才能转化为可用于分析的结构化特征。
  • 选项A错误地将文件格式(Excel)与数据结构混淆。选项C错误,销售表格是典型的结构化数据。选项D过于绝对,结构化数据通常不需要“复杂”的特征工程即可进行基础分析。

第 2 题 · 代码填空

在量化分析中,数据清洗是第一步。以下代码模拟了加载三只股票收盘价数据,并尝试计算其日收益率。请补全代码中缺失的部分,使用Pandas的.pct_change()方法计算收益率。

import pandas as pd
import numpy as np

# 模拟股票收盘价数据
dates = pd.date_range('2024-01-02', periods=5, freq='D')
data = {
    'AAPL': [195.0, 196.5, 194.2, 198.8, 200.1],
    'GOOG': [142.3, 143.8, 141.5, 144.9, 145.3],
    'MSFT': [405.6, 408.2, 402.1, 410.5, 412.0]
}
df_close = pd.DataFrame(data, index=dates)

print("原始收盘价数据:")
print(df_close)
print()

# 计算每日收益率
# 提示:pct_change() 方法默认计算当前行与前一行相比的变化率
df_returns = df_close.______()

print("计算后的日收益率数据:")
print(df_returns.round(4))
👉 点击查看参考答案

空位应填:pct_change

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

import pandas as pd
import numpy as np

# 模拟股票收盘价数据
dates = pd.date_range('2024-01-02', periods=5, freq='D')
data = {
    'AAPL': [195.0, 196.5, 194.2, 198.8, 200.1],
    'GOOG': [142.3, 143.8, 141.5, 144.9, 145.3],
    'MSFT': [405.6, 408.2, 402.1, 410.5, 412.0]
}
df_close = pd.DataFrame(data, index=dates)

print("原始收盘价数据:")
print(df_close)
print()

# 计算每日收益率
# 提示:pct_change() 方法默认计算当前行与前一行相比的变化率
df_returns = df_close.pct_change()

print("计算后的日收益率数据:")
print(df_returns.round(4))
原始收盘价数据:
             AAPL   GOOG   MSFT
2024-01-02  195.0  142.3  405.6
2024-01-03  196.5  143.8  408.2
2024-01-04  194.2  141.5  402.1
2024-01-05  198.8  144.9  410.5
2024-01-06  200.1  145.3  412.0

计算后的日收益率数据:
              AAPL    GOOG    MSFT
2024-01-02     NaN     NaN     NaN
2024-01-03  0.0077  0.0105  0.0064
2024-01-04 -0.0117 -0.0160 -0.0149
2024-01-05  0.0237  0.0240  0.0209
2024-01-06  0.0065  0.0028  0.0037

解释:

  • DataFrame.pct_change() 是Pandas中计算百分比变化(收益率)的核心方法。默认计算相邻行(即相邻交易日)之间的变化率:(当前值 - 前值) / 前值。
  • 由于第一行(2024-01-02)没有前一行数据可供比较,因此其对应的收益率结果为 NaN(非数字)。
  • 在量化分析中,计算收益率是构建策略指标(如移动平均、波动率)的基础步骤。需注意处理结果中的初始NaN值。

本章小结

📋 行动清单

  • 使用Pandas创建包含5个字段、10条记录的模拟数据集,并输出描述性统计
  • 对任意文本文件进行词频统计,生成前10个高频词的条形图
  • 在Jupyter中重现泰坦尼克数据集的特征工程过程,添加”是否儿童”字段

—— 小象教研组