首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于 Polars + QuantDash 极速处理海量股票行情与因子特征计算

基于 Polars + QuantDash 极速处理海量股票行情与因子特征计算

原创
作者头像
用户9138916
发布2026-07-12 15:13:11
发布2026-07-12 15:13:11
240
举报

在量化多因子策略研究中,数据清洗与特征工程(Feature Engineering)占用了研究员 80% 以上的时间。当我们面对成百上千只股票、几年的日线甚至分钟级 K 线数据时,传统的 Pandas 在单线程执行与内存管理上的瓶颈便会逐渐显现。

为了追求更极致的处理速度,许多团队开始转向基于 Rust 编写的高性能 DataFrame 库 —— Polars。Polars 凭借其优秀的并行计算架构、惰性求值(Lazy Evaluation)优化,以及极低的内存开销,正在逐步重塑量化开发者的日常工具链。

然而,优秀的算法也需要高标准的原料。如果基础行情数据源存在字段不规范、缺失值严重或格式不统一的问题,Polars 复杂的链式调用代码很容易因为脏数据而报错中断。

本文将展示如何结合 QuantDash 规范的多市场统一数据接口[1],以及 Polars 的并行表达式,优雅、极速地构建一个多因子特征工程计算框架。


为什么说 QuantDash + Polars 是量化特征工程的黄金组合?

  1. 免去繁琐的清洗工作:quantdash 的 Python SDK 统一返回标准的 Pandas DataFrame,且字段名在不同市场(沪深、港、美)高度一致([date, open, high, low, close, volume])。这使得我们可以直接通过 pl.from_pandas()零成本迁移到 Polars 中,无需编写正则去清洗不规则的列名。
  2. 多进程并发与内存优化:Polars 默认在所有可用的 CPU 核心上并行运行计算,当我们在多只股票上按 symbol 分组并计算滚动窗口指标时,性能可达 Pandas 的数倍。

实战:多标的、多因子特征并行计算

下面我们将编写一个脚本,获取多只跨市场股票的历史行情,并使用 Polars 一次性并行计算出:

  • MA_20(20日移动均线)
  • Volatility_20(20日收益率滚动波动率,用于衡量价格风险)
  • Momentum_20(20日动量因子,用于捕捉价格趋势)

1. 安装依赖

代码语言:javascript
复制
pip install polars pandas quantdash

复制

2. 核心特征工程代码

代码语言:javascript
复制
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))

复制

工程优势拆解

  1. Lazy Evaluation(惰性求值):我们在代码中调用了 .lazy(),Polars 并不会立刻对每一行代码进行计算,而是会生成一个查询计划(Query Plan)。它会自动检测由于 shift 或 rolling_mean 带来的依赖关系,在调用 .collect() 时对底层的物理查询进行合并优化,以最省 CPU 的路径跑完逻辑。
  2. 分组安全的滚动计算:在计算滚动指标时,最忌讳的是第一只股票的尾部数据污染了第二只股票的头部数据。在 Polars 中,我们通过 .group_by("symbol") 结合 .agg(...) 机制,使得所有的因子计算都在独立的股票数据子集内部进行,最后通过 .explode(...) 一键还原为有序表,逻辑非常严密,也更符合工程直觉。

总结

高效的因子工程是保持量化投研节奏的前提。借助 Polars 的现代化底层,配合 quantdash 稳定标准的多市场基础行情输入,开发者可以轻松摆脱传统爬虫清洗数据的“泥潭”,以更清爽、更高效的代码构建出面向实盘的高性能特征管道。

参考文档:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么说 QuantDash + Polars 是量化特征工程的黄金组合?
  • 实战:多标的、多因子特征并行计算
    • 1. 安装依赖
    • 2. 核心特征工程代码
  • 工程优势拆解
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档