事件驱动交易台维护技能
架构概览
零依赖事件驱动股票分析仪表板,部署在阿里云ECS (<SERVER_IP>)。
用户浏览器 → nginx (racingai.top) → Python HTTPServer (:5566)
├── GET /event-driven → 返回 HTML
├── GET /api/health → 健康检查
├── GET /api/market → 上证实时行情
└── POST /api/analyze → AI新闻分析
↓
news_analyzer.py
├── 百度千帆 LLM (ernie-4.5-turbo-128k)
└── 东方财富 API (实时行情)
文件位置(活跃部署):
/var/www/event-driven/event-driven-trader-dashboard.html— 独立 HTML 前端(含内嵌 CSS + JS,无外部依赖)/var/www/event-driven/server.py— 零依赖 Python HTTP 后端(纯标准库,兼容 Python 3.6+)/var/www/event-driven/news_analyzer.py— AI 新闻分析引擎
⚠️
/home/horserace/fintech/下有一份不完整的副本,不是活跃部署。始终修改/var/www/event-driven/下的文件。
调试 Pitfalls(必读)
Pitfall 1: 初始 HTML 硬编码演示数据
症状:页面某个区域"不随分析结果更新",始终显示固定内容(如中国电建、比亚迪等)。
根因:初始 HTML 中包含大量硬编码演示数据(~21KB),覆盖全部 7 个区域。即使 JS 渲染函数存在且被正确调用,页面初始加载时用户看到的是假数据。
修复模式:
- 检查 JS 渲染函数是否存在且在
runAnalysis()中被调用 - 检查初始 HTML 中是否有硬编码的演示数据(grep 标的名称如"中国电建")
- 将所有硬编码演示数据替换为"等待分析"空状态占位
- 确认
runAnalysis()在收到 API 响应后调用所有渲染函数
受影响区域(8个,全部需检查):
- 事件影响力面板(4 个指标卡)
- 板块影响热力(sector tiles)
- 标的共振排序(table tbody)
- 三维共振决策矩阵(SVG
<g id="matrixDataPoints">内的数据点) - 分析报告 → 事件解读 tab (
tab-event) - 分析报告 → 产业链拆解 tab (
tab-chain) - 分析报告 → 技术面详情 tab (
tab-tech) - 分析报告 → 操作建议 tab (
tab-action) - Pipeline 步骤描述(Pipeline desc)
Pitfall 2: 浏览器缓存旧版本
症状:修复已部署到服务器,但用户仍看到旧页面。
根因:server.py 的 _serve_html() 原本不设置 Cache-Control 头,浏览器缓存旧 HTML。
修复:_serve_html() 必须返回以下头:
self.send_header("Cache-Control", "no-cache, no-store, must-revalidate")
self.send_header("Pragma", "no-cache")
self.send_header("Expires", "0")
Pitfall 3: 服务器不支持 HEAD 方法
BaseHTTPRequestHandler 默认只处理 GET/POST,curl -I(HEAD)返回 501。用 curl -s 或 curl -sD- -o/dev/null 验证。
部署与重启
# 1. 上传修改后的文件
scp /local/file.html root@<SERVER_IP>:/var/www/event-driven/
# 2. 重启 systemd 服务(服务由 systemd 托管,勿用 fuser+nohup 手动重启,会与 systemd 冲突)
ssh root@<SERVER_IP> "systemctl restart event-driven"
# 3. 查看服务状态与日志
ssh root@<SERVER_IP> "systemctl status event-driven"
ssh root@<SERVER_IP> "journalctl -u event-driven -n 50"
# 4. 验证
ssh root@<SERVER_IP> "curl -s http://127.0.0.1:5566/api/health"
# 期望返回: {"status": "ok", "service": "event-driven-trader"}
后端 API 数据结构
POST /api/analyze 请求体:{"text": "新闻文本"}
响应 JSON 关键字段:
{
"event_type": "policy|earnings|industry|company|macro",
"event_title": "事件标题",
"event_summary": "事件摘要",
"market_impact": {"direction": "利好|利空|中性", "duration": "短期|中期|长期", "intensity": "high|medium|low"},
"affected_sectors": [{"sector": "板块名", "impact": "利好|利空", "reason": "原因"}],
"beneficiary_stocks": [{"name": "股票名", "code": "代码", "signal": "strong|medium|weak", "logic": "逻辑", "key_point": "关注点"}],
"risk_factors": ["风险1", "风险2"],
"signal_summary": "综合研判",
"confidence": "high|medium|low",
"disclaimer": "免责声明"
}
前端渲染函数链
runAnalysis() 在收到 API 响应后依次调用:
renderMetrics(data) → 事件影响力面板
renderSectors(data) → 板块影响热力
renderTargets(data) → 标的共振排序表
renderMatrix(data) → 三维共振决策矩阵 SVG
renderReport(data) → 分析报告(4个tab全部更新)
updatePipelineDesc(data) → Pipeline 步骤描述
验证清单
修改后必须验证:
grep -c '中国电建\|比亚迪\|隆基绿能'返回 0(无硬编码数据)grep -c '等待分析'返回预期数量(占位符存在)- 渲染函数数量正确(
grep -c 'function render') renderMatrix(data)和renderReport(data)在runAnalysis()中被调用- Cache-Control 头正确返回
- 端到端 API 测试通过(
POST /api/analyze返回有效数据)
详见 references/architecture.md 获取完整架构细节和区域映射。
