ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【实战】低配云服务器部署 Hermes Agent + Python 量化选股全流程:把 settings 改到 TaoToken

【实战】低配云服务器部署 Hermes Agent + Python 量化选股全流程:把 settings 改到 TaoToken

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 拉取盘后数据,按策略筛选,输出标准 JSON;Hermes 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_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite。Model ID 根据你选的模型填,比如常用的对话模型 ID,具体以文档为准,文档地址https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite。

这里要提醒一句: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.6,Tushare 和 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防止安装过程中 OOM:

mkdir -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_TOKEN="your_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_code='000001.SZ', start_date='20260401', end_date='20260416') 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_ok=True) filepath = f"output/selected_{strategy_name}_{today}.json" with open(filepath, "w", encoding="utf-8") as f: json.dump(output, f, ensure_ascii=False, indent=2) 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(exchange='SSE', is_open=1, start_date=today, end_date=today) 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_status='L', fields='ts_code,name') batch_size = 50 for i in range(0, len(stock_list), batch_size): batch = stock_list.iloc[i:i+batch_size] for _, row in batch.iterrows(): try: df = pro.daily(ts_code=row['ts_code'], start_date='20260101', end_date='20260416') 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_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite,替换后重启 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/api,API Key 在控制台管理,Model ID 按需切换。如果你后续想换模型做对比分析,直接改 settings 里的model_id就行,不用动其他配置。想先在线试试模型效果,可以用模型对话页面,地址https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite。如果你打算长期跑编码或 Agent 类任务,Coding Plan 页面有更细的说明,地址https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite。接入过程中遇到配置问题,接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,里面有各语言的调用示例。

量化脚本这块,核心是把runner.py的接口规范固定下来:策略只暴露run(pro),返回标准 JSON。这样你后续加新策略、加回测、加跟踪,都不用改调度逻辑。Backtrader 回测脚本可以单独跑,用bt_runner.py对选股结果做历史验证,确认策略在历史数据上的表现。

最后给一个实用技巧:低配服务器上,选股程序作为一次性任务由 Cron 触发,不要常驻。编译 Python 时先停其他服务释放内存,装完再启动。pip 安装一律加--no-cache-dir。这三条能帮你避开大部分 OOM 问题。整套方案的价值在于用一台低配机器加开源工具链,搭出一个全自动的 AI 量化分析助手,Hermes 的自进化学习会让分析质量随使用时间逐步提升。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进