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