EN

quantecho

自托管的全栈 Web 平台,核心是 Python 回测实验室;用户只写入场信号,成交、出场规则与复权都由经过测试的引擎负责。

quantecho 是我 2026 年从零搭建的一个自托管 Web 平台:前端是 Next.js,后端是几个 Python 伴生服务(sidecar),全部置于同一个网关之后,用 Docker Compose 部署,备份经 GPG 加密。它的核心是回测实验室:入场信号是一段在浏览器里写下的 Python 函数,其余(股票池、出场规则、复权与缓存)都固定写进经过测试的代码,不随信号改变。

notebook 回测的局限

notebook 里的回测写起来容易,却也容易让自己误信结果:成交规则是隐含的,回测用的价格序列与你之前查看的那条复权方式不同,A 股的 T+1 交收规则也常常被忘掉。在 quantecho 里你只写信号,这些容易出问题的决定都只做一次,放在经过测试的代码里。

扫描流程

回测流程:入场信号脚本在股票池上运行,数据层从 parquet 缓存里提供复权价格,引擎套用出场规则和 T+1,结果存档;作业注册表通过 SSE 把进度推送到浏览器 入场信号股票池数据层引擎结果 作业注册表 → SSE 日志流 Python,Monaco 编辑器META → 表单 · entries() → 布尔 标普 500 · 沪深 300 · 中证 5001,303 只标的 每只标的一个 parquet 文件复权价格 · 重试 · 熔断器 三种出场规则 · 先按止损成交A 股按 T+1 处理 交易统计 · 分布逐笔图 · JSON 存档 进度 · 日志行 · 协作式取消 回到浏览器
扫描以作业的形式运行,浏览器通过服务器推送事件跟随其进度,也可以取消。

一个形态(pattern)就是一个 Python 文件,在页面内嵌的 Monaco 编辑器里写:其中一小块 META 生成参数表单,一个 entries() 函数对每只标的返回一串布尔值。一次扫描把它在标普 500、沪深 300 或中证 500 上跑一遍,每个入场点按三种出场规则之一处理:持有 N 天,到目标价(止盈)或超时,或先到止损;若同一根 K 线同时触及止损和止盈,则先按止损成交。A 股的 T+1 在引擎内部处理,因此形态代码从不需要知道自己在哪个市场。

行情按每只标的一个 parquet 文件缓存,价格做后复权,使比价前后一致;显示时再换回。同步层遇到限流会重试,连续失败时触发软件意义上的熔断器,中途也可以取消。每次扫描都登记在一个作业注册表里,作为作业运行;进度和日志行通过服务器推送事件(Server-Sent Events,SSE)推到浏览器,浏览器也可以要求取消。结果包括交易的统计与分布,以及逐笔交易的图,每次扫描都存档为可回放的 JSON。

平台的底层

我做的事。 设计文档、代码、测试、部署与事故复盘,全部由我完成。平台是私有的,没有公开演示;可以公开谈的是回测实验室这一部分。

计数来自各仓库,2026 年 8 月。信号、扫描与结果都不公开。