← 返回文章列表
July 16, 2026
5 分钟阅读

成交模拟:从收盘价幻想到队列感知现实的阶梯

成交模拟:从收盘价幻想到队列感知现实的阶梯
#成交模拟
#回测
#限价单
#队列位置
#部分成交
#做市
#执行
#市场微观结构

你的回测里包含两个模型:一个是关于 alpha 的模型,另一个是关于成交的模型。大多数人把 95% 的精力放在前者上,而后者则直接继承自他们碰巧用的那个框架。这本末倒置了。一个平庸的信号配上一个诚实的成交模型,会得到一个平庸但真实的 PnL 估计;一个出色的信号配上 fill_price = candle.close,得到的数字则什么都估计不了——它只是你从未审视过的某个假设的输出。

对于流动性充裕品种上的吃单(taker)策略,成交模型只是一个修正项。而对于任何涉及挂单的场景——做市、被动入场、post-only 返佣收割——成交模型就是策略本身。你是否成交、何时成交、成交多少,以及在随后价格如何变动的条件下成交,决定的不只是 PnL 的大小,而是它的正负号。

回测与实盘一致性一文中,我们绘制了回测与实盘偏差的完整分类图谱,并将执行偏差评为 5/5 的严重程度——最糟糕的一类。那篇文章只给了成交模拟三个粗略的精度等级便一带而过。本文则是它的深度姊妹篇:完整的阶梯,逐级拆解,把订单生命周期建模为状态机,给出你真正能计算的成交概率上下界,并用一个实测实验精确地展示,一个"盈利"的做市策略究竟死在阶梯的哪一级。

阶梯

成交模拟保真度五级阶梯

每上升一级,都需要更多的数据和更多的代码,而每一级都消除了一个特定的系统性偏差。这些级别的排序依据是它们各自出的错,而不仅仅是成本。

第 0 级:收盘价成交

fill_price = bar.close

订单在生成信号的那根 K 线的收盘价上瞬间、全额成交。而信号本身就是用同一个收盘价算出来的,所以你是在用价格打印出来时还不存在的数据交易:披着执行外衣的未来函数(look-ahead bias)。任何有换手率的策略在这里看起来都很美。

第 1 级:下一根 K 线开盘价

fill_price = next_bar.open

这是 K 线级别吃单逻辑的最低诚实模型。信号在第 tt 根 K 线上计算,成交发生在第 t+1t+1 根 K 线的第一个可观测价格上。这消除了未来函数,但仍然假设零点差、零冲击、开盘打印处无限流动性,以及 100% 成交确定性。对于限价单,它退化成触碰即成交(touch-fill)逻辑(至于为什么这是毒药,详见下文)。

第 2 级:点差 + 固定滑点

half_spread = mid * spread_bps / 2e4
slip        = mid * slippage_bps / 1e4
fill_price  = mid + side * (half_spread + slip)   # side: +1 buy, -1 sell

现在每一笔吃单交易都要支付半个点差外加一个校准过的常数。这是第一个高换手率策略可能在回测里死掉的级别——而这正是重点所在。残余误差在于:滑点不是常数。它随订单规模相对于显示深度而缩放,并且恰恰在你的策略最想交易的时候爆炸式增大。固定的 5 bps 是跨市场状态(regime)的平均值;而你的策略并不在平均状态下交易。

第 3 级:市价单的 L2 深度穿行

有了订单簿快照,你就不再猜测滑点,而是直接计算它。规模为 QQ 的市价买单会逐档穿行卖方;成交价是被吃掉的各档位上的成交量加权平均:

Pfill(Q)=1Qipimin ⁣(qi,  Qj<iqj)P_{\text{fill}}(Q) = \frac{1}{Q}\sum_{i} p_i \cdot \min\!\left(q_i,\; Q - \textstyle\sum_{j<i} q_j\right)

def depth_walk(levels: list[tuple[float, float]], qty: float) -> tuple[float, float]:
    """levels: [(price, size), ...] sorted best-first. Returns (vwap, filled_qty)."""
    remaining, cost = qty, 0.0
    for price, size in levels:
        take = min(size, remaining)
        cost += take * price
        remaining -= take
        if remaining <= 0:
            break
    filled = qty - remaining
    return (cost / filled if filled > 0 else float("nan"), filled)

有两个修正能让这一切在实质上更诚实。第一,延迟:要穿行的是你决策时间戳之后 Δt\Delta t 时刻的订单簿状态,其中 Δt\Delta t 是你实测的信号到交易所延迟——你看到的簿并不是你打进去的簿。第二,可成交部分的部分成交:如果在你的限价穿透价内的显示深度小于 QQ,模型必须返回一个部分成交,并留下一个挂单余量,这就把问题交给了下文的状态机。

第 3 级的残余误差在于冲击与补单:你把订单簿当成一个静态对象来消耗,但真实的簿会部分补充(而真实的对手方会做出反应)。对于低于簿口深度百分之几的挂单规模,这个误差很小;对于更大的挂单,你需要在其上叠加一个冲击模型(Almgren-Chriss 2001)。

第 4 级:限价单的概率化队列位置成交

第 0 到 3 级回答的是"我的主动订单以什么价格成交"。第 4 级回答的是更难的问题:我的被动订单到底成不成交——而它是唯一能给做市策略定价的级别。挂在价格 pp 上的限价单,只有当 pp 处的累计成交量超过排在它前面的队列量时才会成交。这就要求你追踪自己在一个无法直接观测的 FIFO 队列中的位置。

队列位置估计机制——初始位置、成交与撤单时的更新规则、用于分配未观测撤单的 f(x)f(x) 概率族——是我们在墙内的队列一文中构建的原语。这里我不再重新推导;模拟器直接消费它。第 4 级新增的,是在这个估计之上的成交判定规则,详见下文的成交概率一节。

这一级为何重要,文献里有量化的答案:Moallemi 与 Yuan(2016)的《A Model for Queue Position Valuation in a Limit Order Book》表明,对于大跳动点(large-tick)品种,队首位置相对于队尾位置的经济价值,与半个点差相当——与整个做市策略的理论优势处于同一数量级。一个忽略队列位置的成交模型,并不是把做市商的 PnL 估错了;它估计的是另一个策略的 PnL。

确实还存在一个第 5 级——完整的基于智能体的仿真,其中市场会对你的订单做出反应(队列反应式模型,如 Huang、Lehalle 与 Rosenbaum 2015 意义上的;多智能体框架如 ABIDES,Byrd 等 2020)。历史回放,即便是队列感知的,也假设你的订单不会改变其他所有人的行为。这个假设在散户规模下没问题,但当你的报价成为该档位中可见的一部分时,就越来越不成立了。第 5 级不在本文范围内;但要知道,阶梯并未止步于第 4 级。

把部分成交建模为状态机

第 0 到 2 级可以假装订单就是一次函数调用:提交、拿到价格、结束。从第 3 级往上,订单就是一个带有生命周期的过程,模拟器必须把它建模成一个状态机,否则它就会在最要紧的那些情形上悄无声息地处理错误。

带队列位置标注的订单生命周期状态机

enum OrderState {
    PendingNew,                                  // sent, not yet acked (latency window)
    Resting     { remaining: f64, q_ahead: f64 }, // in book, queue position estimated
    PartialFill { remaining: f64, q_ahead: f64 }, // some qty done, rest still queued
    PendingAmend,                                 // amend in flight
    PendingCancel,                                // cancel in flight
    Filled,
    Canceled    { filled_qty: f64 },              // may be partially filled at cancel time
    Rejected,
}

这些状态转移承载着经济含义:

  • PendingNewResting:订单排到的是回执(ack)时刻已存在的一切之,而不是决策时刻。你的队列位置是用 t+Δtackt + \Delta t_{\text{ack}} 时刻的档位成交量来播种的。在决策时刻播种的模拟器会系统性地高估队列优先级——高估的量恰好就是在你的延迟窗口内到达的成交量,而在爆发行情中这就是大部分成交量。
  • RestingPartialFill:当你所在档位的一笔成交大于你前面的队列时,你会被部分成交。剩余部分保持它(此时已排到队首)的位置。部分成交不是噪声——它是信息:1.0 里被成交了 0.3、然后眼看价格弹开,这是和全额成交截然不同的 PnL 事件,而做市商的库存过程正是由这些碎片拼出来的。
  • RestingPendingAmendResting:这是个陷阱。在几乎所有加密交易场所,改单(amend)都是撤单/重挂——币安的 cancelReplace 对于避免重复执行是原子的,但会返回一个排到队尾的新订单 ID。即便是有原生 modify 语义的场所(CME Globex),也只在数量减少时保留时间优先级;改价或数量增加都会丧失它。所以在模拟器里:任何改价操作都会把 q_ahead 重置为当前档位的全部成交量。一个每 500ms 就重新盯盘(re-peg)的报价引擎并不是在"维持报价"——它是在永无止境地从队尾重新入场,其真实的成交画像几乎是纯粹的逆向选择。结合 Moallemi-Yuan 的结论:重新报价是有价格的,而这个价格就是你的队列位置。
  • PendingCancelPartialFillCanceled:撤单也有延迟。在你决定撤掉报价、到撤单指令抵达撮合引擎之间的这个窗口里,你仍然可能成交——而这些成交是你能收到的最糟糕的成交,因为你之所以要撤报价,正是因为市场即将碾过你。一个没有撤单延迟的模拟器,会恰好把你历史中毒性最强的那些成交删掉。

状态机也是让模拟器的账目诚实的东西:手续费按每一次成交事件计提,库存按每一次成交事件更新,而在各状态中停留时长的统计(订单在成交前挂多久 vs. 在被撤前挂多久)则可以直接与实盘日志做比较——而这正是文末校准闭环所依赖的原料。

限价单成交概率:三个模型和一个区间

给定一个挂在价格 pp 上的订单(比方说一个买单),模拟器什么时候判定它成交?有三条判定规则,诚实程度递增:

**1. 触碰即成交(naive)。**只要价格触碰到你的档位就成交:lowtp\text{low}_t \le p。这是一条首次穿越时间(first-passage-time)规则,而它的失败在四分之一个世纪前就被实测过了:Lo、MacKinlay 与 Zhang(2002)的《Econometric Models of Limit-Order Executions》(Journal of Financial Economics 65),用真实的限价单数据拟合生存模型,得出的结论是,由首次穿越时间构造出的假想成交"是真实限价单成交非常糟糕的替代品"。失败的机理是结构性的:当价格触碰到你的档位又弹开时,这次触碰消耗的是队列的前端——那些比你更早报价的交易者。触碰即成交把他们的成交判给了你。更糟的是,它判给你的恰恰是好的成交(触碰即弹开是做市商的盈利情形),而你真实的成交集合却偏向触碰即穿透——那些被逆向选择的成交。

**2. 穿透即成交(保守下界)。**只有当价格严格穿透你的档位才成交:lowt<pϵ\text{low}_t < p - \epsilon,或者在逐笔(tick)数据上,pp 处的累计成交量超过整个档位。如果价格穿透了,pp 处的整个队列都被消耗了,所以不管你排在什么位置都成交了。这条规则绝不会判给你一笔本来拿不到的成交。它的偏差恰好是触碰即成交的镜像:它会拒绝你每一笔"队列耗尽到你的位置但未完全穿透"的成交,而它确实判给你的那些成交,又不成比例地偏向穿透(被逆向选择)的那种。穿透即成交下的做市回测是一次压力测试,而不是一个估计。

**3. 队列耗尽估计。**从成交流(trade tape)追踪你所在价格处的累计成交量 MtM_t,并从 L2 增量推断出撤单量 CtC_t。你的估计队列前量为:

Q^ahead(t)=max ⁣(Q0MtϕCt,  0)\hat{Q}_{\text{ahead}}(t) = \max\!\Big(Q_0 - M_t - \phi \cdot C_t,\; 0\Big)

其中 Q0Q_0 是(回执时刻)下单时的档位成交量,ϕ[0,1]\phi \in [0,1] 是假设来自你前方的撤单占比——这个旋钮的原理化形式(f(x)f(x) 族)是在队列位置一文中推导的。当 Q^ahead=0\hat{Q}_{\text{ahead}} = 0 时开始成交;你的成交数量是超出它的那部分成交量,这自然而然地就给出了部分成交:

filled(t)=min ⁣(S,  max(MtQ0+ϕCt,0))\text{filled}(t) = \min\!\Big(S,\; \max(M_t - Q_0 + \phi\, C_t,\, 0)\Big)

ϕ=1\phi = 1(所有撤单都在你前方)给出这个模型的乐观边界;ϕ=0\phi = 0 给出悲观边界。当你只有稀疏的 L2 快照、且档位上没有成交流时——这在 100ms 节流的加密数据源中很常见——你可以退而求其次,用一个基于模型的先验:Cont、Stoikov 与 Talreja(2010)的《A Stochastic Model for Order Book Dynamics》(Operations Research 58),把每一个价格档位建模为一个生灭队列(birth-death queue),并通过拉普拉斯变换计算,在给定当前队列规模的条件下,一个买单在中间价移动之前成交的概率。这是一个解析式的成交概率神谕(oracle):相对于成交流回放是粗糙的,但远好于触碰即成交,而且便宜到足以在一个高频回测循环内部求值。

区间纪律

这三条规则不是相互竞争的——它们构成一个排序:

fillstrade-through    fillsqueue    fillstouch\text{fills}_{\text{trade-through}} \;\subseteq\; \text{fills}_{\text{queue}} \;\subseteq\; \text{fills}_{\text{touch}}

这诱导出一个 PnL 区间。每一次做市回测都跑三遍,并报告这个区间:

PnLtrade-through    PnLlivePnLtouch\text{PnL}_{\text{trade-through}} \;\le\; \text{PnL}_{\text{live}} \lesssim \text{PnL}_{\text{touch}}

(上界这个不等式是近似的——触碰即成交不只是会拔高策略,还会把策略的排名弄错,因为它把反事实的好成交塞给了你)。由此得出的决策规则是:**一个做市策略只有在能挺过区间的保守边缘、且区间窄到让点估计有意义时,才是可部署的。**一个显示 +9k(触碰)/9k(触碰)/ -3k(穿透)的策略,区间宽达 12k;你除了知道"模拟器的假设压过了你的alpha"之外一无所知。而一个显示+12k;你除了知道"模拟器的假设压过了你的 alpha"之外一无所知。而一个显示 +2.1k / +$0.4k 的策略,才是在告诉你一些真实的东西。

实验:让一个做市策略沿阶梯逐级下探

做市策略 PnL 沿成交模型阶梯逐级崩塌

取一个刻意设计得平平无奇的做市商——在最优买/卖价上对称报价、固定 0.05 BTC 的挂单、库存上限 ±0.5 BTC 且触及上限时用吃单拉平。用一个月的 BTCUSDT 永续数据:低级别用 1m K 线,高级别用 100ms L2 增量外加成交流;maker 手续费 1.0 bps,taker 4.0 bps。每一级都用同一套信号代码(共享核心,所以唯一的变量就是成交模型)。下面的数字是我们一次有代表性的运行结果——你的量级会因交易场所、月份和规模而异;但形态不会变:

级别 成交模型 报价成交率 成交笔数 当月 PnL 结论
0 close-fill 98% 41,200 +$14,800 幻想
1 next-bar-open / 1m K 线上触碰即成交 89% 37,400 +$9,600 带延迟的幻想
2 触碰即成交 + 吃单拉平的点差与固定滑点 89% 37,400 +$7,100 成本建模了,成交仍属虚构
3 + 吃单拉平的 L2 深度穿行 89% 37,400 +$6,400 出场诚实了,入场仍属虚构
4a 穿透即成交(保守) 21% 8,900 -$3,900 压力下界
4b 队列耗尽,ϕ\phi 已校准 37% 15,600 -$700 最佳估计
4c 队列耗尽,ϕ=1\phi = 1(乐观) 44% 18,700 +$1,900 上边缘
实盘影子运行,同一月份 35% 14,100 -$1,150 现实

从上往下读这张表,看这个策略在哪里死掉。它不是死在第 2 级——手续费和滑点砍掉了 26%,策略看起来仍然稳健盈利。它死在第 3 级和第 4 级之间,而它死的原因是任何成本模型都无法捕捉的:成交筛选(fill selection)。触碰即成交判给了 37,400 笔成交,其中大多数是触碰即弹开——纯粹的点差捕获。队列感知模型删掉了其中 58% 的成交,而它删掉的那些成交不成比例地正是盈利的那些:当档位被轻轻触碰时,排在一个重新报价、带散户延迟的做市商前面的队列会把一切都吸收掉。挺进第 4 级的那些成交,偏向于清扫档位的扫单(sweep)——那些价格已经在穿过你的成交。成交率下降到 1/2.4;PnL 翻了符号。这种不对称——丢掉好的成交、留下坏的——就是被机械地显式化了的逆向选择,而它在第 4 级以下的每一级都是不可见的。

还要注意这个区间起了什么作用:[-3,900,+3,900, +1,900] 跨越了零点,校准后的估计在 -700,实盘在700,实盘在 -1,150。模拟器并没有把实盘 PnL 精确到美元——但它算对了符号量级,以及误差在 2 个百分点以内的成交率。这正是成交模型的用处。第 1 级的回测在一个整月毛优势仅几千美元的策略上,把实盘 PnL 算错了 $10,750:成交模型的误差大约是 alpha 的 3 倍。由此得出本文的论点:你的成交模型是一个比你的 alpha 更大的假设。

对低级别有一个提醒:如果你不得不用 K 线数据(第 0 到 2 级),至少要用自适应下钻来解决 K 线内的歧义——在止损(SL)、止盈(TP)或报价档位落在 K 线区间内的地方,从 1m 下钻到 1s/100ms/逐笔。下钻能修正排序误差(哪个档位先被触及),但无法修正队列误差;它是本文在数据分辨率上的姊妹篇,而不是第 4 级的替代品。

校准闭环:对照实盘成交收敛

一个第 4 级的模拟器有自由参数——ϕ\phi、延迟 Δt\Delta t、撤单延迟、档位补单假设。不加校准的话,它只是一个形状不同的猜测。把它变成一台仪器的闭环如下:

**1. 实盘记录一切。**每一个订单事件都带上交易所时间戳:提交、回执、每一笔部分成交、改单回执、撤单回执。外加提交时刻的 L2 状态。这就是回测与实盘一致性一文为其 DivergenceMonitor 所要求的那套记录纪律——成交模型的校准是那个监视器最深的一层。

**2. 把同样的订单在模拟器里回放。**把录下来的市场数据和录下来的订单指令(而不是成交结果)喂进模拟器。现在你就有了成对的结果:对每一个实盘订单,都有一个模拟命运。

**3. 分桶比较分布,而不是均值。**单一的全局成交率匹配可以掩盖相互抵消的误差(在平静状态下过于乐观、在爆发行情下过于悲观——净出来一个"校准好了")。按驱动因素分桶:

import numpy as np
from scipy.stats import ks_2samp

def calibration_report(pairs, bucket_key):
    """pairs: [{'bucket':…, 'live_filled':bool, 'sim_filled':bool,
                'live_ttf':float|None, 'sim_ttf':float|None}, …]"""
    out = {}
    for b in sorted({p['bucket'] for p in pairs}):
        grp = [p for p in pairs if p['bucket'] == b]
        live_fr = np.mean([p['live_filled'] for p in grp])
        sim_fr  = np.mean([p['sim_filled']  for p in grp])
        live_ttf = [p['live_ttf'] for p in grp if p['live_ttf'] is not None]
        sim_ttf  = [p['sim_ttf']  for p in grp if p['sim_ttf']  is not None]
        ks = ks_2samp(live_ttf, sim_ttf) if len(live_ttf) > 20 and len(sim_ttf) > 20 else None
        out[b] = {
            'n': len(grp),
            'fill_rate_live': live_fr,
            'fill_rate_sim':  sim_fr,
            'fill_rate_gap':  sim_fr - live_fr,      # signed: + means sim optimistic
            'ttf_ks_pvalue':  ks.pvalue if ks else None,
        }
    return out

每个桶两个统计量:带符号的成交率差(模拟器减实盘),以及在已成交订单上对成交时间(time-to-fill)分布做的 KS 检验。成交时间的比较是最锋利的那个——一个模拟器可以匹配成交,却在系统性错误的时刻成交,这会污染下游所有的库存和逆向选择统计。这恰恰是 Lo-MacKinlay-Zhang 生存分析视角的教益:执行是一个事件发生时间(time-to-event)问题,所以要以此来验证它。

**4. 按可辨识性顺序拟合旋钮。**延迟优先(直接从回执时间戳测量——不是拟合的)。然后通过在各队列深度桶上最小化成交率差来拟合 ϕ\phi。接着检查波动率状态桶:一个集中在爆发行情桶里、持续存在的乐观差,通常意味着你的模拟器对撤单延迟的毒性成交或档位补单建模不足,而不是 ϕ\phi 的问题。

**5. 重跑区间。**校准之后,队列耗尽估计应当落在区间内、靠近实盘,而且——真正的验收测试——在模拟器下各策略变体的排名,应当与它们在影子模式下的排名一致。然后冻结参数,并按计划定期重新校准;成交动态会随交易场所的手续费档位、跳动点变化和 HFT 群体而漂移,一个在三月校准的 ϕ\phi 到了七月就只是个假设了。

我们运行中的收敛预期:一个未校准的第 4 级模拟器通常落在实盘成交率的 ±10-15 个百分点内;经过一轮校准后,±3-5 个百分点,且成交时间的 KS 检验 p 值不再一律拒绝。用历史回放你做不到比这更好——残差就是市场对你的反应,那是第 5 级的问题。

要点回顾

  1. **说出你的级别。**每一次回测都坐落在这个阶梯上,不管是你选的级别还是你的框架替你选的。如果你说不出自己成交模型的级别及其已知偏差,你的 PnL 数字就带着你没看见的误差棒。
  2. **吃单可以止步于第 3 级。**深度穿行加上实测延迟,能在散户规模下诚实地为主动执行定价。把省下来的精力花在数据质量上。
  3. **做市从第 4 级起步。**在它之下,限价单成交逻辑不是"近似"——它筛选出的是一个反事实的成交集合,带着相反的逆向选择偏斜。做市策略的触碰即成交回测,是最可靠的"一上生产就死"策略生成器。
  4. **建模生命周期,而不是成交。**部分成交、改单重置队列、撤单延迟——毒性成交就住在状态机里,而毒性成交正是做市 PnL 去送死的地方。
  5. **报告区间。**保守和乐观的上下界只多花两次回测运行,却把"我的回测说 +7k"变成了"现实在[7k"变成了"现实在 [-3.9k, +$1.9k] 之间的某处"——这是一个不同、也更好的决策。
  6. **分桶对照实盘成交做校准。**一个只在总量层面验证过的成交模型,是一个带着隐藏的相互抵消误差的成交模型。分桶的成交率差加上成交时间 KS 检验,每季度重新校准。

阶梯的各级不是学院派的分级——每一级都是你的回测停止对你说的一个特定谎言。一直往上爬,直到这些谎言比你的优势更小。

有用的链接

  1. Moallemi, C., Yuan, K. — A Model for Queue Position Valuation in a Limit Order Book (2016)
  2. Cont, R., Stoikov, S., Talreja, R. — A Stochastic Model for Order Book Dynamics, Operations Research 58(3), 549-563 (2010)
  3. Lo, A., MacKinlay, C., Zhang, J. — Econometric Models of Limit-Order Executions, Journal of Financial Economics 65(1), 31-71 (2002)
  4. Huang, W., Lehalle, C.-A., Rosenbaum, M. — Simulating and Analyzing Order Book Data: The Queue-Reactive Model, JASA 110(509), 107-122 (2015)
  5. Almgren, R., Chriss, N. — Optimal Execution of Portfolio Transactions (2001)
  6. Byrd, D., Hybinette, M., Balch, T. — ABIDES: Towards High-Fidelity Multi-Agent Market Simulation (2020)
  7. Binance API — Cancel-Replace order semantics
  8. CME Globex — Order modification and time priority rules

Citation

@article{soloviov2026fillsimulation,
  author = {Soloviov, Eugen},
  title = {Fill simulation: the ladder from close-price fantasy to queue-aware reality},
  year = {2026},
  url = {https://marketmaker.cc/blog/fill-simulation-partial-fills-backtest},
  description = {Five rungs of fill simulation fidelity — from close-price fills to probabilistic queue-position models. Partial fills as a state machine, limit-fill probability bounds as a PnL bracket, and a calibration loop against live fills.}
}
免责声明:本文提供的信息仅用于教育和参考目的,不构成财务、投资或交易建议。加密货币交易涉及重大损失风险。

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

紧跟市场步伐

订阅我们的时事通讯,获取独家 AI 交易见解、市场分析和平台更新。

我们尊重您的隐私。您可以随时退订。