1. 项目概述一个能自己“进化”的DEX交易策略发现引擎如果你在Base链上交易过或者用过Uniswap V3、Aerodrome这些去中心化交易所你肯定知道一个痛点市场是活的但你的交易策略往往是死的。你花几天时间写了个策略回测看着不错一上线市场风格一变策略立马失效然后你又得从头开始调参、重构陷入一个没完没了的循环。AutoResearch这个项目就是冲着解决这个“人肉调参”的瓶颈来的。它的核心想法非常直接把策略的发现和进化过程交给一个AI代理去自动化完成。这个代理会像一个不知疲倦的研究员不断地提出新的策略假设比如“把RSI周期从14改成10试试”然后用真实的Base链上DEX数据ETH/USDC, AERO/USDC等进行回测根据一个综合评分决定是保留这个新策略还是回滚到上一个版本。最关键的是它有一个“记忆”系统能记住每一次实验的成功与失败让下一次的“进化”方向更聪明。我花了12个小时从零构建了这个系统。它不是一个简单的回测框架而是一个完整的、能自主运行的“策略发现引擎”。从获取链上数据、计算技术指标、设计回测引擎到集成LLM大语言模型来生成策略突变、最后通过Bankr钱包在Base主网上进行实盘交易验证整个流程完全打通。最让我兴奋的是它真的在无人干预的情况下通过230多次实验将一个基准策略的评分从0.421提升到了8.176提升了超过1840%并且自动发现了从简单的均值回归到复杂的双策略组合的进化路径。2. 核心架构与设计哲学2.1 为什么是“自主研究”而不是“自动交易”市面上大多数交易机器人核心是“执行”。你给它一个设定好的策略比如“RSI低于30买入高于70卖出”它就不眠不休地执行。AutoResearch的定位是“研究”。它的核心产出不是交易信号而是经过验证的、更优的交易策略本身。这背后的设计哲学深受Andrej Karpathy的“autoresearch”概念启发。Karpathy将其应用于AI模型训练让AI自己修改训练脚本、跑实验、评估结果。我们把这个循环搬到了DEX交易策略领域。这里的“训练”变成了“回测”评估标准从“验证集准确率”变成了“风险调整后的综合收益评分”。2.2 系统架构全景整个系统可以看作一个由数据驱动、记忆增强的闭环反馈系统。下图展示了其核心工作流[数据层] - [策略引擎] - [回测与评估] - [记忆与学习] - [突变生成] ^ | | v ------------------------------------------------------------数据层这是系统的眼睛。它从多个源头获取Base链上DEX的实时和历史数据包括Uniswap V3的0.05%和0.3%费率的ETH/USDC池、cbETH/WETH池以及Aerodrome的AERO/USDC池。我们使用了DeFiLlama、CoinGecko的API并集成了Uniswap开发者平台的子图查询作为后备确保数据的可靠性和实时性。数据以每小时K线的形式被标准化处理为回测提供燃料。策略引擎这是系统的大脑。它基于一个简单的类接口一个onBar函数运行。当前活跃的策略代码就存放在一个单一的strategy.js文件中这是系统的“单一事实来源”。引擎会为每个交易对计算10种技术指标RSI, MACD, 布林带, ATR, VWAP, 随机指标, OBV, EMA, 威廉指标, 百分比排名并将这些数据喂给策略函数策略函数则返回目标持仓量。回测与评估这是系统的裁判。它模拟交易严格计算手续费基于真实DEX费率、滑点并跟踪资金曲线。其评分系统是策略进化的指挥棒计算公式为score sharpe × √(min(trades/50, 1.0)) − drawdown_penalty − turnover_penalty。这个公式巧妙地在夏普比率风险收益比、交易活跃度、最大回撤和换手率之间取得了平衡鼓励策略寻找稳健的Alpha而不是通过高频交易刷虚假收益或承担过大风险。记忆与学习LCM这是系统区别于随机搜索的关键。我们集成了OpenClaw的Lossless Context Management无损上下文管理。每一次实验无论成功KEPT还是失败REVERTED都会被详细记录到记忆库中包括改动了什么参数、得分多少、夏普比率、回撤等。在生成下一次突变前AI代理会先查询记忆“我们试过哪些RSI周期哪个效果最好”“在偏离阈值这个参数上最优区间大概在哪里”“有哪些结构性的改动比如添加新指标我们还没探索”这使得研究过程是收敛的避免了在无效区域反复试错。突变生成LLM Gateway这是系统的创新引擎。我们通过Bankr的LLM Gateway接入Claude Sonnet等模型。系统会构建一个详细的提示词Prompt包含当前策略代码、历史实验记忆、市场数据摘要然后要求LLM“提出一个最有希望提高综合评分的、具体的代码修改建议”。LLM可能会建议调整参数也可能建议引入新的指标组合或出场逻辑。这个建议会被自动应用到strategy.js文件中触发新一轮回测。2.3 模块化设计整个代码库由14个核心源文件模块化构成职责清晰src/controller.js: 总控循环协调突变、测试、学习流程。src/backtest.js: 回测引擎核心包含手续费模型和评分逻辑。src/indicators.js: 纯函数实现的10个技术指标库。src/regime.js: 市场状态检测模块通过Hurst指数、EMA斜率等判断趋势/震荡市。src/memory.js: LCM记忆的封装负责实验日志的存储和查询。src/executor.js: 实盘执行引擎连接Bankr钱包处理风险控制和订单发送。src/bankr.js: Bankr服务的集成层处理LLM调用和钱包交互。scripts/daemon.js: 守护进程脚本让整个研究循环可以7x24小时无人值守运行。这种设计使得系统易于理解、调试和扩展。例如如果你想替换LLM提供商只需修改bankr.js如果想增加新的技术指标就更新indicators.js。3. 实操搭建与运行指南3.1 环境准备与快速启动假设你已经在本地配置好了Node.jsv20环境并且有一个可以访问Base链的RPC节点可以用公共的也可以用自己的Infura或Alchemy端点。第一步克隆代码库并安装依赖注意核心运行时依赖为零但一些脚本可能需要node-fetch等请根据package.json安装git clone https://github.com/darks0l/autoresearch.git cd autoresearch npm install # 如果package.json里有开发依赖的话第二步获取历史数据。回测需要数据我们提供了脚本从多个源抓取Base上主流交易对的近期小时K线数据node scripts/fetch-data.js这个脚本会默认获取ETH/USDC, AERO/USDC等4个交易对的数据保存到data/目录下。你也可以修改脚本或通过配置来增加其他你感兴趣的Base链上交易对。第三步运行基准测试。在让AI开始研究之前最好先看看一个简单策略的基线水平node scripts/run-benchmarks.js这会运行一个内置的简单VWAP均值回归策略并输出其综合评分。我最初得到的基线分数是0.421这将是AI进化的起点。3.2 启动自主研究循环现在激动人心的部分来了。运行以下命令启动一个自动进行30次实验的研究会话node scripts/run-autoresearch.js --max 30你会看到控制台开始输出日志[启动] 加载策略文件与历史记忆... [记忆查询] 发现23次历史实验最佳得分: 0.740 (exp074) [LLM调用] 请求生成突变... [突变生成] LLM建议将RSI周期从14调整为10以获取更灵敏的超卖信号。 [回测] 对4个交易对进行回测共2800根K线... [结果] 新得分: 0.726旧得分: 0.740。未提升回滚。 [记忆] 记录实验exp075: REVERTED。 [LLM调用] 基于失败经验请求新的突变... ...这个过程会持续进行直到达到30次实验上限或者你手动中断。每次实验AI都会尝试一个微小的改动并根据回测结果决定保留还是丢弃。3.3 部署持久化守护进程对于长期、无人值守的研究你需要运行守护进程模式。它会以批次为单位运行实验并在批次间隙暂停避免过度消耗资源和API调用费用。node scripts/daemon.js --batch 15 --model claude-sonnet-4.5 --target 10.0参数解释--batch 15: 每轮运行15次实验。--model claude-sonnet-4.5: 指定使用Claude Sonnet模型进行突变生成效果更好但成本略高。--target 10.0: 设定一个目标分数达到后守护进程可以暂停或通知。守护进程会在每批实验结束后将改进的策略自动提交到Git如果配置了Git仓库并生成一份报告。它还会跟踪Bankr LLM的积分消耗确保研究循环在预算内进行。3.4 实盘交易执行谨慎在AI发现了一个高评分策略后你可以选择进行实盘交易。强烈建议先用模拟盘paper trading运行足够长时间。# 模拟盘运行使用最新的策略 node scripts/run-live.js # 模拟盘并使用市场状态检测模块来动态调整策略 node scripts/run-live.js --regime # 实盘交易需要配置BANKR_API_KEY和有效的Bankr钱包余额 node scripts/run-live.js --live --regime --cycles 24实盘执行引擎内置了严格的风险控制单笔头寸上限默认不超过投资组合总价值的15%。每日止损线当日累计亏损达到5%时自动停止交易。交易对白名单只允许在预设的、流动性好的交易对上交易如ETH/USDC。余额同步每次交易前会从Bankr钱包同步真实余额确保不会超买。重要提示实盘交易涉及真实资产损失风险。务必从小额开始充分理解策略逻辑并确保你已设置好所有安全配置如API密钥权限仅限交易不包含提现。4. 策略进化全记录与深度解析这个项目最宝贵的产出不是最终的策略代码而是那230多次完整的实验日志。它像一本AI交易策略的“进化日记”揭示了机器如何思考市场。我们来深入看看几个关键阶段。4.1 第一阶段VWAP均值回归的陷阱实验1-74最初的基准策略是一个经典的VWAP成交量加权平均价均值回归策略当价格偏离VWAP一定百分比时入场回归时出场。在合成数据人为生成的、具有明显均值回归特性的数据上AI通过微调参数如偏离阈值、ATR周期、RSI周期成功将分数从0.421提升到了0.740。关键教训过拟合Overfitting。当我把这个在合成数据上表现优异的策略exp074放到真实Base链数据上回测时分数暴跌至-1.460模拟回报为-6%。这是一个教科书般的过拟合案例策略完美适应了训练数据合成数据的噪声却无法泛化到真实市场。实操心得永远、永远要用真实市场数据进行最终验证。合成数据或单一历史阶段的数据只能用于初步构思。市场的复杂性和结构性变化是任何合成数据难以模拟的。4.2 第二阶段结构性突破——转向趋势跟踪实验117认识到VWAP策略的局限性后我作为人类开发者进行了一次手动结构性干预。我没有让AI继续调参而是完全重写了策略逻辑从均值回归转向趋势跟踪。新策略结合了唐奇安通道突破作为入场信号。EMA双线交叉作为趋势过滤器只在趋势方向交易。RSI超卖区作为趋势中的回调买入机会。基于ATR的动态跟踪止损来保护利润。这次重构带来了质的飞跃分数从0.74跃升至2.838首次在真实数据上实现了正收益。这揭示了一个关键点LLM擅长在既定框架内做局部优化调参但突破性的架构创新往往还需要人类的直觉和领域知识来引导。4.3 第三阶段LLM守护进程的渐进式优化实验126-183在提供了趋势跟踪这个强大的新框架后我将控制权交回给AI守护进程。它开始了新一轮的“微进化”实验126引入基于Hurst指数的市场状态识别在趋势市增加仓位。实验128将ATR跟踪止损的倍数从2.0收紧至1.5夏普比率显著提升至4.002。实验151增加多时间框架趋势过滤例如用50周期EMA的斜率判断大趋势过滤掉了许多逆势交易。这个阶段分数从2.838稳步提升至3.777。AI通过系统性的、数据驱动的试错不断打磨策略的细节。4.4 第四阶段再次突破——集成学习与双策略组合实验161-199当分数在3.78附近陷入平台期时我再次介入引入了集成学习Ensemble的概念实验161。新策略并行运行三个独立的子策略唐奇安突破、RSI抄底、MACD动量只有当至少两个子策略发出相同方向的信号时才开仓并根据“投票”的票数来加权仓位。这一下将分数推高到了4.512。然而有趣的事情发生了。AI守护进程在后续的实验中竟然发现“简化”比“复杂”更有效。实验163剥离了复杂的集成投票回归到纯粹的唐奇安趋势突破分数反而进一步提升到5.310。这似乎说明在当时的市场状态下一个清晰强力的信号比多个微弱信号的组合更有效。随后AI自发地发现了几项关键改进实验170ATR百分比过滤器将简单的“ATR SMA”过滤器改为“ATR处于其近期分布的60百分位以上”。这是一个质的提升分数跃升至7.327。它不再看ATR的绝对值而是看其相对位置更好地捕捉了“波动率扩张”的起始点。实验180自适应盈利目标根据趋势强度动态调整盈利目标弱趋势2倍ATR强趋势4倍ATR让利润奔跑分数到了7.875。实验183动态突破回看期根据波动率状态动态调整唐奇安通道的回看周期高波动用25期低波动用15期适应不同市场节奏分数达7.991。实验199双策略组合这是最终的巅峰。AI设计了一个双策略投资组合一个策略负责趋势突破另一个负责均值回归。然后利用Hurst指数衡量时间序列趋势性的指标来动态分配资金当Hurst指数高趋势市大部分资金分配给趋势策略当Hurst指数低震荡市则分配给均值回归策略。这个动态资产配置模型将最终分数推至8.176。4.5 核心发现与AI行为模式总结退出优于入场在大多数失败的实验中AI试图优化入场条件。而大多数成功的实验改进的是出场逻辑止损、止盈。这印证了一句交易格言“会买的是徒弟会卖的是师傅。”简单性力量复杂的集成策略exp161被更简单的纯趋势策略exp163超越。AI最终发现减少错误信号比增加更多信号源更重要。自动升级机制有效我们设定了“平台期检测器”。如果连续5次实验都是参数微调且没有显著提升系统会强制LLM进行“结构性思考”禁止它再调参。正是这个机制逼出了“ATR百分比过滤器”这个重大创新。记忆是关键没有LCM记忆每次实验都是独立的随机游走。有了记忆AI能避免重复失败并沿着有希望的方向深入探索。5. 市场状态检测让策略“识时务”一个在所有市场环境下都固守同一套逻辑的策略注定会失败。因此我构建了一个轻量但有效的市场状态检测模块src/regime.js。它从三个维度分析最近100根K线趋势强度通过短期EMA与长期EMA的交叉和斜率来判断。波动率水平计算ATR并判断其处于近期历史分布中的百分位。市场记忆性Hurst指数通过重标极差R/S分析估算。H值接近0.5类似随机游走小于0.5倾向均值回归大于0.5倾向趋势延续。系统将市场划分为5种状态并对应调整策略行为市场状态检测方法策略行为调整强势上涨EMA金叉 H 0.6 斜率向上采用动量跟踪增加仓位使用更宽松的止损。强势下跌EMA死叉 H 0.6 斜率向下采用做空动量或空仓观望使用更紧的止损。均值回归H 0.4 趋势强度弱启用VWAP均值回归子策略高抛低吸。高波动ATR 80百分位将仓位规模减半扩大止损幅度以承受更大噪音。低波动ATR 20百分位保持空仓避免在无方向市场中磨损手续费。在双策略组合exp199中Hurst指数直接用于分配两个策略的资金权重。这是一个非常优雅的解决方案让策略本身具备了环境适应性。6. 集成、扩展与生产化考量6.1 作为OpenClaw技能运行AutoResearch被设计为可嵌入其他智能体系统。你可以将其作为技能安装到OpenClaw中cp -r autoresearch ~/.openclaw/skills/autoresearch之后你就可以在OpenClaw的对话中直接命令它“运行30次autoresearch实验并将结果报告到#autoresearch-lab频道”。这使得它能够成为更大自动化工作流的一部分。6.2 自定义交易对发现系统内置了4个Base主流交易对但你可以轻松扩展。我们提供了发现脚本可以自动扫描Base链上TVL最高的DEX资金池并添加。# 预览TVL前10的池子 node scripts/pairs.js discover # 自动添加TVL大于100万美元的前5个新池子 node scripts/pairs.js auto --max 5 --min-tvl 1000000你也可以通过API手动添加任何Base链上的交易对只需要提供合约地址和费率信息。新增的交易对会持久化到配置文件中并自动纳入后续的所有回测。6.3 报告生成与分析实验日志是文本格式为了更直观的分析我们提供了报告生成器# 生成完整的Markdown报告 node scripts/report.js --out my_strategy_report.md # 生成带样式的HTML报告方便在浏览器中查看 node scripts/report.js --html report.html报告包含评分演变图表、每笔实验的详细参数、分交易对表现、失败模式分析等是复盘AI研究过程的最佳工具。6.4 x402微支付与自维持经济循环为了让这个系统能真正“自给自足”我们设计了基于EIP-3009x402的微支付服务。外部用户或智能体可以支付少量费用来调用服务/strategy/discover: 支付2 USDC启动N次新的策略研究实验。/strategy/validate: 支付0.5 USDC对现有策略进行样本外验证。/strategy/signal: 支付0.1 USDC获取指定交易对的最新交易信号。产生的收入会自动转入Bankr钱包用于支付后续LLM API调用的费用从而形成一个自维持的研究经济循环更好的策略吸引更多使用产生更多收入进而资助更深入的研究。7. 常见问题、故障排查与避坑指南在12小时的密集开发和后续测试中我踩了不少坑。这里记录下最关键的一些问题和解决方案。7.1 数据获取失败或延迟问题运行fetch-data.js时卡住或回测时提示数据缺失。排查检查网络和API密钥首先确认你的网络能访问外部APIDeFiLlama, CoinGecko。如果用了Uniswap API确认密钥有效且未超限。使用备用数据源代码中设置了数据源优先级。如果主源失败会自动降级到备用源。查看日志确认降级是否发生。本地数据缓存成功获取的数据会保存在data/目录下。后续回测会优先使用本地缓存。如果你需要最新数据可以手动删除缓存文件再运行。RPC节点问题如果用到直接链上查询确保Base RPC URL稳定。公共节点可能限速建议使用可靠的供应商节点。技巧在src/config.js中增加数据源超时时间和重试逻辑可以大幅提高鲁棒性。我后来将超时设为10秒并最多重试3次。7.2 LLM生成的策略代码有语法错误或逻辑错误问题AI有时会生成无法通过JavaScript解析的代码或者逻辑上明显有问题的修改比如把买入条件写成卖出。解决强化系统提示词System Prompt这是最重要的。你的提示词必须明确要求LLM“输出一个完整的、可运行的、语法正确的JavaScript策略类onBar函数”。并提供清晰的示例。添加代码验证层在将AI生成的代码写入strategy.js之前先用eval()或创建一个临时VM沙盒尝试解析和执行一下。如果抛出语法错误则直接判定本次实验失败并记录原因“LLM生成无效代码”然后重试。设置安全边界在提示词中限制AI的修改范围。例如“只允许修改entryThreshold,exitThreshold,rsiPeriod这三个参数的数值或调整calculateSignal函数内的逻辑比较符, , , 不允许添加新的外部依赖或改变函数签名”。7.3 回测速度过慢问题当交易对数量增多或K线数据量很大时回测一次实验可能需要几十秒严重拖慢研究循环。优化指标预计算技术指标计算是性能瓶颈。我将所有10个指标的计算从每次onBar调用时计算改为在数据加载阶段一次性批量计算好并存入数组。策略函数只需查表速度提升了一个数量级。减少不必要的精度回测中模拟的滑点和手续费模型在早期研究阶段可以适当简化。例如使用固定比例滑点代替订单簿模型。并行化回测如果测试多个不相关的交易对可以使用Node.js的worker_threads进行并行回测。但要注意共享内存和结果汇总的复杂度。抽样回测在探索性研究阶段可以只用最近30%的数据进行快速回测。只有当策略评分显著提升时再用全量数据进行最终验证。7.4 策略在实盘与回测表现严重不符问题回测分数很高但一上实盘就亏损。排查按优先级未来函数Look-ahead Bias这是最常见原因。确保你的策略在t时刻只能使用t时刻及之前的数据。仔细检查指标计算是否无意中引入了未来信息例如使用了整个数据段的平均值。手续费与滑点低估回测中使用的费率如0.05%和滑点模型如固定0.1%可能远低于实际。尤其是在市场波动大时真实滑点可能远超预期。实盘时务必使用更保守的更高的手续费和滑点假设重新回测。数据质量差异回测使用的历史K线数据如1小时收盘价与实盘接收的Tick级或分钟级数据存在差异。确保数据源和清洗逻辑一致。市场状态变化策略可能只适应特定市场状态如低波动趋势市。使用regime.js模块分析策略在不同历史阶段的表现并考虑引入类似双策略组合的动态适配机制。7.5 Bankr LLM积分消耗过快问题守护进程运行一段时间后Bankr积分耗尽研究停止。管理策略设置预算和警报在守护进程配置中设置每日或每批次的最大积分消耗。可以与Bankr的API结合定期查询余额低于阈值时发送通知如Discord Webhook。优化提示词减少Token使用提示词要简洁精准。将历史实验记忆进行摘要后再喂给LLM而不是发送全部原始日志。实验表明经过摘要的关键信息如“RSI周期在10-20之间表现最佳”与完整日志的效果几乎一样但能节省大量Token。使用成本更低的模型进行探索对于大量的、探索性的参数微调可以使用像claude-haiku这样的轻量级模型。只有当策略进入平台期需要“创造性突破”时再切换到更强的claude-sonnet或claude-opus模型。实现“冷启动”缓存如果多次运行相似的研究可以将第一次运行时LLM生成的有用突变即使当时未提升评分缓存起来后续运行可以直接从缓存中抽取候选减少LLM调用。7.6 记忆LCM查询返回无关信息问题AI基于记忆提出的突变建议似乎与当前策略不相关或在重复过去的失败。解决改进记忆索引和查询LCM默认基于语义搜索。如果记忆条目太多查询可能不够精准。可以尝试为每次实验添加更结构化、更丰富的元数据标签例如[parameter_tuning, rsi_period, success]然后让查询同时结合语义和这些标签进行过滤。定期清理或总结记忆当实验次数超过一定数量比如500次可以对早期、低分或过时的实验记录进行归档或摘要只保留最近的和高分实验的详细记录保持记忆库的“新鲜度”和相关性。人工引导当AI陷入局部最优时手动在记忆库中添加一条“高级提示”例如“过去50次实验都在调整入场参数但评分停滞。建议优先探索出场逻辑的优化或考虑引入市场状态过滤。” 这可以显著改变AI的搜索方向。这个项目对我来说不仅仅是一个黑客松作品它是一次关于“AI如何自主解决问题”的深度实践。它证明了在定义清晰的评估框架和持续的记忆反馈下AI确实可以承担起策略研究和迭代的繁重工作将人类从重复的试错中解放出来去关注更宏观的结构设计和方向把握。最让我满意的不是那个8.176的分数而是看到系统能自己从失败中学习并一步步找到通往更优解路径的那个过程。如果你也对自动化策略发现感兴趣我强烈建议你克隆代码库从运行第一个基准测试开始亲眼看看这个“数字研究员”是如何工作的。