# fulicaipiao **Repository Path**: numen06/fulicaipiao ## Basic Information - **Project Name**: fulicaipiao - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-22 - **Last Updated**: 2026-09-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 双色球研究所 · SSQ LAB FastAPI + React + shadcn/ui 的双色球历史数据与 Laya 决策模型实验网页。这里的 **Laya 是 Convai 的类型化决策模型**,不是 LayaAir 游戏引擎。 ## 功能 - 历史开奖:内置抓取并校验的 3,506 期历史快照(2003-02-23 至 2026-09-20),支持期号、日期、年份筛选,分页。 - 数据同步:优先中国福彩网近期接口,受限时使用公开镜像;失败保留缓存,显示数据截止时间和来源。服务启动后立即在后台检查,此后每 6 小时自动同步;公开页面每 5 分钟检查本地数据版本,回到页面时也会检查,不会触发外部抓取。仅管理员可手动检查开奖更新;服务端对并发同步加锁,5 分钟内重复请求复用结果。每次出现新开奖后,后台会自动依次重新跑八种策略的标准 100 期评估。 - 可视化:红蓝球频次、样本范围切换、冷热号码、当前遗漏、最近 20 期号码分布。 - 预测实验:八种策略都可生成下一期参考号码,每张策略卡显示历史验证期数、红球至少命中 3 个的比例及蓝球命中率;选中后另显示平均红球命中。综合策略由近期频率、均衡、高频和冷号方法生成 20 组新组合后经 Laya 排序;近期贝叶斯用最近 30 期红蓝球分别估计平滑频率、动态生成首选;随机策略用于对照。 - 策略表现:不设独立页面;后台管理仍展示八种策略的完整逐期评估汇总。标准口径为每期使用此前 100 期、连续验证 100 期;成绩不足时显示“待评估”,不阻止选号。 - 后台回测:管理员登录后可逐期滚动回测全部策略,只用目标期之前的数据;展示每期首选、实际开奖、红蓝球命中,与同期随机单注及精确随机分布参考区间对照。后台任务支持进度、停止、刷新恢复和持久化。 - 管理员登录:账号密码加图形验证码;验证码 3 分钟有效、一次性使用,登录尝试和验证码获取均限速。 - 用户账号:手机短信验证码注册,手机号和密码登录;用户与管理员使用独立登录页。收藏绑定用户账号并跨设备同步;“我的收藏”默认展示收藏列表,点击“自选号码”才打开手动选号。预测结果、自选与收藏号码均按近期贝叶斯策略评测所选号码:基于最近 30 期的平滑红蓝球频率,对恰好开出 6 个红球的组合计算模型估计常规奖匹配率、蓝球命中倾向;换号码或开奖数据更新时结果会变化。另展示所有单注相同的数学理论概率,手动选号还展示最近 100 期的历史匹配。模型估计未经未来开奖校准,不代表真实中奖概率或预测优势;特别奖项按当期公告另计。 - 免登录体验:预测实验室允许匿名使用 3 次,页面显示剩余次数;第 4 次提示登录,登录用户不受此试用次数限制。匿名次数在服务端记录,不能仅靠刷新页面重置。 - 校对调优:默认策略。先逐期隐藏已知答案,生成历史候选;根据更早期次的真实命中学习排序权重,再向后验证。展示原排序、调优首选、候选事后最优和实际变化。 - 预测账本:自动留存校对调优策略的下一期首选,开奖同步后自动对照;账本和回测明细只在后台显示。 - 动效:轨道球体、持续滚动球、真实候选批次与回测期数进度、已耗时、逐球弹性揭晓、结果进场,支持系统减少动态效果设置。 - 视觉:默认灰黑色夜间模式,页面、导航、卡片和表单均使用中性灰黑;双色球红蓝色留给号码球和少量强调。浏览器主题色及安装后启动背景也使用灰黑色。 - 短信指令:预测结果和收藏号码可设置正整数倍数并复制单注文本,按用户提供的 `00CP#01#红球号码*蓝球号码#倍数` 格式生成;号码补齐两位,红球升序。HTTP 页面提供剪贴板兼容处理,复制被禁止时显示手动复制文本。 - 手机布局:历史开奖和预测账本采用卡片;校对卡片上下展示预测与实际开奖,命中球点亮、未中球淡化,原排序和事后候选对照可展开。手机复制/收藏触控按钮为 44px。 - Docker:单镜像包含前端静态文件、FastAPI、Laya CPU 依赖;非 root 运行、健康检查、历史缓存及模型持久化。 纯 Laya 决策从此前开奖组合计算每个号码的频次、近 30/10/5 期频次、遗漏与时间衰减特征,让 Laya 分别评价 33 个红球和 16 个蓝球,独立取评分最高的 6 红 1 蓝;页面可以展开查看全部 49 个号码的评分。输入指纹包含完整历史样本、模型标识、权重版本、子目录和算法版本;不包含请求时间、同步时间或输出组数。综合策略使用此前开奖的近期频率、均衡、高频和冷号方法生成 20 组新组合,再交 Laya 逐注评选。校对调优保留原三源候选链路及对应评分缓存,不借用新综合策略的成绩。两者的 Laya 评分都未经彩票开奖概率校准。统计策略也按历史窗口和策略固定抽样种子,同样输入可复现。 校对调优在每次新期开奖后用此前 30 期重新评估原排序和三个学习权重,再生成下一期首选。最近 100 期的逐期成绩和“红球至少中 3 个”目标实验见 [动态调优阶段报告](analysis/动态调优阶段报告.md),旧版三源综合策略与开源 Hedge 挑战实验见 [策略命中与开源算法审计](analysis/策略命中与开源算法审计.md)。新策略的短期与长期成绩、梯度提升模型负面结果见 [贝叶斯与 GBDT 审计](analysis/贝叶斯与GBDT审计.md)。当前 [纯 Laya 逐球评分回测](analysis/逐球Laya回测.md) 与 [新综合策略回测](analysis/历史推演Laya回测.md) 分别保留,避免混淆成绩。目前历史数据没有显示稳定达到高命中率的证据,站点如实展示实测值。 ## Docker 一键运行 需要 Docker 与 Compose。默认使用 CPU,建议至少 4 GB 可用内存和 5 GB 可用磁盘;首次模型下载和加载期间网页的统计功能可正常使用。 ```bash python ops/setup_admin.py docker compose up -d --build ``` 网页:;右上角头像是普通用户入口,进入 `/login` 或 `/register`。管理员入口不在公开页面显示,直接访问 `/admin/login`,输入账号、密码和图形验证码。总览、历史、走势、预测、收藏和后台各有固定路径,刷新会留在当前栏目。API 文档:。后台账号和随机密码保存在本机 `.local/admin-login.txt`,哈希与会话密钥保存在 `.local/admin-auth.json`;两者均不会进入镜像或 Git。再次运行脚本不会覆盖原账号。 ```bash docker compose ps docker compose logs -f app curl http://localhost:18088/api/health curl http://localhost:18088/api/model ``` `/api/health` 检查网页和数据服务;模型是否可推理以 `/api/model` 的 `status: ready` 为准。首次启动从 Hugging Face 下载固定版本的多语言权重(约 647 MB)至 `models` 卷,网络较慢时需要等待。页面会轮询模型状态,加载失败后可点击重新加载。不会用统计抽样冒充模型输出。 停止而保留历史和模型: ```bash docker compose down ``` 更改端口或参数:复制 `.env.example` 为 `.env` 后修改,再运行 Compose。默认仅绑定本机 `127.0.0.1:18088`。公网 FRP 域名默认是 `ssq.feige.51jbm.cn`,同站点账号密码登录可经 HTTP 使用;其他域名须在 `.env` 中设置准确的 `ADMIN_PUBLIC_HOST`。登录和管理写操作校验 Host 与同站点 Origin,密码使用 PBKDF2 哈希保存,图形验证码只以图片传给浏览器,3 分钟有效且只能用一次。每个客户端 5 分钟最多尝试登录 10 次、获取验证码 30 次;会话 Cookie 为 `HttpOnly`、`SameSite=Strict`,HTTPS 入口下还会加 `Secure`。HTTP 传输本身不加密,正式环境建议补齐该域名证书。 开放手机注册时,在 `.env` 中填写 `ALIBABA_CLOUD_ACCESS_KEY_ID`、`ALIBABA_CLOUD_ACCESS_KEY_SECRET`、`ALIYUN_SMS_SIGN_NAME` 和 `ALIYUN_SMS_TEMPLATE_CODE`;签名、模板须在阿里云短信服务中审核通过,验证码模板使用 `${code}` 参数。密钥只由容器环境读取,不进入镜像。短信验证码 5 分钟有效;发送、校验和登录均有限速。用户账号、会话、收藏和匿名试用次数保存在数据卷的 `users.sqlite3` 中,请随数据卷一同备份。 若只需统计功能、不下载模型依赖: ```dotenv WITH_LAYA=false LAYA_ENABLED=false ``` 再执行 `docker compose up -d --build`。这是明确关闭模型的轻量模式,前端会显示 Laya 未启用。 ## 镜像交付 / 发布到服务器 构建结果为 `ssq-lab:1.0.0`。未预设第三方镜像仓库,不需要任何付费 API Key。 ```bash # 保存并在目标服务器导入 docker save -o ssq-lab-1.0.0.tar ssq-lab:1.0.0 docker load -i ssq-lab-1.0.0.tar # 将 compose.yaml 一起交付到服务器,运行预构建镜像 python ops/setup_admin.py docker compose up -d --no-build ``` 镜像包含依赖和历史快照,**不包含运行时下载的模型权重**。联网服务器首次启动会下载到模型卷。离线服务器还需迁移 `ssq-lab_models` 卷,或把预先下载的模型目录挂载进容器,设置 `LAYA_MODEL` 为容器内目录、`LAYA_SUBFOLDER` 为其中的模型子目录。 若有自己的仓库,将镜像标记为 `你的仓库/ssq-lab:1.0.0` 后执行 `docker push`,并相应修改 Compose 的 `image`。请勿把 `.env` 或模型访问令牌构建进镜像。 ## 当前机器的 FRP 域名 公网入口:,通过独立 `frpc` 服务转发到 Compose 网络中的 `app:8000`。使用现有 FRP 服务的域名解析与 HTTP 入口,不占用其他项目的代理。 ```powershell python ops/frp/configure.py --source D:/tools/frp/frpc-hz-web.toml docker compose -f compose.yaml -f compose.frp.yaml up -d --build docker compose -f compose.yaml -f compose.frp.yaml logs --tail 30 frpc ``` 连接配置和认证信息仅保存在被 Git / Docker 构建排除的 `.local/frpc.json`,以只读文件挂载,不写入镜像。`ssq-frpc:0.69.1` 从 FRP 官方发布的 Linux amd64 二进制构建,自动随 Docker 重启。直接在同一公网网站点击右上角头像登录后台;账号见 `.local/admin-login.txt`。当前域名尚无匹配的 HTTPS 证书,因此公网 HTTP 登录的密码传输未加密。 需要手动重跑完整标准口径时,在部署主机执行 `python ops/evaluate_strategies.py`;可在后面追加策略 ID(如 `balanced hot`)。脚本会把验证码图片写入本机 `.local/admin-captcha.png` 并提示输入,登录后删除图片。模型策略首次 100 期评估较慢,后台会保留逐期进度。 在其他机器部署时,将 `--source` 指向该机器已授权的 FRPC 配置,并通过 `--domain` 指定已解析到同一 FRP 服务器的域名。 ## 本地开发环境 Python 3.12,Node.js 22.12+。前后端分别启动: ```bash python -m venv .venv # Windows: .venv\Scripts\activate # Linux/macOS: source .venv/bin/activate pip install -r requirements.txt pip install -r requirements-model.txt --extra-index-url https://download.pytorch.org/whl/cpu # Windows PowerShell $env:LAYA_ENABLED='true' python -m uvicorn backend.main:app --reload --port 8018 # Linux/macOS: LAYA_ENABLED=true python -m uvicorn backend.main:app --reload --port 8018 ``` 另一个终端: ```bash npm ci npm run dev ``` 访问 。Vite 将 `/api` 代理至 `127.0.0.1:8018`。生产构建 `npm run build` 后,FastAPI 会直接提供 `dist/` 中的网页。 手动抓取: ```bash python -m backend.data ``` ## Laya 评估流程 使用 `laya==0.3.5`,`convaiinnovations/laya` 的 `multilingual` 子目录,固定 revision:`1c5edc17a7acd8701df6fc341c0d179f1c62c982`。通过 `LAYA_MODEL`、`LAYA_SUBFOLDER`、`LAYA_REVISION` 可以替换为其他兼容的 Laya 权重。更换仓库时也需更换 revision(或设为空以使用该仓库默认版本)。 1. 取选定窗口的历史记录,计算红球频次和和值均值。 2. 根据历史样本、模型与算法版本的 SHA-256 指纹,用独立伪随机源生成固定 20 个合法、不重复的候选组合;请求组数只影响输出截取。 3. 构建候选的红球和值、奇偶数量、三区间覆盖、平均出现次数等特征。 4. 调用真实 `laya.Agent.predict`,以 `score` 题型判断候选对给定历史特征标准的适配度(0 / 1 / 2 三个等级的期望值)。 5. 按模型评分降序、同分按号码升序排序,返回前 N 组、输入指纹、算法版本、实际模型名称、候选数与推理耗时。无模型或推理异常时返回 503,不悄悄回退。 Laya 是通用决策模型,基础权重保持固定。校对调优策略在它的评分之上学习候选排序,不是微调 Laya,也不是概率校准。**评分不是中奖概率,也没有证实能提升命中率。** 合法单式组合的头奖理论概率相同,为 `1 / (C(33, 6) × 16) = 1 / 17,721,088`。热点、冷号和均衡形态只反映采样偏好。 ## 数据来源和边界 - [中国福彩网开奖公告](https://www.cwl.gov.cn/ygkj/wqkjgg/ssq/):官方数据,当前环境直接访问可能被限制。 - [Justdoitfor/my-lottery-data](https://github.com/Justdoitfor/my-lottery-data):备用公开镜像,自述来源为 500.com 历史表。内置快照取自此源,保留原始期次并规范成七位期号。非官方担保数据,可能滞后。 - 获取时间、数据截止日期分别展示,不能把抓取成功当作已获取最新开奖。最近 100 期可在官方接口恢复后更新,更早期次保留已有镜像记录。 - 校验包括日期、期号年份、球号范围、红球唯一性、重复期次冲突;同步采用临时文件原子替换,不让失败更新覆盖缓存。 - 收藏仅存在当前浏览器 localStorage,最多 100 组;管理员账号只用于后台,不同步个人收藏。 ## 测试 ```bash pip install pytest python -m pytest -q npm test npm run build docker compose config --quiet ``` 测试覆盖记录规范化、异常数据拒绝、频次与遗漏、四种策略的合法性与唯一性、缓存回退、陈旧上游拒绝、API 参数校验、模型缺失响应和排序契约。排序契约测试使用替身;真实模型需在 `/api/model` 就绪后执行端到端请求: ```bash curl http://localhost:18088/api/strategy-evaluations ``` ## 目录 ```text backend/ FastAPI、同步缓存、统计选号、Laya 适配 data/snapshot.json 已抓取历史快照 src/ React 页面、动效、交互图表 src/components/ui/ shadcn/ui 源组件 tests/ 后端测试 Dockerfile Node 前端构建 + Python 运行镜像 compose.yaml 启动、健康检查及持久化卷 ``` 参考:[Laya 官方代码及 Apache-2.0 许可](https://github.com/NandhaKishorM/laya)、[模型权重](https://huggingface.co/convaiinnovations/laya)、[shadcn/ui](https://ui.shadcn.com/)、[FastAPI Docker 部署文档](https://fastapi.tiangolo.com/deployment/docker/)。 ## 滚动验证与预测账本 在“预测验证”页选择历史窗口、验证期数和可选结束期号。系统按时间由早到晚逐期验证,每次用此前完整 N 期生成一组首选,与下一期真实开奖比较,再向前推进一期。综合策略和 Laya 决策使用原排序;校对调优另设更早的学习窗口,不利用本期待验证答案调参。请求期间冻结历史快照;不同回测区间、策略、数据或模型版本各自留存。 随机仅作为回测对照,不再参与综合策略候选。随机单注每期红球命中均值为 36/33,蓝球为 1/16;参考区间按红球超几何分布、蓝球二项分布的精确卷积计算。区间外表现也需要新样本复核,重复挑选区间会造成选择偏差。这里没有把 Laya 0–2 的适配评分转换为中奖概率。 后台任务最多排队 4 个,单工作线程串行推理。长回测会让新预测排队,页面会显示等待状态;停止在当前推理批次结束后生效。刷新页面后按浏览器保存的任务编号继续查询。回测每完成一期就保存到历史数据卷的 `backtests.json`(最近 12 次),标准成绩另存于 `evaluations.json`;服务重启时未完成任务标为中断,已完成期次保留。回测任务和逐期结果仅管理员可读。 `AUTO_FORECAST=true` 默认开启每 30 秒的账本维护:检查是否已经为最新历史样本和当前模型版本保存校对调优首选,缺少时排队计算;使用 100 期历史窗口、30 期学习。首次准备需要数分钟,之后复用候选评分缓存;数据源更新后自动核对上一条。首次首选和时间记录写入 `forecasts.json`,重复请求不会覆盖首条,存储与应用重启无关。可设置 `AUTO_FORECAST=false` 关闭自动生成。自动开奖同步仍按 `AUTO_SYNC` 每 6 小时运行。 数据源只提供开奖日期,没有精确开奖时间;因此只有留存日期(北京时间)早于开奖日期,才能标为“已核验:开奖日前留存”。同日或晚于开奖日期的记录标为时间未核验,不计入已验证开奖前表现。若数据源滞后,下一期可能已经实际开奖,页面不将这样的事后记录冒充事前预测。 API:`POST /api/predictions`、`POST /api/backtests` 返回任务;`GET /api/jobs/{id}` 读取真实进度和结果;`POST /api/jobs/{id}/cancel` 请求停止;`GET /api/backtests` 查询已保存回测;`GET /api/forecasts` 查询预测账本。原同步 `/api/predict` 保持兼容。 滚动验证方法参考:[Forecasting: Principles and Practice — Time series cross-validation](https://otexts.com/fpp3/tscv.html)。 ## 校对、学习排序、后续验证 `forward-reranker-v1` 的流程:假设验证第 T 期,首先隐藏第 T 期及未来开奖,用 T 之前的窗口生成原三源候选。学习样本为 T 之前的 20–100 期(默认 30 期);每一个学习样本的候选与特征也只使用其自身更早的数据。 排序器使用 8 项特征:Laya 评分、红蓝球历史频次、红蓝球遗漏、奇偶均衡、和值接近度、区间覆盖。目标为每组红球命中数加蓝球命中数,不等同于中奖等级或奖金。每期内部中心化,按期等权,特征缩放仅由训练部分计算,使用岭回归学习排序权重。 内部按时间滚动验证最后约三分之一的学习期次,比较原 Laya 排序与固定正则强度 10、1、0.1;同分优先原排序,其次更强正则。选定参数后用此前全部学习样本拟合,冻结本期首选,最后才揭晓第 T 期、计算真实命中。其结果可以进入 T+1 的学习,但不会修改第 T 期已选号码。因此外层逐期结果评估的是“滚动学习”的整体流程,不能反过来用同一外层结果挑一个漂亮版本。 表格另外显示同一候选集中开奖后命中最多的组合,用来诊断排序漏选还是候选覆盖不足。这是事后上限,不能算预测成绩,更不能保证候选中会包含开奖号码。内部验证改善也不保证后续改善,页面保留负向变化。 无答案的候选评分缓存保存在数据卷 `candidate_scores/`,以历史样本、候选算法和模型版本指纹隔离;排序权重重新使用当前允许的历史答案拟合。修改调优规则时必须增加 `VERSION`,避免沿用旧任务结果或账本记录。预测输入指纹包含学习期数及学习所需的全部历史数据,重复请求和显示数量不会改变首选。 默认首次 30 期学习 + 10 期验证需要约 8–12 分钟(依机器而异);同一窗口重复计算可复用评分。回测 API 示例:`{"strategy":"calibrated","window":100,"warmup":30,"periods":10}`。当前下期预测与自动留存固定使用 30 期学习。 方法参考:[时间顺序交叉验证](https://sklearn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html)、[岭回归正则化](https://scikit-learn.org/1.8/modules/generated/sklearn.linear_model.Ridge.html)。测试覆盖训练/验证隔离、改动本期答案不影响本期首选、未来学习吸收已揭晓结果、同分回退、确定性和候选缓存。 ## 本地动态反馈实验(默认不启用) `backend/feedback.py` 实现红球生成权重和蓝球 16 个号码的独立学习。实验通过 `run_calibration(..., feedback=True)` 或 `rank_next(..., feedback=True)` 启用,使用独立的 `forward-feedback-v2` 版本和缓存指纹。它按每期此前已知结果更新生成偏好,重新产生历史策略候选,再调用 Laya 评分新组合;实际答案只影响后续期次。 生产 API 和自动留存仍默认使用 `forward-reranker-v1`,不开放未经验证的实验切换。这轮较长区间未证实动态蓝球评分的稳定优势,不能仅凭最近少量期次的提升推广。 本地数值筛选:`python ops/analyze_feedback.py`;与生产特征一致的动态反馈验证:`python ops/validate_dynamic_feedback.py`。前者比较 51 个红球、54 个蓝球参数组合,按时间将 2023–2024 年用于选择参数、2025 年起用于后续验证;后者验证预先定义的动态学习方法。分析过程中的逐期预测均只用过去数据,最终验证结果不可再用来调参后冒充未见数据。完整结果与方法边界见 `analysis/算法校对报告.md`。 真实 Laya 完整流程可通过 `python -m ops.evaluate_laya_feedback --periods 30 --strategy feedback` 复现;使用 `--strategy baseline` 对照现有重排方法。需要已安装模型依赖并设置 `LAYA_ENABLED=true`。结果写入本地 JSON,不修改线上策略或预测账本。