在量化多因子策略研究中,数据清洗与特征工程(Feature Engineering)占用了研究员 80% 以上的时间。当我们面对成百上千只股票、几年的日线甚至分钟级 K 线数据时,传统的 Pandas 在单线程执行与内存管理上的瓶颈便会逐渐显现。
为了追求更极致的处理速度,许多团队开始转向基于 Rust 编写的高性能 DataFrame 库 —— Polars。Polars 凭借其优秀的并行计算架构、惰性求值(Lazy Evaluation)优化,以及极低的内存开销,正在逐步重塑量化开发者的日常工具链。
然而,优秀的算法也需要高标准的原料。如果基础行情数据源存在字段不规范、缺失值严重或格式不统一的问题,Polars 复杂的链式调用代码很容易因为脏数据而报错中断。
本文将展示如何结合 QuantDash 规范的多市场统一数据接口[1],以及 Polars 的并行表达式,优雅、极速地构建一个多因子特征工程计算框架。
下面我们将编写一个脚本,获取多只跨市场股票的历史行情,并使用 Polars 一次性并行计算出:
pip install polars pandas quantdash复制
import pandas as pd
import polars as pl
from quantdash import QuantDash
def fetch_multi_market_data(api_key, symbols, start_date):
"""批量获取多市场数据并合并为 Pandas DataFrame"""
qd = QuantDash(api_key=api_key)
all_dfs = []
for sym in symbols:
try:
print(f"正在拉取标的: {sym}")
# 获取前复权K线,保障因子计算的准确性
df = qd.stock.get_kline(symbol=sym, start_date=start_date, adjust="forward")
df['symbol'] = sym # 添加标的代码列以便分组
all_dfs.append(df)
except Exception as e:
print(f"拉取 {sym} 失败: {e}")
if not all_dfs:
raise ValueError("未成功获取到任何标的数据")
return pd.concat(all_dfs, ignore_index=True)
def compute_factors_with_polars(pandas_df):
"""利用 Polars 进行多因子并行特征工程"""
# 1. 将 Pandas DataFrame 直接转换为 Polars DataFrame,并启用 Lazy 模式以获得查询优化
lf = pl.from_pandas(pandas_df).lazy()
# 2. 转换日期格式,按 symbol 分组排序并计算因子
processed_df = (
lf.with_columns([
pl.col("date").str.to_date("%Y-%m-%d") # 字符串转标准 Date 类型
])
.sort(["symbol", "date"]) # 确保时间序列是有序的
.group_by("symbol") # 按股票分组,避免不同股票的数据混淆
.agg([
pl.all(), # 保留原始列数据
# 因子 1:20 日移动平均线
pl.col("close").rolling_mean(window_size=20).alias("MA_20"),
# 因子 2:20 日收益率波动率(滚动标准差)
# 用今日收盘价除以上一日收盘价减 1 得到收益率
((pl.col("close") / pl.col("close").shift(1)) - 1.0)
.rolling_std(window_size=20)
.alias("volatility_20"),
# 因子 3:20 日价格动量因子 (今日收盘价相对于20天前价格的涨幅)
((pl.col("close") / pl.col("close").shift(20)) - 1.0)
.alias("momentum_20")
])
.explode(pl.all().exclude("symbol")) # 将分组后的 List 结构平铺展开,恢复为扁平表格
.collect() # 执行计算(Lazy 评估在此时正式启动并多线程跑批)
)
return processed_df
if __name__ == "__main__":
# 请替换为你的 QuantDash API Key
API_KEY = "your_quantdash_api_key_here"
# 测试标的涵盖 A股、美股、港股,展示多市场无缝支持
SYMBOLS = ["600519.SH", "AAPL.US", "00700.HK"]
START_DATE = "2024-01-01"
# 第一步:获取数据
raw_pd_df = fetch_multi_market_data(API_KEY, SYMBOLS, START_DATE)
# 第二步:使用 Polars 极速处理
result_pl_df = compute_factors_with_polars(raw_pd_df)
# 查看计算结果
print("\n特征工程计算完成!数据预览(后5行):")
print(result_pl_df.tail(5))复制
高效的因子工程是保持量化投研节奏的前提。借助 Polars 的现代化底层,配合 quantdash 稳定标准的多市场基础行情输入,开发者可以轻松摆脱传统爬虫清洗数据的“泥潭”,以更清爽、更高效的代码构建出面向实盘的高性能特征管道。
参考文档:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。