本节摘要:QuantDinger 的实盘通道不止加密侧:官方 README 口径同时支持 IBKR(盈透)与 Alpaca 两家券商,覆盖股票,整个平台的资产面覆盖加密、股票、外汇。本节讲券商通道与加密所的三个结构性差异——市场时钟(有开闭市,不是七乘二十四)、T+1 结算(卖出资金不是即时可用)、保证金制度(杠杆受监管规则约束)——以及每个差异对配置与策略行为的实际影响;然后讨论适用面:什么策略适合走券商通道,外汇的具体通道以官方文档为准;最后给出接入流程与三个高频坑位。读完这节你会发现:接入券商的工程量不大,改的全是"时间感"。
| 差异 | 加密所 | 券商(IBKR/Alpaca) | 对你的实际影响 |
|---|---|---|---|
| 市场时钟 | 7×24 连续 | 有开闭市、节假日休市 | scheduler 触发要挂交易日历 |
| 结算 | 即时到账(可用) | 卖出资金 T+1 结算 | 连续调仓策略的资金可用性要建模 |
| 保证金 | 按所方规则 | 受监管保证金规则约束 | 杠杆上限与强线规则不同,别套用 |
逐一展开。
市场时钟。策略在加密侧养成的"任何时刻都可能有信号"的假设在股票侧不成立。两个工程后果:其一,scheduler-worker 的定时任务要挂交易日历(开闭市、节假日),否则休市时段的信号要么堆积到开盘瞬间倾泻,要么在重试中丢失;其二,收盘前的处理要显式设计——"收盘前十五分钟减仓"这类规则是策略层逻辑,不是通道层自动获得的。日历数据本身也属于第 03 章《数据层》的管辖范围,接入券商前先确认日历源。
T+1 结算。当日卖出股票的资金按 T+1 结算后可用于再投资(规则以交易所与券商当前规定为准)。对连续调仓策略,这意味着"刚卖出的钱马上买入下一标的"在资金可用性上可能不成立,策略的 sizing 模块必须把"可用资金"与"总权益"区分开。回测侧同理:6.1 的资金约束若按总权益算,paper 与实盘会出现系统性偏差——这正好是 7.2 节差异表的券商版。
T+1 结算的时间线(现金账户视角,示意) T 日 卖出成交 ──▶ 资金在途:计入总权益,sizing 不可当作可用 │ ▼ T+1 日 结算完成 ──▶ 资金进入可用余额 ──▶ 才能再投入 (遇节假日顺延:日历与结算规则以交易所与券商当前规定为准)
"可用资金"与"总权益"的拆分可以用一段极简逻辑表达(示意,结算规则以交易所与券商当前规定为准):
# settle_check.py —— 可用资金与在途资金拆分(示意逻辑,规则以官方规定为准) from datetime import date, timedelta def split_cash(cash_total, pending_sells, today=None): """pending_sells: [(卖出日期, 金额)],只登记尚未结算的卖出""" today = today or date.today() available, unsettled = cash_total, 0.0 for trade_date, amount in pending_sells: if trade_date + timedelta(days=1) <= today: available += amount # 已过 T+1:结算完成,可用 else: unsettled += amount # 在途:计入权益,不可下单 return {"available": round(available, 2), "unsettled": round(unsettled, 2)}
这段逻辑要落在两处才有效:sizing 只拿 available 一栏做买入预算;回测的资金约束按同一模型计算——只改实盘不改回测,等于亲手制造 7.2 节差异表里多出来的那一行系统性偏差。
保证金。券商通道的融资融券受监管保证金规则约束,杠杆上限、维持保证金与加密所的合约杠杆完全是两套逻辑。本书的立场:接入券商通道的策略一律从现金账户逻辑起步,杠杆问题留给读者在充分理解自家券商规则后自行决策,本书不给任何杠杆建议。
| 维度 | 适合券商通道 | 适合加密通道 |
|---|---|---|
| 标的 | 美股等股票标的 | 加密货币交易对 |
| 时间尺度 | 日线及以上为主(避开隔夜跳空敏感的高频) | 各时间尺度 |
| 策略类型 | 轮动、事件驱动、基本面量化 | 趋势、套利、做市类 |
| 外汇 | 外汇覆盖属于平台资产面的一部分,具体通道与合约细节以官方文档为准 | 稳定币对相关的跨所操作 |
判断原则只有一条:策略的时间尺度和信号节奏,能不能和市场时钟共存。信号密集到需要盘中多次反应、又对隔夜跳空敏感的策略,在股票侧的执行风险结构完全不同,回测里的成交假设要重新审视。
还有一类容易忽略的形态:跨通道组合——同一平台里加密腿与股票腿并存的策略。两条通道的时间感不同(一条七乘二十四,一条按日历离散),对账节奏不同(一条即时,一条 T+1),第 8.3 节的对账脚本要按通道分别跑;11.1 节的订单延迟与拒绝率指标也要按通道分桶统计——把两条通道的延迟混成一个 P99,等于用一个平均数描述两个不同分布,两边的问题都会被互相稀释。
(示意结构,字段名与券商适配器名称以官方文档为准。)
# broker_alpaca.yaml —— 券商接入配置(示意,字段以官方文档为准) broker: name: alpaca environment: paper # 券商侧也有 paper 环境,先用它 credentials_env: QD_ALPACA_KEY calendar: source: trading_calendar # 交易日历(第 03 章数据层) premarket: false # 是否允许盘前交易,起步建议关 close_cutoff_min: 15 # 收盘前停发新单的分钟数(示意值) trading: order_types: [market, limit] settlement_model: t_plus_1 # 资金可用性按 T+1 建模 safety: kill_switch: enabled reconcile: schedule: daily # 每日对账(第 8.3 节)
流程上比加密侧多一步:券商账户的权限开通(行情订阅、交易权限)通常有人工审核环节,预留等待时间;测试顺序仍是"券商 paper 环境先行,再谈真实资金",与 8.1 的门槛清单同构。
一个典型的接入节奏(示意):第一周提交券商账户权限申请,等待审核期间先用券商 paper 环境把日历、结算、收盘截止三项配置调通;第二周权限下来,先只读行情,观察数据口径与第 03 章本地库的对齐情况;第三周才进入与 8.1 同构的验证清单。比加密侧慢的这些天不是浪费——券商通道的时间感问题(节假日顺延、半日市、结算顺延)全都要靠日历上的真实交易日来暴露,纸面核对发现不了它们。
| 坑 | 症状 | 对策 |
|---|---|---|
| 日历缺失 | 休市日信号堆积或丢失 | scheduler 挂交易日历,日历进数据层维护 |
| 资金可用性错判 | T+1 未结算资金被 sizing 当可用 | sizing 区分总权益与可用资金,回测同步建模 |
| 盘前盘后误成交 | 流动性极差时段成交在极差价格 | 默认关闭盘外时段,收盘前截止时间显式配置 |
第三个坑值得多说一句:盘外时段的流动性薄,点差可能放大一个数量级,"市价单成交了"和"成交在一个可接受的价格"是两回事——这类执行质量问题在回测里通常被滑点假设掩盖,在实盘里变成真金白银的损耗,第 11 章的拒绝率与成交质量指标会持续暴露它。
| 现象 | 常见原因 | 第一动作 |
|---|---|---|
| 开盘瞬间信号倾泻 | scheduler 未挂交易日历,休市积压集中释放 | 日历进数据层维护;积压信号按设计丢弃或限速 |
| 买入被拒:资金不足 | sizing 按总权益算,在途资金不可用 | 换 settle_check 口径,回测同步改 |
| 节假日当天仍在发单 | 日历源未更新或服务器时区错位 | 核对日历源版本与时区,当日异常记录归档 |
| 最后一单成交在极差价格 | 落入盘外时段或收盘竞价边缘 | 检查 close_cutoff_min 是否生效,收紧截止 |
| 券商 paper 与真实账户行为不一致 | 两边费率与成交规则有差异 | 以真实账户规则为准重对差异表 |
前两行是同一类病:把加密侧的"连续世界"假设带进了股票侧的"离散世界"。判断是不是这类问题,有个简单办法——看异常是否精确发生在日历边界上(开盘瞬间、节后首日、收盘边缘):边界上出的问题找时钟,边界中间出的问题才找策略。
无论走加密通道还是券商通道,接入完成只是拿到了"下单的能力",不是"安全的保障"。下一节讲接入之后每天都要做的事:本地账本与交易所的每日对账、对不上账时的分级处理、异常熔断的触发条件,以及给自己划清的合规边界。