Oracle3
Open-source trading engine and MCP server for prediction markets. Fee-aware no-arbitrage trading across related contracts, live on Kalshi, Polymarket and Solana or on paper.
一个分数看清短线情绪,一只股票看懂趋势结构、胜率与赔率。
Translation pending
FinanceGitHub @leemuweiuiuxOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A股短線情緒看板與個股技術分析:**https://lfjmwl.com**(Vercel 預設網址 stockmarketshortemotion.vercel.app 也可用)。
由 twsvp-frontend 的「短線情緒」原樣遷出(來源 69593b1,PR #126),獨立部署。twsvp.com 保留自己的短線情緒頁面,兩站各自取數、互不依賴。
| 網址 | 內容 |
|---|---|
/about | 介紹頁(公開):產品介紹、今日情緒分數、底部「登录」按鈕 |
/login | 登入頁:輸入郵箱 → 同一頁填驗證碼,免費註冊 |
/home | 首頁(需登入):積分與簽到、個股技術分析輸入框、今日短線情緒(分數、階段、市場概況)、當日題材異動(可直接解鎖) |
/technicalanalysis | 個股技術分析(需登入,每次分析扣 10 積分) |
/shortemotion/cn | 短線情緒 · A股(需登入) |
/limitup | 漲停情緒(需登入,整頁須解鎖:10 積分 / 12 小時):漲停天梯、跌停股、晉級率、題材強弱與今日亮點 |
/ | 已登入 → /home;未登入 → /about |
/cn、/cn-short-emotion、/short-emotion | 舊網址,轉到上面的新網址 |
/tw、/tw-short-emotion、/shortemotion/tw、/shortemotion/hk | 已下線的台股、港股看板,轉到 A股看板 |
每個看板放在自己的資料夾(/看板名/…),以後新增看板照同樣方式加。
Supabase Cron(supabase/migrations/20261023033000_cron_dispatch.sql,工作日北京時間 09:02、09:32–11:32、13:02–15:02 每 30 分鐘;早報 06:50)
└─ POST /api/cron → 經 GitHub API 手動運行工作流(準點觸發;GitHub 自帶的定時常晚 25–30 分鐘,還會整次丟掉)
GitHub Actions(.github/workflows/short-emotion.yml;A股盤中每 30 分鐘、新聞每小時。自帶的定時 09:07–16:37 每 30 分鐘留作備用,同一時段只呼叫一次 Wind;延遲到窗口外時自動補抓 11:30 / 15:00 收盤快照)
└─ scripts/short-emotion/refresh.mjs 呼叫 Wind MCP 計算快照
└─ 強制推送到 short-emotion-data 分支
Vercel
├─ middleware.js 打開看板前檢查登入(未登入 → /login?next=原網址)
├─ public/about/、public/login/ 介紹頁、登入頁(共用 public/shared/lang.js 簡繁切換)
├─ public/short-emotion/ 短線情緒看板頁面
├─ public/home/、public/technical-analysis/ 首頁、個股技術分析頁面(共用 public/shared/nav-account.js)
├─ public/limitup/ 漲停情緒頁面
├─ api/limitup.js 漲停情緒:只讀資料分支(4 個數字免費,其餘須解鎖)、解鎖扣積分
├─ api/auth.js 登入:驗證碼通過後把憑證寫進 HttpOnly cookie、查詢登入狀態、退出
├─ api/short-emotion.js 只讀資料分支(summary 公開,其餘需登入);POST action=refresh 觸發上面的工作流
└─ api/technical-analysis.js 個股技術分析:由網站伺服器直接呼叫 Wind MCP(需要 WIND_API_KEY),扣積分
Supabase Auth 寄送與驗證郵箱驗證碼(經 Resend 寄出,不使用資料表)
短線情緒的頁面不直接呼叫 Wind,「刷新」觸發 GitHub Actions 取數。個股技術分析例外:每次查詢的股票不同、無法事先算好,所以由 api/technical-analysis.js 直接呼叫 Wind。
api/_lib/technical-analysis/engine.js,照原版搬過來,只換了 Wind 呼叫方式、日期按北京時間、輸出不標注數據來源)。supabase/migrations/20261021b_analysis_history.sql,每人保留最近 10 筆,只有本人看得到)。首頁與個股分析頁的輸入框下方顯示最近 3 條(同一支股票只留最新一次),點開直接看當時的結果(/technicalanalysis?id=<記錄>),不調用行情、不扣分;頂部標明分析時間,「重新分析」才扣分。/technicalanalysis 直接分析;網址上的 ?q= 只預填、不自動分析(避免打開分享連結就扣分)。WIND_API_KEY(Production);Supabase SQL Editor 執行 supabase/migrations/20261021_points_analysis.sql。沒有 Key 時頁面顯示「暫未開通」,不扣分。(n−1)/n);空表为0、未返回payload为未知。原版缺失数据兜底及诊断口径不另作优化。[2.5%, 5.5%),按题材归属、涨幅、量比、换手、成交额及题材分钟动能评分。领涨优先最早封板;龙头按归属评分与涨幅;中军按成交额/市值排名,字段不足时按涨幅中位兜底。batch 标签文案,避免原版出现 undefined;当前已有“启动”文案继续保留。台股、港股看板已於 2026-10-18 移除(程式與歷史資料一併刪除)。
POST /api/auth?action=session,伺服器寫入兩個 HttpOnly cookie(se_at、se_rt,SameSite=Lax)。api/_lib/supabase-public.js(只放公開的 Publishable key);本地或測試可用 SHORT_EMOTION_AUTH=off 關閉登入。[email protected]),郵件範本改為顯示驗證碼 {{ .Token }};
寄信上限 20 封/小時,登入請求 10 次/5 分鐘/IP。Resend 免費版每天 100 封、每月 3000 封。daily_active 表每人每天一行,只記「哪天來過」(不記看了哪個市場、用了哪個功能)。
打開看板時由 middleware 寫入(每人每天一次,se_seen cookie 去重);寫入用登入用戶自己的憑證呼叫 record_activity(),
不需要 secret key,函數每次寫入時順手刪除 30 天前的記錄。SQL 見 supabase/migrations/(依檔名順序執行)。/_vercel/insights/script.js,在 Vercel 專案的 Analytics 查看。需要先在 Vercel 專案的 Analytics 頁按 Enable。activity_summary(註冊數、近 7 天新註冊、今日 / 7 天 / 30 天活躍)與 activity_daily(每天活躍人數)。
表與視圖都不對網站訪客開放。/account(需登入):姓名、郵箱(只讀)、電話(區號 + 手機號,不做驗證碼)。full_name / display_name、phone_country_code、phone_number),
透過 GET / POST /api/auth?action=profile 用登入用戶自己的憑證讀寫,不另建表;Supabase 後台 Users 的 Display name 會顯示姓名。/account 的「外觀」:白版、黑版、自適應(預設,跟隨系統深淺色)。記在這台裝置的瀏覽器(localStorage twsvp_theme,沿用 TWSVP 時期的鍵名),所有頁面打開時讀取。se_rf cookie,10 分鐘有效)。定時更新照舊,不扣分。supabase/migrations/20261020_points.sql,在 SQL Editor 執行一次),只能經由 points_* 函數用登入者自己的憑證存取;
流水只記類型(註冊贈送/簽到/刷新/解鎖異動/退回),永久保留。營運概況:select * from points_overview;/account 顯示餘額、簽到按鈕與積分記錄。同一個 Vercel 專案順便提供設計 Demo,和看板互不影響:
public/demo/<名稱>/index.html,網址是 https://demo.lfjmwl.com/<名稱>(vercel.json 開頭兩條帶 has: host 的改寫)。demo.lfjmwl.com/ 由 middleware.js 送到 /like(點讚反饋 Demo,手機版:單擊/雙擊/連擊 × 顏色/動畫/文字共 9 種條件,底部淺色按鈕切換與重置;網址後加 #double-anim 等可直接打開某個條件)。/ → /about 的跳轉加了 missing: host,不作用在 demo 網域;demo 網域上看板相關網址照常需要登入。npm run dev 後打開 http://localhost:3000/demo/like/index.html 。demo.lfjmwl.com;若 lfjmwl.com 的 DNS 不在 Vercel,到 DNS 服務商加 CNAME demo → cname.vercel-dns.com。WIND_API_KEY。
沒設定之前,定時任務會自動跳過(只留一條警告),不會寄失敗通知。vercel.json 已指定輸出目錄 public)。GITHUB_ACTIONS_TOKEN:GitHub fine-grained token,只授權本倉庫,
權限 Actions: Read and write、Contents: Read-only。沒有它頁面照常顯示,只是「刷新」不可用。WIND_API_KEY:個股技術分析用(可與 GitHub Actions 同一把)。沒有它個股分析顯示「暫未開通」。supabase/migrations/20261023033000_cron_dispatch.sql 開頭的步驟):Supabase Vault 生成密鑰 shortemotion_cron_secret,
同一個值填到 Vercel 環境變數 CRON_SECRET 並 Redeploy,再在 SQL Editor 執行該檔案。沒做之前只靠 GitHub 自帶的定時(會延遲)。npm install
npm test # 單元測試
npm run dev # http://localhost:3000 ,預設讀線上資料分支,登入用真實 Supabase
SHORT_EMOTION_AUTH=off npm run dev # 不登入直接看看板
SHORT_EMOTION_DATA_DIR=./short-emotion-data npm run dev # 改讀本地檢出的資料分支
SHORT_EMOTION_AUTH=off WIND_MOCK=1 npm run dev # 個股技術分析用離線樣本(樣本電子 603936、樣本新材 300986 等)
手動跑一次取數(需要 WIND_API_KEY):WIND_API_KEY=... npm run refresh -- --force --market=all
main 是線上版本,受保護規則限制,所有改動都走「分支 → PR → 合併」。流程、分工與衝突處理見 CONTRIBUTING.md。
分享長圖、小卡底部附二維碼(public/short-emotion/qr-site.svg,指向 https://lfjmwl.com:已登入進看板、未登入到介紹頁);網址改了用 python3 scripts/short-emotion/build-share-qr.py 重新產生。
Logo:紅色實心方塊反白,L 與 J 合起來是一個 D(public/short-emotion/logo.svg);分頁圖示另有 favicon-32.png、/favicon.ico,手機桌面圖示 /apple-touch-icon.png。
twsvp_theme、twsvp_price_scheme;樣式檔仍叫 twsvp.cssapi/_lib/limitup/engine.js,对应原版 limit-engine.js),计算口径不改。只改了接线:
api/_lib/limitup/themes.js;短线情绪 v4 评分与题材雷达仍用自己的词表,两边互不影响,题材名偶尔对不上属于预期。api/_lib/short-emotion/engine.js,与短线情绪在同一次更新里共用,不重复取数。schedule.js 的 limitup,交易时段每 30 分钟,11:30 / 15:00 收盘补抓;当日已有 15:00 之后的收盘快照就不再重算)。用户点「刷新」(−5 积分)会一并重算。
kv/limitup_news-cache_<日期>.json,同一只股票当天只查一次资讯,之后的更新只查新出现的涨停股。limitup_latest(最新)、limitup_day_<日期>(每日定格,「较上日」用上一交易日这份,保留 90 天)、资讯缓存(保留 3 天)。/limitup 整页须解锁,−10 积分,12 小时内首页天梯与整页都能看。与题材异动的解锁分开计算、分开扣分;不限额账号不扣分。未解锁时接口只返回 4 个数字,不返回个股。supabase/migrations/20261027090000_limitup_unlock.sql(新增 points_limitup_status、points_unlock_limitup 与流水类型「解锁涨停情绪」)。没执行之前页面显示「积分服务暂时不可用」,不扣分。合并后数据任务跑过一次才有数据,之前页面显示「暂无快照」。首页最下方展示最新一期(标题、板块、100—150字摘要);点击进入 /kandian/article?id=YYYYMMDD。/kandian?tab=reports 倒序分页保留全部文章,?tab=views 保留原观点预览。阅读不扣积分,接口需登录。
生成由 .github/workflows/morning-report.yml 执行,复用 Wind MCP 和数据分支,不新增数据库。北京时间工作日06:50由 Supabase Cron 准点触发生成(同上,经 /api/cron),GitHub 自带的06:50、07:10、07:30定时留作备用补跑;接口在07:20前隐藏当日内容。GitHub定时任务可能延迟,因此07:20是最早可见时间,不能保证准点完成。与原行情任务使用相同并发组,避免覆盖数据。已生成的日期不重写,已报道的行情日不重复生成;失败不写索引、保留上一期。首次节假日仍可能总结未报道的上一交易日(尚未接入权威的前瞻交易日历),后续无新收盘数据则跳过。
启用前在GitHub配置:
WIND_API_KEY:沿用现有配置。MORNING_REPORT_API_KEY:模型接口密钥。MORNING_REPORT_BASE_URL:支持 /chat/completions 的HTTPS API基础地址,通常以 /v1 结尾。MORNING_REPORT_MODEL:该接口支持的模型ID;须支持JSON模式和足够长的上下文。可使用提供兼容接口的Alice服务;仅有Alice聊天界面不能直接接入。手动运行 Morning report 工作流验证首篇;缺少配置会明确失败,不发布占位文章。详情先生成、同次输出摘要并验证长度、五段正文、候选板块和引用id;留存原始证据以便核查。当前校验不等同人工事实审核;历史对照基于真实日K由模型解释,尚不提供经过回测的相似度/胜率,也未独立计算历史事件样本。上线前需人工检查首篇数字、消息时间与历史案例,按实际效果补充研究规则。不能把这部分当作已完成的量化回测系统。
首页资金模块与 /sectorflow 共用 public/shared/fund-flow.js:首页展示今日流入/流出各前三,点击板块带入详情;详情支持今天、5日、20日以及金额/占比、最多10个板块选择。板块颜色按代码固定,支持浅色/深色主题。今天为盘中累计净流入,多日为每日净流入;多日默认选线按区间合计排序,右端数值是最后一个有效采样值。范围沿用短线情绪概念池(非全市场资金排名)。
数据复用原有 sectorflow 盘中与每日快照,新增存成交额,用对应时点的净流入额/成交额计算占比;老快照无成交额时不回填占比。Actions 首轮及收盘后通过 Wind analytics 按区间合计筛选的概念查询真实20日序列,5日与20日共用查询并缓存到 sectorflow:windows:v1,同日盘中、盘后分别最多尝试一次;失败保留旧序列并记录错误。首次查询可能增加运行时间。没有新增密钥、数据库或浏览器端 Wind 调用。
已有数据可立即展示;历史接口不返回序列时仅展示已存的真实每日点,明确提示不足,不使用区间总额补造每日点或开盘零点。读取 summary/full 仍需登录、不扣积分,新增 dashboard 字段并保留旧协议字段。上线后需在真实 Actions 取数中确认 Wind 返回的历史字段、单位及日期范围;本地验证使用模拟数据,未消耗真实 Wind 配额。
北京时间每个交易日16:05触发生成盘后总结,完成后自动进入「要闻」及首页最新文章,作者统一「官方看点」。正文700—1400字、摘要100—150字,覆盖全天盘面、主线演变、驱动与分歧、回看日内观察、下一交易日观察。必须有当日15:00收盘快照;休市跳过,数据缺失报错,GitHub16:15、16:35备用补跑。消息截点固定16:05,盘后消息不能反推盘中涨跌。独立id为日期-evening,不阻断次日早报。复用现有模型配置与数据存储。16:05是触发时间,排队和生成可能延后。
一级业务页使用 Logo、页面标题、签到页面入口、积分余额与个人中心。Logo 根据有效登录态跳转 /home 或 /about。个人中心及二三级页面保留顶部返回箭头及各自的页面动作:个人中心右上角是「设置」,编辑页保留「保存」,文章详情保留「分享」。签到入口仅打开 /account/signin,不会直接领取积分;领取动作只能在签到页确认后触发,服务器端同一北京时间自然日仅允许一次。
/admin 的「全站功能使用」按北京时间展示今日/近7日事件次数、登录账号去重人数和匿名浏览器标识数。所有产品页面接入 /shared/usage.js,记录页面访问、手机返回恢复、按钮/链接点击、表单提交及选项切换;不记录输入文本、查询参数、股票代码、文章ID或完整URL。匿名浏览器标识 cookie 保留30天,原始事件每天清理30天以前的数据;管理员页面不采集为产品使用。
waitUntil 异步记录,采集失败不改变业务响应。采集接口复用 /api/auth?action=usage;浏览器只能写观察事件。API执行结果凭证复用服务器 CRON_SECRET,数据库校验 Vault 的 shortemotion_cron_secret。凭证不发给浏览器。usage_private 原表禁止匿名和普通登录账号直接访问;只读汇总 RPC admin_usage 检查管理员身份。相同事件ID去重,每个账号/匿名标识每分钟最多120条。数据库迁移:supabase/migrations/20261028101645_feature_usage.sql。数据库迁移先于新版API/前端部署;回退代码时保留新增表和RPC即可,不删除现有业务数据。