从零开始,手把手教你在浏览器里完成股票策略回测
easy-tdx 的回测系统需要两个软件配合:Python(负责算数据和回测)和 Node.js(负责显示网页界面)。这两个软件都是免费的,我们一步一步来。
打开浏览器,访问官网下载页:
https://www.python.org/downloads/
页面会自动推荐 Windows 版本,点黄色按钮 "Download Python 3.12.x"(3.12 是目前最稳定的版本)。如果推荐的是 3.13 也可以。
双击下载的安装包,看到第一个界面时,最下方有一个复选框 "Add python.exe to PATH",必须勾上!这是新手最容易漏的一步,漏了后面所有命令都跑不了。
勾上之后,点 "Install Now",等几分钟安装完成。
按键盘 Win + R,输入 cmd 回车,打开黑色命令行窗口。在里面输入:
python --version
如果显示 Python 3.12.x(数字无所谓,3.10 以上都行),就成功了。如果提示"不是内部或外部命令",说明上一步 PATH 没勾,请卸载重装一次。
访问官网:
https://nodejs.org/zh-cn
下载左边那个 "LTS"(长期支持版),不要下右边那个最新尝鲜版。LTS 更稳定,新手用它不会出怪问题。版本号一般是 20.x 或 22.x。
双击安装包,全部点"下一步",不用改任何选项,点"Install"等完成。
再次打开命令行(按 Win + R 输入 cmd),输入:
node --version
显示 v20.x.x 或更高版本就成功了。
easy-tdx 是一个开源项目,代码托管在 GitHub。我们需要把代码下载到本地,然后启动两个服务。
打开浏览器访问:
https://github.com/handsomejustin/easy_tdx
点页面右上角绿色的 "Code" 按钮,选 "Download ZIP"。下载后解压到 D 盘根目录,建议重命名为 easy_tdx,完整路径就是 D:\easy_tdx。
D:\easy_tdx 最稳。
按 Win + R,输入 cmd 回车。然后输入:
# 进入项目目录(根据你的实际路径调整)
D:
cd \easy_tdx
# 一次性安装项目本体和 Web 服务所需的所有 Python 依赖
# 包括 FastAPI、Uvicorn、pandas、numpy 等
pip install -e ".[web]"
这步会下载很多文件(约 100MB),需要等 3 到 5 分钟。看到最后有 Successfully installed ... 就成功了。
pip install -e ".[web]" -i https://pypi.tuna.tsinghua.edu.cn/simple
# 看到帮助信息就说明安装好了
easy-tdx --help
# 还在项目目录里,进入前端目录
cd web-ui
# 安装前端依赖(第一次会下载约 200MB,耐心等 5 分钟)
npm install
npm config set registry https://registry.npmmirror.com
npm install
这是新手最容易迷糊的地方:这个系统需要同时开两个命令行窗口,一个跑后端(算数据的厨房),一个跑前端(显示网页的服务员)。
按 Win + R 输入 cmd 回车,进入项目根目录:
D:
cd \easy_tdx
easy-tdx serve --port 8000
看到类似下面的输出就成功了:
INFO: Uvicorn running on http://0.0.0.0:8000
INFO: Application startup complete.
这个窗口不要关! 它一直开着,前端才能取到数据。
按 Win + R 输入 cmd 回车,进入前端目录:
D:
cd \easy_tdx\web-ui
npm run dev
看到这样的输出:
VITE v8.x.x ready in 500 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
打开 Chrome 或 Edge 浏览器,地址栏输入:
http://localhost:5173
看到顶部导航栏有"单标的回测 / 组合回测 / 参数寻优 / 结果对比 / 策略库"五个标签,就大功告成了!
easy-tdx serve --port 8000,一个跑 npm run dev,然后浏览器打开 http://localhost:5173 就行。
现在你已经打开了浏览器,进入"单标的回测"页面(就是首页 /)。我们用一只大家熟悉的股票演示:贵州茅台(SH:600519)。
整个页面分左右两栏:
我们从上到下填配置:
600519(贵州茅台)2020-01-06(默认值,不动)fast=5, slow=20 先跑新手默认值不用动:
等几秒,右侧依次出现四块东西:
先别急着看那一堆数字,先看图。
红三角密集的地方,说明策略在那里频繁买入。理想情况下,红三角(买入)应该出现在股价低点附近,绿钉(卖出)出现在高点附近。如果买卖点和股价走势明显相反,说明这个策略在这个股票上不灵。
如果净值曲线一路向右上方走,说明赚钱了。如果一路向下,或者大幅震荡,说明策略不行。同时观察下方的回撤填充:回撤越大,说明中途亏得越狠,套牢风险越大。
双均线策略的 fast 和 slow 用 5 和 20 不一定最好。让电脑把所有组合都试一遍,找出最赚钱的那一组,这就是"参数寻优"。
点顶部导航的 "参数寻优" 标签。
在"寻优参数"区,你会看到 fast 和 slow 两个参数。每个参数右边有个复选框。
5, 10, 15, 20, 25(逗号分隔)20, 30, 40, 50, 60下方会实时显示"网格点数 = 25"(5 × 5 = 25 种组合)。网格点数上限是 200,超过会被拒绝。
等几秒到几十秒(取决于网格点数),右侧出结果。
结果区有三块:
顶部显示评级徽章、最佳参数组合、总收益率、夏普、最大回撤。比如可能显示:
评级 [B] | {"fast": 10, "slow": 30} | 总收益 156% | 夏普 1.2 | 回撤 32%
一个颜色方格图,横轴是 fast,纵轴是 slow,颜色越红表示这个组合收益率越高。一眼能看出哪个区域好。
所有 25 种组合按总收益降序排列,每行有评级徽章 + 各项指标。点最右边的"查看"按钮,会跳回单标的回测页,自动用这个参数组合跑一遍完整回测,看 K 线和净值曲线。
页面上还有一个橙色按钮 "一键寻优所有策略"。点它,系统会用每个策略自带的预设参数网格,把所有 18 个内置策略都跑一遍寻优,然后给你一个全局排名。
这对不知道用哪个策略的新手特别有用:让电脑告诉你,这个股票上哪个策略历史表现最好。
一键寻优所有策略通常要跑 30 秒到几分钟(策略多、网格密就慢)。这段时间按钮文字会变成"一键寻优所有策略中…",右侧页面会出现一张名言卡片,每 3 秒随机轮播一条全球投资大师的话:
卡片顶部有一条橙色进度条循环填充,暗示"还在跑";底部有橙色脉动小点 + "后台寻优进行中,大师智慧伴你等待…"。等结果跑完,卡片自动消失,排名表正常显示。
寻优排名表按总收益降序排,第一名往往收益最高但回撤也最大、交易最频繁。这种策略通常是"碰巧"赶上了某段大行情,换个时段可能就崩了。
正确的做法:看评级徽章,挑 B 档或更高的,而不是挑收益最高的。
寻优排名表每行都有一个评级徽章(S/A/B/C/D)。这个评级综合了六个维度,帮你过滤掉那些"虚胖"的高收益策略。具体含义见第七章。
原则:
假设你看中了 fast=10, slow=30 这个组合(B 档)。验证步骤:
系统会用这个参数组合自动跑一遍完整回测,你能看到 K 线、净值曲线、成交明细。
好的策略净值曲线应该稳步向上,回撤浅,恢复快。如果净值像过山车一样大起大落,说明不稳定。
普通人能承受的最大回撤通常在 20% 到 30% 以内。如果你看到最大回撤 45%,意味着最坏的时候你的 100 万会跌到 55 万,你确定自己能扛住不割肉吗?
这是最关键的一步,但需要手动操作:
2023-01-01(只测最近两年),看收益和回撤是否稳定2020-01-06 至 2022-12-31(只测前三年),对比一下如果三个时段表现都不错,这个策略相对靠谱。如果只在某个时段特别猛,其他时段拉胯,那就是过拟合,实盘会原形毕露。
好不容易找到一个好策略,关机就丢了多可惜。easy-tdx 提供了"策略库"功能,把策略永久存在本地数据库里。
右上角有一个 "💾 保存策略" 按钮,点它。
看到"✓ 已保存到策略库"就成功了。数据存在 C:\Users\你的用户名\.easy_tdx\strategies.db(SQLite 文件,重启电脑不丢)。
点顶部导航的 "策略库" 标签。
页面顶部有两个 Tab,把策略分成两类:
每个 Tab 里,你会看到对应类型的卡片,每张卡片显示:
这是策略库最强大的功能。详见第十章。跑完之后还能把整个组合保存下来,下次一键看今日信号。
这是 v1.17.14 新增的功能,目的就是让普通人一眼判断"这个策略/品种适不适合经常参与"。
| 档位 | 颜色 | 含义 | 适合普通人? |
|---|---|---|---|
| S | 金色 | 长期持有体验优秀,回撤浅、胜率稳 | ✅ 推荐经常参与 |
| A | 绿色 | 风险可控,套牢后能较快回本 | ✅ 适合 |
| B | 蓝色 | 可参与但需择时,套牢回本有压力 | ⚠️ 谨慎参与 |
| C | 橙色 | 风险偏高,长期套牢风险大 | ⚠️ 不建议经常参与 |
| D | 红色 | 持有体验差,或系统亏损 | ❌ 别碰 |
有一只股票(京东方)用某策略回测,总收益率 126%,看起来很美。但仔细看:
系统给它评了 D 档。
为什么?因为普通人根本拿不住这种策略。它的高收益是靠少数几次大涨撑起来的,大部分时间在亏钱。等你熬不住割肉了,后面的大涨就和你无关了。这就是评级系统的价值:不被高收益迷惑,看穿持有体验的真相。
评级故意不看总收益率,只看风险调整后的持有体验:
| 维度 | 权重 | 通俗解释 |
|---|---|---|
| 卡玛比率 | 18% | 套牢后回本的难度,越高越容易回本 |
| 利润因子 | 18% | 赚的钱总和 vs 亏的钱总和的比值,大于 1 才不亏 |
| 最大回撤 | 17% | 从最高点跌多少,跌越深套越牢 |
| 胜率 | 17% | 100 笔交易里赢几笔,普通人拿不住低胜率 |
| 夏普比率 | 15% | 每承担 1 分风险换多少收益,通用指标 |
| 波动率 | 15% | 价格上下抖动的程度,抖得越狠心越慌 |
有些情况直接判低档,不管其他指标多好:
| 触发条件 | 结果 | 原因 |
|---|---|---|
| 利润因子 < 1 | 直接 D | 系统实际在亏钱 |
| 最大回撤 > 60% | 直接 D | 深度套牢几乎无法回本 |
| 最大回撤 > 50% | 最高 B | 套牢很难回本 |
| 胜率 < 30% 且交易够多 | 最高 C | 普通人拿不住 |
| 利润因子 < 1.2 | 最高 B | 系统勉强盈亏平衡 |
如果你看到评级徽章旁边有个橙色标签 "⚠ 交易样本有限",意思是这只股票/策略在回测期间交易笔数少于 10 笔。
系统不会因此否定整个评级(长线策略本来就交易少,但净值曲线很健康)。它的处理方式是:把胜率和利润因子的权重降到 0,只看基于净值曲线的指标(夏普/卡玛/回撤/波动率)。这种处理对长线策略是公平的。
你看到这个标签时,知道"胜率这个数字不太靠谱,但其他指标可信"就行。
回测结果区的绩效表分三组:收益、风险、交易。下面用大白话逐个解释。
从开始到结束,你的钱涨了多少。1.2643 表示涨了 126.43%。这是最容易看懂但最容易被骗的指标。
把总收益换算成"平均每年赚多少"。比如 6 年赚 100%,年化大约 12.2%。年化比总收益更公平,因为时间长短不同没法直接比。
每承担 1 分风险(波动)能换多少收益。一般认为:
夏普的升级版,只看"下跌的波动"(因为上涨的波动是好事)。同样越高越好,通常比夏普数值大一些。
这是套牢回本难度的最佳代理。卡玛越高,说明回撤越浅、收益越高,套牢后越容易回本。卡玛 > 1 算不错,> 2 算优秀。
最重要的风险指标。 从历史最高点跌到最低点的百分比。比如最大回撤 41%,意味着你曾经从 100 万跌到 59 万。
普通人能承受的极限:
从峰值跌到最深点经历了多少个交易日(bar)。数字越大,套牢时间越长。注意:这是"跌到最深"的时间,不是"跌下去再涨回来"的总时间。
价格上下波动的剧烈程度,年化后的标准差。< 15% 算平稳,> 30% 算剧烈。
整个回测期间买卖了多少次。少于 10 次说明样本不足(胜率不可信),多于 100 次说明交易太频繁(手续费会吃掉利润)。
赚的笔数和亏的笔数。两者加起来等于总交易数。
盈利次数 ÷ 总交易数。35% 意味着 100 笔里只赢了 35 笔。普通人 < 35% 会很难受。
总盈利金额 ÷ 总亏损金额(取绝对值)。< 1 表示亏 > 赚(系统亏损),1 到 1.5 算勉强,1.5 到 2 算健康,> 2 算优秀。
每笔赚钱交易平均赚多少,每笔亏钱交易平均亏多少。如果平均盈利 4%、平均亏损 2%,即使胜率只有 35%,整体也可能赚钱(因为赚的笔大,亏的笔小)。
最赚的一笔和最亏的一笔。如果最大亏损 > 10%,要警惕单笔爆雷风险。
每笔交易平均持有多久。< 5 天算短线,> 30 天算长线。这反映了策略的交易风格。
系统想下单但被拒绝的次数(通常是资金不足或持仓冲突)。正常应该是 0。
19 个指标太多记不住?新手抓住这 5 个就够了:
回测结果最下方是"成交记录"表,每一笔买卖都列出来了。这是你"跟单"的依据。
| 列 | 含义 |
|---|---|
| datetime(时间) | 这笔交易发生在哪一天 |
| direction(方向) | BUY = 买入,SELL = 卖出 |
| size(数量) | 买/卖了多少股 |
| price(价格) | 成交价(开盘价或收盘价,取决于你的设置) |
| commission(佣金) | 给券商的手续费 |
| slippage(滑点) | 成交价和理想价的偏差 |
| pnl(盈亏) | 这笔卖出对应的盈亏金额(只有卖出时有) |
| rejected(拒单) | false = 正常成交,true = 被拒绝 |
因为回测结束日期默认是"今天",最后一笔交易就是最近的信号。每天收盘后重新跑一次回测(日期范围保持到今天),观察最后一笔是否有变化(从 SELL 变 BUY 就是新买入信号)。
开始日期不变,结束日期保持今天。
即使策略说持有,也要给自己设一个止损线(比如亏 10% 就走),防止策略失效时深套。
单只股票风险太大,用多只股票组合可以分散风险。easy-tdx 提供两种组合方式。
点导航的 "组合回测" 标签。
在"标的列表"区,默认有 SZ:000001(平安银行)和 SH:600519(贵州茅台)。你可以增减,比如加:
SZ:000001 平安银行
SH:600519 贵州茅台
SH:600036 招商银行
SZ:000858 五粮液
下拉选"双均线交叉",参数用你寻优出来的最佳组合。所有股票用同一个策略。
日线,2020-01-06 至今。
系统把总资金平均分给每只股票(100 万 ÷ 4 = 每只 25 万),各自独立跑策略,然后净值曲线按日期对齐加总。
这是更强大的玩法:你在策略库里存了多个策略(比如茅台用双均线、招行用 MACD、五粮液用布林带),把它们组合起来。
每个策略在单标的回测页跑完后,点"保存策略"存进策略库。
每张卡片左上角有个复选框,勾选你想组合的多个策略(比如勾 3 个)。
N 是你勾选的数量。系统会:每个策略各拿 1/N 资金、各跑在它保存时的原标的(用最新行情)、净值曲线按日期对齐求和。
结果和组合回测页一样:组合净值曲线、19 项绩效指标、各策略对比表、各策略当前持仓表(这个特别有用:看回测结束时每个策略还持有多少钱,有没有套牢)。
举个简单例子:单只股票最大回撤可能是 40%,但 4 只不相关的股票组合在一起,最大回撤可能降到 25% 左右。因为它们不会同时跌到最低点,有的跌时有的涨,相互抵消。
但要注意:组合降低的是"非系统性风险"(单只股票暴雷),不能降低"系统性风险"(整个大盘崩盘)。2008 年、2015 年股灾时,所有股票一起跌,组合也救不了。
这是 v1.18.0 新加的能力。读完第十章你已经会勾选 N 个策略跑组合回测了,但跑完关机就丢,下次要重新勾选重新跑。更麻烦的是,你真正想知道的是"今天我该买哪个、该卖哪个",而不是"过去 6 年平均表现如何"。
本次更新把这两件事一次解决:把组合存下来,以后一键用今天重跑,直接得到"截至今天的持仓信号"。
前提:你已经在策略库的「单标的」Tab 勾选了多个策略(比如 4 个),点了"组合回测",结果区已经出来。
结果区标题"组合回测结果"右边,有一个橙色的 "💾 保存为组合" 按钮(不是结果区下方的"保存策略",那是单标的用的)。
弹窗里会写明:存的是各策略的 strategy+params+标的+资金配比,以及组合级绩效快照。
保存成功后,策略库页面切到「组合」Tab,会看到一张橙色边框的组合卡片,右上角带 🗂 图标,显示"4 策略 · 总收益 417%"。
这是本次更新最重要的功能。点组合卡片的 "↻ 重跑到今天" 橙色按钮:
系统会弹一个确认框,告诉你"将自动用今天作为结束日重跑 N 个策略",并提示策略信号是模型仓位,不是投资建议。点"确认"开始。
系统把组合里所有策略的结束日期全部覆盖为今天,然后用最新行情重新跑一遍组合回测。这一步可能要等 10 到 60 秒(取决于策略数和标的数),按钮文字会变成"重跑中…"。
跑完后页面自动滚动到结果区。重点看最下面的 "当前持仓"表,它显示的就是截至今天的策略信号(哪些该持有、哪些该空仓)。
当前持仓表的状态列,从原来的两态(持仓/空仓)升级成了三态,让你一眼分辨"该继续拿"还是"该警惕":
| 状态徽章 | 颜色 | 含义 | 你怎么应对 |
|---|---|---|---|
| 🟢 持有 | 绿底 | 策略说继续持有,且当前是浮盈 | 继续拿着,但别得意,设好止盈线 |
| 🟠 持有·浮亏 | 橙底 | 策略说继续持有,但当前浮亏 | 警惕!盯紧止损线,跌破就坚决走 |
| ⚪ 空仓·等买点 | 灰底,行半透明 | 策略说现在不该持有 | 观望,等下次出现"持有"信号再考虑 |
表里其他列也要看:
本次更新特意加了三处警示,因为"模型仓位"和"真实账户"是两回事,新手很容易混淆:
假设你保存了一个"4 策略组合",想每天看信号:
说明 Python 没装好或 PATH 没配置。回到第一章 1.1 重装 Python,务必勾选 "Add Python to PATH"。如果已装,在命令行输入 pip install -e ".[web]"(在项目目录下)重新安装。
Node.js 没装或没重启命令行。回到第一章 1.2 重装 Node.js,然后关闭所有 cmd 窗口重新打开。
网络问题。换淘宝镜像:
npm config set registry https://registry.npmmirror.com
然后重新 npm install。
检查两点:
easy-tdx serve --port 8000easy-tdx 需要连接通达信的行情服务器取数据。可能原因:
可以换个时间再试,或者用其他股票代码试试。
这是正常的。回测结果存在后端进程内存,重启就清空。重要的策略一定要点"保存策略"存进策略库,策略库的数据存在 SQLite 文件里,重启不丢。
这只股票/策略在回测期间交易笔数少于 10 笔。系统已经把胜率和利润因子的权重降到 0,只看净值类指标(夏普/卡玛/回撤)。长线策略常常这样,不一定是坏事。详见第七章 7.5 节。
参数取值组合太多。减少参数取值的数量,比如 fast 从 10 个值减到 5 个值,或者只寻优一个参数(不勾另一个)。
评级阈值是基于金融惯例校准的,可能在某些边界情况不完美。每个维度的打分逻辑在 web-ui/src/grading/thresholds.ts 文件里,如果你懂技术可以微调。或者截图给老师反馈。
在行情数据区的"周期"下拉里选 MIN_5(5 分钟)、WEEK(周线)等。注意:分钟线数据量很大,回测会慢很多,新手建议只用日线(DAY)。
请把这六个字刻在脑子里。以下是新手必须知道的真相:
寻优出来的"最佳参数"在历史数据上完美,可能只是巧合。验证方法见第五章 5.4 节(分段重跑)。
你现在能回测的股票都是"还活着"的股票。那些退市的、ST 的、破产的你回测不了。所以回测收益天然偏高。
回测假设你能以"开盘价"成交,但实盘中你可能买不到那个价。实盘的滑点和佣金也比回测设的高。
| 能帮你 | 不能帮你 |
|---|---|
| 验证一个策略在历史数据上是否有效 | 预测未来(未来不可预测) |
| 对比多个策略哪个更适合某只股票 | 告诉你哪只股票会涨(没人能知道) |
| 找到相对合理的参数区间 | 找到"绝对最佳"的参数(不存在) |
| 评估风险(最大回撤、波动率) | 消除风险(风险永远存在) |
| 建立纪律性的交易习惯 | 替代你自己的判断和止损 |
easy-tdx 给了你一把尺子,让你不再凭感觉炒股。但尺子本身不会替你赚钱,赚钱靠的是纪律和耐心。
用这个工具找到 1 到 2 个你理解、能拿住的策略,严格执行,长期坚持。这比追逐"收益最高的策略"重要 100 倍。
市场永远在变,工具会迭代,策略会失效。不变的是:不懂不投、分散风险、严格止损、长期主义。
祝你在市场里活得更久,走得更远。