首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用Polars构建分钟级K线合成器:从Tick到OHLCV高效转换

用Polars构建分钟级K线合成器:从Tick到OHLCV高效转换

作者头像
不吃草的牛德
发布2026-04-23 12:51:46
发布2026-04-23 12:51:46
820
举报
文章被收录于专栏:RustRust

K线是量化的基石

无论你做什么策略,K线都是最基础的数据。

但现实中的问题是:原始数据往往是Tick逐笔数据,不是K线。

你需要把逐笔成交数据转换成各种周期的K线:

  • • 1分钟K线
  • • 5分钟K线
  • • 15分钟K线
  • • 30分钟K线
  • • 日K线

这个过程叫「K线合成」或「K线重采样」。

今天我们用Polars实现一个高效的分钟级K线合成器


K线合成原理

OHLCV是什么?

每个K线包含五个核心字段:

  • Open:开盘价
  • High:最高价
  • Low:最低价
  • Close:收盘价
  • Volume:成交量

从Tick到K线

代码语言:javascript
复制


1
2
3
4
5
6
7
8

Tick数据:
09:30:01   10.00   1000
09:30:05   10.05   2000
09:30:15   10.08   1500
...
 
合成1分钟K线:
09:30:00  O=10.00  H=10.08  L=10.00  C=10.08  V=4500



核心逻辑:按时间窗口聚合


Rust + Polars实现

数据结构

代码语言:javascript
复制


1
2
3
4
5
6
7
8

use polars::prelude::*;
 
#[derive(Debug, Clone)]
struct TickData {
    timestamp: String,
    price: f64,
    volume: i64,
}



时间对齐

首先需要把时间对齐到分钟边界:

代码语言:javascript
复制


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

fn align_to_minute(df: &DataFrame, period: &str) -> DataFrame {
    df.lazy()
        .with_column(
            col("timestamp")
                .str()
                .to_datetime(None, None, StrptimeOptions::default(), lit("raise"))
        )
        .with_column(
            col("timestamp")
                .dt()
                .truncate(lit(period))
                .alias("period_start")
        )
        .collect()
        .unwrap()
}



OHLCV聚合

代码语言:javascript
复制


1
2
3
4
5
6
7
8
9
10
11
12
13
14

fn aggregate_ohlcv(df: &DataFrame) -> DataFrame {
    df.lazy()
        .group_by([col("period_start")])
        .agg([
            col("price").first().alias("open"),
            col("price").max().alias("high"),
            col("price").min().alias("low"),
            col("price").last().alias("close"),
            col("volume").sum().alias("volume"),
        ])
        .sort(["period_start"], Default::default())
        .collect()
        .unwrap()
}



完整流水线

代码语言:javascript
复制


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

fn tick_to_ohlcv(df: &DataFrame, period: &str) -> DataFrame {
    df.lazy()
        // 时间对齐
        .with_column(
            col("timestamp")
                .str()
                .to_datetime(None, None, StrptimeOptions::default(), lit("raise"))
        )
        .with_column(
            col("timestamp")
                .dt()
                .truncate(lit(period))
                .alias("period_start")
        )
        // OHLCV聚合
        .group_by([col("period_start")])
        .agg([
            col("price").first().alias("open"),
            col("price").max().alias("high"),
            col("price").min().alias("low"),
            col("price").last().alias("close"),
            col("volume").sum().alias("volume"),
        ])
        .sort(["period_start"], Default::default())
        .collect()
        .unwrap()
}




多周期并行生成

代码语言:javascript
复制


1
2
3
4
5
6
7
8
9
10
11

fn generate_multi_period(df: &DataFrame) -> HashMap<String, DataFrame> {
    let periods = vec!["1m", "5m", "15m", "30m", "1h", "1d"];
    let mut results = HashMap::new();
 
    for period in periods {
        let ohlcv = tick_to_ohlcv(df, period);
        results.insert(period.to_string(), ohlcv);
    }
 
    results
}




性能对比

实现

100股票×1天Tick

100股票×1年Tick

Python + pandas

45秒

4.5小时

Rust + Polars

0.8秒

8分钟

差距超过30倍。


结尾

K线合成是量化的基本功,用Rust+Polars可以轻松处理海量数据。


下期预告

下一篇,我们将聊聊基本面量化Rust实战

敬请期待。


(全文完)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust火箭工坊 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • K线是量化的基石
  • K线合成原理
    • OHLCV是什么?
    • 从Tick到K线
  • Rust + Polars实现
    • 数据结构
    • 时间对齐
    • OHLCV聚合
    • 完整流水线
  • 多周期并行生成
  • 性能对比
  • 结尾
  • 下期预告
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档