行情数据与回测
这些模块组成一条链:Historical Data 把价格历史下载到本地数据集;Backtest 和 Quant Tools 处理这些数据集,Visualization 则为 connector 所提供的任何品种绘制图表,无论是否已存储。这三者都要求安装 Historical Data,因为它拥有它们所读取的数据集目录。
Historical Data
把外部服务商的 OHLCV K线下载到存储在你数据库中的数据集,或导入一个文件(如果你已经有的话)。一旦存储,数据就属于你:可以绘图、backtest、导出,无需重新获取。
服务商与凭据
服务商只需集中配置一次,作为 data connector:一个带凭据、可选请求限额以及允许使用它的模块的命名服务商账户。Historical Data 没有自己的服务商设置:服务商选择器旁边的 Connectors 按钮打开的就是你在设置中能看到的同一个共用界面。
有些服务商无需密钥(Binance 和 Binance 期货、Bitget、OKX、Kraken、Coinbase、Yahoo Finance),可立即使用;其他的需要 API 密钥,大多数有免费档。缺少凭据的 connector 会显示需要凭据,在你设置之前会被跳过。
出站调用会在设置 → API 速率中计数,让你可以观察免费档的使用情况。
下载
选择服务商、资产类型、时间框架、代码和日期范围,然后点击 Download。说明:
- 期货使用合约代码:基础代码 + 月份字母 + 年份数字(
F G H J K M N Q U V X Z= 1月…12月),例如GCJ5表示 2025 年 4 月的黄金。 - 期权由标的、到期日、看涨/看跌和行权价构建。
- 日内限制:服务商只在有限的回溯期内提供日内粒度(例如约 7、60 或 730 天,取决于服务商)。更早的历史可按 1d / 1w 无限制获取。在你把不可能的范围加入队列之前,表单会发出警告。
在 v0.0.15 之前下载的数据集
在 v0.0.15 之前,到达当前时间的下载或更新可能会存储仍在形成的 K 线,之后的更新则从它之后开始。这样的数据集可能包含不完整的 K 线(最高价、最低价、收盘价和成交量被截断)。请重新下载以替换它们。从 v0.0.15 起,K 线只有在其周期结束后才会被存储。
| 服务商 | 可能包含不完整 K 线的数据集 |
|---|---|
| Coinbase, Kraken, Yahoo Finance, Alpaca, Massive, EODHD, Alpha Vantage, Capital.com, Interactive Brokers | 在 v0.0.15 之前下载或更新的 |
| Binance (spot) | 在 v0.0.12 之前下载或更新的 |
| Binance USDⓈ-M, Bitget, OKX, OANDA, TradeStation, FOREX.com | 无 |
一次多个
一个表单即可排队整批任务:勾选所需的任意多个时间框架,并输入用逗号分隔的多个代码(BTCUSDT, ETHUSDT, SOLUSDT)。每个品种 × 时间框架组合排队一个下载(3 个品种 × 2 个时间框架 = 6 个下载),全部使用同一个 connector 和相同的日期范围。
在你按下 Download 之前,表单会对该批次估价:共有多少个下载、大约花费多少次服务商请求,以及最少需要多长时间(它们依次运行,以遵守服务商的速率限制)。当 connector 带有请求限额时,一个小仪表会显示当前窗口已经用掉多少,并在批次超出时发出警告。它不会被阻止:其余部分会等待额度重置并自行恢复。
查看任务
下载作为后台任务逐块运行,并带有实时进度。可按状态、服务商、时间框架或代码过滤任务;批次归在一个标题之下,显示其中多少个下载已完成。
- **触及限额的任务是
waiting,而不是失败。**该行会说明原因(额度已达上限或服务商速率限制),并倒计时到它自行恢复的时刻。 - Cancel 会停止任何未完成的任务,一次点击即可取消批次中的其余任务。取消是协作式的:工作线程会在下一个块边界停止,已经写入的 K 线会被保留。
- 长时间暂停和批次结束会触发通知,push 到授予 Historical Data 的渠道。
数据集
Datasets 标签页列出所有已存储的内容:K 线数量、日期范围、大小。你可以从这里:
- Fetch newer:拉取比最后存储的一根更新的 K 线(补充数据集)。
- Export 为 CSV 或 Parquet。CSV 可在任何电子表格中打开;Parquet 是带类型且压缩过的相同 K 线,大小约为十分之一,
pd.read_parquet读取时无需日期解析或类型猜测。Parquet 文件还在自己的元数据中携带品种、时间框架和来源,所以在应用的任何地方导入回去时,表单会自行填写。 - Delete 数据集(丢弃它的所有 K 线)。
- 直接跳转到它的图表。
Capital.com 和 OANDA 的下载还会存储每根 K 线的买价和卖价;对于其他服务商,backtest 在需要时会获取它们。
导入的数据集位于同一个列表中,以其文件的来源命名,而不是以服务商命名。它们没有 Fetch newer 按钮:背后没有服务商,扩展它们的方式是另一个文件。
导入你自己的文件
Datasets 标签页上的 Import 读取你已有的价格历史:交易所转储、broker 导出、电子表格、供应商的归档。CSV、TSV、TXT、JSON 或 Parquet,最大 20 MB,每根 K 线一行。
文件在各步骤之间从不离开你的浏览器,也从不存储在服务器上:每一步都会再次传送它,所以没有需要恢复或清理的半途上传。
**列由系统提议,由你确认。**表头会与多语言词典(六种语言)匹配,并且与值的实际样子匹配,所以 Date;Ouverture;Plus haut;… 和 open_time,open,high,low,close,volume 都能完成映射。每列旁边的圆点表示检测器有多确定;它不确定的任何内容都留给你。更正一列会教会它:下一个带有该表头的文件会自行映射。
Parquet 文件会被读入与 CSV 相同的网格,所以列检测、映射步骤和预览的工作方式完全一致。它的类型会被遵循:旧式 INT96 时间戳(Spark 和较旧的 pandas 写出的)和 DATE 变为日期,DECIMAL 保留其精度,null 保持为空单元格。同一个读取器也服务于 Journal 和 Portfolio 的导入,所以它们也接受 Parquet。
时间戳读取为日期,或以秒、毫秒、微秒或纳秒为单位的 Unix 整数,按列检测并可覆盖。不带时区的文本时间戳按你选择的偏移量读取,这决定了每一行属于哪个周期,而不仅仅是如何显示。
**缺失的会被填充,绝不会被虚构。**只有一个价格列的文件是收盘价序列(净值、指数水平):开盘价、最高价和最低价由收盘价填充,形成平坦的 K 线,表单会如实说明。你已经映射的某一列在某一行为空,会是一个指明其行号的错误,而不是零。
在写入任何内容之前,预览会针对整个文件报告:K 线数、行数、列数、第一个和最后一个日期、你的时间戳实际的间隔(作为时间框架提供)、该间隔下缺失的周期、共用同一周期的行、最高/最低价未包含其开盘/收盘价的 K 线,以及每一个无法读取的行。
**文件说不出的,由你来说。**文件会说“Close”;它不会说这些 K 线是 AAPL 的日线。所以导入会询问:
- 代码、资产类型和时间框架(时间框架根据文件自身的间隔预先填好)。
- 来源:文件来自的 broker、交易场所或供应商,自由文本。它是序列标识的一部分,所以同一个品种由两个 broker 导出时,仍是两个数据集,而不是被平均成一个的两份行情记录。
- 名称和标签:你自己的标签,用于在目录中重新找到该序列并过滤它。
**导入两次是安全的。**重新导入会落到同一个数据集上,并逐周期覆盖:相同文件,相同结果。重叠的周期会在你提交之前在预览中计数。
从这里导出的 Parquet 文件几乎可以跳过该表单:它已经知道自己的代码、资产类型、时间框架和来源,只填写你留空的框,所以你输入的任何内容仍然优先。导出,在 pandas 中编辑,再导入回来。
一旦导入,该序列就是普通数据集:backtest、Quant Tools、journal 补全以及投资组合的因子代理都像读取任何下载的数据集一样读取它。
下载之前先看看
你不必排队一个任务就能知道某个品种是否值得存储。图表通过 connector 获取一个窗口并不存储任何内容;当窗口看起来合适时,保存它,就会为恰好那个范围排队正常的下载任务。覆盖你已持有的 K 线时是整合而不是重复,所以从图表补充数据集是安全的。
Historical Data Visualization
图表不绑定数据集:它打开的是一个品种。搜索代码、选择时间框架,无论你是否下载过,K 线都会到达:服务器提供你目录中已有的内容,只通过 connector 获取缺失的边缘部分。除非你要求,否则不会写入任何内容。
页面是一个工作区:图表网格、旁边的品种列表,以及它们下方的一个快速 backtest 会话。除非另有说明,下面的一切描述的都是单个图表;网格本身在工作区中。
查找品种
不会有不属于K线的东西被覆盖在上面:图表左上角的代码是一个按钮,它以模态框打开品种选择器,一个搜索框覆盖该图表允许使用的每个 connector。输入 BTC,Binance、Bitget、OKX、Kraken、Coinbase、Yahoo、EODHD、Alpha Vantage、Alpaca 和 Massive 会一起应答,每个结果都标有提供它的 connector。按资产类型过滤;在同一个模态框中勾选或取消勾选来源(勾选就是授权,服务器会拒绝该模块从未获授的 connector)。
搜索框为空时,面板会列出你最近绘制过的图表,然后是已经存储的内容,两者都可一键打开且不产生任何成本。
无法绘制的行会在图表的位置上说明,并指明原因:connector 从未被授权、服务商不认识该代码、缺少凭据,或根本没有已授权的 connector 提供它。每条消息都带有修复它的按钮。
工作区
工作区是图表网格,从 1x1 到 3x4。行和列从工具栏中选取,所以垂直分割、水平分割和 2x2 是同一个控件,而不是一份命名布局的列表;拖动分隔条可给某个图表更多空间,或最大化某个图表再返回网格。你可以保留任意多个工作区、为其命名,并从选择器中切换;重新加载时会恢复你打开的那一个。
每个图表带有自己的品种、时间框架、绘图样式、指标和绘图。图表从它自己的标题栏关闭,空单元格会请求一个品种。
联动组。点击图表的联动按钮可给它一种颜色。共用同一种颜色的图表共用代码和十字线,当它们处于相同时间框架时也共用可见范围。时间框架本身有意从不共用:同一个代码上的三个窗格分别使用 1m、1h 和 1d,这才是把它们联动起来的理由。
**所有图表共用一个连接。**同一账户上的窗格共用一个实时流,所以同一个 Alpaca 密钥上的四个图表只占用一个连接席位,而不是四个。
品种列表
页面左侧的一条竖栏,来自两个永远不会混淆的来源:
- 图表列表是这条竖栏自己的,用
+按钮创建,它打开同一个品种选择器。它们保存图表坐标,所以点击即可绘制,无需查询。Recent 是没有名称的同样东西。 - Watchlists 模块的清单保存报价代码,所以绘制其中一个是一次查询。当清单或该行通过 data connector 报价时,只会询问那个 connector:通过 IBKR 报价的代码只在 IBKR 上绘制,否则不绘制。
点击一行即可在活动窗格中绘制它,或把它拖到任何窗格上。这里绝不会写入自选清单:编辑清单会先把它复制成图表列表,然后编辑副本,而把图表列表变成真正的自选清单只能通过 Promote 按钮。
加载历史
图表打开时显示最新的 1500 根 K 线,并在已加载数据的左边缘放置一个按钮。每点击一次就向后走一片。没有你的操作,绝不会发生任何服务商请求,这正是让计费密钥可预测的原因;当服务商的历史用尽时,走动就会停止。
时间框架下拉菜单提供 connector 支持的每一种 K 线大小,而不只是你碰巧下载过的,切换时间框架会保持你正在查看的日期。
实时流
对于支持流式传输的 connector,只要最新一根K线就是此刻正在形成的那一根,图表就会自行进入实时:最后一根 K 线就地更新,控件显示连接状态和落后于交易所的延迟。同一个控件可以手动停止和重启数据源。
实时按品种而不是按数据集寻址,并且不存储任何内容。流式服务商提供的任何代码都可以实时观看,而无需先下载,这正是重点:你可以在决定是否值得保留之前先看看。在实时状态下保存该品种,同一个数据源也会开始把已收盘的 K 线记录到数据集中。
谁流式传输什么。Binance(现货和期货)、Bitget、OKX、Kraken 和 Coinbase 会流式传输它们下载的每个时间框架,包括日线,因为在 24/7 市场上,日线 K 线就是纪元日。Capital.com 也流式传输每个时间框架,来自它分别发布的买价和卖价 K 线,以其中间价绘制。Alpaca、Massive 和 Interactive Brokers 各发布一种粒度(一分钟柱、一分钟聚合、五秒柱),图表由它折叠出你的时间框架。这涵盖每个日内时间框架,而把日线和周线留给下载:股票交易时段不是 1440 个与纪元对齐的分钟,所以以那种方式构建的日线 K 线会与已存储的不一致。在无法流式传输的时间框架上,控件会说明哪些可以,而不是消失。每个服务商的细节见实时流。
无论有多少个窗格,图表只流式传输一个代码:同一品种上的多个窗格,以及同一账户上的多个窗格,共用连接,而不是各自占用一个席位。
**哪个账户。**当一个服务商拥有多个 connector 时,实时控件会多出一个账户选择器。两个密钥意味着两份权限和两个连接席位,所以花掉哪一个由你决定,而不是备用回退。切换会在另一个上重启数据源。
接缝处没有缺口
加载窗口、打开 socket 和等待服务商发布都需要时间,而分钟线服务商一分钟才说一次话。到第一个实时 tick 到达时,图表可能落后一根或几根 K 线,而这些 K 线过去会一直缺失,直到你重新加载。
所以流会告诉服务器图表在哪里结束,服务器会发送其间已收盘的内容:品种已存储时来自目录,只有目录无法回答的尾部才来自服务商,没有缺口时则什么都不发。你看到进入实时时的就是市场实际发生的,接合处没有空洞。
无法运行时
被拒绝的密钥、没有流式传输的套餐、你的账户没有订阅的品种:这些是答复,而不是故障。图表会点明是哪一种,引用服务商自己的话,并停止,而不是在永远不会变绿的圆点背后无休止地重连。
| 你看到什么 | 含义 | 该怎么做 |
|---|---|---|
| Not authorized / 密钥被拒绝 | 凭据错误,或套餐没有实时数据源(免费的 Massive 密钥可以下载历史,但在实时登录时被拒绝) | 修复 connector,然后按 Try again |
| 此代码为 No subscription | 账户已连接,但无权使用该品种的数据源(Alpaca 免费版流式传输 IEX,而不是 SIP 或 OPRA;IBKR 提供你所订阅的内容) | 选择另一个品种,或在供应商处添加订阅 |
| Connection taken | 大多数供应商允许每个账户一个实时连接,另一个程序占着席位 | 关闭另一个程序;这个会自行持续重试,因为它会自行恢复 |
| This timeframe does not stream | 服务商发布单一粒度,而你的时间框架高于它 | 切换到控件列出的某个时间框架,或停留在已下载的数据上 |
| Connector not granted | 该图表从未获得这个 connector | 通过消息中的链接在 Data connectors 中授权 |
| Market data lines 几乎用完 | Interactive Brokers 限制账户同时流式传输的品种数量,而工作区已接近该上限 | 在下一个图表无缘无故沉默之前,关闭一个窗格,或停止你没在看的那个的实时数据源 |
其他一切(socket 断开、服务商小故障)都会以退避方式悄悄重连。
图表
- 图表类型:K线、OHLC 柱、折线和 Renko(带砖块大小)。
- 指标:SMA、RSI、MACD 等,作为叠加层或单独窗格,每个都有可配置的来源、线条/填充颜色和宽度。每个序列在图表标题栏中都有自己的一行,悬停时带有隐藏、设置和移除,每个窗格的标题位于它所承载的绘图之上。标题栏在十字线处读数:O H L C、涨跌幅,以及光标下 K 线处每个指标的值,光标离开时回退到最新可见的 K 线。
- 图表设置:线性或对数刻度、水平和垂直网格线、日分隔线、作为参考线绘制的前收盘价、十字线及其每个序列的值标签、悬停提示(默认关闭)、涨跌颜色、价格刻度在左侧或右侧,以及固定在价格轴上、颜色与产生它的K线相同的最新价标签。
- 导航由手驱动:拖动可平移两个轴(时间左右、价格上下),滚轮缩放(按设备校准,所以鼠标滚轮的一格和触控板的一下移动的量相同)。更改图表类型会保持当前缩放。
- 成交量绘制在价格窗格的底部,就像行情终端绘制的那样,而不是放在单独的窗格里。另有一个全屏模式。
- 微型市值价格写作
0.0₅4549,下标计数零的个数,而不是一排相同的0.0000标签。
比较两个品种
向同一个图表添加另一个品种,它会被重新基准化绘制,因为两种货币的两个价格放在同一个轴上说明不了什么。两种读法,只差一次点击:
- 百分比变化,两个序列都重新基准化到窗口起点,回答哪一个涨得更多;
- 比率,该品种除以另一个,重新基准化为 100,这是配对交易视图:当你正在绘制的这个跑赢时,线条上升。
对比序列按逐个周期与图表对齐,所以对同一天打不同时间戳的两个市场仍然能对齐。
保存图表
- 作为图片:图表的 PNG,与屏幕上完全一致,包括绘图和叠加层。
- 作为页面:一个可在任何浏览器中离线打开的 HTML 文件,包含图片、图片的内容(品种、窗口、时间框架、指标、对比、K 线由谁提供),以及嵌入的K 线本身。粘贴进文档的截图是没人能事后核对的说法;这个则可以被重新阅读。不会上传任何内容:文件在你的浏览器中构建。
图表上的自定义指标
指标对话框有第二个标签页:Custom。它保存的是 Backtest 模块所构建的同一个节点图库,所以一个指标只存在一次,两个模块看到的是同一个定义。从列表中选一个即可绘制,或者就在这里用同一个构建器新建一个;保存会把它写回共用库。
与目录指标不同,自定义指标自己选择窗格:在价格上,或在自己的窗格中。这个选择按实例由你决定,所以同一个指标可以在一个图表上叠加在K线上,在另一个图表上位于其下方。作为叠加层绘制的 0-100 指标会得到一个隐藏的第二刻度,所以它不会把价格压扁。
定义随实例一起携带:即使库中的行被删除,图表仍会绘制它的自定义指标,重新加载时只要该行存在,就会从库中刷新它。
绘图工具
图表左边缘的一条竖栏:趋势线、水平线和垂直线、矩形、斐波那契回撤、文本、多头和空头头寸框(入场、目标和止损,附带得出的盈亏比 R:R),以及报告价格变化、百分比、K 线数量和经过时间的测量工具。
- 每个对象都有自己的样式(颜色、宽度、虚线),通过拖动其手柄来编辑。
- OHLC 磁吸会把手柄吸附到其下方K线的开盘价、最高价、最低价或收盘价,放在图表上已有对象附近的手柄会吸附到它上面,并有一条引导线说明吸附到了什么。
- 样式模板:给一个对象设置样式,以名称保存,再应用到接下来的对象上。一个模板可以被设为每个新绘图的默认值。
- 图表之间复制:Ctrl/⌘+C 然后 Ctrl/⌘+V 粘贴所选对象,也可以粘贴到另一个品种;Ctrl/⌘+D 原地复制,偏移一根 K 线。
- 绘图锚定在时间和价格上,而不是像素上,所以无论缩放、平移还是更改时间框架,它们都停留在各自的 K 线上。
- 它们按品种保存,而不是按时间框架,也不是按窗格:在 1h 上画的趋势线与 15m 上是同一条线,同一代码上的两个窗格显示同一块画板。
- 撤销(竖栏的按钮,或 Ctrl/⌘+Z)取消最后一个绘图,或最后一个快速 backtest 订单。
对象列表
超过五个绘图后,图表就需要一个列表,所以有这样一个列表:这个品种上的每个对象,包括它是什么、位于什么价格,以及随后需要的四个操作:隐藏、锁定、删除和重新排序。顺序就是绘制顺序,决定了谁在上面。选中一行就会在图表上选中它,而列表与图表所绘制的是同一个数组,所以编辑在对话框关闭之前就会显示出来。
警报
价格或指标水平,由服务器监视。浏览器可以关闭,机器可以在做别的事:警报照样会触发,进入你的通知,以及该图表被授予的渠道(一个都不勾选 = 所有渠道)。
从警报对话框设置,或从你已绘制的水平线设置,它会交出自己的价格。
有三条规则值得了解,因为它们是决策而不是细节:
- **仅限已收盘的 K 线。**正在形成的K线的最高价还不是事实,下一个 tick 可能会修改它。基于它触发的警报会报告从未发生的事情。
- 是穿越,而不是状态。Crosses above 等待价格向上穿过该水平,所以放在当前价格之下的警报不会在你创建它的瞬间触发。
- 水平按此图表的时间框架读取,日线警报被重新读取的频率远低于一分钟线警报:未存储的品种每次检查花费一次小请求,而一天只动一次的 K 线不值得每分钟一次。
每个警报可以触发一次或每次都触发,并带冷却时间。列表会说明每个警报上次触发的时间、上次读取的内容,以及当 connector 或额度妨碍时,它为何根本无法运行。警报在该列表中暂停和重新启用。
Broker 账本
同步一个 broker 账户,图表就会绘制你实际持有的东西:每个未平仓头寸在其平均成本处一条价格线,每个挂单在其限价或止损处一条。价位会落在代码匹配的图表上(忽略标点),所以包含多个品种的工作区会自行标注。只读,并且只有在你按下 Sync 时才重新读取:没有平均成本的头寸不会得到线,并会如实计数,而不是被放在某个看似合理的地方。
快速 backtest
手动交易图表的草稿板:点击图表开仓,再次点击平仓。改为长按可选择方向和仓位大小,点击标记的箭头可翻转。加仓、部分平仓和反转都源于你下的成交。
会话跨越整个工作区,而不是单个图表:屏幕上的每个图表都把它的成交记入其中,数字是它们的总和,这正是包含多个品种的账本的实际读法。面板中的选择器指明目标图表,即点击时下单的那个、仓位框编辑的那个;它就是活动窗格,所以在这里选择和在那里点击是同一个动作。
工作区下面的条带在折叠时是一行会话数字。展开时可通过其上边缘调整大小,并有三个标签页:
- Trades:会话的交易列表,包含入场、出场、盈亏和 R(以该交易最差的未平仓亏损衡量,因为没有止损可引用),外加重置。
- Statistics:胜率、期望值、盈亏比、按方向的结果、连续记录和收益分布。
- Performance:会话的盈亏曲线,每笔交易带有其浮盈高点和最差的未平仓亏损,所以全天处于水下的盈利交易读起来就是这样。
仓位大小以单位、合约(乘以点值)或名义价值输入,并按成交价换算。这些成交保存在你的浏览器中,按品种:它是阅读图表的草稿板,绝不是 journal 数据,也不会向 Trading Journal 提交任何内容。
Backtest 按钮会把同一个品种交给 Backtest 模块,如果它尚未存储,会先保存。
图表会记住你离开的位置
图表类型、指标和绘图属于品种,而不属于数据集,也不属于窗格:它们在每次编辑后不久以该代码自己的坐标保存在服务端,并以同样的方式出现在任何窗格、任何工作区、任何浏览器中。对于你只看过一次、从未下载过的代码也是如此,这正是重点:绘制一个你尚未决定保留的东西,不再意味着失去你在上面画的内容。
不存储在服务端的是快速 backtest 会话,它保留在这个浏览器中。
图表设置中的自动保存数据开关是一个独立的决定,针对的是K线而不是布局:它在你第一次绘制品种时存储该品种,从而排队一个下载。默认关闭。
数据缺失时
返回不足的窗口总会在图表上方的提示中说明原因,同时保留已到达的 K 线:
| 原因 | 发生了什么 |
|---|---|
| auth | connector 的凭据缺失或被拒绝。 |
| quota | connector 触及了自己的请求限额。 |
| rate_limit | 服务商对请求限流。 |
| symbol | 服务商不认识这个代码。 |
| depth | 服务商不提供该时间框架下这么久远的历史。 |
| provider | 服务商返回的其他任何内容。 |
Backtest
*组合指标信号,用加仓调整仓位,衡量优势。*选一个数据集或整个投资组合,定义规则,运行。无需代码。
策略
- 每个方向的入场 / 出场规则,由指标、价格和固定值之间的比较构建。用 AND(全部成立)或 OR(任一成立即可)对规则分组。
- 方向:做多、做空或双向。选项:把空头一侧推导为多头的镜像(反转运算符,镜像振荡器水平:RSI 低于 30 变为 RSI 高于 70;ADX、ATR 和成交量过滤器保持不变),以及止损反向(相反信号触发时翻转头寸)。
- 每个方向的止损 / 止盈:每个都是可独立开关的复选框(占平均入场价的百分比,或入场前最后一根已收盘K线的 ATR 的倍数)。没有出场规则时,出场通过 SL/TP 或反转发生。
仓位、账户与成本
- 按权益百分比或固定数量/手数/合约数确定仓位,带有杠杆和初始资金。固定数量遵循零售惯例随杠杆缩放,所以杠杆 3 配固定仓位 1 会开 3 个单位。
- 加仓:当入场信号再次触发时,最多允许 N 个叠加的入场;SL/TP 随后跟踪平均入场价。加仓在开盘时发出,先于该 K 线的测试:随后触及止损的 K 线会平掉由该次加仓形成的头寸,而被该次加仓移动的止损(保本)会在同一根 K 线上测试。
- 成本:手续费(固定或名义价值的百分比,按交易或按单位)和点差 %,这样结果不是幻想。手续费可以为负,用于 maker 返佣或按成交付款的 broker。入场手续费在成交时从现金中扣除,就像 broker 扣款那样,所以未平仓头寸的权益、回撤和加仓都已扣除它。
- 没有意义的设置(没有资金、仓位或杠杆为零或更低、价值为零的合约、无法交易的网格)会在运行前被拒绝,含有一根不合法的 K 线(最高价低于最低价、价格不是数字)的数据集同样被拒绝,并点名那根 K 线。
仓位(高级)
除权益百分比和固定数量之外:
- 每笔交易风险:确定仓位,使触发止损的代价为权益的固定 %(需要所交易方向上有止损)。
- 分数 Kelly:根据策略最近 N 笔信号交易的胜率和赔率确定仓位,包括被跳过的(持平交易既不算盈利也不算亏损),按你选择的分数缩放并设上限;窗口填满之前使用预热仓位。亏损阶段会暂停入场,但不会永久停止:优势恢复后它们会恢复。
- 权益档位:阈值表;水平不高于当前权益的最高档位决定仓位。
投资组合(多资产)
添加多个数据集,在合并时钟上对它们全部运行一个策略(全部锁定在相同时间框架):
- 对齐预览显示合并时钟的长度、重叠窗口、指标预热 K 线(包括链式自定义指标的累计回溯),以及每个资产缺失的 K 线,全部在你模拟之前。
- 投资组合限制:限制未平仓头寸的数量以及总敞口 / 每个资产的敞口。开盘时持有的头寸即使稍后在该 K 线内平仓,仍保留它在那里的名额。
- 交易时段:K 线在不同时间开盘的资产(加密货币的一天在 00:00 UTC,纽约的在 13:30)按此顺序行动。较早开盘时的订单,其仓位和限制检查使用较晚资产的前收盘价,而不是尚未发生的开盘价。
- 按资产明细报告每个品种的交易、净盈亏、手续费、胜率和敞口。
网格策略
在下限和上限之间的一组价格档位;每个格子低买,在上一档卖出,做多、做空或中性。每档固定数量,或把总预算分摊到各格,可选地在网格上方/下方设止损。结果报告成交、往返交易和期末库存。
- 中性在中心线两侧都交易:其下的格子买入并在上一档卖出,其上的格子做空并在下一档买回。它需要奇数个档位。
- 买单只放在最新收盘价下方的线上(卖单在其上方),并在该线成交,或在 K 线开盘越过它时按开盘价成交。目标以同样方式成交。
- 网格上方或下方的止损在其水平成交(跳空时按开盘价),排在价格走向它途中碰到的成交之后,然后停止网格。
- 没有边界时,网格跨越迄今所知的区间:每根 K 线之前各 K 线的最低低点和最高高点。
- 在交易窗口之外选择 close 时,库存在开盘时、该 K 线内其他一切之前被平掉。
DCA(储蓄计划)
信号规则和网格之外的第三种模式,针对大多数资金实际的投资方式:一个加权篮子,随时间买入,从不再平衡。
- **权重固定。**投入的每一欧元按你为每个代码设定的权重拆分。不做再平衡,所以在五个资产中的一个上触发的规则,只会投入该资产自己的份额。
- 资金流入。初始资金在每个资产的第一根 K 线一次性买入。此后的一切都是新资金:周期性投入(按 K 线、日、周、月、季或年,到账即投资或作为现金保留),以及条件成立时投入一笔金额的买入规则。
- 买入规则:固定金额,现金、投资组合或成本基础的百分比,带最大触发次数和冷却时间,按下一根 K 线的开盘价成交。
- 卖出规则:头寸的百分比、整个头寸、若干单位或一个金额,由收益目标、条件或两者触发,所得资金保留为现金或取出。
- 条件是引擎的普通规则组,加上为此模式编写的两类:市场指标(相对高点的回落、相对低点的上涨、N 根 K 线的变化、自起点以来的变化)和实时头寸(盈亏 %、自上次买入以来的偏离、平均成本、单位数、价值、权重 %、现金 %、回撤)。默认在加权篮子指数上求值,或按资产求值,此时只买入满足条件的资产。
- 针对储蓄计划的度量,而不是针对策略:在**经存入调整(时间加权)**的曲线上计算回撤和 Sharpe,所以存入不会被当作上涨;对投入资金的收益率;IRR 作为资金加权收益;以及一个基准,即相同的总投入在起点一次性投入。
仓位、加仓和止损在这里不适用:计划自己的规则决定每一笔成交。
交易窗口
Filters 步骤决定策略何时可以开仓,按你选择的时钟:命名时区(America/New_York),遵循夏令时,或固定的 UTC 偏移,不遵循夏令时:
- 工作日和交易时段(每天可以有多个,结束早于开始则跨过午夜)。
- 日历:只在给定日期交易,或绝不在这些日期交易。Never 优先于 only。
- 窗口之外,头寸要么保留,要么平仓,加仓也可以被阻止。入场受到限制;出场、止损和止盈在每根 K 线上继续运行。
成本与执行真实性
- 滑点:固定的 tick 数或价格的百分比,应用于每笔成交。
- 资金费率:对未平仓名义价值按恒定年化利率计算,用于永续合约估算(多头支付,空头收取)。
- 熔断:在达到最大单日亏损(当日)或最大回撤(整个运行)后停止交易。
- 品种配置:价格最小变动单位、手数步长、最小数量和合约乘数,使仓位和价格贴合实际合约。每笔成交以及每个止损、目标、限价和网格线都会按不利于交易者的方向取整到最小变动单位:买入支付高一个 tick 的价格,多头的止损低一个 tick。
订单执行
止损和目标如何成交,始终如此:
- 交易会在其开仓的那根 K 线上对照其止损和止盈测试,而不是从下一根开始。
- 止盈是限价单:当成交的一侧触及目标时(多头为买价,空头为卖价)按目标价成交,不收滑点和点差;或者如果你选择的话,仅当价格穿过目标时成交(高级,Execution)。开盘就越过目标的 K 线会在该开盘价成交,先于该 K 线内的任何其他事情。
- 止损是止损单:按止损价成交,或在 K 线跳空越过时按开盘价成交,并支付点差和滑点。
- 当一根 K 线同时触及止损和目标,而没有其他信息说明哪个先到时,止损优先。
- 在 K 线内平仓的交易(止损、目标、限价)不会在该 K 线的开盘价重新开仓,那是退出之前的价格:新的入场要等下一根 K 线。
- 每个在收盘时做出的信号都在下一个开盘执行:入场、出场条件,以及入场条件不再成立时出场。没有任何东西在产生其自身决策的收盘价成交。
- MAE 和 MFE 只计算交易所经历的部分:从成交到出场,绝不包括它离开后该 K 线的剩余部分。
Advanced 步骤(Execution)中的选项,默认全部关闭:
- 入场订单:市价,或限价。限价单在买入时放在参考价下方,卖出时放在其上方,相对于信号 K 线的收盘价或下一根 K 线的开盘价有一个偏移(百分比、价格距离或 ATR 倍数)。它在你设定的 K 线数量内保持有效,在触及时成交,或仅当价格穿过时成交,并以自己的价格成交且无滑点(K 线开盘越过它时按开盘价)。持续成立的信号不会移动挂着的订单。加仓遵循同样的规则。
- 出场订单:信号出场(出场条件,以及入场条件不再成立时出场)的同样选择。未能及时成交的出场限价单要么在下一个开盘转为市价,要么被取消。止损反向仍是市价翻转。
- 用更低时间框架检查 SL/TP:当一根 K 线同时触及止损和目标,或限价单在 K 线中途成交时,运行会在仅那根 K 线内读取同一品种(同一服务商)的更低时间框架,以查看哪个先发生。它首先读取该时间框架已存储的数据集,然后是先前运行下载的 K 线,这些会被保留供以后运行使用。Auto 取已存储的最细时间框架,否则取服务商在每根 K 线一次请求内所能提供的最细时间框架。与该 K 线不匹配(极值不同)的更低时间框架 K 线不会被使用。
- 下载缺失的更低时间框架 K 线:使用此选项,运行需要而未持有的 K 线会从服务商下载,并且只下载这些。运行之后,一条提示会说明有多少根 K 线因缺少它们而被判定为止损,附带成本(请求数和时间)和一个获取它们的复选框。约 4 分钟以内的下载会在进度窗口中自动开始;更长的则等待你,并显示服务商的速率限制及其 connector 上剩余的额度,因为余量不足时可能失败。随后运行会用下载的 K 线重放。当服务商拒绝(没有该数据的权限或订阅、密钥、速率限制)或连续三次失败时,运行会停止向它请求,并在结果旁边说明。启用该选项的模拟交易会话,在需要时会下载刚刚收盘的 K 线之下的 K 线,并稍等片刻让服务商发布;没有该选项,或它们始终没有到来时,止损优先。
- 使用买价/卖价:成交读取买价和卖价,而不是中间价与点差(市价买入支付卖价,多头的止损和目标在买价上触发)。它们只为可能发生成交的 K 线从服务商获取,采用其提供的最简便方式(见下表),并保留供以后运行使用。简短的获取会在运行后自动开始,较长的会先询问,进度窗口与更低时间框架相同。没有买卖价的 K 线使用点差,结果会说明有多少根如此。没有历史买卖价的服务商会让该选项保持关闭并说明原因。
- 单独的 maker 手续费(在 Costs 块中):限价成交(入场和出场限价、止盈)支付它们自己的手续费,返佣则为负。
- 原始价格:股票和 ETF 在服务商提供时按经拆股和分红调整后的 K 线定价(Yahoo、EODHD、Alpaca;Interactive Brokers 的 K 线是经拆股调整的)。勾选此项可按实际成交的价格运行。没有调整后序列的股票数据集会在结果旁标出。
结果会显示已下达、已成交和已过期的限价单、有多少根 K 线同时触及止损和目标以及它们如何被判定(更低时间框架或最坏情况),以及有多少成交按买价/卖价定价。
各服务商的买价/卖价与实时价格
| 服务商 | 历史买价/卖价(backtest) | 实时价格(模拟交易的止损、目标、限价) | 实时买价/卖价(模拟交易成交) |
|---|---|---|---|
| Capital.com | 买价和卖价 K 线 | 是 | 是 |
| OANDA | 买价和卖价 K 线 | 否,在 K 线收盘时检查 | 不使用 |
| Interactive Brokers | 买价和卖价 K 线序列 | 是 | 是 |
| FOREX.com | 买价和卖价 K 线 | 否,在 K 线收盘时检查 | 不使用 |
| Alpaca | K 线开盘和收盘时的报价(股票、ETF、加密货币) | 是 | 是 |
| Massive | K 线开盘和收盘时的报价(股票、ETF、期权、外汇) | 是 | 是 |
| Binance, Binance Futures, Kraken, OKX, Bitget, Coinbase | 无,使用点差 | 是 | 是 |
| TradeStation, Yahoo, EODHD, Alpha Vantage | 无,使用点差 | 否,在 K 线收盘时检查 | 不使用 |
当报价在开盘和收盘时读取时,K 线内部的点差是它们围绕 K 线自身最高价和最低价的平均值。
基于实时价格的模拟交易
模拟交易会话在已收盘的 K 线上按其时间框架读取信号,并在其间根据实时价格监视其价位:
- 止损、止盈和限价单(入场和出场)在触及它们的第一个实时价格上触发,无需等待 K 线收盘。移动止损仍在每次收盘时移动,实时价格按当时设定的价位触发它。
- 策略使用买价/卖价时,成交按实时买价/卖价定价,否则按实时价格加上设置中的点差和滑点定价。它会立即发出警报,下一次运行会在其 K 线上重放它,与实际发生时一致,不会发出第二次警报。
- 没有该品种实时价格的服务商会在会话对话框中点名:在那里,止损、目标和限价在 K 线收盘时检查。如果实时数据源停止,或应用离线,则 K 线重新接管,会话日志会说明这一点。
- 入场在给出其信号的收盘时发出警报。市价单以该收盘价宣布,附带其仓位(按该收盘时标记的权益计算)以及用于按名义金额下单、可使用小数单位的 broker 的金额,然后在下一个开盘成交:服务商流式传输价格时按第一个实时价格成交(其止损和目标随后从该成交起被实时监视),否则在该 K 线收盘后按其开盘价成交。价格会更新而不发出第二次警报。限价单在下达时宣布(Triggering limit order),其成交在发生时发出警报。
- 实时成交的限价入场,其止损和目标要从下一次运行才获得;在此之前,该头寸在 K 线收盘时受到保护。
模拟交易运行的是与 backtest 相同的引擎,选项也相同:开启 Download missing lower-timeframe candles 或买价/卖价后,运行会获取刚刚收盘的 K 线所需的内容,并稍等片刻让服务商发布。会话行会列出它正在挂着的限价单。
策略与自定义指标
- 命名策略:保存、搜索、复制和编辑完整的策略配置。
- 策略版本(可选启用):在设置 → 版本管理中开启版本管理后,已保存的策略可以从标题栏的历史菜单进行版本管理。保存一个版本(带日期和可选备注),回顾每一步所说的内容,恢复它(恢复后的状态会保存为一个新版本,备注为被恢复版本的日期,并保留其名称)或删除它。历史记录在一个窗口中打开,可搜索备注和日期;与当前策略匹配的版本会被标记。备注上限 500 个字符。未保存的编辑会在取版本之前先保存。为某个策略关闭版本管理时,会询问是保留还是删除其版本。删除带版本的策略时,会询问是否保留它们;保留的版本可从 Strategies 标签页中的带版本的已删除策略恢复它。拥有 Backtest 写入权限的 agent 可以通过 MCP 做同样的事,每次更新后像 commit 一样保存一个版本。
- 自定义指标:用命名的步骤构建你自己的指标,无需代码。每个步骤要么对来源(价格字段或前一个步骤的输出)应用内置指标,要么计算按名称引用前面步骤的公式(
@volume / SMA(@volume),支持+ − × ÷、min、max、abs、clamp)。这让你可以链式组合指标:RSI 的 Hull MA、RSI 的 MACD、平滑的成交量比率,等等。读取完整K线的指标(ATR、Stochastic、ADX、VWAP…)只适用于价格,而不适用于派生步骤。高亮的步骤是输出。自定义指标会与内置指标一起成为规则编辑器中的操作数,且该库与图表共用,图表绘制的是同一个定义(图表上的自定义指标)。 - 可搜索的指标选择器:从分组的、可输入过滤的列表中选择指标(规则编辑器和自定义指标构建器中都是如此),而不是滚动一个很长的下拉菜单。
日期窗口和参数扫描(API)
有两项能力位于 API 而不是表单中。它们面向助手,以及任何通过 MCP 驱动应用的人:
- **按日期窗口运行。**运行(以及对齐预览)上的
from/to会限制模拟的时间跨度,这正是滚动前向验证和行情状态切片所需要的:运行 2019–2021,然后 2022–2024,再对比。to包含整天。 POST /api/backtest/sweep:在服务端运行参数网格,并取回每一次试验以及试验次数。网格路径可以深入数组(long.entry.conditions.0.left.period),因此指标周期是可以扫描的;上限为 4 个轴和 64 次试验。
参数扫描还会返回去偏 Sharpe:考虑到这些具体试验的变化幅度,N 个毫无价值的策略中最好的那个预期能达到的 Sharpe。请将胜出者与这条线比较,而不是与零比较:在真实的日线上,八个均线交叉中最好的得分为 0.59,而选择门槛为 0.70,意味着没有优势的证据,而单看最大值是会掩盖这一点的。
它还会返回网格的 backtest 过拟合概率(PBO):试验的权益曲线被切成 16 块,每一半分别用作一次样本内和一次样本外的集合,PBO 是样本内胜出者在样本外排名处于后半的拆分所占的比例。Quant 的 Compare 标签页在已保存的运行上计算同样的数字。
优化器
取一次已完成的运行并改变它的参数:每个方向的指标长度和阈值、止损、仓位、成本、投资组合限制、网格设置,以及要排除哪些工作日(每个子集都会尝试)。每个参数有起点 / 终点 / 步长,随着你放宽它们,标题栏会统计变体数量,并设有上限,使网格保持有限。
- 开始之前,它会根据过去的运行在你机器上测得的数据估算成本:每个变体的毫秒数、工作线程数、总时间。你可以随时停止并保留已计算的内容。
- 按你选择的指标排名(Sharpe、Sortino、收益、盈亏比、胜率、期望值、最大回撤、交易数);之后任何列都可以重新排序。使用样本外拆分时,每个排名数字都是样本内的,样本外收益会显示但绝不参与排名:依据它挑出的胜出者是见过它的。
- Analysis 显示所选指标在每个变体上的分布:最差、平均、最好,以及有多少为正。如果邻近的结果都很糟糕,单个好数字没有多大意义。
- 多重检验折扣:按数据实际每年拥有的 K 线数衡量(24/7 市场的小时 K 线大约是股票的五倍),最佳 Sharpe 会与选择门槛对照显示,即这么多个毫无价值的策略中最好的那个预期能达到的 Sharpe。低于该门槛,尝试这么多变体就足以解释胜出者。
- 点击一个变体可阅读它的完整 backtest,按它自己的设置重放。在你把它保留到历史记录之前,不会存储任何内容。
样本外拆分
把数据拆分为样本内的头部和样本外的尾部;策略在两者上都运行,两个统计块(收益、盈亏比、胜率、最大回撤、交易数)并排显示。两列之间的巨大差距是过拟合的迹象。
模拟交易
*一次已完成的运行,继续向前运行。*在结果上按 Paper trade,策略会继续按计划进行模拟交易,并向你选择的渠道发出警报。没有第二个引擎:每次运行都用普通 backtest 重新模拟该窗口并报告变化,所以模拟成交按构造就是 backtest 在相同 K 线上会显示的成交。
- 策略被冻结在其运行时的样子,包括品种。之后编辑该策略不会改变正在运行的会话;当你再次保存策略时,会话自己的表单会提供更新它或启动副本的选项。
- **第一次运行为账本播种。**窗口中已有的每个往返交易会一次性记录,汇总为单个事件:打开会话不会触发一连串关于历史的警报。只有此后发生的事情才是值得发消息的成交。
- 窗口:每次运行向引擎提供多少历史(尾随 K 线,或固定的起点)。
- Paper 标签页列出会话及其状态、下次运行、未平仓头寸和未读事件,每个都可以立即运行、暂停、恢复或删除。无论是否发送过任何东西,事件日志都会保留,所以无法送达的内容在你回来时仍然在那里。
计划
每次运行及其数据都遵循K线自己的时钟。
- 间隔(每 N 分钟)、每日、每周、每月或一次,使用真实的时区。
- 间隔在K线网格上触发,绝不在会话创建的那一秒:每分钟在 :00,每 15 分钟在 :00 / :15 / :30 / :45,每小时在整点。
- 运行会把它等待的 K 线下载到会话自己的数据集中。进行中的 K 线绝不会被存储:读取的是最后一根已收盘的,周线是从周一到下一个周一,日线则要在其时间戳之后过去整整一天才算(美国日线 K 线在 04:00 UTC 之后到达)。在周期结束之前存储的最后一根 K 线会被重新读取。服务商尚未发布的 K 线会在几秒内被再次请求,完全没有成交的周期则不写入任何内容,这仅仅意味着下一次运行没有新的东西可模拟。
- 没有发现新 K 线的运行不花费任何成本:它根本不模拟。
发送什么,发往哪里
- Notify:每次运行、仅在有新成交时,或从不。Every run 还会报告安静的运行,这是区分“什么都没发生”和“引擎已停止运行”的唯一方法。
- Group messages:立即发送,或每小时、每日或每周摘要。分组发送是一条关于某个时期的消息,而不是每笔成交一次提醒。
- Alert on 入场、出场或两者,并可选地仅针对你点名的品种。
- 渠道:授予 Backtest 的通知渠道,全部或你选择的几个。没有设置渠道时不发送任何内容,每个事件仍会记录在应用中。
自定义消息
三条消息,三种措辞,各有各的词汇:Entry、Exit 和 Summary(分组的那条)。留空某个字段则使用内置措辞。
- 每条都有标题和正文,用占位符编写:
{{trade.ticker}} {{trade.direction}} at {{trade.entry_price}}- Variables 恰好列出该消息可以读取的内容,并附带示例值;点击一个即可插入。入场读取交易的入场部分,出场读取整个交易(包括盈亏),摘要读取该时期、
since.*(自上次警报以来)、total.*(自会话开始以来)和open.*(此刻持有的内容),外加session.*、event.*和stats.*。消息无法读取的路径不会提供给它。 - 过滤器写作
| name:arg,而upper、lower、trim和json不带参数:
{{trade.pnl | round:2}} {{since.from | date:YYYY-MM-DD}} {{trade.exit_reason | default:-}}- Preview 是服务器自己的渲染器,所以它显示的就是将要发送的内容。它基于示例交易和会话的最新数字运行,所以会话尚未产生的值会就地用方括号标出,消息的其余部分仍会渲染。
结果
- 标题统计:收益(对比买入持有)、净盈亏和手续费、胜率、盈亏比、期望值、最大回撤、Sharpe/Sortino。
- 叠加在价格上并带入场/出场标记的权益曲线。
- 完整的绩效摘要(毛利润/亏损、盈亏比率、最大盈利/亏损、最大连续盈利/亏损、交易中的平均 K 线数…)以及完整的交易列表,每笔交易带 MAE/MFE(持仓期间最差的未平仓亏损 / 最佳的未平仓盈利),可过滤,并带出场原因(信号消退、出场信号、止损、止盈、反转、数据结束)。
- 按名称保存运行并保留历史记录,以便以后比较策略。已完成运行的 Reports 菜单会按方向和按资产整体导出:带有所有图表的 PDF,或仅含数字的 Markdown。两者都不含交易列表;文件以策略名称和导出时刻命名。
Quant Tools
针对你的数据集、已保存的 backtest 的分析,对于衍生品则直接来自服务商。标签页分为六组。
哪些标签页需要什么:
- Asset 和 Multi-asset 读取已存储的 Historical Data 数据集。
- Strategy 读取已保存的 Backtest 运行。
- Sizing 和 Calculators 接受你输入的数字(波动率目标还会读取数据集)。
- Derivatives 读取授予 Quant 的 Interactive Brokers 或 Massive connector。
Asset
一个数据集和一个时间窗口,由该组的每个标签页共用。
- Risk:年化历史波动率、最大回撤、你所设置置信度下的 Value at Risk 和 Conditional VaR。VaR 之外的尾部用三种方式估计(正态、Cornish-Fisher、对最差亏损的广义帕累托拟合)。表格列出最差的回撤,包括深度、日期,以及到达谷底和恢复所用的 K 线数,因为单个最大回撤数字掩盖了填平这个坑用了多久。
- Statistics:这是什么类型的序列。
- 与具有相同均值和波动率的正态分布对比的分布:偏度、超额峰度、QQ 图。
- 序列相关:收益和绝对收益的自相关,附带 Ljung-Box p 值。收益很少显示出自相关,绝对收益通常会:这就是波动率聚集。
- 趋势或均值回归:Hurst(R/S 和 DFA)、按期限的方差比,以及价格半衰期。
- 平稳性:ADF 和 KPSS,一并解读。
- Sharpe 比率是否能与运气区分:t 统计量、概率 Sharpe、最短业绩记录长度。
- Volatility:
- 同一批 K 线上的五种估计量。Close-to-close 只使用收盘价;Parkinson、Garman-Klass、Rogers-Satchell 和 Yang-Zhang 还读取K线的区间。
- 它们的滚动路径。
- 说明今天的读数相对其期限是高还是低的波动率锥。
- 带有持续性和冲击半衰期的 GARCH(1,1) 预测。
- Regimes:
- 高斯隐马尔可夫模型把收益拆分为 2 到 4 个状态,最平静的在前,并按最可能的状态为价格图着色。
- 每个状态的收益、波动率、停留时间和典型停留时长。
- 转移概率,以及市场当前最可能处于哪个状态。
- Events:选择一个条件(跳空、大幅收盘、SMA 或 RSI 交叉、新的 N 根 K 线高点或低点、连续、成交量激增),并查看市场随后做了什么。
- 多个期限的前向收益,对比同一批 K 线上的无条件基线,每个期限带 p 值。
- 事件前后的平均路径。
- Seasonality:
- 月 × 工作日的热力图,显示平均收益、波动率、K 线区间或成交量,外加按月、按工作日和(仅日内)按小时的条带。
- 每个单元格显示其样本数和胜率。小时时钟使用 UTC。
Multi-asset
两个或更多具有相同时间框架的数据集。
- Portfolio:相关矩阵、有效前沿(随机配置的点云;点击最大 Sharpe 或最小波动率点可读取其权重)和风险平价。
- Pairs:
- 协整(Engle-Granger,以及双向的 Johansen)以及带对冲比率、z 分数和半衰期的价差。
- 滚动相关性和 beta。
- 领先-滞后相关性和 Granger 因果关系,用于查看是否有一个序列先动。
- Basket:
- PCA:篮子实际持有多少个独立的赌注。
- 相关性树状图:谁一起移动。
- 层次风险平价配置。
- 1、3、6 和 12 个月的相对强弱表。
- 压力测试,让某个权重配置经历数据所涵盖的每一次过去的危机(2008、2020、2022 等)。
- Regression:
- 资产的收益对一个或多个因子数据集(指数、债券、黄金、行业)的回归。
- 带 t 统计量的 alpha、每个因子的 beta、R²、跟踪误差和信息比率。
- 上行/下行捕获率和滚动 beta。
混合资产类别没有问题,包括不同的服务商:K 线按它们所属的周期匹配,而不是按服务商给它们打的时间戳。加密货币日线 K 线在 00:00 UTC 开盘,美国股票的则在纽约交易时段开始时开盘,两者是同一天。由此产生两件事,面板会说明适用了哪一件:
- 混合了 24/7 市场与交易所时段市场的篮子按每周衡量。按日对齐的话,连续交易资产的周末走势会落在与另一个资产的周一同一行上,从而低估它们实际一起移动的程度。
- 年化是按时钟计数而不是假定的:同样的日线数据集在交易所是每年 252 个周期,在 24/7 市场是 365 个。
日内数据集是例外:锚定在交易时段的 4h K 线与锚定在时钟的 4h K 线相差 90 分钟,所以混合服务商的日内篮子会被拒绝,而不是近似处理。请使用日线数据集,或整个篮子使用同一个服务商。
Strategy
已保存的 backtest 运行。每次运行都在服务器上重放,以重新生成其确切的交易。
- Monte Carlo:对运行的交易重新抽样数千次(逐笔,或按块以保持连续记录在一起)。
- 权益路径、最终权益和最大回撤的百分位带。
- 以亏损结束的概率。
- 破产风险:权益曾跌到你设定阈值的路径所占的比例。
- 叠加绘制的真实权益曲线。
- Trades:交易按单位风险价值多少。
- 以货币和 R 计的期望值、R 倍数分布,以及 SQN(最多使用 100 笔交易,带 Van Tharp 的分级)。
- MAE/MFE 散点图:盈利交易承受了多少浮亏,亏损交易此前走了多远。
- 当运行有百分比止损时,1R 就是止损,否则是平均亏损,页面会说明是哪种。网格和 DCA 运行不记录 MAE/MFE,所以它们不显示散点图。
- Compare:2 到 20 次运行在其共同日期上的对比。
- 重新基准化的权益曲线、收益、波动率、Sharpe 和回撤的表格,以及它们收益的相关性。
- 最佳运行的去偏 Sharpe,其他运行算作它被挑选出来的试验。
- backtest 过拟合概率(PBO,通过 8 到 16 块的组合对称交叉验证)。PBO 高于 50% 意味着样本内胜出者通常落在样本外的后半部分。
Sizing
- Position size:根据你的资金、入场、止损和风险(百分比或固定金额),得出仓位、名义价值、保证金、敞口和盈亏比。它可以根据数据集建议止损(波动率、ATR、波段),并用最新收盘价填入入场价。
- Kelly:根据胜率和赔率得出的 Kelly 分数,附带半 Kelly 和四分之一 Kelly。全 Kelly 使长期增长最大化,但波动剧烈;大多数交易者按半或四分之一确定仓位。
- Vol targeting:
- 持有目标波动率 ÷ 资产的估计波动率,估计采用滚动或 EWMA,并受最大杠杆限制。
- 每根 K 线按其之前已知的估计确定仓位,因此没有前视偏差。
- 显示按你的权益现在应持有的权重和单位数,以及缩放后的轨迹与平放持有该资产的对比。
- Risk of ruin:胜率、赔率和每笔交易风险达到给定回撤的机会,每笔交易风险固定金额或固定比例。三种答案:
- 封闭形式:Vince,用于固定金额;Cramér-Lundberg 界,适用于任一种仓位方式。
- 在你设置的交易次数上的模拟,附带其标准误以及按交易次数的破产曲线。
Calculators
- Options:Black-Scholes-Merton 价格和希腊字母(vega 和 rho 按每点,theta 按每天)、用于美式行权并带提前行权溢价的二叉树,以及报价的隐含波动率。
- Futures basis:根据现货价格和期货价格,得出基差、它隐含的年化持有收益、隐含回购利率、按你的利率和收益率计算的公允价值,以及到下一个合约的展期收益。
- Compounding:
- 本金和每期收益会带来什么,附带投入。
- 达到目标所需的收益,以及需要多少个周期。
- 从回撤中爬回所需的涨幅。
- Sharpe test:针对没有附带数据而被引用的 Sharpe。
- 它能否与零或某个基准区分开?
- 需要多长的业绩记录?
- 计入尝试过的策略数量之后还剩下什么(带偏度和峰度的去偏 Sharpe)?
Derivatives
这些直接读取服务商而不是已存储的数据集,所以需要授予 Quant 的 Interactive Brokers 或 Massive connector。
一次运行是几十个服务商请求,由服务商控制节奏。页面显示已完成的请求数与计划数,以及正在获取的内容。获取的内容保留六小时,所以更改利率或展期规则时会重新计算,而无需再次询问服务商。
- Futures curve:一个产品的有到期日的合约(Interactive Brokers 为
ES@CME,Massive 为ES),包括已到期的。- 最后一个完成交易时段上的期限结构。
- 近月合约与下一个合约之间随时间变化的展期收益。
- 持有近月合约并展期的连续序列,按比率回溯调整使其终止于今天的价格,旁边是在每次展期处跳变的拼接序列。
- 展期是日历规则:近月合约是剩余天数多于 N 天的最近合约。
- 提供现货代码(例如作为指数的
SPX)时,它会添加基差、每年的持有收益ln(F/S)、隐含回购利率,以及相对于你输入的利率和收益率下公允价值的定价偏差。 - Massive 的曲线使用每个交易时段的结算价。
- IV surface:标的的期权链。
- 分布在你设置的最短和最长天数之间的若干到期日,每侧的价外行权价,每个价格被转换为 Black-Scholes-Merton 隐含波动率。
- 按到期日的波动率微笑、ATM 期限结构、25-delta 风险逆转和蝶式,以及检查 ATM 总方差不会在一个到期日到下一个到期日之间下降。
- Interactive Brokers 按最后一个小时中间价为每个期权定价,与标的取自同一小时,所以不需要期权行情数据订阅。Massive 按交易时段收盘价为每个定价。
- 页面会在你开始之前告诉你请求数:使用免费的 Massive 密钥(每分钟 5 次),一条期权链需要几分钟。
- Implied vs realized(仅限 Interactive Brokers):标的的 30 天隐含波动率,最多回溯十年,对比每一天前后的 close-to-close 波动率。
- 波动率溢价:IV 减去随后的波动率。
- 你选择的回溯期内的 IV rank 和百分位。
- IV 对已实现波动率的预测效果如何(随后的已实现波动率对 IV 的回归)。
- IV 变化与价格变动的相关性。