量化交易(Quantitative Trading)是利用数学模型、统计分析和计算机程序进行投资决策的交易方式。随着开源社区的发展,越来越多的专业级量化交易框架涌现,让个人投资者也能构建自己的交易系统。
本文将深入剖析 GitHub 上 Star 数最多的 5 大开源量化交易框架,帮助你选择最适合自己的工具,开启量化交易之旅。
| 排名 | 项目名称 | Stars | 主语言 | 核心定位 | 主要市场 |
|---|---|---|---|---|---|
| 1 | **Freqtrade** | 46.9k | Python | 加密货币交易机器人 | 数字货币 |
| 2 | **Microsoft Qlib** | 37.5k | Python | AI 量化投资平台 | A股/美股 |
| 3 | **VeighNa (vnpy)** | 36.6k | Python | 量化交易开发框架 | 期货/股票/期权 |
| 4 | **Backtrader** | 20.4k | Python | 回测与实盘交易框架 | 多市场 |
| 5 | **Zipline** | 19.4k | Python | 事件驱动回测引擎 | 美股 |
┌─────────────────────────────────────────────────────────────────────────────┐
│ 量化交易技术栈 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 数据层 ┌──────────────────────────────────────────────────────┐ │
│ │ 数据获取 → 数据清洗 → 特征工程 → 因子计算 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 策略层 ┌──────────────────────────────────────────────────────┐ │
│ │ 信号生成 → 风险控制 → 仓位管理 → 订单执行 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 执行层 ┌──────────────────────────────────────────────────────┐ │
│ │ 券商接口 → 订单管理 → 成交确认 → 资金结算 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 分析层 ┌──────────────────────────────────────────────────────┐ │
│ │ 绩效评估 → 风险分析 → 归因分析 → 报告生成 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Freqtrade 是目前最流行的开源加密货币交易机器人,以其易用性和功能完整性著称。项目采用 Python 开发,支持 100+ 交易所,提供从回测到实盘的完整解决方案。
┌─────────────────────────────────────────────────────────────┐
│ Freqtrade 架构 │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Strategy │ │ FreqAI │ │ Hyperopt │ │
│ │ 策略模块 │ │ 机器学习 │ │ 参数优化 │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ └────────────────┼─────────────────────┘ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Freqtrade Core │ │
│ │ (Bot Loop / Order Management / Position Tracking) │ │
│ └───────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ CCXT Library │ │
│ │ (统一接口: Binance, OKX, Bybit, Kraken...) │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
| 特性 | 说明 |
|---|---|
| **策略开发** | Python 类继承,支持自定义指标 |
| **回测引擎** | 支持 K 线和 Tick 数据回测 |
| **参数优化** | 基于 Optuna 的 Hyperopt 功能 |
| **机器学习** | FreqAI 模块,支持 LightGBM/XGBoost/PyTorch |
| **实盘交易** | 支持 Spot 和 Futures 市场 |
| **风控系统** | 止损、追踪止损、保护机制 |
| **监控界面** | Web UI + Telegram Bot |
from freqtrade.strategy import IStrategy
from freqtrade.strategy.parameters import IntParameter, DecimalParameter
from pandas import DataFrame
import talib.abstract as ta
class AdvancedRSIStrategy(IStrategy):
"""
RSI 策略 - 带参数优化
"""
# 基础配置
timeframe = '15m'
stoploss = -0.10 # 10% 止损
minimal_roi = {"0": 0.05} # 5% 止盈
# 可优化参数
buy_rsi = IntParameter(10, 40, default=30, space="buy")
sell_rsi = IntParameter(60, 90, default=70, space="sell")
rsi_period = IntParameter(10, 20, default=14, space="buy")
# 追踪止损参数
trailing_stop = True
trailing_stop_positive = DecimalParameter(0.01, 0.05, default=0.02)
trailing_stop_positive_offset = DecimalParameter(0.02, 0.08, default=0.03)
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# 计算 RSI 指标
dataframe['rsi'] = ta.RSI(dataframe, timeperiod=self.rsi_period.value)
# 添加趋势过滤器
dataframe['ema200'] = ta.EMA(dataframe, timeperiod=200)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# 入场条件:RSI 超卖 + 价格在 EMA200 之上(上升趋势)
dataframe.loc[
(dataframe['rsi'] < self.buy_rsi.value) &
(dataframe['close'] > dataframe['ema200']),
'enter_long'] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# 出场条件:RSI 超买
dataframe.loc[
(dataframe['rsi'] > self.sell_rsi.value),
'exit_long'] = 1
return dataframe
# 1. 安装
pip install freqtrade
# 2. 创建配置
freqtrade new-config --config config.json
# 3. 下载历史数据
freqtrade download-data --exchange binance --pairs BTC/USDT ETH/USDT --days 365
# 4. 回测
freqtrade backtesting --strategy AdvancedRSIStrategy --timerange 20230101-20231231
# 5. 参数优化
freqtrade hyperopt --strategy AdvancedRSIStrategy --epochs 100 --spaces buy sell
# 6. 模拟盘运行
freqtrade trade --strategy AdvancedRSIStrategy --dry-run
# 7. 实盘运行(需要配置 API 密钥)
freqtrade trade --strategy AdvancedRSIStrategy
| 推荐使用 | 不推荐使用 |
|---|---|
| 加密货币交易 | 股票/期货交易 |
| Python 开发者 | 需要 C++ 高频交易 |
| 中低频策略 | 毫秒级高频 |
| 个人/小团队 | 大型机构 |
Qlib 是微软研究院开源的 AI 导向量化投资平台,专注于将机器学习技术应用于量化投资。它覆盖了从数据处理、模型训练到策略回测的完整流程。
┌─────────────────────────────────────────────────────────────┐
│ Qlib 架构层次 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 接口层 用户 API / 分析报告 / 可视化工具 │
├─────────────────────────────────────────────────────────────┤
│ 工作流层 因子挖掘 → 预测模型 → 组合构建 → 执行环境 │
├─────────────────────────────────────────────────────────────┤
│ 学习框架 监督学习 / 强化学习 / 市场动态建模 │
├─────────────────────────────────────────────────────────────┤
│ 基础设施 数据服务 / 训练器 / 元控制器 / 实验管理 │
└─────────────────────────────────────────────────────────────┘
| 特性 | 说明 |
|---|---|
| **模型库** | 20+ SOTA 模型(LightGBM, LSTM, Transformer, GATs 等) |
| **因子库** | Alpha158(158 因子)/ Alpha360(360 因子) |
| **RD-Agent** | LLM 驱动的自动化因子挖掘 |
| **强化学习** | 基于 Tianshou 的 RL 框架 |
| **回测引擎** | 支持日内和日频交易模拟 |
| **实验管理** | MLflow 集成 |
import qlib
from qlib.contrib.model.gbdt import LGBModel
from qlib.contrib.data.handler import Alpha158
from qlib.data.dataset import DatasetH
from qlib.workflow import R
from qlib.contrib.strategy import TopkDropoutStrategy
from qlib.contrib.evaluate import backtest_daily, risk_analysis
# 1. 初始化
qlib.init(provider_uri='~/.qlib/qlib_data/cn_data', region='cn')
# 2. 配置
market = "csi300"
benchmark = "SH000300"
data_handler_config = {
"start_time": "2008-01-01",
"end_time": "2020-08-01",
"fit_start_time": "2008-01-01",
"fit_end_time": "2014-12-31",
"instruments": market,
}
# 3. 创建数据集(使用 Alpha158 因子)
dataset_config = {
"class": "DatasetH",
"module_path": "qlib.data.dataset",
"kwargs": {
"handler": {
"class": "Alpha158",
"module_path": "qlib.contrib.data.handler",
"kwargs": data_handler_config,
},
"segments": {
"train": ("2008-01-01", "2014-12-31"),
"valid": ("2015-01-01", "2016-12-31"),
"test": ("2017-01-01", "2020-08-01"),
},
},
}
# 4. 模型配置
model_config = {
"class": "LGBModel",
"module_path": "qlib.contrib.model.gbdt",
"kwargs": {
"loss": "mse",
"learning_rate": 0.0421,
"max_depth": 8,
"num_leaves": 210,
},
}
# 5. 训练和预测
from qlib.utils import init_instance_by_config
model = init_instance_by_config(model_config)
dataset = init_instance_by_config(dataset_config)
with R.start(experiment_name="qlib_workflow"):
# 训练模型
model.fit(dataset)
recorder = R.get_recorder()
# 预测
pred_score = model.predict(dataset)
# 回测策略:TopkDropout(选 Top 50,每期淘汰 5 只)
strategy = TopkDropoutStrategy(
topk=50,
n_drop=5,
signal=pred_score
)
# 执行回测
report, positions = backtest_daily(
start_time="2017-01-01",
end_time="2020-08-01",
strategy=strategy
)
# 风险分析
analysis = risk_analysis(
report["return"] - report["bench"] - report["cost"]
)
print(analysis)
Qlib 集成了 RD-Agent,这是微软开发的 LLM 驱动自动化研究助手:
# 自动化因子挖掘
rdagent fin_quant
# 仅因子优化
rdagent fin_factor
# 仅模型优化
rdagent fin_model
# 从研报中提取因子
rdagent fin_factor_report --report-folder=./reports/
性能表现:根据研究论文,RD-Agent 相比基准因子库:
Qlib 提供强大的因子表达式引擎:
from qlib.data.dataset.loader import QlibDataLoader
# 自定义因子表达式
MACD_EXP = '''
2 * ((EMA($close, 12) - EMA($close, 26)) / $close
- EMA((EMA($close, 12) - EMA($close, 26)) / $close, 9))
'''
RSI_EXP = '''
100 - 100 / (1 + Sum(Max($close - Ref($close, 1), 0), 14)
/ Sum(Abs($close - Ref($close, 1)), 14))
'''
# 加载数据
data_loader = QlibDataLoader(
config={
"feature": ([MACD_EXP, RSI_EXP], ['MACD', 'RSI']),
"label": (['Ref($close, -2) / Ref($close, -1) - 1'], ['LABEL'])
}
)
df = data_loader.load(
instruments='csi300',
start_time='2010-01-01',
end_time='2020-12-31'
)
| 推荐使用 | 不推荐使用 |
|---|---|
| A 股/美股量化研究 | 加密货币交易 |
| AI/ML 策略开发 | 高频交易 |
| 因子投资研究 | 简单技术分析 |
| 学术研究/机构 | 纯手动交易 |
VeighNa(原 vn.py)是中国最受欢迎的开源量化交易框架,以其全面的市场覆盖和强大的实盘能力著称。它采用事件驱动架构,支持国内期货、股票、期权以及国际市场。
┌─────────────────────────────────────────────────────────────┐
│ VeighNa 架构 │
├─────────────────────────────────────────────────────────────┤
│ ┌───────────────────────────────────────────────────────┐ │
│ │ VeighNa Trader (GUI) │ │
│ ├───────────────────────────────────────────────────────┤ │
│ │ MainEngine │ EventEngine │ Gateway │ App Modules │ │
│ └───────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────┼────────────────────────────┐ │
│ │ ▼ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │CTA策略 │ │组合策略 │ │价差交易 │ │期权管理 │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │算法交易 │ │风控模块 │ │数据记录 │ │vnpy.alpha│ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────┼────────────────────────────┐ │
│ │ ▼ Gateway 接口层 │ │
│ │ CTP │ XTP │ IB │ TORA │ UFT │ ESUNNY │ COMSTAR │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
国内市场:
| Gateway | 市场 | 说明 |
|---|---|---|
| CTP | 期货/期权 | 上期所/大商所/郑商所 |
| XTP | A 股/ETF 期权 | 中泰证券 |
| TORA | A 股/ETF 期权 | 华鑫证券 |
| UFT | 期货/ETF 期权 | 恒生 |
| COMSTAR | 银行间 | 外汇/债券 |
国际市场:
| Gateway | 市场 | 说明 |
|---|---|---|
| IB | 全球 | 股票/期货/期权/外汇 |
| TAP | 外盘期货 | 易盛 9.0 |
| DA | 外盘期货 | 直达期货 |
from vnpy_ctastrategy import CtaTemplate, BarGenerator, ArrayManager
from vnpy.trader.object import TickData, BarData, TradeData, OrderData
class BollingerBandsStrategy(CtaTemplate):
"""布林带突破策略"""
author = "VeighNa Trader"
# 策略参数
boll_window = 18
boll_dev = 3.4
fixed_size = 1
parameters = ["boll_window", "boll_dev", "fixed_size"]
# 策略变量
boll_up = 0.0
boll_down = 0.0
variables = ["boll_up", "boll_down"]
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)
self.am = ArrayManager()
def on_init(self):
self.write_log("策略初始化")
self.load_bar(10) # 加载 10 天历史数据
def on_start(self):
self.write_log("策略启动")
def on_stop(self):
self.write_log("策略停止")
def on_tick(self, tick: TickData):
self.bg.update_tick(tick)
def on_bar(self, bar: BarData):
self.bg.update_bar(bar)
def on_15min_bar(self, bar: BarData):
self.cancel_all()
am = self.am
am.update_bar(bar)
if not am.inited:
return
# 计算布林带
self.boll_up, self.boll_down = am.boll(self.boll_window, self.boll_dev)
# 交易逻辑
if self.pos == 0:
if bar.close_price > self.boll_up:
self.buy(self.boll_up, self.fixed_size, True)
elif bar.close_price < self.boll_down:
self.short(self.boll_down, self.fixed_size, True)
elif self.pos > 0:
if bar.close_price < self.boll_down:
self.sell(bar.close_price, abs(self.pos))
elif self.pos < 0:
if bar.close_price > self.boll_up:
self.cover(bar.close_price, abs(self.pos))
self.put_event()
def on_order(self, order: OrderData):
pass
def on_trade(self, trade: TradeData):
self.put_event()
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy_ctp import CtpGateway
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
def main():
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
# 添加 Gateway
main_engine.add_gateway(CtpGateway)
# 添加应用模块
main_engine.add_app(CtaStrategyApp)
main_engine.add_app(CtaBacktesterApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if __name__ == "__main__":
main()
VeighNa 4.0 引入了 vnpy.alpha 模块,借鉴 Microsoft Qlib 的设计:
# 因子特征工程
from vnpy.alpha.dataset import Alpha158
# 机器学习模型
from vnpy.alpha.model import LassoModel, LGBModel, MLPModel
# 策略研究工作流
from vnpy.alpha.lab import AlphaLab
| 推荐使用 | 不推荐使用 |
|---|---|
| 国内期货/股票/期权 | 纯加密货币 |
| 需要实盘交易 | 纯研究用途 |
| 中文环境 | 海外用户 |
| CTA/套利策略 | 高频策略 |
Backtrader 是 Python 生态中最成熟的回测框架之一,以其简洁的 API和丰富的内置指标著称。它采用"Lines"架构,让策略开发变得直观。
┌─────────────────────────────────────────────────────────────┐
│ Backtrader 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Cerebro (大脑) │ │
│ │ 协调所有组件,驱动事件循环 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────────────┐ │
│ │ Data Feeds │ │ Strategies │ │ Brokers │ │
│ │ 数据源 │ │ 策略 │ │ 券商模拟/实盘 │ │
│ └────────────┘ └────────────┘ └────────────────────┘ │
│ │ │ │ │
│ └────────────────┼────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Indicators │ Analyzers │ Observers │ Sizers │ │
│ │ 122+ 指标 │ 绩效分析 │ 可视化 │ 仓位管理 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Backtrader 的核心概念是 Lines(线对象):
# 访问当前值(索引 0)
current_close = self.data.close[0]
# 访问前一个值(索引 -1)
previous_close = self.data.close[-1]
# 访问前两个值(索引 -2)
two_bars_ago = self.data.close[-2]
这种设计防止了前视偏差(Look-ahead Bias),因为你只能访问当前和历史数据。
from datetime import datetime
import backtrader as bt
class SmaCrossStrategy(bt.Strategy):
"""双均线交叉策略"""
params = dict(
pfast=10, # 快速均线周期
pslow=30 # 慢速均线周期
)
def __init__(self):
# 创建指标
sma1 = bt.ind.SMA(period=self.p.pfast)
sma2 = bt.ind.SMA(period=self.p.pslow)
self.crossover = bt.ind.CrossOver(sma1, sma2)
def next(self):
if not self.position:
# 金叉买入
if self.crossover > 0:
self.buy()
else:
# 死叉卖出
if self.crossover < 0:
self.close()
def notify_order(self, order):
if order.status in [order.Completed]:
if order.isbuy():
print(f'买入执行: {order.executed.price:.2f}')
elif order.issell():
print(f'卖出执行: {order.executed.price:.2f}')
# 运行回测
cerebro = bt.Cerebro()
cerebro.addstrategy(SmaCrossStrategy)
# 添加数据
data = bt.feeds.YahooFinanceData(
dataname='AAPL',
fromdate=datetime(2020, 1, 1),
todate=datetime(2023, 12, 31)
)
cerebro.adddata(data)
# 设置初始资金
cerebro.broker.setcash(100000)
# 设置佣金
cerebro.broker.setcommission(commission=0.001)
# 运行
print(f'初始资金: {cerebro.broker.getvalue():.2f}')
results = cerebro.run()
print(f'最终资金: {cerebro.broker.getvalue():.2f}')
# 绘图
cerebro.plot()
# 使用 optstrategy 进行参数优化
cerebro.optstrategy(
SmaCrossStrategy,
pfast=range(5, 20), # 测试 5-19
pslow=range(20, 50) # 测试 20-49
)
# 添加分析器
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
# 多核优化
cerebro = bt.Cerebro(maxcpus=4, optdatas=True, optreturn=True)
results = cerebro.run()
# 分析结果
for stratrun in results:
strat = stratrun[0]
print(f"参数: {strat.p._getkwargs()}")
print(f"夏普比率: {strat.analyzers.sharpe.get_analysis()}")
def next(self):
if not self.position:
# 括号订单(主订单 + 止损 + 止盈)
orders = self.buy_bracket(
price=self.data.close[0],
stopprice=self.data.close[0] * 0.95, # 5% 止损
limitprice=self.data.close[0] * 1.10, # 10% 止盈
size=100
)
# OCO 订单(一取消全)
o1 = self.buy(exectype=bt.Order.Limit, price=p1)
o2 = self.buy(exectype=bt.Order.Limit, price=p2, oco=o1)
o3 = self.buy(exectype=bt.Order.Limit, price=p3, oco=o1)
| 推荐使用 | 不推荐使用 |
|---|---|
| 策略研究与回测 | 需要中文文档 |
| Python 开发者 | 高频交易 |
| 多市场支持 | 需要 GUI 界面 |
| 学术研究 | 纯加密货币 |
Zipline 是著名量化平台 Quantopian 开发的事件驱动回测引擎。虽然 Quantopian 已于 2020 年关闭,但 Zipline 作为开源项目继续被广泛使用,其设计理念影响深远。
┌─────────────────────────────────────────────────────────────┐
│ Zipline 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TradingAlgorithm │ │
│ │ (initialize + handle_data) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ AlgorithmSimulator │ │
│ │ (事件循环: BAR/SESSION_START/END) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────────────┐ │
│ │ DataPortal │ │ Blotter │ │ Pipeline │ │
│ │ 数据门户 │ │ 订单簿 │ │ 因子计算引擎 │ │
│ └────────────┘ └────────────┘ └────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Zipline 的 Pipeline API 是其最重要的创新,提供高效的横截面因子计算:
from zipline.pipeline import Pipeline
from zipline.pipeline.factors import RSI, SimpleMovingAverage
from zipline.pipeline.data import EquityPricing
def make_pipeline():
# 创建因子
rsi = RSI()
sma = SimpleMovingAverage(
inputs=[EquityPricing.close],
window_length=30
)
return Pipeline(
columns={
'rsi': rsi,
'sma': sma,
'longs': rsi.top(10), # RSI 最高的 10 只
'shorts': rsi.bottom(10) # RSI 最低的 10 只
},
screen=rsi.notnull() # 过滤条件
)
from zipline.api import (
order, order_target, order_target_percent,
symbol, record, attach_pipeline, pipeline_output,
schedule_function, date_rules, time_rules
)
from zipline.pipeline import Pipeline
from zipline.pipeline.factors import RSI
from zipline.finance import commission, slippage
def make_pipeline():
rsi = RSI()
return Pipeline(
columns={
'longs': rsi.top(3),
'shorts': rsi.bottom(3),
}
)
def initialize(context):
# 附加 Pipeline
attach_pipeline(make_pipeline(), 'my_pipeline')
# 调度函数
schedule_function(rebalance, date_rules.every_day())
# 设置佣金和滑点
context.set_commission(commission.PerShare(cost=0.0075, min_trade_cost=1.0))
context.set_slippage(slippage.VolumeShareSlippage())
def before_trading_start(context, data):
# 获取 Pipeline 输出
context.pipeline_data = pipeline_output('my_pipeline')
def rebalance(context, data):
pipeline_data = context.pipeline_data
longs = pipeline_data[pipeline_data.longs].index
shorts = pipeline_data[pipeline_data.shorts].index
# 2 倍杠杆,等权多空组合
weight = 1.0 / 3.0
for asset in longs:
if data.can_trade(asset):
order_target_percent(asset, weight)
for asset in shorts:
if data.can_trade(asset):
order_target_percent(asset, -weight)
# 平仓不在当前组合中的持仓
for asset in context.portfolio.positions:
if asset not in longs and asset not in shorts:
if data.can_trade(asset):
order_target_percent(asset, 0)
def analyze(context, perf):
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
perf.portfolio_value.plot(ax=ax1)
ax1.set_ylabel('Portfolio Value')
perf[['alpha', 'beta']].plot(ax=ax2)
ax2.set_ylabel('Alpha/Beta')
plt.show()
from zipline import run_algorithm
import pandas as pd
results = run_algorithm(
start=pd.Timestamp('2016-1-1', tz='utc'),
end=pd.Timestamp('2020-1-1', tz='utc'),
initialize=initialize,
handle_data=lambda ctx, data: None, # 使用调度函数
before_trading_start=before_trading_start,
analyze=analyze,
capital_base=100000,
bundle='quantopian-quandl'
)
| 类别 | 因子 |
|---|---|
| **基础** | Returns, SimpleMovingAverage, VWAP, EWMA |
| **技术** | RSI, BollingerBands, MACDSignal, Aroon, IchimokuKinkoHyo |
| **统计** | RollingPearson, RollingSpearman, SimpleBeta |
Quantopian(2011-2020)是由 John Fawcett 和 Jean Bredeche 创立的波士顿金融科技公司。它旨在创建一个众包对冲基金,让自由量化分析师开发、测试和使用交易算法。2020 年 11 月,Quantopian 宣布关闭,团队加入 Robinhood Markets。虽然 Quantopian 已关闭,但 Zipline 的设计理念(Pipeline API、事件驱动、无前视偏差)深刻影响了后来的量化框架。
| 推荐使用 | 不推荐使用 |
|---|---|
| Pipeline 因子研究 | 新项目(维护较少) |
| 美股回测 | 实盘交易 |
| 学术研究 | A 股市场 |
| 学习量化概念 | 生产环境 |
开始选择量化框架
│
▼
┌───────────────────┐
│ 目标市场是什么? │
└─────────┬─────────┘
│
┌─────┼─────┬─────────┐
▼ ▼ ▼ ▼
加密货 A股 美股 期货/期权
│ │ │ │
▼ │ │ ▼
Freqtrade │ │ VeighNa
│ │
┌─────┘ └─────┐
▼ ▼
国内 海外
│ │
▼ ▼
VeighNa Backtrader
Qlib Zipline
| 维度 | Freqtrade | Qlib | VeighNa | Backtrader | Zipline |
|---|---|---|---|---|---|
| **加密货币** | ⭐⭐⭐⭐⭐ | ⭐ | ⭐ | ⭐⭐ | ⭐ |
| **A 股** | ⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| **美股** | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| **期货** | ⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
| **回测能力** | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| **实盘交易** | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐ |
| **AI/ML** | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐ |
| **学习曲线** | 简单 | 中等 | 中等 | 简单 | 中等 |
| **中文文档** | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐ |
| **社区活跃度** | 非常高 | 高 | 高 | 中 | 低 |
| 你的需求 | 推荐框架 | 理由 |
|---|---|---|
| **加密货币交易** | Freqtrade | 专业级加密货币支持,交易所覆盖广 |
| **A 股因子投资** | Qlib | AI 驱动,因子库丰富,RD-Agent 自动化 |
| **期货 CTA 策略** | VeighNa | 国内市场支持最好,实盘能力强 |
| **学习量化入门** | Backtrader | 文档清晰,API 简洁,社区资源多 |
| **美股多因子研究** | Zipline | Pipeline API 设计优秀 |
| **AI 机器学习** | Qlib | 模型库最全,支持监督学习/强化学习 |
| **全市场套利** | VeighNa | 多 Gateway 支持,价差交易模块 |
┌─────────────────────────────────────────────────────────────┐
│ 策略开发标准流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 想法产生 │
│ └→ 市场观察 → 文献研究 → 假设形成 │
│ │
│ 2. 数据准备 │
│ └→ 数据获取 → 数据清洗 → 特征工程 │
│ │
│ 3. 策略实现 │
│ └→ 信号生成 → 交易规则 → 风控逻辑 │
│ │
│ 4. 回测验证 │
│ └→ 历史回测 → 参数优化 → 样本外测试 │
│ │
│ 5. 风险评估 │
│ └→ 绩效指标 → 压力测试 → 敏感性分析 │
│ │
│ 6. 模拟盘 │
│ └→ 纸上交易 → 实时验证 → 问题修复 │
│ │
│ 7. 实盘部署 │
│ └→ 小仓位 → 逐步扩仓 → 持续监控 │
│ │
└─────────────────────────────────────────────────────────────┘
# 风险管理检查清单
RISK_CHECKLIST = {
# 仓位控制
"单品种仓位上限": "≤ 10%",
"总仓位上限": "≤ 80%",
"杠杆倍数": "≤ 2x",
# 止损止盈
"单笔止损": "≤ 2%",
"日内最大亏损": "≤ 5%",
"单笔止盈": "≥ 止损 * 1.5",
# 交易限制
"日内最大交易次数": "≤ 10 次",
"连续亏损后暂停": "≥ 3 次",
# 相关性控制
"同板块持仓上限": "≤ 30%",
"相关性阈值": "≤ 0.7",
}
| 陷阱 | 说明 | 解决方案 |
|---|---|---|
| **前视偏差** | 使用了当时不可得的信息 | 使用事件驱动框架 |
| **生存偏差** | 只选择当前存活的股票 | 使用当时的市场成分 |
| **过度拟合** | 参数过度优化 | 样本外测试、交叉验证 |
| **交易成本低估** | 忽略滑点、冲击成本 | 设置真实佣金和滑点 |
| **流动性假设** | 假设所有订单都能成交 | 设置成交量限制 |
# 关键绩效指标
METRICS = {
# 收益指标
"年化收益率": "策略年度化收益",
"超额收益": "相对基准的收益",
# 风险指标
"最大回撤": "峰值到谷值的最大跌幅",
"年化波动率": "收益率的标准差年度化",
# 风险调整收益
"夏普比率": "(收益率 - 无风险利率) / 波动率",
"索提诺比率": "(收益率 - 无风险利率) / 下行波动率",
"卡玛比率": "年化收益 / 最大回撤",
# 交易统计
"胜率": "盈利交易 / 总交易",
"盈亏比": "平均盈利 / 平均亏损",
"交易次数": "统计期间的总交易数",
"换手率": "交易金额 / 资产净值",
}
# 优秀策略的基准
BENCHMARKS = {
"夏普比率": "≥ 1.5",
"最大回撤": "≤ 15%",
"胜率": "≥ 50%",
"盈亏比": "≥ 1.5",
}
# Day 1: 环境搭建
pip install freqtrade
freqtrade new-config --config config.json
# Day 2-3: 数据下载和回测
freqtrade download-data --exchange binance --days 365
freqtrade backtesting --strategy SampleStrategy
# Day 4-7: 策略开发
# 编写自定义策略,添加指标和信号
# Day 8-14: 参数优化
freqtrade hyperopt --epochs 500
# Day 15-30: 模拟盘验证
freqtrade trade --dry-run
# 30 天后: 小仓位实盘
# Day 1: 环境搭建
pip install pyqlib
qlib.init
# Day 2-7: 数据准备
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data
# Day 8-14: 学习因子和模型
# 研究Alpha158因子,尝试不同模型
# Day 15-21: 策略回测
qrun benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml
# Day 22-30: 自定义开发
# 开发自定义因子和策略
# 持续: 研究和优化
# Day 1: 环境搭建
pip install vnpy
# Day 2-7: 熟悉平台
# 运行 VeighNa Trader,连接模拟账户
# Day 8-14: 策略开发
# 基于模板开发 CTA 策略
# Day 15-21: 回测优化
# 使用 CTA 回测模块
# Day 22-30: 模拟盘
# 连接 CTP Mini 进行模拟交易
# 持续: 准备实盘
量化交易是一场马拉松,而非短跑。选择合适的工具是成功的第一步:
"Past performance is not indicative of future results." (过往业绩不代表未来表现)量化交易的核心不在于工具,而在于策略逻辑、风险管理和持续学习。
本文基于 2025 年 2 月的项目版本撰写,开源项目持续演进中。
还没有人回复