
设计分层架构的量化回测系统,通过数据层(多周期数据对齐,处理非交易日)、引擎层(Kafka解耦+Spark预处理)、策略层(容器化模型+事务保证数据流顺序)、执行层(调度任务+版本管理),支持多模型、多周期回测,确保数据一致性与可扩展性。
老师讲解时,先拆解系统架构的“四层”逻辑:
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| InfluxDB | 时序数据库 | 专为时间序列设计,支持高写入速率(>10万条/秒),时间聚合 | 分钟级高频数据回测(如1分钟K线) | 查询语言简单(InfluxQL),不适合复杂SQL分析 |
| ClickHouse | 列式数据库 | 高效聚合,支持TB级数据,列式存储优化查询 | 日频数据存储与复杂计算(如多因子模型、回测指标) | 写入延迟较高(秒级),不适合实时写入 |
| MySQL | 关系型数据库 | 通用事务支持,适合结构化数据存储 | 结果存储(模型版本、回测指标) | 写入延迟较高(毫秒级),不适合高频数据回测 |
| Spark | 分布式计算框架 | 大数据处理(特征工程、数据清洗),支持分块处理 | TB级历史数据预处理(如生成多因子特征) | 需集群资源,计算延迟(分钟级) |
伪代码展示数据对齐与非交易日处理:
# 数据层:非交易日分钟数据处理(周末丢弃)
def fetch_min_data(exchange, start, end):
min_data = exchange.get_kline(start, end, '1m')
# 按交易日对齐:过滤非交易日,按日聚合最后一个分钟数据
daily_data = min_data.resample('D').last()
# 周末数据丢弃(无交易则聚合为空)
daily_data = daily_data[~daily_data.index.dayofweek.isin([5,6])] # 周五到周日
return daily_data
# 引擎层:Kafka事务保证多模型数据流顺序
producer = KafkaProducer()
producer.send('min-data-topic', fetch_min_data(...).encode(), transactional_id='tx-1')
producer.commit_transaction()
# 策略层:容器化模型调用
def run_strategy(model, data):
# model: Docker容器,gRPC接口
signal = model.predict(data)
return signal
# 执行层:Airflow调度日频回测
scheduler = AirflowScheduler()
scheduler.add_task(
task_id='daily_backtest',
task=run_strategy,
model='lstm_model:1.0', # 版本号
data='daily_data',
period='daily'
)
(约90秒)
“面试官您好,我设计的量化回测系统采用分层架构,分为数据层、引擎层、策略层和执行层。数据层用InfluxDB存储分钟级数据,通过按交易日对齐(周末分钟数据丢弃,按日聚合最后一个分钟数据),确保与日频数据时间一致;引擎层用Kafka解耦数据流,支持多模型并发,Spark用于TB级历史数据预处理(如特征工程);策略层将模型封装为Docker容器,通过Kafka事务保证多模型数据流顺序;执行层用Airflow调度任务,按周期触发回测,数据层记录模型版本,确保回测使用正确版本。这样既能支持多模型、多周期回测,又能保证数据一致性和性能。”