一、升级概览
2025 年 11 月 5 日至 6 日,TradingAgents-CN 完成了一次重要的 技术指标准确性 和 数据质量优化 工作。
本次更新通过 30 个提交,解决了 技术指标计算不准确、数据复权不一致、RSI 与同花顺不一致、工具反复调用、PDF 导出兼容性、绿色版服务管理 和 数据同步覆盖 等关键问题。
本次更新后,系统的 技术分析准确性、数据一致性、分析稳定性和部署易用性 都有明显提升。
核心改进
- 技术指标完整性:为 A股和港股 添加完整技术指标计算,包括 MA、MACD、RSI、BOLL。
- 数据复权对齐:Tushare 改用 前复权数据,与同花顺保持一致。
- RSI 计算优化:改用 中国式 SMA 算法,与同花顺、通达信计算方式对齐。
- 防止工具无限循环:为所有分析师添加 工具调用计数器,最多调用 3 次。
- 历史回溯优化:市场分析默认回溯天数提升至 365 天,保障 MACD、MA60 等指标稳定。
- PDF 导出增强:优化中文显示、表格分页,并支持 Docker 环境。
- 绿色版优化:新增停止服务脚本、端口配置说明和部署工具。
- 数据同步修复:修复成交量单位、时间显示、历史数据覆盖实时数据等问题。
二、技术指标准确性修复
2.1 问题背景
相关提交:
5359507:为 A股数据添加完整的技术指标计算。9b2ee38:为港股数据添加完整的技术指标计算。f9a0e98:修复所有数据源缺少技术指标计算的问题。28502e5:添加技术指标详细日志,便于对比验证。
用户反馈市场分析师的 技术分析不准确。排查后发现,A股和港股数据长期存在技术指标缺失问题。
主要问题
A股数据缺少技术指标
此前 A股数据只提供基本价格信息,例如开盘价、最高价、最低价、收盘价等 OHLC 数据,没有计算:
- MA5 / MA10 / MA20 / MA60
- MACD
- RSI
- BOLL 布林带
这会导致大模型只能基于价格走势进行判断,无法进行专业技术分析。
港股数据同样缺少技术指标
港股数据与 A股类似,也只有基本行情数据,缺少完整技术指标。
不同市场数据质量不一致
此前美股数据有完整技术指标,而 A股和港股没有,导致不同市场的分析质量差异较大。
部分数据源没有统一格式化
只有 Tushare 数据源调用了 _format_stock_data_response,MongoDB、AKShare、BaoStock 等数据源没有统一格式化,导致切换数据源或切换股票后,技术指标可能消失。
三、技术指标补齐方案
3.1 为 A股添加完整技术指标
系统在 tradingagents/dataflows/data_source_manager.py 中补充了完整技术指标计算。
# 计算移动平均线
data['ma5'] = data['close'].rolling(window=5, min_periods=1).mean()
data['ma10'] = data['close'].rolling(window=10, min_periods=1).mean()
data['ma20'] = data['close'].rolling(window=20, min_periods=1).mean()
data['ma60'] = data['close'].rolling(window=60, min_periods=1).mean()
# 计算 MACD
exp1 = data['close'].ewm(span=12, adjust=False).mean()
exp2 = data['close'].ewm(span=26, adjust=False).mean()
data['macd_dif'] = exp1 - exp2
data['macd_dea'] = data['macd_dif'].ewm(span=9, adjust=False).mean()
data['macd'] = (data['macd_dif'] - data['macd_dea']) * 2
# 计算 RSI
delta = data['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14, min_periods=1).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=14, min_periods=1).mean()
rs = gain / loss.replace(0, np.nan)
data['rsi'] = 100 - (100 / (1 + rs))
# 计算 BOLL
data['boll_mid'] = data['close'].rolling(window=20, min_periods=1).mean()
std = data['close'].rolling(window=20, min_periods=1).std()
data['boll_upper'] = data['boll_mid'] + std * 2
data['boll_lower'] = data['boll_mid'] - std * 2
3.2 为港股添加相同技术指标
港股数据在 tradingagents/dataflows/providers/hk/hk_stock.py 中添加相同技术指标计算逻辑,确保 港股技术分析 与 A股保持一致。
3.3 统一所有数据源格式化
MongoDB、AKShare、BaoStock 等数据源也统一调用 _format_stock_data_response。
# MongoDB 数据源
if mongo_data:
return self._format_stock_data_response(mongo_data, symbol, period)
# AKShare 数据源
if akshare_data:
return self._format_stock_data_response(akshare_data, symbol, period)
# BaoStock 数据源
if baostock_data:
return self._format_stock_data_response(baostock_data, symbol, period)
3.4 添加技术指标详细日志
为方便与同花顺、通达信等软件对比,系统增加了最近 5 个交易日的技术指标日志。
logger.info("[技术指标详情] ===== 最近5个交易日数据 =====")
logger.info(f"价格: 开={row['open']:.2f}, 高={row['high']:.2f}, 低={row['low']:.2f}, 收={row['close']:.2f}")
logger.info(f"MA: MA5={row['ma5']:.2f}, MA10={row['ma10']:.2f}, MA20={row['ma20']:.2f}, MA60={row['ma60']:.2f}")
logger.info(f"MACD: DIF={row['macd_dif']:.4f}, DEA={row['macd_dea']:.4f}, MACD={row['macd']:.4f}")
logger.info(f"RSI: {row['rsi']:.2f}")
logger.info(f"BOLL: 上={row['boll_upper']:.2f}, 中={row['boll_mid']:.2f}, 下={row['boll_lower']:.2f}")
3.5 修复效果
| 指标类型 | 修复前 | 修复后 |
|---|---|---|
| 移动平均线 | 无 | MA5、MA10、MA20、MA60 |
| MACD | 无 | DIF、DEA、MACD柱、金叉/死叉识别 |
| RSI | 无 | RSI14、RSI6、RSI12、RSI24 |
| BOLL | 无 | 上轨、中轨、下轨、位置百分比 |
| 数据源一致性 | 不一致 | 所有数据源统一格式化 |
四、Tushare 前复权数据对齐
4.1 问题背景
相关提交:
f49d403:Tushare 改用pro_bar接口获取前复权数据。0bd967d:修复pro_bar调用方式错误。
用户提出:“同步 Tushare 数据到 MongoDB 是用的前复权吗?同花顺采用的是前复权数据。”
排查后发现,Tushare 原来使用的是 daily() 接口,该接口返回 不复权数据,与同花顺默认使用的 前复权数据 不一致。
问题影响
- 不复权数据会导致历史价格不连续。
- 用不复权数据计算的 MA、MACD、RSI、BOLL 与同花顺差距较大。
- AKShare 和 BaoStock 已使用前复权,只有 Tushare 不一致。
4.2 解决方案
将 Tushare 日线数据从 daily() 改为 ts.pro_bar(),并设置 adj='qfq'。
修改前:
df = await asyncio.to_thread(
self.api.daily,
ts_code=ts_code,
start_date=start_str,
end_date=end_str
)
修改后:
df = await asyncio.to_thread(
ts.pro_bar,
ts_code=ts_code,
api=self.api,
start_date=start_str,
end_date=end_str,
freq='D',
adj='qfq'
)
4.3 复权方式对比
| 复权方式 | 说明 | 优点 | 缺点 | 使用场景 |
|---|---|---|---|---|
| 不复权 | 使用实际交易价格 | 真实价格 | 价格不连续 | 查看历史真实价格 |
| 前复权 | 以当前价格为基准调整历史价格 | 价格连续 | 历史价格不是真实成交价 | 技术分析 |
| 后复权 | 以上市价格为基准调整当前价格 | 价格连续 | 当前价格不是真实成交价 | 查看长期真实涨幅 |
4.4 修复后的数据源一致性
| 数据源 | 接口 | 复权方式 | 是否与同花顺一致 |
|---|---|---|---|
| Tushare | ts.pro_bar() | 前复权 adj='qfq' | 一致 |
| AKShare | stock_zh_a_hist() | 前复权 adjust="qfq" | 一致 |
| BaoStock | query_history_k_data_plus() | 前复权 adjustflag="2" | 一致 |
五、RSI 计算方法优化
5.1 问题背景
相关提交:
b2680dd:改用同花顺风格的 RSI 指标。050d03b/9cd5059:改用中国式 SMA 计算 RSI,与同花顺一致。
在数据改为前复权后,MACD 已经比较准确,但 RSI 仍然与同花顺不一致。
原因主要有两个:
- 系统原来使用 RSI14,属于国际常用周期。
- 同花顺常用 RSI6、RSI12、RSI24。
- 系统原来使用简单移动平均,而同花顺和通达信使用 中国式 SMA。
5.2 中国式 SMA 说明
同花顺和通达信中的 SMA 公式为:
SMA(X, N, M) = (M * X + (N - M) * SMA[i-1]) / N
等价于 pandas:
pd.Series(X).ewm(com=N-M, adjust=True).mean()
RSI 计算中通常 M=1,所以:
SMA(X, N, 1) = ewm(com=N-1, adjust=True).mean()
5.3 解决方案
新增同花顺风格 RSI 指标:
delta = data['close'].diff()
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
# RSI6
avg_gain6 = gain.ewm(com=5, adjust=True).mean()
avg_loss6 = loss.ewm(com=5, adjust=True).mean()
rs6 = avg_gain6 / avg_loss6.replace(0, np.nan)
data['rsi6'] = 100 - (100 / (1 + rs6))
# RSI12
avg_gain12 = gain.ewm(com=11, adjust=True).mean()
avg_loss12 = loss.ewm(com=11, adjust=True).mean()
rs12 = avg_gain12 / avg_loss12.replace(0, np.nan)
data['rsi12'] = 100 - (100 / (1 + rs12))
# RSI24
avg_gain24 = gain.ewm(com=23, adjust=True).mean()
avg_loss24 = loss.ewm(com=23, adjust=True).mean()
rs24 = avg_gain24 / avg_loss24.replace(0, np.nan)
data['rsi24'] = 100 - (100 / (1 + rs24))
同时保留 RSI14 作为国际标准参考。
5.4 RSI 趋势判断
系统还新增 RSI 趋势判断:
if rsi6 > rsi12 > rsi24:
rsi_trend = "多头排列"
elif rsi6 < rsi12 < rsi24:
rsi_trend = "空头排列"
else:
rsi_trend = "震荡整理"
5.5 RSI 计算方法对比
| 计算方法 | 公式 | 使用软件 | 特点 |
|---|---|---|---|
| 简单移动平均 | rolling(window=N).mean() | 国际标准 | 所有数据权重相同 |
| 中国式 SMA | ewm(com=N-1, adjust=True).mean() | 同花顺 / 通达信 | 历史数据递减权重 |
| Wilder’s Smoothing | ewm(alpha=1/N, adjust=False).mean() | 部分国际软件 | 指数平滑 |
六、防止工具反复调用
6.1 问题背景
相关提交:
81dbfab:修复基本面分析反复调用问题。0c04a81:修复基本面分析师工具调用计数器缺失问题。9d321f3:为所有分析师添加工具调用计数器,防止无限循环。ca95a14:在AgentState中添加工具调用计数器字段。
用户反馈 基本面分析反复调用几十次,与之前市场分析师的无限调用问题类似。
根本原因
- 基本面分析异常处理不完善,异常信息返回给 LLM 后,LLM 会尝试重新调用工具。
conditional_logic.py检查fundamentals_tool_call_count,但分析师没有正确设置该计数器。AgentState中没有显式定义计数器字段,LangGraph 不会合并未定义字段。- 市场分析师、新闻分析师、社媒分析师也存在类似风险。
6.2 解决方案
完善异常处理
try:
estimated_metrics = self._estimate_financial_metrics(...)
report = self._generate_full_report(...)
except Exception as e:
logger.warning(f"无法获取完整财务指标: {e}")
report = {
"基本信息": {...},
"行业分析": {...},
"数据说明": "当前无法获取完整财务数据,建议参考其他信息源"
}
在 AgentState 中添加计数器字段
class AgentState(TypedDict):
market_tool_call_count: int
fundamentals_tool_call_count: int
news_tool_call_count: int
sentiment_tool_call_count: int
所有分析师统一限制最大调用次数
current_count = state.get('fundamentals_tool_call_count', 0)
if current_count >= 3:
logger.warning(f"基本面分析工具调用已达到最大次数 ({current_count}),强制退出")
return {
"messages": [AIMessage(content="基本面分析完成")],
"fundamentals_tool_call_count": current_count
}
return {
"messages": [...],
"fundamentals_tool_call_count": current_count + 1
}
6.3 修复效果
| 分析师 | 修复前 | 修复后 |
|---|---|---|
| 市场分析师 | 无计数器 | 最大 3 次 |
| 基本面分析师 | 计数器未生效 | 最大 3 次 + 异常处理 |
| 新闻分析师 | 无计数器 | 最大 3 次 |
| 社交媒体分析师 | 无计数器 | 最大 3 次 |
七、历史数据回溯天数优化
7.1 问题背景
相关提交:
16afbb2:将市场分析回溯天数改为 250 天并添加配置验证日志。0b11498:技术分析时间调整为 365 天。
技术指标准确性依赖足够长的历史数据,尤其是 MACD 和 MA60。
技术原因
- MACD 使用 EMA12、EMA26,需要较长预热期。
- MA60 至少需要 60 天数据。
- 专业级技术分析建议使用 120-365 天 历史数据。
- 获取 365 天数据不会增加 Token 消耗,因为系统只把最后 5 天指标结果发送给 LLM。
7.2 配置调整
MARKET_ANALYST_LOOKBACK_DAYS=365
7.3 配置验证日志
lookback_days = int(os.getenv("MARKET_ANALYST_LOOKBACK_DAYS", "60"))
logger.info(f"市场分析回溯天数配置: {lookback_days} 天")
if lookback_days < 120:
logger.warning("回溯天数较少,可能影响 MACD 等指标准确性")
logger.warning("建议设置为 250-365 天")
7.4 数据量对比
| 回溯天数 | MACD 准确性 | MA60 可用性 | 推荐场景 |
|---|---|---|---|
| 30 天 | 不准确 | 不可用 | 不推荐 |
| 60 天 | 基本可用 | 可用 | 快速测试 |
| 120 天 | 较准确 | 可用 | 日常使用 |
| 250 天 | 准确 | 可用 | 专业分析 |
| 365 天 | 非常准确 | 可用 | 推荐配置 |
八、PDF 导出功能增强
8.1 问题背景
相关提交:
5526bc9:完善 PDF 导出功能,支持 Docker 环境。42a69b3:优化 WeasyPrint PDF 生成的 CSS 样式。6bfcde0:简化 PDF 导出,只保留 pdfkit。
此前 PDF 导出存在以下问题:
- 中文文本可能竖排显示。
- 表格分页不正常。
- Docker 环境缺少 PDF 生成工具和中文字体。
- WeasyPrint 依赖 Cairo,构建复杂且耗时。
8.2 CSS 样式优化
* {
writing-mode: horizontal-tb !important;
direction: ltr !important;
}
thead {
display: table-header-group;
}
tbody {
display: table-row-group;
}
tr {
page-break-inside: avoid;
}
8.3 Docker 环境支持
RUN apt-get update && apt-get install -y \
wkhtmltopdf \
pandoc \
fonts-noto-cjk \
&& rm -rf /var/lib/apt/lists/*
RUN pip install pdfkit python-docx
8.4 最终方案
最终 PDF 导出简化为:
- 移除 WeasyPrint。
- 移除 Cairo 相关依赖。
- 保留 pdfkit + wkhtmltopdf。
- 减少约 170 行代码。
- 提升 Docker 构建速度和兼容性。
8.5 方案对比
| 方案 | 中文显示 | 表格分页 | Docker 支持 | 构建时间 |
|---|---|---|---|---|
| Pandoc | 一般 | 一般 | 支持 | 快 |
| WeasyPrint | 好 | 好 | 构建慢 | 慢 |
| pdfkit | 好 | 好 | 支持 | 快 |
九、绿色版功能完善
9.1 停止服务脚本
相关提交:
cb789a3:添加绿色版全部停止服务脚本。f49ea3d:添加停止服务脚本部署工具。
新增脚本支持:
- 使用 PID 文件优雅停止服务。
- Nginx 使用
nginx -s quit优雅退出。 - 清理临时文件和 PID 文件。
- PID 文件失效时支持强制停止。
- 检查是否仍有进程运行,并给出提示。
使用方式:
# 批处理文件
停止所有服务.bat
# PowerShell 脚本
.\stop_all.ps1
# 强制停止
.\stop_all.ps1 -Force
9.2 端口配置文档
相关提交:
12f8d16:绿色版修改端口说明。97e6e11:添加 portable 脚本目录说明文档。
文档覆盖内容:
- 自动检测端口占用。
- 显示占用进程信息。
- 修改
.env文件。 - 修改
nginx.conf文件。 - 重启服务生效。
- 常见端口:8000、3000、6379、27017。
十、数据同步问题修复
10.1 成交量与成交额单位修复
相关提交:
4c885f0:修复成交量同步问题。a70e540:为成交量和成交额添加日期标签。
问题包括:
- Tushare 成交额单位是 千元,需要转换为元。
- 成交量和成交额缺少日期标签,难以判断数据是否为当天。
修复方案:
if 'amount' in data.columns:
data['amount'] = data['amount'] * 1000
quote = {
"volume": volume,
"amount": amount,
"tradeDate": trade_date,
"isToday": trade_date == today
}
10.2 时间显示修复
相关提交:
fe04d99:修复前端时间显示多加 8 小时的问题。
修复逻辑:
if (!dateStr.includes('Z') && !dateStr.includes('+') && !dateStr.includes('-')) {
dateStr += '+08:00'
}
10.3 避免历史数据覆盖实时数据
相关提交:
c0f185e:修复历史数据覆盖实时数据的问题,优化自选股同步策略。440ae8f:优化单个股票同步逻辑,避免历史数据覆盖实时行情。
问题表现:
- 先同步实时行情,数据日期为 11-05。
- 再同步历史数据,最新记录为 11-04。
- 历史数据覆盖了更新的实时行情。
修复方案:
existing_quote = db.market_quotes.find_one({"symbol": symbol})
if existing_quote:
existing_date = existing_quote.get('trade_date')
latest_date = latest_data.get('trade_date')
if existing_date > latest_date:
logger.info("market_quotes 中的数据更新,跳过覆盖")
return
10.4 历史数据同步日志增强
相关提交:
e693484:增强历史数据同步日志,诊断空数据问题。99b0e6b:增强 Tushare 历史数据同步错误日志。25acf24:添加缺失的trading_time工具模块。c6769962:优化单个股票实时行情同步逻辑。
新增诊断日志:
logger.info(f"{symbol}: 请求日线数据 start={start_date}, end={end_date}, period={period}")
if not data:
logger.warning("Tushare API 返回空数据")
logger.warning(f"参数: symbol={symbol}, ts_code={ts_code}, period={period}")
logger.warning(f"日期: start={start_date}, end={end_date}")
logger.warning("可能原因: 无交易数据、日期范围错误、代码格式错误、API限制或积分不足")
十一、统计数据
11.1 提交统计
| 类别 | 提交数 | 主要改进 |
|---|---|---|
| 技术指标 | 5 | A股/港股技术指标、详细日志、数据源统一 |
| 数据复权 | 2 | Tushare 前复权、调用方式修复 |
| RSI 计算 | 3 | 同花顺风格、中国式 SMA、趋势判断 |
| 防止循环 | 4 | 异常处理、计数器、AgentState 字段 |
| 回溯天数 | 2 | 250 天到 365 天、配置验证 |
| PDF 导出 | 3 | Docker 支持、CSS 优化、简化依赖 |
| 绿色版 | 4 | 停止脚本、端口配置、文档完善 |
| 数据同步 | 7 | 成交量单位、时间显示、覆盖问题、日志增强 |
| 总计 | 30 | - |
11.2 代码变更统计
| 指标 | 数量 |
|---|---|
| 修改文件 | 45+ |
| 新增文件 | 15+ |
| 新增代码 | 3000+ 行 |
| 删除代码 | 400+ 行 |
| 净增代码 | 2600+ 行 |
十二、核心价值
12.1 分析准确性提升
本次更新补齐了 A股和港股技术指标,并让数据复权、RSI 算法与同花顺保持一致。
核心成果:
- 技术指标从无到有。
- Tushare 前复权数据与同花顺对齐。
- RSI 使用中国式 SMA,与同花顺一致。
- 365 天历史数据保障指标预热充分。
预期效果:
- 技术分析准确性提升 80%+。
- 与同花顺指标差距小于 0.5%。
- 分析报告专业性显著提升。
12.2 系统稳定性提升
核心成果:
- 所有分析师工具调用最多 3 次。
- 异常时返回简化报告,而不是错误堆栈。
AgentState显式定义计数器字段。- 数据同步避免旧数据覆盖新数据。
预期效果:
- 无限循环问题完全解决。
- 系统稳定性提升 50%+。
- 用户体验显著改善。
12.3 功能完整度提升
核心成果:
- PDF 导出支持 Docker 环境。
- 绿色版新增停止服务脚本。
- 端口配置文档更完整。
- 成交量、时间、历史覆盖等数据问题全部修复。
预期效果:
- 功能完整性提升 30%+。
- 用户满意度提升 40%+。
- 部署便利性显著提升。
十三、升级指南
13.1 绿色版升级步骤
方法一:保留数据升级,推荐
适用场景:希望保留所有历史数据、配置和分析结果。
第一步:备份当前数据
$backupDate = Get-Date -Format "yyyyMMdd_HHmmss"
Copy-Item -Path "data\mongodb" -Destination "data\backups\mongodb_$backupDate" -Recurse
也可以使用 MongoDB 工具备份:
.\vendors\mongodb\mongodb-win32-x86_64-windows-8.0.13\bin\mongodump.exe `
--host localhost --port 27017 --db tradingagents `
--out "data\backups\mongodb_dump_$backupDate"
第二步:停止所有服务
停止所有服务.bat
或:
.\stop_all.ps1
第三步:备份配置文件
Copy-Item .env .env.backup_$(Get-Date -Format "yyyyMMdd")
Copy-Item -Path config -Destination config.backup_$(Get-Date -Format "yyyyMMdd") -Recurse
第四步:下载并解压新版本
下载最新绿色版压缩包,例如:
TradingAgentsCN-portable.zip
解压到临时目录,例如:
C:\Temp\TradingAgentsCN-portable-new
第五步:覆盖程序文件
$source = "C:\Temp\TradingAgentsCN-portable-new"
$target = "当前绿色版目录"
Copy-Item -Path "$source\tradingagents" -Destination "$target\tradingagents" -Recurse -Force
Copy-Item -Path "$source\app" -Destination "$target\app" -Recurse -Force
Copy-Item -Path "$source\web" -Destination "$target\web" -Recurse -Force
Copy-Item -Path "$source\scripts" -Destination "$target\scripts" -Recurse -Force
Copy-Item -Path "$source\frontend\dist" -Destination "$target\frontend\dist" -Recurse -Force
Copy-Item -Path "$source\*.ps1" -Destination $target -Force
Copy-Item -Path "$source\*.bat" -Destination $target -Force
Copy-Item -Path "$source\*.md" -Destination $target -Force
不要覆盖以下目录:
data\:MongoDB、Redis 数据。vendors\:MongoDB、Redis、Nginx、Python 等第三方工具。venv\:Python 虚拟环境。logs\:日志文件。runtime\:运行时配置。
第六步:更新配置文件
重点检查新增配置项:
MARKET_ANALYST_LOOKBACK_DAYS=365
如果旧 .env 中有 API Key、自定义端口等配置,请手动复制到新 .env 文件中。
第七步:启动服务
powershell -ExecutionPolicy Bypass -File .\start_all.ps1
第八步:验证升级
Get-Process | Where-Object { $_.Name -match "nginx|python|redis|mongod" }
Start-Process "http://localhost"
Get-Content logs\webapi.log -Tail 50
第九步:测试技术指标
- 访问
http://localhost。 - 登录系统。
- 打开任意股票,例如
000001或300750。 - 运行市场分析。
- 查看日志中的技术指标详情:
Get-Content logs\webapi.log | Select-String "技术指标详情"
13.2 Docker 版本升级步骤
方法一:使用 Docker Compose 升级,推荐
适用场景:使用 docker-compose.hub.nginx.yml 部署的用户。
第一步:备份 MongoDB 数据
docker exec tradingagents-mongodb mongodump \
--host localhost --port 27017 \
--username admin --password tradingagents123 --authenticationDatabase admin \
--db tradingagents \
--out /data/db/backup_$(date +%Y%m%d_%H%M%S)
第二步:备份配置文件
cp .env .env.backup_$(date +%Y%m%d)
cp nginx/nginx.conf nginx/nginx.conf.backup
第三步:拉取最新代码
git pull origin main
或下载最新源代码压缩包并解压。
第四步:拉取最新镜像
docker-compose -f docker-compose.hub.nginx.yml pull
docker images | grep tradingagents
第五步:停止并删除旧容器
docker-compose -f docker-compose.hub.nginx.yml down
docker image prune -f
第六步:更新配置文件
对比新旧配置:
diff .env.backup_$(date +%Y%m%d) .env.example
重点确认:
MARKET_ANALYST_LOOKBACK_DAYS=365
第七步:启动新版本
docker-compose -f docker-compose.hub.nginx.yml up -d
docker-compose -f docker-compose.hub.nginx.yml logs -f --tail=100
第八步:验证升级
docker-compose -f docker-compose.hub.nginx.yml ps
curl http://localhost/api/health
curl http://localhost
docker-compose -f docker-compose.hub.nginx.yml logs backend | tail -50
第九步:查看技术指标日志
docker-compose -f docker-compose.hub.nginx.yml logs backend | grep "技术指标详情"
十四、升级后验证清单
14.1 服务状态检查
绿色版:
Get-Process | Where-Object { $_.Name -match "nginx|python|redis|mongod" }
Docker 版:
docker-compose -f docker-compose.hub.nginx.yml ps
14.2 数据完整性检查
绿色版:
.\vendors\mongodb\mongodb-win32-x86_64-windows-8.0.13\bin\mongosh.exe --eval "
use tradingagents
print('股票日线数据:', db.stock_daily_quotes.countDocuments())
print('股票基本信息:', db.stock_basic_info.countDocuments())
print('自选股:', db.user_favorites.countDocuments())
"
Docker 版:
docker exec tradingagents-mongodb mongosh \
--username admin --password tradingagents123 --authenticationDatabase admin \
tradingagents --eval "
print('股票日线数据:', db.stock_daily_quotes.countDocuments());
print('股票基本信息:', db.stock_basic_info.countDocuments());
print('自选股:', db.user_favorites.countDocuments());
"
14.3 技术指标验证
打开任意股票,运行市场分析,并查看日志:
绿色版:
Get-Content logs\webapi.log | Select-String "技术指标详情"
Docker 版:
docker-compose -f docker-compose.hub.nginx.yml logs backend | grep "技术指标详情"
建议与同花顺对比:
- MA5 / MA10 / MA20 / MA60 差距小于 0.5%。
- MACD、DIF、DEA 差距小于 0.5%。
- RSI6 / RSI12 / RSI24 差距小于 0.5%。
- BOLL 上轨、中轨、下轨差距小于 0.5%。
14.4 功能测试
建议测试以下功能:
- 股票搜索。
- 自选股管理。
- 市场分析。
- 基本面分析。
- 新闻分析。
- 报告导出,包括 PDF 和 Word。
- 数据同步。
14.5 配置验证
绿色版:
Get-Content logs\webapi.log | Select-String "市场分析回溯天数"
Docker 版:
docker-compose -f docker-compose.hub.nginx.yml logs backend | grep "市场分析回溯天数"
日志中应显示:
市场分析回溯天数配置: 365 天
十五、常见升级问题
Q1:升级后技术指标还是不准确?
请检查回溯天数配置:
绿色版:
Select-String -Path .env -Pattern "MARKET_ANALYST_LOOKBACK_DAYS"
Docker 版:
grep MARKET_ANALYST_LOOKBACK_DAYS .env
应为:
MARKET_ANALYST_LOOKBACK_DAYS=365
如果仍不准确,可以清空旧 Tushare 缓存数据后重新同步。
绿色版:
.\vendors\mongodb\mongodb-win32-x86_64-windows-8.0.13\bin\mongosh.exe tradingagents --eval "
db.stock_daily_quotes.deleteMany({data_source: 'tushare'})
"
Docker 版:
docker exec tradingagents-mongodb mongosh tradingagents --eval "
db.stock_daily_quotes.deleteMany({data_source: 'tushare'})
"
然后访问:
http://localhost → 数据管理 → 同步历史数据
Q2:升级后 MongoDB 数据丢失怎么办?
可以从备份恢复。
绿色版:
.\vendors\mongodb\mongodb-win32-x86_64-windows-8.0.13\bin\mongorestore.exe `
--host localhost --port 27017 --db tradingagents --drop `
"data\backups\mongodb_dump_20251106\tradingagents"
Docker 版:
docker exec -i tradingagents-mongodb mongorestore \
--db tradingagents --drop /data/db/backup_20251106/tradingagents
Q3:升级后服务无法启动?
检查端口占用。
绿色版:
Get-NetTCPConnection -LocalPort 80,8000,6379,27017 -State Listen -ErrorAction SilentlyContinue
Docker 版:
netstat -tuln | grep -E '80|8000|6379|27017'
如果有端口冲突:
- 绿色版参考端口配置说明修改。
- Docker 版修改
docker-compose.yml中的端口映射,例如将80:80改为8080:80。
Q4:Docker 镜像拉取失败怎么办?
可以配置 Docker 镜像加速器,或本地构建镜像。
镜像加速器示例:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
重启 Docker 后重新拉取。
也可以本地构建:
docker-compose -f docker-compose.hub.nginx.yml build
Q5:绿色版升级后 vendors 目录损坏怎么办?
不要覆盖 vendors 目录。
如果不小心覆盖,需要重新下载完整绿色版压缩包,只提取 vendors\ 目录进行恢复。
十六、总结
本次更新通过 30 个提交,完成了 技术指标准确性 和 数据质量 的全面优化。
主要成果包括:
- 技术指标完整性:为 A股和港股添加完整的 MA、MACD、RSI、BOLL 计算。
- 数据复权对齐:Tushare 改用 前复权数据,与同花顺保持一致。
- RSI 计算优化:改用 中国式 SMA 算法,与同花顺、通达信一致。
- 防止无限循环:为所有分析师添加 工具调用计数器。
- 历史回溯优化:默认回溯 365 天,提升 MACD、MA60 等指标准确性。
- PDF 导出增强:支持 Docker 环境,完善中文显示和表格分页。
- 绿色版完善:新增停止服务脚本和端口配置文档。
- 数据同步修复:修复成交量单位、时间显示、历史数据覆盖等问题。
- 升级指导完善:补充绿色版和 Docker 版升级步骤、验证清单和常见问题。
这些改进显著提升了 TradingAgents-CN 的 分析准确性、系统稳定性、数据一致性和部署易用性,让技术分析报告更接近专业行情软件的计算结果,也为用户提供了更可靠的股票分析体验。
✅ 官方唯一渠道:📦 GitHub 仓库:https://github.com/hsliuping/TradingAgents-CN
Aekor AI-API 中转站,让全球顶尖 AI 大模型“触手可及”!你是否曾为这些烦恼头疼?
🔹 人在国内,却总被海外官网 API 的高延迟、掉线、甚至无法访问困扰?
🔹 想用最强的 GPT、Claude 等模型,却卡在海外信用卡、支付审核等重重阻碍?
🔹 官方 API 太贵?Aekor 为你打通“网络-支付-成本”的任督二脉!
💡 Aekor 核心价值:好用、便宜、快 💡
🚀 高速稳定,告别掉线国内专线加速,API 响应低延迟,告别「转圈圈」的焦虑,开发效率瞬间拉满!
🧠 顶尖模型,随需而调涵盖 GPT 系列、Claude 系列等全球主流大厂模型,一次接入,轻松调用!
🎁 免费白嫖,诚意拉满!
注册即送 20 美元体验额度,够你狠狠测试一轮模型质量与线路稳定性了!
⚠️ 温馨提示:API 中转市场虽多但良莠不齐(甚至有些会偷工减料换小模型糊弄事儿)。Aekor 坚持提供正版稳定的服务,但还是建议:先用免费的 20 刀测试是否契合自身需求,满意了再小额充值上车,理性消费不盲目。
文章评论