1. 低配云服务器跑 Hermes Agent 与 Python 量化选股的真实场景一台 2G 内存的云服务器能同时跑一个 AI Agent 和一套 Python 量化选股脚本吗我一开始也怀疑但实测下来是可以的前提是把内存管住、把任务拆开。这篇文章要解决的就是这个具体问题在低配云服务器上部署 Hermes Agent配合 Python Backtrader 做量化选股从环境准备一路跑到端到端验证。先说清楚这套东西是什么、能做什么、适合谁。Hermes Agent 是 Nous Research 开源的一个自主 AI Agent 框架核心特点是自进化学习闭环支持通过网关接入微信、飞书、Telegram 等消息平台也支持 OpenAI、Anthropic、GLM、Kimi 等多种大模型 API。Python 量化选股部分我们用 Tushare 拉行情数据用自写策略做筛选用 Backtrader 做历史回测。适合谁适合手头只有一台低配云服务器、想用低成本方案搭一个 AI 量化助手的朋友也适合想学 Agent 与量化系统对接的开发者。整条链路是这样的系统 Cron 在每个交易日收盘后触发 Python 选股程序程序调用 Tushare 拉取盘后数据按策略筛选输出标准 JSONHermes Agent 内置定时任务读取选股结果做深度分析再通过已接入的微信网关自动推送跟踪脚本每日检查已选股票的后续表现同样经 Agent 推送。全程无需人工干预。低配服务器的核心矛盾是内存。2G 物理内存加上 4G Swap跑一个常驻 Agent 已经吃掉不少再叠加 Python 编译、Pandas 数据处理稍不注意就 OOM。所以本文的重点不只是“怎么装”更是“怎么在有限资源下装得稳、跑得动”。下面按环境准备、依赖安装、Agent 配置、选股脚本运行、端到端验证的顺序展开每一步都给可复制的命令和配置片段。2. TaoToken 前置给 Hermes Agent 接上稳定的大模型入口Hermes Agent 本身只是框架它需要调用大模型 API 才能做分析和对话。低配服务器上自己部署本地模型不现实所以走 API 是唯一选择。这里我用 TaoToken 作为模型接入层它提供统一的 API 入口兼容 OpenAI 风格的调用方式Hermes Agent 配置起来很直接。TaoToken 是什么、能做什么简单说它是一个大模型 API 聚合入口你拿到一个 API Key就能通过统一的 Base URL 调用多种模型。对 Hermes Agent 这种需要频繁调用模型做分析、又不想在服务器上折腾多套 SDK 的场景来说省事。适合谁适合需要在 Agent 里切换模型、又希望配置简单的开发者。接入前你需要准备三样东西我把它叫做“三件套”Base URL、API Key、Model ID。Base URL 用https://taotoken.net/api注意这个地址不带任何查询参数。API Key 在控制台的 API Keys 页面创建地址是https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。Model ID 根据你选的模型填比如常用的对话模型 ID具体以文档为准文档地址https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。这里要提醒一句Hermes Agent 的模型配置通常写在它的 settings 文件里不同版本路径可能略有差异常见的是~/.hermes/settings.json或项目目录下的config/settings.json。你要做的是把上面三件套填进去。如果你用的是 Claude Code 类的润色或编码场景配置逻辑类似但字段名不同本文聚焦 Hermes Agent 的 settings。为什么不在低配服务器上直接跑本地模型算一笔账一个 7B 参数的模型量化后也要 4G 以上内存2G 机器根本放不下就算放得下推理速度也没法用于每日选股分析。所以 API 接入是低配场景下的理性选择。TaoToken 在这里扮演的是“模型供给方”你只管调用不用管模型部署和显存。配置完成后Hermes Agent 就能在定时任务里调用模型对选股 JSON 做基本面、技术面、消息面的综合分析。这一步是整个链路里唯一需要联网调用外部服务的环节其余选股、回测、跟踪都在本地完成。把模型入口配稳后面的自动化才有意义。3. 可复制配置settings 片段与 Hermes Agent 接入这一节给可直接复制的配置。先看 Hermes Agent 的 settings 片段我用 JSON 格式写路径按~/.hermes/settings.json来你按自己实际安装路径调整。核心是把模型接入部分指向 TaoToken。{ model: { provider: openai_compatible, base_url: https://taotoken.net/api, api_key: sk-你的TaoToken密钥, model_id: 你的模型ID, timeout: 120, max_retries: 3 }, gateway: { wechat: { enabled: true, token: 你的网关token } }, memory: { max_history: 20, persist: true } }注意base_url后面不要加/v1之类的后缀TaoToken 的 API 入口就是https://taotoken.net/api。model_id填你在控制台选定的模型标识。timeout设 120 秒低配服务器网络波动时给足重试空间。max_retries设 3避免偶发失败导致定时任务中断。接下来是 Python 量化选股的环境配置。先升级 Python很多云服务器自带 3.6Tushare 和 Pandas 新版都要求 3.8我推荐编译安装 3.10轻量且稳定。安装编译依赖sudo yum groupinstall -y Development Tools sudo yum install -y openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel wget下载并编译 Python 3.10用altinstall避免覆盖系统自带版本cd /tmp wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz tar xzf Python-3.10.14.tgz cd Python-3.10.14 ./configure --enable-optimizations --prefix/usr/local make -j2 sudo make altinstall编译在 2G 内存机器上约需 10 到 20 分钟。建议先临时停掉其他服务释放内存比如sudo systemctl stop hermes装完再启动。验证并清理python3.10 --version cd /tmp rm -rf Python-3.10.14 Python-3.10.14.tgz创建虚拟环境并安装依赖--no-cache-dir防止安装过程中 OOMmkdir -p ~/quant cd ~/quant python3.10 -m venv venv source venv/bin/activate pip install --upgrade pip pip install --no-cache-dir tushare pandas numpy requests backtrader配置 Tushare Token写入环境变量echo export TUSHARE_TOKENyour_token_here ~/.bashrc source ~/.bashrc再建一个config.py读取# ~/quant/config.py import os TUSHARE_TOKEN os.environ.get(TUSHARE_TOKEN, )到这里模型接入和量化环境两套配置都齐了。settings 里的三件套Base URL、API Key、Model ID是 Agent 能工作的前提Python 环境和 Tushare Token 是选股能跑的前提。两者独立配置互不干扰但最终在定时任务里汇合。4. 验证请求从选股脚本到 Agent 推送的端到端跑通配置写完必须验证不然定时任务跑起来报错你都不知道哪一步断了。验证分两段先验证 Python 选股链路再验证 Hermes Agent 的模型调用和推送。先验证 Tushare 连通性import tushare as ts import os ts.set_token(os.environ[TUSHARE_TOKEN]) pro ts.pro_api() df pro.daily(ts_code000001.SZ, start_date20260401, end_date20260416) print(df.head())能打印出行情数据说明 Token 和数据源没问题。接着写选股调度入口runner.py它会扫描strategies/目录下所有策略并执行# ~/quant/runner.py import json, datetime, os, sys, gc, importlib, glob import tushare as ts from config import TUSHARE_TOKEN ts.set_token(TUSHARE_TOKEN) pro ts.pro_api() def save_results(stock_list, strategy_name): today datetime.date.today().strftime(%Y%m%d) output { date: today, strategy: strategy_name, count: len(stock_list), stocks: stock_list } os.makedirs(output, exist_okTrue) filepath foutput/selected_{strategy_name}_{today}.json with open(filepath, w, encodingutf-8) as f: json.dump(output, f, ensure_asciiFalse, indent2) print(f{strategy_name}: 选出 {len(stock_list)} 只 - {filepath}) return filepath def run_all_strategies(): result_files [] strategy_dir os.path.join(os.path.dirname(__file__), strategies) sys.path.insert(0, strategy_dir) for py_file in sorted(glob.glob(os.path.join(strategy_dir, *.py))): module_name os.path.basename(py_file)[:-3] try: mod importlib.import_module(module_name) stocks mod.run(pro) if stocks: fp save_results(stocks, module_name) result_files.append(fp) except Exception as e: print(f策略 {module_name} 出错: {e}) finally: gc.collect() return result_files if __name__ __main__: today datetime.date.today().strftime(%Y%m%d) cal pro.trade_cal(exchangeSSE, is_open1, start_datetoday, end_datetoday) if len(cal) 0: print(非交易日跳过) sys.exit(0) files run_all_strategies() from notify import notify_agent for f in files: notify_agent(f)每个策略文件只需暴露一个run(pro)函数返回list[dict]每个 dict 包含code、name、score、reason四个字段。策略内部要分批处理每批 50 只处理完gc.collect()释放内存这是低配机器不 OOM 的关键。# strategies/your_strategy.py 示例骨架 import gc def run(pro): results [] stock_list pro.stock_basic(exchange, list_statusL, fieldsts_code,name) batch_size 50 for i in range(0, len(stock_list), batch_size): batch stock_list.iloc[i:ibatch_size] for _, row in batch.iterrows(): try: df pro.daily(ts_coderow[ts_code], start_date20260101, end_date20260416) if df is None or len(df) 30: continue signal your_signal_logic(df) if signal: results.append({ code: row[ts_code], name: row[name], score: 80, reason: 你的选股理由 }) except Exception: continue gc.collect() return results跑一次python runner.py如果输出类似macd_golden: 选出 8 只 - output/selected_macd_golden_20260416.json说明选股链路通了。打开 JSON 确认结构正确。再验证 Hermes Agent 的模型调用。在微信上给 Hermes 发一条自然语言指令让它读取最新选股 JSON 并分析我在服务器上部署了一个量化选股程序每天下午4点会自动运行选股结果保存在 /root/quant/output/ 目录下文件名格式是 selected_策略名_日期.json。请你设置一个定时任务每天下午4点15分自动读取这个目录下最新的选股 JSON 文件对里面每只股票进行深度分析基本面、技术面、消息面给出综合评分然后把分析结果发给我。Hermes 会把这条指令沉淀为定时 Skill。如果它能回复确认并开始读取文件说明 settings 里的模型接入生效了。这一步验证的是三件套配置是否正确——如果 Base URL 或 Key 填错这里会直接报错。5. 本篇常见错排查401、local proxy failed 与 reading choices配置和验证过程中最容易踩的坑集中在模型接入和内存两块。下面按真实报错对照排查。第一个高频错误是 401 Unauthorized。现象是 Hermes Agent 调用模型时返回 401日志里能看到authentication failed或invalid api key。原因通常是 settings 里的api_key填错、过期或者复制时带了多余空格。排查方法打开~/.hermes/settings.json确认api_key字段是完整的sk-开头字符串没有换行和空格。如果确认无误还是 401去控制台重新生成一个 Key地址https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite替换后重启 Hermes。第二个错误是local proxy failed或连接超时。现象是模型调用卡住然后报网络错误。低配服务器网络出口不稳定时容易出现。排查先确认base_url是https://taotoken.net/api没有多余路径。然后在服务器上直接 curl 测试连通性curl -X POST https://taotoken.net/api/chat/completions \ -H Authorization: Bearer sk-你的密钥 \ -H Content-Type: application/json \ -d {model:你的模型ID,messages:[{role:user,content:hi}]}如果 curl 能通而 Hermes 不通说明是 Hermes 的 timeout 设太短把 settings 里的timeout调到 120 或更高。如果 curl 也不通检查服务器 DNS 和出网策略。第三个错误是reading choices相关报错通常表现为KeyError: choices或list index out of range。这说明模型返回的响应结构不符合预期常见原因是model_id填了一个不存在的模型或者请求体格式不对。排查确认model_id与控制台里可用的模型标识完全一致大小写敏感。另外检查 Hermes 版本是否过旧旧版本可能不兼容某些响应格式升级到最新版。第四个是内存相关现象是选股脚本跑到一半被系统 kill日志里出现Killed或MemoryError。这是 2G 机器的典型问题。排查确认策略里做了分批处理每批不超过 50 只每批结束gc.collect()。检查是否长期持有大 DataFrame用完就释放。可以用df.astype({vol: float32, amount: float32})降低内存占用。另外确认 Swap 已启用free -h能看到 4G Swap。第五个是hermes chat --message不生效。Hermes 的 CLI 是交互式终端对话不支持命令行参数直接发消息。正确做法是用 Hermes 内置 Cron 加微信指令对接不要试图用命令行一次性发送。第六个是hermes stop命令不存在。停止服务用sudo systemctl stop hermes不是hermes stop。第七个是 Tushare 接口频率限制请求过快返回空数据。每次请求后加time.sleep(0.12)并分批处理。非交易日 Cron 仍会触发在runner.py开头加交易日判断即可避免无数据可取。6. 语义一致 CTA把模型入口和接入文档收好整条链路跑通后你手里其实有两套需要长期维护的东西一套是 Hermes Agent 的模型接入配置一套是 Python 量化选股脚本。前者依赖 TaoToken 的 API 入口后者依赖 Tushare 和本地环境。模型接入这块建议把三件套记牢Base URL 用https://taotoken.net/apiAPI Key 在控制台管理Model ID 按需切换。如果你后续想换模型做对比分析直接改 settings 里的model_id就行不用动其他配置。想先在线试试模型效果可以用模型对话页面地址https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite。如果你打算长期跑编码或 Agent 类任务Coding Plan 页面有更细的说明地址https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。接入过程中遇到配置问题接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里面有各语言的调用示例。量化脚本这块核心是把runner.py的接口规范固定下来策略只暴露run(pro)返回标准 JSON。这样你后续加新策略、加回测、加跟踪都不用改调度逻辑。Backtrader 回测脚本可以单独跑用bt_runner.py对选股结果做历史验证确认策略在历史数据上的表现。最后给一个实用技巧低配服务器上选股程序作为一次性任务由 Cron 触发不要常驻。编译 Python 时先停其他服务释放内存装完再启动。pip 安装一律加--no-cache-dir。这三条能帮你避开大部分 OOM 问题。整套方案的价值在于用一台低配机器加开源工具链搭出一个全自动的 AI 量化分析助手Hermes 的自进化学习会让分析质量随使用时间逐步提升。
阅读完成 · 觉得有帮助?