使用手册
功能在哪 · 是什么 · 怎么调出来一、软件定位与适用场景
量化研究 / 交易框架(Python / 云 / 券商 API),用于数据、回测、实盘。本文只讲软件功能与界面含义,不涉及任何交易方向建议。
二、使用前准备
- 准备 Python 环境或平台账号
- 订阅数据源
- 配置 API 密钥
- 准备策略代码
三、界面结构总览
手机端通常分为三个主区域:
- 行情页:看品种价格、分时、K 线、盘口
- 交易页:下单、持仓、挂单、资金
- 账户页:账户信息、安全设置、业务办理、通知
四、数据页字段含义
- 标的 / 周期 / 复权方式
- 字段:OHLCV、因子
- 起止范围与频率
独到见解:复权方式选错,回测结论全盘反转。
五、回测页要素
- 起止时间 / 初始资金
- 手续费与滑点设置
- 绩效指标:夏普、最大回撤
- 参数优化区间
六、实盘页常用功能
- API 连接状态
- 订单管理
- 风控阈值
- 日志与告警
- 部署(云 / 本地)
七、〇、关于「Pro」的说明
需要先说明一件事:QuantConnect 官方公开产品线中,并没有一个正式命名为「Pro」的发行版。 该平台公开的形态是:
- QuantConnect:云端策略开发与回测平台(免费账户 + 付费订阅)。
- LEAN:开源算法交易引擎,开放源码,允许自行下载并扩展到商业用途。
本目录名为 QuantConnectPro,本文按照 QuantConnect 云端平台 + LEAN 开源引擎的公开机制 来整理操作路径。若你使用的确实是某个第三方打包或本地增强版本,请以该版本的官方说明为准,本文内容不能替代其厂商文档。
下文统一以「平台」指代云端 QuantConnect,以「LEAN」指代开源引擎。
八、认识一个项目的骨架
一个 QuantConnect 项目通常只有两三个文件:
| 文件 | 作用 |
|---|---|
main.py | 策略主文件,含 initialize 与 on_data |
research.ipynb | 可选的 Jupyter 研究笔记本 |
| 库文件 | 放自己封装的工具函数 |
在项目列表中点击项目名即可进入编辑器;编辑器上方有 Backtest(回测)与 Live Trading(实盘)两个主入口,日常操作几乎都围绕这两个按钮展开。
九、添加标的与设置周期
不同资产类别用不同的添加方法,参数大同小异:
| 资产类别 | 添加方法示例 | 备注 |
|---|---|---|
| 美股 | self.add_equity("SPY", Resolution.DAILY) | 支持股票与 ETF |
| 外汇 | self.add_forex("EURUSD", Resolution.MINUTE) | 需注意交易时段 |
| 加密货币 | self.add_crypto("BTCUSD", Resolution.MINUTE) | 全天连续交易 |
| 期货 | self.add_future(Futures.Indices.SP_500_E_MINI, Resolution.MINUTE) | 涉及连续合约与换月 |
| 期权 | self.add_option("SPY", Resolution.MINUTE) | 涉及合约链过滤 |
| 差价合约 | 按平台支持的 CFD 标的添加 | 视地区与账户而定 |
颗粒度选择: Resolution 支持 tick、second、minute、hour、daily。颗粒度越细,回测越慢、数据体积越大。低频策略不要用 tick 粒度回测,那是纯粹浪费时间与配额。
关于数据质量: 平台强调其数据为「无存活者偏差」数据,并自动处理拆股、分红与公司事件(退市、并购)。这一点在使用自定义数据时不再适用——自定义数据要自己负责。
操作教程
一步一步 · 跟着做完一件事十、先分清两条路:云端还是本地
这是第一步就要做的选择,两条路的成本结构完全不同。
| 对比项 | 云端平台 | 本地 LEAN |
|---|---|---|
| 运行环境 | 浏览器 IDE,无需安装 | 本机 Docker 环境运行 |
| 数据源 | 平台自带数据集,付费可扩容 | 需自备数据或通过 LEAN ToolBox 处理 |
| 算力来源 | 平台提供的计算节点 | 自己的机器 |
| 适合对象 | 快速验证想法、不想维护基础设施 | 数据保密要求高、想完全掌控代码 |
| 主要开销 | 订阅费 + 云信用 IPQC/节点 | 自己买数据、自己运维 |
操作建议:先用免费账户走通一次完整回测,再决定是否上付费或转本地。 不要一上来就买订阅——多数人卡在的不是算力,而是连不上数据或看不懂报错。
十一、两种写法:经典式与框架式
平台支持两种组织策略的方式,选择哪一种会影响后续所有操作。
| 写法 | 特征 | 适合 |
|---|---|---|
| 经典式 | 继承 QCAlgorithm,所有逻辑写在 on_data | 单标的、进出场逻辑简单、需要精细控制每一笔单 |
| 框架式 | 装配五个可插拔模块 | 多标的、组合再平衡、排序打分、多因子风格 |
官方推荐在多数情况下使用框架式,理由是模块之间以明确的方式连接,可以互相替换、彼此复用。但对于「一个信号进场、一个信号出场」这类紧密耦合的逻辑,框架式并不顺手,因为它默认假设你希望长时间保持满仓,会把购买力全压给单个信号。
十二、一个最小可运行的经典式策略
步骤 1:新建项目。 在项目列表创建新项目,语言选 Python。
步骤 2:写入初始化。 粘贴以下代码框架:
from AlgorithmImports import *
class MyAlgorithm(QCAlgorithm):
def initialize(self) -> None:
# 设置回测区间与初始资金
self.set_start_date(2020, 1, 1)
self.set_end_date(2023, 12, 31)
self.set_cash(100000)
# 添加标的,返回对象中取 symbol 备用
self.spy = self.add_equity("SPY", Resolution.DAILY).symbol
# 预热若干根 K 线,避免使用未成熟的指标值
self.set_warm_up(30, Resolution.DAILY)
# 记录持有技术指标的变量
self.fast = self.sma(self.spy, 10, Resolution.DAILY)
self.slow = self.sma(self.spy, 30, Resolution.DAILY)
def on_data(self, slice: Slice) -> None:
# 预热期内不下单
if self.is_warming_up:
return
# 本根 K 线没有该标的的数据则跳过
if not slice.bars.contains_key(self.spy):
return
holdings = self.portfolio[self.spy].quantity
# 金叉:快线上穿慢线
if self.fast.current.value > self.slow.current.value and holdings <= 0:
self.set_holdings(self.spy, 1.0)
# 死叉:快线下穿慢线
elif self.fast.current.value < self.slow.current.value and holdings > 0:
self.liquidate(self.spy)
步骤 3:点击 Backtest。 等待编译与回测完成,右侧出现绩效图表与统计。
这段代码里有两个必须养成的习惯:一是 set_warm_up 预热,二是 is_warming_up 判断。没有预热时,指标前若干根 K 线的取值是不可信的,很多「回测完美」的假象就来自这一段。
十三、下单方式一览
| 方法 | 含义 | 典型场景 |
|---|---|---|
self.set_holdings("SPY", 0.5) | 调整到占净值 50% 的仓位 | 组合调仓,最常用 |
self.market_order("SPY", 10) | 市价买卖指定股数 | 明确数量的进出场 |
self.limit_order("SPY", 10, price) | 限价单 | 不愿追价的挂单 |
self.stop_market_order("SPY", -10, stop) | 止损市价单 | 硬性保护,注意滑点 |
self.stop_limit_order(...) | 止损限价单 | 想控制止损成交价 |
self.market_on_open_order(...) | 开盘市价单 | 按开盘价执行 |
self.market_on_close_order(...) | 收盘市价单 | 按收盘价执行 |
self.liquidate("SPY") | 平掉指定标的 | 出场、清仓 |
self.liquidate() | 全部平掉 | 极端处置 |
重要提醒:set_holdings 是「目标仓位」语义,不是「加仓」语义。 传入 0.5 表示调到了 50%,而非再买 50%。反复误会这一点会导致仓位不断翻转。
十四、技术指标怎么用
平台内置上百种指标,注册后会自动随数据更新。常用写法:
self.rsi_ind = self.rsi(self.spy, 14, MovingAverageType.WILDERS, Resolution.DAILY)
self.macd_ind = self.macd(self.spy, 12, 26, 9, Resolution.DAILY)
self.bb_ind = self.bb(self.spy, 20, 2, Resolution.DAILY)
self.atr_ind = self.atr(self.spy, 14, MovingAverageType.SIMPLE, Resolution.DAILY)
取值时用 .current.value;判断成熟用 .is_ready;短线策略还要加 volume/相关性一类指标。
历史窗口的写法: 需要保存过去若干个值时,用滚动窗口:
self.window = RollingWindow[float](5)
def on_data(self, slice: Slice) -> None:
if self.is_warming_up:
return
self.window.add(self.rsi_ind.current.value)
if not self.window.is_ready:
return
# 此时窗口已满,可以比较窗口内的值
滚动窗口的索引语义是 [0] 表示最新,下标越大越旧,方向与 Backtrader 的 line 索引一致,初上手容易搞反。
十五、框架式的五个模块怎么拼装
框架式策略的数据流是一条责任链,每一步的产物是下一步的输入:
Universe Selection 选出标的集合
↓
Alpha 生成 Insight(交易观点)
↓
Portfolio Construction 把 Insight 变成 PortfolioTarget(目标仓位)
↓
Risk Management 修正/过滤这些目标
↓
Execution 落实为真实订单
最小装配示例:
class MyFrameworkAlgorithm(QCAlgorithm):
def initialize(self) -> None:
self.set_start_date(2020, 1, 1)
self.set_end_date(2023, 12, 31)
self.set_cash(100000)
self.set_universe_selection(EmaCrossUniverseSelectionModel())
self.add_alpha(RsiAlphaModel())
self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())
self.set_execution(ImmediateExecutionModel())
self.set_risk_management(MaximumDrawdownPercentPerSecurity(0.03))
| 模块 | 常用内置模型 | 各自负责 |
|---|---|---|
| Universe Selection | EmaCrossUniverseSelectionModel、QC500UniverseSelectionModel、FineFundamentalUniverseSelectionModel、ScheduledUniverseSelectionModel | 决定关注哪些标的 |
| Alpha | RsiAlphaModel、MacdAlphaModel、EmaCrossAlphaModel、ConstantAlphaModel、HistoricalReturnsAlphaModel | 生成观点 |
| Portfolio Construction | EqualWeightingPortfolioConstructionModel、MeanVariance...、BlackLitterman...、最大夏普类 | 决定每份多少 |
| Risk Management | MaximumDrawdownPercentPerSecurity、MaximumSectorExposureRiskManagementModel、追踪止损类 | 压住风险 |
| Execution | ImmediateExecutionModel、SpreadExecutionModel、StandardDeviationExecutionModel、VWAP 类 | 决定怎么成交 |
实操顺序建议:先用全部内置模型跑通一遍,确认链路没问题,再逐层替换成自己的实现。 一次替换五层,出了错无处排除。
十六、Insight(观点)怎么写
Insight 是 Alpha 模块的输出,也是贯穿后三层的对象。核心要素:
insights = [
Insight.price("SPY", timedelta(days=5), InsightDirection.UP,
magnitude=0.02, confidence=0.6)
]
| 字段 | 含义 | 设定不当的后果 |
|---|---|---|
| Symbol | 针对哪个标的 | 组合层算错对象 |
| Period | 观点有效期 | 过期则被系统撤下、自动平仓 |
| Direction | 方向(涨/跌/持平) | 方向写反直接亏钱 |
| Magnitude | 预期幅度 | 影响部分组合模型的权重 |
| Confidence | 置信度 | 影响加权方式 |
| Weight / SourceModel | 权重与来源标记 | 便于事后归因 |
关于平仓: 框架式策略高度依赖 Period 到期来管理出场。若你的策略出场条件与技术信号强耦合(比如某个形态结束就走),官方给出了四条替代路径:一是发出短周期观点并持续续期;二是动态更新观点的到期时间;三是把出场本身做成一个独立的 Alpha 信号;四是用风险模型(如最大回撤、追踪止损)接管出场。四种都不完美,这正是框架式不适合紧密耦合信号的原因。
十七、历史数据的查询方式
需要在盘中取一段历史做计算时:
hist = self.history(self.spy, 100, Resolution.DAILY)
hist2 = self.history(self.securities.keys(), 30, Resolution.DAILY)
df = self.history(self.spy, timedelta(days=30), Resolution.MINUTE)
返回结果是便于直接做计算的表格结构。注意:
- 不要在
on_data里高频调用历史查询,这是回测最常见的性能杀手。 - 若需要「截至上一根」的数据,务必注意当前这根是否已包含在内,避免引入未来信息。
- 取多个标的时,一次批量取比逐个取快得多。
十八、定时任务怎么设
不想每根 K 线都跑逻辑时,用调度器:
self.schedule.on(
self.date_rules.every_day("SPY"),
self.time_rules.before_market_close("SPY", 30),
self.rebalance
)
| 配置维度 | 常用选项 |
|---|---|
| 日期规则 | 每天、每周指定日、每月指定日、每日 |
| 时间规则 | 开盘后若干分钟、收盘前若干分钟、午夜、每 N 分钟 |
| 回调 | 自定义函数名 |
在收盘前几分钟调仓,是低频策略最常见的落地方式,可以避开开盘的剧烈波动,同时保留一定的执行空间。
十九、把回测做“贵”一点:成本与成交模型
不建模成本的回测没有参考意义。至少要做三件事:
def initialize(self) -> None:
# 设定券商模型,会影响费率、保证金与撮合假设
self.set_brokerage_model(BrokerageName.INTERACTIVE_BROKERS_BROKERAGE,
AccountType.MARGIN)
self.set_security_initializer(self.custom_initializer)
self.set_benchmark("SPY")
def custom_initializer(self, security) -> None:
# 为不同资产设置不同的手续费与滑点假设
security.set_fee_model(InteractiveBrokersFeeModel())
security.set_slippage_model(VolumeShareSlippageModel())
| 建模项 | 不做的后果 |
|---|---|
| 手续费 | 高频换手策略收益虚高 |
| 滑点 | 短线、大资金策略失真最严重 |
| 保证金模型 | 杠杆水位算错,可能出现不可能实现的仓位 |
| 成交量假设 | 回测成交价与实际完全脱钩 |
| 结算规则 | 现金账户的重复买入可能被判定违规 |
检验方法: 把手续费与滑点各放大一倍看结果是否崩塌。若崩塌,说明策略的安全边际不足以覆盖真实交易摩擦。
二十、回测报告看什么
右侧统计面板指标很多,建议按以下顺序看,而不是先盯总收益:
| 顺序 | 指标 | 为什么先看它 |
|---|---|---|
| 1 | 最大回撤 | 先确认自己能不能扛得住,收益才有意义 |
| 2 | 交易笔数与换手 | 笔数太少可能是偶然,太多则成本敏感 |
| 3 | 年度/月度拆收益 | 看收益是否集中在极少数几天 |
| 4 | 夏普比率 | 在前面都过关后才有参考价值 |
| 5 | 与基准对比 | 跑不赢简单基准就该反思 |
| 6 | 持仓与杠杆曲线 | 检查是否出现不可接受的仓位峰值 |
一个常用判据:剔除表现最好的若干天后收益是否大幅缩水。 若缩水严重,说明收益高度依赖极端行情,不可依赖。
二十一、参数优化与样本外检验
平台支持对参数区间做扫描式优化。操作流程:
- 在策略中把待调参数定义为可配置项。
- 设置扫描取值范围与步长。
- 运行优化任务,查看参数平面上各组合的表现。
- 观察参数平原是否成片——只有孤立的尖峰通常是拟合出来的。
防过拟合的三段式做法:
| 阶段 | 用途 | 禁忌 |
|---|---|---|
| 样本内 | 初步筛选 | 不要把结果当结论 |
| 样本外 | 验证稳健性 | 不要用样本外结果回头改参数 |
| 滚动前推 | 模拟真实使用 | 不要忽视交易成本变化 |
要害在于:样本外一旦用过,它就变成了样本内。 反复用同一段样本外数据调参,等于把整套数据都拟合了一遍。
二十二、Research(研究环境)怎么用
云端提供 Jupyter 笔记本环境,用途是把「探索」与「落地」分开:
- 在笔记本里查历史数据、画分布、做统计检验。
- 验证某个信号是否有区分度后再写进策略。
- 把验证通过的单个逻辑封装成模块,供框架式调用。
推荐先做「信号有效性验证」再做「策略回测」。 直接跑完整回测去找信号,等于用极其昂贵的方式做探索。
二十三、本地 LEAN 与 LEAN CLI 的工作流
需要本地开发时的基本链路:
- 安装 Docker 环境。
- 拉取 LEAN 引擎源码或镜像。
- 用命令行工具初始化项目、拉取/整理数据、本地回测。
- 用 VS Code 等本地编辑器编码。
- 需要时把本地项目推送到云端执行,或者反向拉取云端项目到本地。
本地方式的优势是数据与代码都在自己手里;代价是数据整理与运维全部自理。 平台提供了 ToolBox 工具来处理各类数据源的导入,这部分的工作量容易被严重低估。
二十四、实盘部署的操作顺序
从回测走到实盘,建议严格按以下顺序自查:
- 退出 PDF 报告或详细统计,确认成交明细与预期一致。
- 检查每一笔异常成交,确认是否由撮合假设造成。
- 先在 Paper Trading(模拟交易) 运行至少一个完整周期。
- 接入券商时,确认账户类型(现金账户/保证金账户)与策略所需一致。
- 确认交易品种权限已经开通(期权、期货往往需要单独申请)。
- 部署后设置通知(邮件/即时消息/自定义回调),不要靠手动盯盘。
- 记录每次部署的版本与参数,保证出问题可回溯。
关于通知: 平台对不同订阅层级有每小时通知条数限制,超出部分按云信用计费。设计告警策略时应避免「每笔成交都发一条」的粗放做法,否则很容易在剧烈行情中刷爆额度。
二十五、资产覆盖、可见提醒与常见限制
| 项目 | 说明 |
|---|---|
| 支持资产 | 股票、外汇、期权、期货、加密货币、差价合约,可在同一组合中同时持有 |
| 颗粒度 | tick / 秒 / 分钟 / 小时 / 日,细粒度通常需付费层级 |
| 单次文件大小 | 免费账户有较小的文件体积上限,付费层级逐级提高 |
| 团队规模 | 免费层级仅单人,协作功能在付费层级提供 |
| 计算节点 | 免费层级资源有限,付费可从数个节点扩展到不限节点 |
| 高级数据 | 基本面、另类数据在不同层级开放程度不同,部分需额外付费 |
| 自托管部署 | 仅机构类层级提供本地化部署选项 |
上表中的额度类信息随官方定价调整而变动,付费前请以官网实时页面为准。
二十六、常见坑清单
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 回测收益惊人,实盘毫无表现 | 未建模滑点与手续费 | 加上成本模型重跑 |
| 策略只交易了几天 | 数据缺失或标的选择过窄 | 检查数据集区间与标的池 |
| 指标前几十根输出异常 | 未预热 | 加 set_warm_up 并判断 is_warming_up |
| 买卖方向反了 | 混淆 set_holdings 目标语义 | 明确目标仓位而非增减仓 |
| 回测极慢 | 用了过细粒度或频繁查历史 | 降粒度、批量取数 |
| 出现不可能的杠杆 | 未设置保证金模型 | 设定 set_brokerage_model 与账户类型 |
| 参数优化结果不可复现 | 随机种子/版本变动 | 锁定版本与随机种子 |
| 实盘与回测下单不一致 | 撮合假设差异 | 调整填充模型保守度 |
| 框架式策略仓位过度集中 | 内置等权模型全仓给单一信号 | 自定义组合构建模型 |
| 通知被刷爆 | 每笔成交都推送 | 合并、分级、限频 |
| 自定义数据回测报错 | 时间时区/字段缺失 | 先做单标的短区间验证 |
二十七、注意事项
- 工具不产生盈利能力。 平台提供的是执行与记账基础设施,策略本身的成败完全取决于使用者。
- 回测的作用是证伪,不是证明。 一条漂亮的资金曲线首先应当引发怀疑,而不是信心。
- 不要用 tick 数据去跑日线策略。 粒度必须与实盘决策频率一致。
- 上线前必须经过模拟交易。 至少要覆盖一段趋势行情与一段震荡行情。
- 「Pro」这个名字不构成任何能力承诺。 若你用的是第三方打包版本,请以该版本厂商文档为准,对其声称的功能保持审慎。
- 本文仅在介绍工具操作,不构成投资建议,不推荐任何产品与平台。
金融产品有风险,入场前请务必确认自身风险承受能力;交易决策请自行判断,据此操作风险自负。
💬 用户评价 (0)
立即登录