第1章:因子平台技术栈选型

做因子平台这些年,我最大的感触就是——技术栈选型这事儿,真不是拍脑袋决定的。你想想看,一套平台少说跑两三年,选错了后面全是坑。今天我就把我在实战中踩过的雷、总结的经验,掰开了揉碎了讲给你听。

1.1 编程语言选择:Python vs C++

先说结论:核心计算用C++,策略研发用Python。这不是和稀泥,是血泪教训换来的。

我的个人习惯:

  • 因子计算引擎底层用C++,追求极致性能
  • 策略回测、数据分析用Python,追求开发效率
  • 两者通过pybind11或Cython桥接

我在项目中遇到过一件事:某团队用纯Python做全市场因子计算,3000只股票、100个因子,跑一次要40分钟。后来我把核心循环用C++重写,时间直接降到3分钟。嗯,这就是差距。

Python的优势:

  • 生态丰富:pandas、numpy、scikit-learn随便用
  • 开发速度快:写策略原型,一天能迭代三个版本
  • 社区活跃:遇到问题StackOverflow上基本都有答案

C++的优势:

  • 执行效率高:同样的逻辑,C++比Python快10-50倍
  • 内存控制精细:大数据场景下,内存就是钱
  • 适合高频场景:微秒级的延迟差异,可能就是盈亏分界线

避坑指南:我曾经见过一个团队,为了"统一技术栈",强行用C++写所有策略代码。结果呢?一个简单的移动平均线策略,开发花了三天,调试又花了两天。说白了,工具要用对地方。

1.2 数据处理框架:Pandas vs Spark

这个问题其实很简单:数据量决定框架

场景 推荐框架 原因
单机数据量 < 10GB Pandas 轻量、灵活、上手快
单机数据量 10GB-100GB Pandas + 分块处理 内存不够?分块来凑
数据量 > 100GB Spark 分布式计算,不解释
实时流处理 Spark Streaming 低延迟、高吞吐

我个人习惯是:能用Pandas绝不用Spark。为什么?因为Spark的调试成本太高了。你写个groupby,在Pandas里一行搞定,在Spark里要调半天分区、shuffle、内存配置。

但话说回来,当你的数据量真的上去了,Pandas就扛不住了。我记得有一次处理全市场Tick数据,单日数据量就超过50GB。Pandas直接OOM,换成Spark后,虽然慢了点,但至少能跑完。

注意:不要为了"大数据"而用Spark。如果你的数据量只有几GB,Spark的调度开销反而比Pandas更慢。我见过有人用Spark算一个100MB的CSV文件,光启动SparkContext就花了30秒,实际计算只用了0.5秒。何必呢?

1.3 消息队列:Kafka vs RabbitMQ

消息队列的选择,说白了就是吞吐量 vs 灵活性的权衡。

Kafka:

  • 设计目标:高吞吐、持久化、分布式
  • 适合场景:日志收集、流式处理、数据管道
  • 缺点:配置复杂、运维成本高

RabbitMQ:

  • 设计目标:灵活路由、可靠投递、易用性
  • 适合场景:任务调度、异步处理、微服务通信
  • 缺点:吞吐量有限、消息堆积能力弱

我在项目中遇到过这样的选择:因子平台需要实时接收行情数据,然后分发给多个策略引擎。行情数据的特点是量大(每秒几万条)、但每条数据很小。这时候Kafka就是天然的选择——它的分区机制能保证数据顺序,高吞吐能扛住行情峰值。

但如果是策略信号的传递,比如A策略算出一个信号,要通知B策略执行交易,这时候RabbitMQ更合适。因为它的路由灵活,可以精确控制谁收到什么消息。

我的建议:如果预算和运维能力允许,两个都上。Kafka做数据管道,RabbitMQ做服务间通信。如果只能选一个,选Kafka——它更通用,而且生态更丰富。

1.4 数据库选型:ClickHouse vs MySQL vs Redis

数据库选型是因子平台最关键的决策之一。我见过太多团队,用MySQL存时序数据,结果查询慢到怀疑人生。

ClickHouse:

  • 列式存储,适合OLAP场景
  • 压缩比高,存储成本低
  • 查询速度快,特别是聚合查询
  • 缺点:不支持事务,不适合频繁更新

MySQL:

  • 行式存储,适合OLTP场景
  • 支持事务,数据一致性有保障
  • 生态成熟,工具丰富
  • 缺点:大数据量查询慢,扩展性差

Redis:

  • 内存数据库,速度极快
  • 支持多种数据结构
  • 适合缓存、计数器、实时排行榜
  • 缺点:数据量受内存限制,持久化能力弱

我个人习惯的搭配是:

  • 因子数据存储:ClickHouse。日频数据、分钟数据、Tick数据,全往里面塞。查询速度快,压缩比高,存储成本低。
  • 元数据管理:MySQL。因子定义、策略配置、用户信息,这些需要事务保证的数据,交给MySQL。
  • 缓存层:Redis。热点数据、计算结果、临时信号,放Redis里,毫秒级响应。

曾经踩过的坑:有次我把因子计算结果直接写MySQL,每天几亿条数据,一个月后MySQL就崩了。后来换成ClickHouse,同样的数据量,查询速度提升了100倍,存储空间减少了80%。嗯,选对数据库,事半功倍。

知识体系总览

因子平台技术栈选型 编程语言 数据处理框架 消息队列 数据库 Python C++ Pandas Spark Kafka RabbitMQ ClickHouse MySQL Redis 选型核心原则:性能 × 开发效率 × 运维成本 没有银弹,只有最适合你场景的选型 推荐组合:Python + C++ + ClickHouse + Kafka + Redis

最后说一句:技术栈选型没有标准答案。我给你的建议是基于我的经验,但你的场景可能完全不同。关键是要理解每个工具的优缺点,然后根据你的数据量、性能要求、团队能力来做选择。

核心要点回顾:

  • Python做策略研发,C++做核心计算
  • 数据量小用Pandas,数据量大用Spark
  • Kafka做数据管道,RabbitMQ做服务通信
  • ClickHouse存因子数据,MySQL管元数据,Redis做缓存
专注资料整理