系统部署与运维文档

A股打新门票量化系统 · 运行于 Oracle VPS「va」 · v2026.08

离线独立源码包

全套源码、量化数据、一键安装脚本与配置打包下载

包含完整算法引擎、全量行情 Parquet 数据、实盘 SQLite、前端页面及一键部署脚本 install.sh

一、 系统架构总览

用户浏览器
   │  https
   ▼
Caddy (0.0.0.0:443, 自动TLS证书, 强制HTTPS)
   │  reverse_proxy 127.0.0.1:8099
   ▼
Flask 应用 (app.py, systemd 托管, 端口 8099)
   ├── GET  /            → index.html   前台研报+回测+决策
   ├── GET  /admin       → admin.html   实盘后台(需登录)
   ├── GET  /strategy.html              策略设计说明书(公开)
   ├── GET  /deploy.html                部署运维文档(后台入口)
   ├── POST /api/run_backtest           动态回测引擎
   ├── GET  /api/decision_data          实时多因子评分(新浪行情)
   ├── GET  /api/stock_kline            K线+技术指标(本地OHLCV)
   └── /api/auth/* /api/portfolio/*     实盘CRUD(SQLite)
  • 服务器:Oracle Cloud VPS「va」(aarch64 / Ubuntu 22.04,内网 10.0.0.3,公网 150.230.136.64);
  • 域名:ipo.va.485494.xyz → DNS A 记录指向 VPS 公网 IP,Caddy 自动申请/续期 Let's Encrypt 证书;
  • 依赖:Python 3.10 + Flask 3.x + pandas + numpy + pyarrow + yfinance + requests + pytz;前端 TailwindCSS/Chart.js/FontAwesome CDN + 自托管 ECharts。

二、 文件清单与路径

路径 类型 说明
/opt/ipo-report/app.py应用入口Flask 主应用:全部 API 路由、实时评分引擎、K线接口、实盘 CRUD、鉴权(ADMIN_USER / ADMIN_PASS 定义于此)
/opt/ipo-report/backtest_engine.py回测引擎多因子打分 + 资金流模拟(止盈/偏差率/等权再平衡/费用模型)
/opt/ipo-report/index.html前台页面回测概览 + 决策依据 + K线弹窗(主题/字号本地记忆)
/opt/ipo-report/admin.html后台页面实盘持仓录入/同步/审计(Session 鉴权)
/opt/ipo-report/strategy.html公开文档策略设计说明书(前台头部有入口链接)
/opt/ipo-report/deploy.html运维文档本页面(后台头部有入口链接)
/opt/ipo-report/static/echarts.min.js自托管JSECharts 5.5.0(避免 jsdelivr 国内被墙导致K线加载失败)
/opt/ipo-report/data/portfolio.dbSQLite ★实盘持仓/交易流水/现金池(唯一有状态的数据库,需备份)
/opt/ipo-report/results_latest.json预计算首页默认展示的回测结果(由导出脚本生成)
/root/ipo_ticket_strategy/prices_clean.parquet行情数据 ★38 只标的+指数的收盘价(前复权),回测与评分的数据源
/root/ipo_ticket_strategy/ohlcv_clean.parquet行情数据 ★OHLCV 全字段(K线弹窗数据源)
/etc/caddy/Caddyfile反代配置ipo.va.485494.xyz → 127.0.0.1:8099(同机还有 al/opencode 站点)
/etc/systemd/system/ipo-app.service服务单元开机自启、崩溃自动重启(Restart=always, 3s)

三、 常用运维命令

服务管理
systemctl status  ipo-app        # 查看运行状态
systemctl restart ipo-app        # 重启(改完 app.py / backtest_engine.py 后必须执行)
systemctl stop    ipo-app
journalctl -u ipo-app -f         # 实时日志(排查 500 错误必看)
journalctl -u ipo-app -n 50      # 最近50行日志
Caddy 反代管理
caddy validate --config /etc/caddy/Caddyfile   # 改配置后先验证
systemctl reload caddy                          # 平滑重载
systemctl restart caddy                         # 硬重启(证书异常时)
行情数据更新(建议每月或需要时执行)
python3 -c "
import yfinance as yf, pandas as pd, datetime
df_old = pd.read_parquet('/root/ipo_ticket_strategy/prices_clean.parquet')
tickers = list(df_old.columns)
end = datetime.date.today().strftime('%Y-%m-%d')
df_new = yf.download(tickers, start='2009-01-01', end=end, auto_adjust=True, progress=False)
df_new['Close'].to_parquet('/root/ipo_ticket_strategy/prices_clean.parquet')
df_new.to_parquet('/root/ipo_ticket_strategy/ohlcv_clean.parquet')
print('updated to', end)"

注意:决策页的「当前价格/涨跌幅」是实时行情(新浪接口)无需更新;parquet 影响的是历史因子(波动率/回撤/均线)、回测与K线。

实盘数据库备份与恢复
# 备份(建议每周)
cp /opt/ipo-report/data/portfolio.db /root/backup/portfolio.$(date +%F).db

# 恢复
systemctl stop ipo-app
cp /root/backup/portfolio.2026-08-25.db /opt/ipo-report/data/portfolio.db
systemctl start ipo-app

四、 后台账号与安全

  • 后台入口:https://ipo.va.485494.xyz/admin;默认账号 admin / 密码 ipo2026(Session 鉴权,浏览器会话内有效);
  • 修改密码:编辑 /opt/ipo-report/app.py 顶部 ADMIN_USER / ADMIN_PASS,然后 systemctl restart ipo-app;
  • 前台回测/决策/K线为只读公开接口,不涉及资金操作;所有写入操作(持仓录入/删除/现金池修改/同步市价)均需登录;
  • 建议后续增强:Caddy 层加 IP 白名单或 basic_auth、启用 fail2ban、定期轮换密码。

五、 常见问题排查(FAQ)

Q1:页面打开是 502 Bad Gateway?

Flask 挂了。systemctl restart ipo-app,然后 journalctl -u ipo-app -n 30 看崩溃原因(通常是改了 app.py 有语法错误——改完先 python3 -c "import app" 验证再重启)。

Q2:决策页点「立即计算」报错或价格为 0?

新浪行情接口限流/被墙。curl 'https://hq.sinajs.cn/list=sh600900' -H 'Referer: https://finance.sina.com.cn' 在服务器上测试连通性;一般几分钟后自动恢复。

Q3:K线弹窗「图表库加载失败」?

自托管 ECharts 文件丢失。检查 /opt/ipo-report/static/echarts.min.js 是否存在(约 1MB),或从 https://cdn.jsdelivr.net/npm/echarts@5.5.0/dist/echarts.min.js 重新下载。

Q4:回测报 500 / ModuleNotFoundError?

backtest_engine.py 不在运行目录。确认 /opt/ipo-report/backtest_engine.py 存在且 service 的 WorkingDirectory=/opt/ipo-report。

Q5:证书过期/HTTPS 报错?

Caddy 自动续期,若失败检查 443/80 端口可达与 DNS 解析:journalctl -u caddy -n 30。

六、 版本变更记录

日期版本变更内容
2026-08-21v1.0系统上线:15年回测研报 + 静态HTML发布
2026-08-21v1.5Flask 动态化:自定义起止日期回测、实时决策引擎、实盘后台(/admin, admin/ipo2026)、主题与字号记忆、移动端适配
2026-08-24v2.0新浪实时行情接入;K线弹窗(ECharts自托管, MA/BOLL/信号/回撤/高低点标注);止盈开关与门限/保留金额自定义;偏差率轮动+等权再平衡;北京时间统一
2026-08-25v2.1修复K线JSON中NaN导致解析失败;新增策略说明书(/strategy.html)与部署文档(/deploy.html)