# investment **Repository Path**: mfind/investment ## Basic Information - **Project Name**: investment - **Description**: 投资小助手 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-17 - **Last Updated**: 2026-08-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 观澜 · Vue 投资管理工具 面向 A 股与港股的 Vue 3 投资管理 MVP。浏览器只访问本地代理;OAuth 凭证由官方 SDK 缓存,不会打包进前端。 ## 当前功能与数据边界 - 持仓:按代码录入、编辑、删除、服务端保存,名称和最新价由行情接口自动获取;支持自定义分组、按市值/今日盈亏/累计盈亏排序,以及相同市场和代码的重复持仓自动合并;市值、累计与当日盈亏实时计算;行业通过公司/基金资料自动识别,价值/成长/质量由财报、估值和跟踪指数因子自动归因;现金余额可编辑。 - 行情:通过 Longbridge OpenAPI 获取 A 股、港股和主要指数的最新价、涨跌、开高低、成交量额、名称、币种和股本资料;界面会显示 `BROKER`、`DEMO` 或 `ERROR`。 - 标的详情:点击自选或持仓中的标的,可查看 PE/PB、股息率、机构评级与目标价、分红、公司资料、财报基本面和中文 Longbridge 新闻;分红、财报、ETF 持仓和新闻支持展开更多。ETF 不显示无意义的机构目标价。 - 自选列表:添加时先用真实行情验证代码并自动取得名称,支持移除;列表保存在服务端状态文件。 - ETF 查询:输入 `510300`、`159915`、`2800.HK` 等代码,可读取真实报价,并聚合基金名称、跟踪指数、主要持仓、分红记录、指数 PE/PB、指数股息率、ETF 自身近 12 月分红率、近 5 年与近 10 年估值百分位。 - 短线选股:提供“题材博弈”和“趋势跟随”两套 A 股筛选器。前者检查成交额、换手率、非 ST/非新股、板块联动及板块前三,并显示当日/近 3 日/近 5 日主力净流入、东方财富人气排名和总市值;后者可选择股价高于 MA5/MA10/MA30/MA60,显示四条均线、总市值和资金流入趋势。 - 新闻偏好:可选择公司、行业、宏观和 ETF 主题,设置关键词与显示数量;偏好保存在服务端状态文件。 - 持仓建议:输入 `1%–30%` 的年度收益目标后,依据目标难度、最大持仓比例和现金占比给出规则型建议;不合理目标不会保存。建议只用于组合规划,不构成收益承诺。 - 仓位纪律:每个标的可设置仓位上下限、浮盈止盈点和浮亏加仓点;达到条件后显示减仓、平仓或加仓检查提醒,不会自动交易。 - 半年检查:按上半年、下半年记录仓位检查快照,列出触发仓位上限或止盈点的减仓/平仓候选。 - 黄金观察:展示上海金 `Au99.99` 价格、5/10 年历史价格百分位、中国央行黄金与外汇储备价值,以及中文贵金属要闻。 - 服务端存储:持仓、自选、现金、收益目标、仓位规则、半年检查、新闻偏好和选股参数统一保存到 `server/data/user-state.json`;首次升级会迁移并清理旧浏览器数据。 - 飞书提醒:在“我的组合 → 服务端存储与飞书提醒”中配置每日盈亏简报、每日最多一只的选股候选、调仓提醒和仓位规则命中提醒;服务端按上海时间定时读取真实行情并推送,网页关闭后仍可运行。 ## OAuth 接入 项目使用官方 `longbridge` Node.js SDK、`https://openapi.longbridge.com` 与 `wss://openapi-quote.longbridge.com/v2`。旧的 `longport` 包及 `LONGPORT_*` 变量不再使用。 在 Longbridge 注册 OAuth Client,回调地址填写 `http://localhost:60355/callback`,然后在 `.env` 填写: ```env PORT=8787 LONGBRIDGE_OAUTH_CLIENT_ID=你的Client ID LONGBRIDGE_OAUTH_REDIRECT_PORT=60355 LONGBRIDGE_HTTP_URL=https://openapi.longbridge.com LONGBRIDGE_QUOTE_WS_URL=wss://openapi-quote.longbridge.com/v2 ``` 首次请求 `/api/health` 时,终端会打印授权地址。浏览器完成授权后,官方 SDK 将令牌保存到 `~/.longbridge/openapi/tokens/` 并在可用时自动刷新,无需手动填写 Access Token。 ## 连接机制 - `/v1/watchlist/groups` REST 接口用于确认 OAuth 已认证。 - 实时报价不是 `/v1/quote` REST API,而是通过官方 `QuoteContext` 建立行情 WebSocket 后拉取。 - `/api/health` 会分别返回 `authenticated` 和 `connected`,便于区分 OAuth 问题与行情 WebSocket 问题。 ## 启动与验证 ```bash npm install npm run broker ``` 另一终端执行: ```bash npm run dev curl http://127.0.0.1:8787/api/health curl 'http://127.0.0.1:8787/api/quotes?symbols=600036.SH,700.HK' curl 'http://127.0.0.1:8787/api/instrument?symbol=700.HK' curl 'http://127.0.0.1:8787/api/instrument?symbol=510300.SH' curl 'http://127.0.0.1:8787/api/profiles?symbols=510300.SH,600036.SH,700.HK' curl 'http://127.0.0.1:8787/api/screener?minAmount=500000000&minTurnover=8&minAverageAmount=100000000&maxReturn20=30' curl 'http://127.0.0.1:8787/api/gold' curl 'http://127.0.0.1:8787/api/state' curl 'http://127.0.0.1:8787/api/notifications/feishu' ``` 健康检查同时返回 `authenticated: true` 与 `connected: true` 后,网页刷新和 ETF 查询才会显示真实报价。 修改 `server/index.mjs` 或更新项目后,需要先停止旧的 `npm run broker` 进程并重新启动;Node 服务不会自动热更新。 ## 本地接口 - `GET /api/health`:OAuth 与行情 WebSocket 状态,以及当前账户的行情等级。 - `GET /api/quotes?symbols=600036.SH,700.HK`:批量最新报价与静态资料,包括 OHLC、成交、PE/PB、股息率和市值等派生字段。 - `GET /api/instrument?symbol=700.HK`:单个股票详情,包括报价、估值、机构预测、分红、公司资料、财报基本面和中文新闻。 - `GET /api/instrument?symbol=510300.SH`:单个 ETF 详情,包括 Longbridge 报价,以及公开基金资料、持仓披露、ETF 近 12 月分红率和跟踪指数估值。 - `GET /api/profiles?symbols=510300.SH,600036.SH,700.HK`:批量返回持仓行业、自动风格归因、财报快照与组合新闻。 - `GET /api/screener`:A 股短线筛选结果,包括题材联动、趋势指标、主力资金流、人气排名、中期逻辑标签和入选原因;默认条件为成交额大于 5 亿元、换手率大于 8%、20 日日均成交额大于 1 亿元、近 20 日涨幅低于 30%、股价高于 MA60。可通过 `maPeriod=5|10|30|60` 修改均线条件。 - `GET /api/gold`:上海金 Au99.99 行情、5/10 年价格位置、中国央行黄金与外汇储备价值和贵金属新闻。 - `GET /api/state`、`PATCH /api/state`:读取或更新单用户服务端状态。 - `GET /api/notifications/feishu`:飞书配置、最近检查、最近推送和当前活动提醒状态。 - `POST /api/notifications/feishu/test`:发送飞书测试卡片。 - `GET /api/notifications/preview`:按最新真实行情预览当前会触发的仓位提醒,不发送消息。 - `POST /api/notifications/check`:立即执行一次后台规则检查;正常情况下由定时器自动执行。 Longbridge 返回的数据范围取决于账户权限。健康接口的 `quoteLevel` 若显示 `Delay`,对应市场为延迟行情;页面中的券商数据标识只表示数据来自真实接口,并不承诺所有市场都是逐笔实时行情。 选股器使用东方财富公开行情和腾讯证券复权日 K 线,不消耗 Longbridge 行情额度。为控制免费接口压力,股票池按当日成交额从高到低覆盖前 3000 只 A 股,而非低流动性尾部的完整全市场;接口会同时返回市场总数和覆盖说明。选股结果只用于缩小研究范围,不构成买卖建议。 ## 服务端数据与备份 - 默认数据文件是 `server/data/user-state.json`,提醒去重状态是 `server/data/notification-state.json`;目录已加入 `.gitignore`。 - 可通过 `INVESTMENT_DATA_DIR=/绝对路径` 把数据放到单独的备份磁盘。写入采用临时文件后原子替换,适合当前单用户本地部署。 - 首次打开新版页面时,会把现有旧版 `localStorage` 数据迁移到服务端,确认保存成功后删除旧浏览器键值。之后浏览器只通过 `/api/state` 读写;服务端不可用时不会把新数据写回浏览器。 - 备份时复制整个数据目录即可。恢复时先停止 broker,覆盖数据目录后重新启动。 ## 飞书提醒配置 1. 在飞书群的“设置 → 群机器人 → 添加机器人 → 自定义机器人”中创建机器人。 2. 复制 Webhook;如果开启了“签名校验”,同时复制签名密钥。 3. 在 `.env` 填写并重启 `npm run broker`: ```env FEISHU_WEBHOOK_URL=https://open.feishu.cn/open-apis/bot/v2/hook/你的Webhook标识 FEISHU_WEBHOOK_SECRET=可选的签名密钥 ALERT_CHECK_INTERVAL_SECONDS=300 HKD_CNY=0.92 ``` 4. 打开“我的组合 → 服务端存储与飞书提醒”,点击“发送测试消息”;也可以调用: ```bash curl -X POST http://127.0.0.1:8787/api/notifications/feishu/test curl http://127.0.0.1:8787/api/notifications/preview ``` 提醒只在规则从未触发变为触发时发送;规则恢复正常后再次触发会重新推送,持续触发期间不会每五分钟重复刷屏。后台提醒依赖 `npm run broker` 持续运行,电脑休眠或服务退出时无法检查。行情时效取决于 Longbridge 账户的行情等级。 页面可以为每日盈亏、每日选股、季度调仓和仓位规则分别选择“定时推送”或“实时推送”,并设置时间。默认配置是每日盈亏 15:20 定时、每日选股 15:20 定时、季度调仓在每季度最后一个工作日 09:00 定时、仓位上下限/止盈/加仓实时推送。实时模式按 broker 轮询间隔检查,在首次命中时推送;定时模式在指定时间之后当天只发送一次。每日选股来自现有 `/api/screener` 服务端筛选结果,每天最多一只,只用于研究,不构成买卖建议。`notification-state.json` 会分别记录日期和活动规则,避免重复推送。 ### 选股器新增指标口径 - 当日、近 3 日和近 5 日资金流均为东方财富定义的“主力净流入”及主力净占比,是基于成交单分类的供应商统计,不等同于已确认的机构、北向或席位资金。 - 关注度使用东方财富 A 股人气排名、排名变化和全市场数量,只代表东方财富站内用户关注热度,无法代表全互联网或全市场投资者关注度。 - MA5、MA10、MA30、MA60 使用腾讯证券前复权日收盘价计算;“股价高于多少日均线”支持四档选择。 - 市值使用东方财富行情中的总市值。公开接口临时缺失时页面显示 `—`,不会用演示数据补齐。 ## Clash Verge / Mihomo 如果显式代理的 `curl` 可以访问 Longbridge,但 SDK 返回 `Connection reset by peer`,通常是原生 WebSocket 未经过系统 HTTP 代理。请在 Clash Verge 中: 1. 开启 `TUN 模式`,必要时先开启 `服务模式`。 2. 确保 `longbridge.com` 使用代理节点,而不是 `DIRECT`。 3. 重启 `npm run broker`,重新调用 `/api/health`。 如果 TUN 已可用,但终端还设置了 `HTTP_PROXY`、`HTTPS_PROXY` 或 `ALL_PROXY`,Longbridge SDK 可能优先使用失效的显式代理。可先清除这些变量再启动: ```bash env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY -u NO_PROXY npm run broker ``` 启用后,不带 `--proxy` 的以下命令也应能完成 TLS 握手: ```bash curl -Iv https://openapi.longbridge.com curl -Iv https://openapi-quote.longbridge.com ``` `401` 或根路径 `404` 都说明网络已通;连接重置或 TLS 超时说明 TUN/规则仍未生效。 ## ETF 数据来源与限制 - 报价、名称和券商资料来自 Longbridge OpenAPI;基金档案、最新披露持仓和基金分红来自天天基金公开页面;最新指数指标来自中证指数有限公司或东方财富。 - 近 5 年和近 10 年分位使用乐咕乐股指数 PE/PB 历史序列。沪深 300 等指数使用加权 TTM PE 与加权 PB 的等权综合百分位;恒生指数目前使用月频 PE 百分位。 - 若免费指数 PE/PB 历史源未覆盖某只行业、主题或新指数 ETF,A 股 ETF 回退到天天基金单位净值百分位,港股 ETF 回退到复权收盘价百分位。页面会明确标注“价格口径”,不会将其冒充为指数估值分位。 - 创业板 ETF 的长期序列使用“创业板市场估值代理”,页面会明确标注该代理口径;新设指数若没有足够历史,会显示实际起止日期和“历史不足”。 - 指数 PB 是指数估值口径,不是基金自身 PB;免费源缺失时显示 `—`,不会回填演示数据。 - 公开网页结构可能调整,生产环境应替换为具备授权和稳定 SLA 的基金/指数数据服务。 ## 黄金数据口径 - 黄金价格来自上海黄金交易所 `Au99.99` 日行情,单位为人民币/克。 - 黄金没有利润和现金流,不能使用股票的 PE/PB;页面中的“估值”仅指历史收盘价百分位。 - 央行黄金与外汇储备来自东方财富宏观月度数据,显示美元价值。黄金储备价值变化同时受到购金数量与金价影响,不能直接等同于净买入量。 - 贵金属要闻来自 SHMET 上海金属网公开快讯。