离线独立源码包
全套源码、量化数据、一键安装脚本与配置打包下载
包含完整算法引擎、全量行情 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 | 自托管JS | ECharts 5.5.0(避免 jsdelivr 国内被墙导致K线加载失败) |
| /opt/ipo-report/data/portfolio.db | SQLite ★ | 实盘持仓/交易流水/现金池(唯一有状态的数据库,需备份) |
| /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-21 | v1.0 | 系统上线:15年回测研报 + 静态HTML发布 |
| 2026-08-21 | v1.5 | Flask 动态化:自定义起止日期回测、实时决策引擎、实盘后台(/admin, admin/ipo2026)、主题与字号记忆、移动端适配 |
| 2026-08-24 | v2.0 | 新浪实时行情接入;K线弹窗(ECharts自托管, MA/BOLL/信号/回撤/高低点标注);止盈开关与门限/保留金额自定义;偏差率轮动+等权再平衡;北京时间统一 |
| 2026-08-25 | v2.1 | 修复K线JSON中NaN导致解析失败;新增策略说明书(/strategy.html)与部署文档(/deploy.html) |