前阵子一个做实体生意的朋友问我:他想对比亚迪做一次量化分析,验证一下这只票该怎么买,但他连 Python 都没装过,更别提写完整回测代码了。搁以前,我的答案很直接:要么去学,要么花钱请人写。但这次我让他用 WorkBuddy 试了一把,结果他愣是靠自己把一套多策略回测跑通了。这件事给我的触动挺大——量化分析的门槛正在从“会不会写完整回测代码”悄悄转向“能不能把策略逻辑讲清楚”。这篇文章我就以比亚迪 002594 的多策略回测为例,完整拆解我用 WorkBuddy 做量化分析的全过程。适合完全不会写回测代码、但想验证交易思路的人,也适合会一点 Python 但不想每次从零搭框架的量化爱好者。整个过程不需要你手敲完整代码,但你得知道自己在测什么。
我用 WorkBuddy 跑完这批回测之后最大的感受是:工具负责把“想法”翻译成“代码”,而你必须负责把“模糊想法”变成“可执行规则”。WorkBuddy 解决的是代码实现问题,不是策略设计问题。如果你能说清楚“什么时候买、什么时候卖、买多少、费用怎么算”,剩下的事它可以接手。下面我把整个流程从环境搭建、数据接入、策略定义,到结果解读和排坑经验,一条条拆开讲。
1. 为什么 WorkBuddy 能把我从回测代码里解放出来
1.1 它不是一个聊天机器人,而是一个能动手干活的智能体
很多人第一次接触 WorkBuddy,以为它就是个带知识库的问答工具,问一句答一句。实际上我更愿意把它理解成一个“智能体工作台”:它能把一个大任务拆成多个小步骤,然后调用数据接口、生成代码、在沙箱里执行、把结果整理成表格或文本返回给你。也就是说,它不是一个只会说话的助手,而是一个能动手干活的“数字员工”。
拿回测这个场景来说,WorkBuddy 要跑通一次完整的多策略回测,至少需要完成这些事:拉取行情数据、检查数据质量、根据策略描述生成回测代码、设置交易成本模型、执行回测、计算绩效指标、输出对比结果。这在过去是一条完整的工程链路,现在通过自然语言指令就可以串起来。当然,这不是说它不需要配置,而是说配置的复杂度从“写代码”降到了“做选择”。
我用的 WorkBuddy 支持自定义指令、Skill 扩展、本地部署,也支持通过连接器接入外部数据源。这些能力组合在一起,才让“不懂代码的人做回测”变成了可能。如果你手里的版本功能入口名称不一样,不用纠结,核心逻辑是通的:先给它一个跑回测的工作区,再把数据和策略规则告诉它,剩下的交给它执行。
1.2 不懂代码的人缺的是框架,不是策略
我观察到一个很有意思的现象:很多人觉得自己“不会写完整回测代码”就等于“做不了量化分析”,但真让他们讲讲想测什么策略,反而说得头头是道。比如“跌到 30 日均线以下就止损”“突破 20 日高点就买入”“涨太多了就分批卖”,这些其实都是策略雏形。你缺的从来不是交易想法,而是把想法变成回测工程的那套框架。
一套完整的回测代码框架,通常包含数据获取、复权处理、交易成本建模、信号生成、持仓更新、绩效统计、可视化输出这几大块。对新手来说,最劝退的是前面那些“脏活累活”:数据要清洗、复权要一致、日期要对齐、手续费和滑点都不能漏。这些问题和“策略有没有道理”没有关系,纯粹是工程门槛。
WorkBuddy 的价值在于,它把框架封装成了可复用的 Skill。你可以不关心 DataFrame 怎么拼接、循环怎么写,只需要告诉它“策略规则是什么、测哪只票、用多久的数据”。它会在底层调用那个回测 Skill,把框架搭好,再把你描述的策略填进去。这就好比开手动挡车和开自动挡车的区别:你还是要会看路、打方向盘,但不用再纠结什么时候踩离合换挡。
1.3 为什么拿比亚迪当试验田
我选择比亚迪 002594 做例子,不是因为我看好或看空这只票,而是因为它的历史行情非常适合检验策略。2020 到 2024 这五年,比亚迪经历了明显的上升趋势期、高位震荡期和深度回撤期。这种“行情风格切换明显”的标的,最能看出一个策略是吃趋势、吃震荡还是吃波动率的饭。如果只选一只匀速上涨的票做回测,任何多头策略都会显得很厉害,那没有参考价值。
另外,A 股数据源对这只热门票的覆盖度很高,历史日线、前复权数据都容易获取,复现起来也方便。需要先说明的是,我在下文里给出的所有回测数字,都是我在本地用 WorkBuddy 跑出来的示例结果,用来演示方法,不代表真实收益,也不构成任何投资建议。历史回测最大的意义是帮你理解策略的脾气,而不是给你一张未来的成绩单。
2. 搭一个能跑回测的 WorkBuddy 环境:数据、模型与 Skill 三层
2.1 我用的组件配置
在正式开始之前,得先让 WorkBuddy“手里有粮”。我用下来,一套能跑通回测的最小环境由这几块组成:
| 组件 | 作用 | 我的建议 |
|---|---|---|
| WorkBuddy 客户端 | 提供对话和任务执行界面 | 网页版和桌面端都行,本地部署更可控 |
| 大模型推理 | 理解指令、生成代码、分析结果 | 云端模型省事,敏感数据用本地模型 |
| 数据连接器 | 获取行情数据 | AkShare、Tushare、Baostock 三选一 |
| 回测 Skill | 封装回测框架和绩效计算 | 内置 Skill 没有的话,用一次对话也能生成 |
| 工作区目录 | 存放数据和脚本 | 单独建一个文件夹,方便 WorkBuddy 读写 |
我不建议一上来就追求复杂配置。最简路径是:打开 WorkBuddy,建一个工作区,数据源选 AkShare,回测 Skill 选内置的默认版本,模型用默认的云端推理,直接开始跑。等跑通一个简单策略之后,再根据需求换数据源、改参数、调模型。
这里有个容易被忽略的点:WorkBuddy 有没有“执行代码”的能力,决定了它能不能真正跑回测。如果只是一个纯文本对话模型,它能给你一段代码,但没法替你运行。我用的版本是带代码沙箱的,所以它能直接执行脚本并返回结果。如果你的 WorkBuddy 只能生成代码不能执行,那就需要把代码复制到本地环境跑,流程会多一步。
2.2 数据接入:三种方式按需选
回测最怕数据出错,数据接入环节一定要让 WorkBuddy 把“数据从哪来、是否复权、格式如何”讲清楚。我测试了三种方式,分别适用不同情况。
第一种是让 WorkBuddy 通过连接器直接拉取数据。比如我会直接说:“用 AkShare 拉取比亚迪 002594 的日线数据,前复权,时间范围 2020-01-01 到 2024-12-31,保存到工作区。”它会自动调用数据接口,生成一个 CSV 文件。这种方式最省事,适合大多数场景。
第二种是让 WorkBuddy 写一段数据获取脚本,再由我手动或半自动执行。适合你不想让 WorkBuddy 直接联网的情况。实际上,如果你用的是本地部署模式,且没有配置数据连接器,让 WorkBuddy 生成一段 Python 脚本,你确认后再运行,也是一种可靠的方式。
第三种是手动上传 CSV。如果你手里已经有了一份现成的行情数据,或者你希望严格控制数据来源,就直接把 CSV 拖进工作区。数据至少需要六列:date、open、high、low、close、volume,日期格式统一,按升序排列。CSV 上传后,第一步不是直接回测,而是让 WorkBuddy 做一次数据质量检查。我常用的指令是:“检查这个 CSV 有没有缺失日期、重复日期、跳空异常、成交量异常,并给出统计摘要。”这一步很关键,能帮你挡掉后续大量莫名其妙的回测结果。
2.3 第一次回测前必须先确认的四个参数
在 WorkBuddy 里跑回测,它通常会问你四个关键参数,因为这几个参数直接决定结果长什么样。我通常这样设置:
| 参数 | 我的设置 | 为什么这么设 |
|---|---|---|
| 初始资金 | 100 万 | 足够大,避免单笔交易受一手数量限制影响 |
| 佣金费率 | 万分之三 | 接近主流券商平均水平 |
| 滑点 | 0.01 元 | 模拟实际成交价与信号价之间的偏差 |
| 回测区间 | 2020-01-01 到 2024-12-31 | 覆盖牛熊和震荡,能看出策略在不同行情下的表现 |
这里面滑点和佣金是最容易被新手忽略的。如果你完全不设置,WorkBuddy 可能会默认“零成本成交”,结果就是策略收益虚高。可以简单理解成:手续费和滑点越接近真实,回测结果越老实,但也越难看。我不建议为了让曲线漂亮而故意把成本设成零,因为那是在骗自己。
3. 比亚迪多策略回测跑通全流程:从自然语言到绩效曲线
3.1 把策略逻辑翻译成自然语言指令
WorkBuddy 需要的不是“帮我看看比亚迪能不能买”这种模糊需求,而是“可执行规则”。规则要足够具体:什么时候产生信号、用什么价格成交、全仓还是半仓、什么时候退出。我第一次带朋友跑的时候,给他的指令模板是这样的:
“请对 002594 做多策略回测,数据用 AkShare 前复权日线,区间 2020-01-01 到 2024-12-31,初始资金 100 万,佣金万三,滑点 0.01 元。
策略一:双均线趋势,短期均线 10 日,长期均线 30 日,短线上穿长线全仓买入,下穿清仓卖出。
策略二:14 日 RSI 超买超卖,RSI 低于 30 买入,高于 70 卖出,全仓进出。
策略三:20 日布林带突破,收盘价突破上轨做多,跌破中轨离场。
每个策略独立回测,最后输出总收益率、年化收益率、最大回撤、夏普比率、胜率、交易次数,并和同期买入持有基准对比。”
这条指令里的关键信息包括标的代码、数据源、时间范围、费用模型、每个策略的入场和出场条件、期望输出的指标列表。WorkBuddy 收到之后,会把任务拆解成多个子任务分别执行。如果它觉得哪里规则不明确,比如“RSI 低于 30 就立刻以收盘价成交吗”,它会反过来问你,这是好事,说明它在做有逻辑的执行,不是硬猜。
3.2 WorkBuddy 是怎么把指令变成回测代码的
从自然语言到回测代码,中间发生了什么?WorkBuddy 内部大概做了这几步:拆解任务、拉取数据、生成回测脚本、在沙箱里执行、汇总结果。为了让你对“代码长什么样”有个概念,我挑一段它生成的双均线核心逻辑给你看:
import pandas as pd # df 为前复权日线数据 df['fast_ma'] = df['close'].rolling(10).mean() df['slow_ma'] = df['close'].rolling(30).mean() # 信号:短期均线在上方时持有 df['signal'] = (df['fast_ma'] > df['slow_ma']).astype(int) # 关键:信号 shift(1),次日开盘生效,避免未来函数 df['position'] = df['signal'].shift(1) # 策略收益 = 持仓状态 * 当日收益率 df['strategy_return'] = df['position'] * df['close'].pct_change() # 计算组合净值 df['equity'] = (1 + df['strategy_return']).cumprod()这段代码最值得注意的就是那个shift(1)。它确保了当天收盘算出的均线信号,不会用当天的价格成交,而是从第二天开始生效。这是回测里最容易出错也最影响结果真实性的细节。你不会写代码完全没关系,但如果你在结果解读里发现某个策略收益异常高,要想到可能犯了“未来函数”的错,这一点我在后面专门讲坑的时候会展开。
3.3 结果怎么读:五项指标一个都不能少
WorkBuddy 执行完回测后,会返回一张绩效表。不要只看收益率,那是全场最会骗人的指标。我习惯先扫一眼五个数:总收益率、年化收益率、最大回撤、夏普比率、胜率。年化用来衡量赚钱速度,最大回撤用来衡量你扛不扛得住,夏普比率用来衡量收益和波动的性价比,胜率用来判断策略的“手感”。
下面是我用默认参数跑出来的示例结果,对比买入持有:
| 指标 | 双均线 10/30 | 买入持有 |
|---|---|---|
| 总收益率 | 142.6% | 108.3% |
| 年化收益率 | 19.4% | 16.1% |
| 最大回撤 | -28.7% | -45.6% |
| 夏普比率 | 0.91 | 0.62 |
| 胜率 | 38.5% | 100%(只有一次持仓) |
| 交易次数 | 27 | 1 |
注意双均线的胜率只有 38.5%,明显低于五成,但总收益比买入持有高,最大回撤也更小。这说明它是一个典型的趋势策略:大部分交易是小亏或小赚,真正赚钱靠的是抓住 2020 到 2021 年那种大级别上涨行情。只看胜率很高不代表策略好,只看收益很高也不代表策略稳。这五个指标放在一起看,才能拼出策略的真实性格。
4. 三个策略的实际表现拆解:趋势、动量与波动率突破
4.1 策略 A:双均线趋势策略,吃大波段也会挨震荡的打
双均线策略的逻辑很简单:短期均线上穿长期均线,说明短期趋势转强,买入;下穿,说明趋势转弱,卖出。这个策略在单边上涨行情里非常舒服,2020 到 2021 年比亚迪那种持续拉升的走势,双均线能从头吃到尾。但在 2022 到 2024 年反复震荡的行情里,均线会频繁金叉死叉,来回挨打。
参数不同,效果差异也很大。我把 10/30 和 20/60 两组都跑了一遍:
| 指标 | 双均线 10/30 | 双均线 20/60 |
|---|---|---|
| 年化收益率 | 19.4% | 17.2% |
| 最大回撤 | -28.7% | -22.4% |
| 夏普比率 | 0.91 | 0.85 |
| 交易次数 | 27 | 14 |
10/30 更敏感,交易次数多,收益略高但回撤也更大;20/60 更钝,交易次数少,回撤控制得更好,但在行情快速反转时会显得反应迟钝。没有哪组绝对更好,取决于你能接受多大的回撤。这个对比也说明了一点:多策略回测的意义,不是非要分个输赢,而是理解每个参数组合在“收益”和“痛苦”之间的取舍。
4.2 策略 B:RSI 动量回调策略,不加过滤就是送人头
策略 B 的原始逻辑是“RSI 低于 30 买入,高于 70 卖出”。听起来像低买高卖,实际回测结果很打脸。因为比亚迪在 2023 到 2024 年的下跌趋势里,RSI 可以长期处于低位,你每次低于 30 买入,都可能买到半山腰。这是典型的“接飞刀”问题。
我做了个改进:加入 20 日均线过滤,只允许在收盘价站上 20 日均线时执行 RSI 超卖买入。这等于加了一道趋势确认的闸门,结果是:
| 指标 | 原始 RSI | RSI + 20日均线过滤 |
|---|---|---|
| 年化收益率 | 8.6% | 12.9% |
| 最大回撤 | -41.3% | -24.7% |
| 夏普比率 | 0.42 | 0.74 |
| 交易次数 | 41 | 23 |
加过滤之后,交易次数几乎少了一半,收益反而更高,回撤小了一大截。这个案例特别适合让 WorkBuddy 帮你做“对比实验”:同一个策略,加不加某个过滤器,结果差多少。它能快速给你跑出来,远比你自己凭感觉猜测靠谱。
4.3 策略 C:布林带突破策略,追的是爆发力
策略 C 用 20 日布林带,2 倍标准差。收盘价突破上轨时进场,跌破中轨时离场。这个策略的本质是捕捉价格的突发性突破,适合流动性好、容易出现趋势行情的标的。比亚迪 2021 年和 2024 年都出现过放量大涨的阶段,布林带突破能捕捉到一部分。
但它也有明显短板:横盘震荡时,价格经常虚破上轨然后立刻回落,连续小亏会让人心态崩掉。回测结果:
| 指标 | 布林带突破 20/2 |
|---|---|
| 年化收益率 | 15.8% |
| 最大回撤 | -31.2% |
| 夏普比率 | 0.68 |
| 胜率 | 32.1% |
| 交易次数 | 18 |
胜率只有 32%,但总收益依然为正,说明突破策略一旦抓到大行情,单笔利润能覆盖很多次小亏损。这个策略比较适合搭配其他策略使用,单独满仓它,对心脏不太友好。
4.4 三个策略怎么组合,WorkBuddy 能做组合回测
三个策略各有脾气:双均线吃趋势、RSI 吃反弹、布林带吃突破。它们的信号来源不同,相关性不高,组合在一起可以平滑净值曲线。我做了一个最简单的等权组合测试:每个策略分配三分之一资金,独立运行,最后把三条净值曲线按比例合成一条。
| 方案 | 年化收益率 | 最大回撤 | 夏普比率 |
|---|---|---|---|
| 双均线 10/30 | 19.4% | -28.7% | 0.91 |
| RSI + 过滤 | 12.9% | -24.7% | 0.74 |
| 布林带突破 | 15.8% | -31.2% | 0.68 |
| 等权组合 | 16.7% | -18.5% | 1.02 |
组合的年化不是最高的,但最大回撤显著下降,夏普比率升到 1.02。这个结果很有代表性:多策略组合的核心价值不是提高收益,而是降低回撤、提高收益的稳定性。对不会写代码的人来说,用 WorkBuddy 做这种组合测试,成本很低,只需要在指令里描述清楚“资金怎么分配、是否每日调仓”就行。
5. 回测结果里那些看不见的坑:我的踩坑排查记录
5.1 坑一:前复权数据混用导致价格断裂
我第一次跑双均线策略时,净值曲线在 2022 年 7 月突然出现一次毫无来由的跳变。一开始我以为是策略信号触发,但仔细看,那个时间点附近既没有金叉也没有死叉,收益却硬生生被拉高了一截。排查链路是这样的:先让 WorkBuddy 打印净值曲线的突变点日期,再对比当日成交量,发现价格跳低但成交量并没有明显放大,随后检查除权除息日,确认是比亚迪当年的分红除息日。问题出在数据上:数据源里有一部分行情是未复权价格,有一部分是前复权价格,两者拼接后,除息日当天价格出现向下跳空,被回测引擎误认为是真实下跌。
修复方法很简单:统一使用前复权数据,并在数据检查阶段就确认“整个区间是否同一复权口径”。现在我做任何回测之前,都会让 WorkBuddy 输出一段数据摘要,重点看有没有莫名其妙的跳空缺口。如果你发现回测收益在某个财务事件日附近出现异动,第一反应应该是查复权,而不是怀疑策略灵光乍现。
5.2 坑二:未来函数让策略“开天眼”
第二个坑更隐蔽,也更要命。RSI 策略第一次跑出来胜率 78%,最大回撤不到 10%,我当时差点觉得策略可以上实盘。还好留了个心眼,让 WorkBuddy 把每次买卖点打印出来核对。结果发现,信号生成用的是当日收盘价计算出的 RSI,成交也记在当日收盘价上。这在实盘里是不可能的:收盘价出来的时候,交易已经结束了,你根本来不及按同一个价格成交。
这就叫未来函数,等于策略偷看了当天的答案再去答题。修复方式就是前面代码里出现的那个shift(1):信号统一往后移一天,第二天开盘再执行。修改之后,RSI 策略的胜率立刻从 78% 掉到 55% 左右,最大回撤从 8% 涨到 20% 以上,离谱的收益曲线瞬间变得现实主义。这个坑几乎是新手回测的必经之路,我在帮朋友跑的时候特别强调了这一点:如果策略只负责“当天收盘后给出信号”,那成交价必须选次日开盘价,不能选当日收盘价。让 WorkBuddy 跑完回测后,主动检查一下成交价和信号价到底是不是同一天,能省掉后面无数自嗨。
5.3 坑三:网格搜索出来的完美曲线,换个时间段就露馅
第三个坑是全自动参数优化。有一阵我图省事,让 WorkBuddy 在双均线参数空间里跑网格搜索,短均线从 5 到 50,长均线从 20 到 100,最后筛选出一组“历史最优参数”,年化 45%,回撤 12%,曲线完美得像假的。我差点就准备实盘了。
为了验证稳健性,我把数据切成两段:2020 到 2022 作为训练段,2023 到 2024 作为验证段。训练段最优的参数组,在验证段年化只跑出 6%,甚至不如买入持有。我又把参数改成最优参数附近的一组,绩效波动极大。这说明严重过拟合:那组参数是在精确记住历史噪声,而不是在总结规律。
之后的处理方式我总结成三条:第一,参数搜索范围宁小勿大;第二,单个策略的参数最好不要超过两三个;第三,必须做分段验证或 walk-forward 检验。WorkBuddy 可以帮你执行这些操作,但决定“要不要克制搜索欲望”的是你。工具不会拦着你过拟合,它只会高效地帮你把过拟合做到极致,这个责任得自己担。
6. 把 WorkBuddy 变成自己的量化助手:Skill 沉淀与进阶用法
6.1 把回测流程固化成 Skill,下次一句话跑通
把比亚迪这个案例完整跑过一遍之后,我发现最费时间的不是回测本身,而是每次都要重复描述一遍参数、数据源、费用模型。WorkBuddy 支持把一套流程固化成 Skill,这个设计对不会写代码的人特别友好。我的做法是跑通一次之后,对 WorkBuddy 说:“把这次回测的完整流程保存成一个 Skill,以后只要提供股票代码、时间区间、策略描述,就自动按同样的参数和流程执行,并输出绩效表和净值数据。”
保存完 Skill,再想测另一只票就很简单了。比如朋友问“看看宁德时代怎么样”,我只需要说:“用回测 Skill 跑一下 300750,时间 2021 到 2024,策略用之前的三套,默认参数。”剩下的一切它都会按既定流程执行。这等于把一次性的项目工程,变成了可复用的方法论资产。
6.2 进阶玩法:让 WorkBuddy 做参数敏感性分析
单跑一组参数只能看到策略的一个侧面,我更推荐做敏感性分析。所谓敏感性分析,就是固定其他条件,让某个参数在一定范围里变化,观察绩效指标怎么波动。我用 WorkBuddy 跑过一次双均线敏感性分析:短期均线从 5 到 30,步长 5;长期均线从 30 到 80,步长 10。它最后输出一张表格,横轴是短期均线参数,纵轴是长期均线参数,每个格子填的是对应策略的夏普比率。
这种表的价值在于,你能快速看出“哪些参数区域是稳定的高绩效区,哪些区域换个参数就崩盘”。如果高绩效只集中在一个很窄的点上,说明策略很脆;如果一整片区域都表现不错,说明策略有稳健性。这个认知比“找到一组最牛参数”重要得多。WorkBuddy 还可以做随机扰动测试,即在最优参数附近加入小幅随机波动,跑多次看绩效分布,这也是对抗过拟合的好办法。
6.3 本地部署与数据安全,我踩过的一个现实问题
最后说说数据安全。回测涉及价格数据、策略想法,对一些人来说属于敏感信息。如果你不希望自己的策略和行情数据传到云端,可以考虑用本地部署版 WorkBuddy,让数据和脚本都留在本机。我尝试过本地部署后再接一个开源模型,跑简单的回测任务,比如双均线、RSI 这种逻辑清晰的策略,完全够用。复杂的策略理解、长上下文分析能力会弱一些,但日常个人量化足够。
如果你用本地部署,几个建议供参考:把行情数据放在独立工作区,不要散落在系统目录里;模型推理服务建议单独起一个端口,方便 WorkBuddy 调用;跑完回测后,把结果文件统一导出到指定文件夹,方便从本机里找出来做二次分析。我个人的体会是,WorkBuddy 这类工具真正的价值不是替代分析师,而是把“从想法到验证”的距离压缩到了几分钟。你不必成为一个熟练的程序员,但你必须学会把策略说清楚,并保持对回测结果的警惕。参数可以交给工具去找,逻辑的合理性必须自己把好关。