
大家好,我是花姐。 最近折腾数据处理的时候,发现了一个宝藏库------DuckDB,配合 Python 和 Pandas 简直不要太香!今天我就聊聊它到底有多好用,特别适合我们搞量化研究的同学。
1. DuckDB 是什么?
DuckDB 是一款嵌入式的 OLAP 数据库,目标就是把复杂 SQL 的计算能力直接带到 Python 里。
和传统数据库不一样:
- 无需安装服务器,pip 一行命令搞定
- 完全运行在本地进程里,数据交互无延迟
- SQL 查询可以直接对 Pandas DataFrame、CSV、Parquet 等各种数据源执行
一句话:像写 SQL 一样处理数据,比 Pandas 更快,内存占用更低,还能跨格式操作。
2. 安装方式超级简单
只需要一行命令:
bash
pip install duckdb
装完后就能在 Jupyter / VSCode 里直接用,不用连数据库、不用部署服务。
3. 数据处理的核心优势
3.1 直接读文件
CSV、Parquet、JSON 等文件,可以直接用 DuckDB 的 SQL 读取:
python
import duckdb
# 读 CSV
duckdb.read_csv('daily.csv')
# 读 parquet
duckdb.read_parquet('data/*.parquet')
# 或直接 SQL
duckdb.sql("SELECT * FROM 'data/daily.csv'")
无需手动用 pandas 先读,DuckDB 自带高效的文件读取引擎。
3.2 SQL 直接跑在 Pandas DataFrame 上
这个特性对量化研究太友好了!
python
import pandas as pd
import duckdb
df = pd.read_csv('daily.csv')
res = duckdb.sql("""
SELECT symbol, AVG(close) AS avg_close
FROM df
WHERE date >= '2024-01-01'
GROUP BY symbol
""").df()
不用注册、不用额外配置,DuckDB 会自动识别 Python 里的 DataFrame,当成表来查。
3.3 支持 Arrow、Polars、云端数据
如果数据是 Arrow/Polars 格式,DuckDB 也能直接使用; 文件路径支持 HTTP/HTTPS/S3,云上的数据能直接查询,非常灵活。
4. 量化研究的高频应用场景
4.1 直接查询超大 CSV
行情或分钟数据很大时,用 pandas 直接读常常爆内存,用 DuckDB 一条 SQL 就能过滤聚合:
python
duckdb.sql("""
SELECT date, symbol, close
FROM read_csv('daily.csv')
WHERE symbol IN ('000001.SZ','600000.SH')
""").df()
4.2 多表 join 超方便
因子表、行情表、行业表,多表合并一条 SQL 解决:
python
duckdb.sql("""
SELECT p.date, p.symbol, p.close, f.pb, f.pe
FROM read_parquet('price.parquet') p
JOIN read_parquet('factor.parquet') f
ON p.symbol = f.symbol AND p.date = f.date
""").df()
4.3 窗口函数秒算指标
像滚动均线、动量指标,用 SQL 的窗口函数一行就搞定:
python
duckdb.sql("""
SELECT symbol, date,
AVG(close) OVER(PARTITION BY symbol ORDER BY date ROWS 19 PRECEDING) AS ma20
FROM read_parquet('price.parquet')
""").df()
5. 为什么强烈推荐?
- 简单省心:免部署,不用维护数据库
- 性能强:比 pandas 快很多,join/聚合/窗口函数都快
- 无缝衔接:对 Pandas DataFrame 和 Parquet 文件支持非常顺滑
- 代码优雅:用 SQL 代替繁琐的链式 pandas 代码,逻辑清晰
对我们搞量化的来说,这就是一把开箱即用的数据分析利器。
花姐小结
DuckDB + Python + Pandas,这套组合简直就是量化研究的新神器,特别适合处理日线、分钟线、财务因子这些大数据。
如果你也经常被 pandas 的慢和内存瓶颈搞得焦头烂额,不妨试试它!