把「每 5 分钟跑一次,行为分乘人的权重乘时间衰减,分档出流」写成一套可以直接实现、可以在后台逐项核对的规则。所有数字都是默认参数(见第 7 节),改参数不改结构。
三者分工:B 决定「这件事本身」,P 决定「谁做的」,D 决定「多久以前」。人的分做成乘数而不是加数,是因为你们要的是「给人打权重」:P = 10 的人最多把自己的帖子放大 1.5 倍,P = 1 的人缩到 0.6 倍,不会出现加法模型里「名人的小动作压过无名氏的强平」。
top10_seen(addr, coin, first_seen, last_seen, best_rank)。地址一旦进表就永远在监控集合里。
沿用现有方法论的「行」:同地址、同币、同动作类型的相邻成交合并,间隔 ≤ 90 分钟(现货 120 分钟)视为同一行,仓位归零处强制断行,反手拆成「平掉原仓 + 从零开新仓」两行。动作类型:行前仓位为 0 → 建仓;行前仓位与变动同号 → 加仓(按浮盈浮亏分滚仓 / 补仓);否则减仓(按盈亏分止盈 / 止损,归零为清仓);被清算的是本人 → 强平;现货买卖;账本类 入金 / 出金 / 质押 / 解押 / 转入 / 转出。
(地址, dex, 币, 行的起始时间) 的哈希。跨节拍稳定,是已读去重的前提。建议保留一条低门槛,目的是过滤刷单噪音、控制存储,不是筛质量(质量由分档决定):
THRESHOLD_ON = false 即全部成帖,低分帖自然沉到第 10 档。四个归一化到 [0, 1] 的分量加权,再乘压制系数:
B_raw = 0.40 · size + 0.30 · type + 0.20 · result + 0.10 · context B = 10 · clamp(B_raw · m, 0, 1)
size_abs = clamp((log10(N) − 4) / 3, 0, 1),N = 名义美元。1 万 → 0,10 万 → 0.33,100 万 → 0.67,1,000 万 → 1。size_rel = clamp(N / (0.3 · E), 0, 1),E = 动作时总资产。仓位达到总资产 30% 记满分;E 未知记 0 并在后台标记;E 不足 1,000 美元(清仓后提空的账户)同样视为未知,避免 N / E 爆表。size = 0.7 · size_abs + 0.3 · size_rel。账本动作的 N = 转账金额。| 类型 | type | 类型 | type |
|---|---|---|---|
| 强平 | 1.00 | 出金 | 0.50 |
| 清仓 | 0.80 | 入金 | 0.40 |
| 建仓 | 0.70 | 解押 | 0.40 |
| 补仓(带浮亏加) | 0.50 | 质押 | 0.25 |
| 滚仓(带浮盈加) | 0.50 | 现货卖出 | 0.40 |
| 止损部分 | 0.50 | 现货买入 | 0.35 |
| 止盈部分 | 0.45 | 转入 / 转出 | 0.20 |
result = clamp((log10|R| − 4) / 2, 0, 1),R = 平仓盈亏减手续费。1 万 → 0,10 万 → 0.5,100 万 → 1。result = 0.5 · clamp((log10|U| − 4) / 2, 0, 1),U = 动作结束时的浮盈浮亏。带着 200 万浮亏补仓是有信息的。2 × |涨跌| × 10 × min(1, 成交 / 300 万) + 1.2 × log10(1 + 成交 / 百万))废弃:成交项让 BTC / ETH 小跌也常年霸榜。账本动作 context = 0。公众人物/KOL 7;行为命名巨鲸 6;风投与财库 5;社区交易员 5;其他有备注 4;仅因上过前十大进池 3。有 X 账号 +1,有描述 +0.5,上限 10。排除类型 0。
| 组 | 字段 |
|---|---|
| 身份 | 别名、主体类型、人工描述、X 账号与简介、粉丝数 |
| 资金 | 总资产、全周期盈亏、30 天盈亏、7 天盈亏、30 天曲线的最大回撤 |
| 交易画像 | 回合数、胜率、平均持仓时长、最大单笔名义、强平次数、多空占比、交易过的币种数、TWAP 成交占比、日均行数 |
| 上榜 | 进过哪些资产前十大、最高名次、最近一次在榜时间 |
| 近期 | 最近 10 条过门槛动作的标题句(就是帖子的标题句) |
overall 0–10 综合分,就是 P dims 影响力 fame / 实力 skill / 信号价值 signal / 戏剧性 drama,各 0–10 tags ≤ 4 个短标签,如「方向性重仓」「对冲」「频繁强平」「新入场」 reason ≤ 60 字,一句话理由 exclude true / false,行为像做市、对冲、搬砖,不该进流
|overall − mean(dims)| ≤ 2,超出视为不一致,整批重跑。exclude = true 直接令 P = 0,后台显示理由供人工复核。P_new = 0.6 · AI + 0.4 · P_old,单日变动上限 ±2。每条 P 记录 addr, P, dims, tags, reason, exclude, prompt_version, model, facts_hash, scored_at。评分标准那段 prompt 有版本号,改一次 prompt 就是一个新版本,后台按版本对比分数变化。
g(P) = (1 − κ) + κ · P / 5 κ = 0.5 → g ∈ [0.5, 1.5],P = 5 时 g = 1 P = 0 → 不成帖
κ 调大,人的权重更重(κ = 1 时 g ∈ [0, 2])。
age = 现在 − 行内最后一笔成交时间(小时) D = 1 age ≤ 1 D = 0.5 ^ ((age − 1) / H(B)) age > 1 H(B) = clamp(12 · 2^((B − 5) / 2), 6, 48) 小时
半衰期随行为分变。「特别大的行为可留」就是这一条,不用另立规则:
age > 24 小时 且 B < 8 → 删除;age > 72 小时 → 一律删除。24 小时这一刀就是「超过 24 小时重要性骤降」。D 每个节拍重算,所以「以每次跑为节点,新帖子进、最老的退」成立;只是「退」由 D 和出场规则决定,不是数量上限。
档内按行内最后一笔成交时间新在前,不按 S。分档管质量带,档内顺序管新鲜度,两件事分开。以后要加「随机」就是把这一条换掉,其余不动。
候选 = 第 1 档 ∩ 该用户未读 按 5.2 排序,同一地址最多 2 条、同一资产最多 4 条 取 10 条;不够则拼接第 2 档未读,依此类推 返回的 10 条立即记为已读(已读表按帖子 id,72 小时过期)
拉取式,不是推送式。用户每次打开、下拉刷新、翻页,服务端按当前节拍的档位取这个用户未读的 10 条。没有定时批量推送,也没有主动通知。
一条给一个人只出现一次。发过就记已读,72 小时内不再出现;帖子最长也只活 72 小时,所以对同一个人就是只见一次。分数和档位每 5 分钟都在变,但一条帖子后来升到第 1 档也不会回头再推给已经看过的人;原地更新(滚仓 300 万变 350 万)同样不重置已读。
两个人同一时刻看到的不一样,因为已读表是按人的:A 的「第 1 档未读」和 B 的不是同一批。
| 东西 | 变不变 | 多久 |
|---|---|---|
| 规则里的权重(0.40 / 0.30 / 0.20 / 0.10、κ、半衰期、上限) | 不变,版本内常量 | 改了就是新版本 |
| 行为分 B | 同一行来了新成交才变 | 随成交 |
| 人的分 P | 变 | 每天一次 |
| 衰减 D、总分 S、档位 | 变 | 每 5 分钟一节拍 |
| 某个用户的已读 | 只增不减 | 72 小时过期 |
待定 主动推送(比如关注的地址有大动作时发通知)不在 v1 里。要做的话建议规则:只推关注的地址、只推 B ≥ 7 的动作、每人每小时最多 3 条、同一行只推一次(原地更新不再推)。
两张表,都按分数排,每个数字可以点开看来源。已按本节做成 打分后台,跑在 feed3.json 的真实帖子上。
标题句 · S · B(size / type / result / context 四个分量、m 压制)· P(g 乘数)· D(age、H)· 档 · 更新次数 · 帖子 id。
别名 · P · 四个维度 · 标签 · 理由 · exclude · 先验值 · 上次评分时间 · prompt 版本 · 事实表快照(点开)。
| 参数 | 默认 | 作用 |
|---|---|---|
| TICK | 5 分钟 | 节拍 |
| GAP_PERP / GAP_SPOT | 90 / 120 分钟 | 合行间隔 |
| THRESHOLD_ON | true | 成帖门槛开关 |
| MIN_NOTIONAL / MIN_PNL | 1 万 / 5,000 美元 | 门槛 |
| W_SIZE / W_TYPE / W_RESULT / W_CTX | 0.40 / 0.30 / 0.20 / 0.10 | B 的权重 |
| SIZE_ABS_LO / SIZE_ABS_HI | 1 万 / 1,000 万美元 | size_abs 两端 |
| SIZE_REL_FULL | 30% 总资产 | size_rel 满分点 |
| RESULT_LO / RESULT_HI | 1 万 / 100 万美元 | result 两端 |
| M_FLAT / M_SPAM / M_TINY | 0.5 / 0.6 / 0.7 | 压制系数 |
| SPAM_ROWS | 30 行 / 24 小时 | 刷单判定 |
| KAPPA | 0.5 | 人的权重强度 |
| P_BATCH / P_ANCHORS / ANCHOR_TOL | 25 / 3 / 1.5 | AI 批次与锚点 |
| P_SMOOTH / P_MAX_STEP | 0.6 / ±2 | 平滑 |
| P_STALE | 14 天 | 过期退回先验 |
| GRACE | 1 小时 | 衰减前的平台期 |
| H0 / H_MIN / H_MAX | 12 / 6 / 48 小时 | 半衰期基准与上下限 |
| EXIT_AGE / KEEP_B / HARD_EXIT | 24 小时 / 8 / 72 小时 | 出场 |
| TIERS | 10 | 档数 |
| PAGE / CAP_ADDR / CAP_ASSET | 10 / 2 / 4 | 每页条数与多样性上限 |
| READ_TTL | 72 小时 | 已读保留 |
size_abs = (6.48 − 4)/3 = 0.83 size_rel = 300/(0.3×5000) = 0.20 size = 0.64 type = 0.80 result = (5.18 − 4)/2 = 0.59 context = 0.6 B = 10 × (0.256 + 0.240 + 0.118 + 0.060) = 6.7 g(9) = 1.4 age 0.5h → D = 1
size_abs = 0.90 size_rel = 500/(0.3×800) → 1 size = 0.93 type = 1.0 result = (6.08 − 4)/2 → 1 context = 0 B = 10 × (0.372 + 0.300 + 0.200 + 0) = 8.7 g(3) = 0.8
size_abs = 0.16 size_rel = 0.05 size = 0.13 type = 0.50 result = 0.5 × 0 = 0 context = 0.3 m: N < 1% E 且 N < 10 万 → × 0.7 B = 10 × (0.052 + 0.150 + 0 + 0.030) × 0.7 = 1.6 g(8) = 1.3
名人身份把一次中等清仓抬到第一档,但抬不动一次小补仓;无名氏的强平靠行为分自己站到前面。
pipeline/scoring_v1.py(Python,gen_feed3 用它给 For You 排序)与 pipeline/admin_template.html(JS,打分后台交互重算)两份实现,后台页眉核对两边算出的 S 是否一致。pipeline/p_overrides.json,手调优先,0 = 不进流)。3.1、3.3 到 3.6 的 AI 评分暂不做。tick.sh:只抓每个地址上次之后的成交,全量重算,发布),每 4 小时一次全量兜底;改分数后 rescore-foryou 一分钟重算发布。用户两条要求:人比行为和时间衰减重要得多;首页尽量是有头像的帖子。落地为三处,默认开启,参数在后台可调:
合成公式换主轴:S = P × (1 + B/10) × D′。P 是主轴,行为分只在 1 到 2 倍之间放大;D′ 在 P_GRACE = 6 小时内不衰减,之后半衰期 P_HALF = 36 小时(对所有帖子一样,不随 B 变),P_EXIT = 48 小时出场。PERSON_FIRST = 0 可回到 v1 的 S = B × g(P) × D。
P 的来源分三层:手调(p_overrides.json)> AI 主观分(地址池体检/p_scores.json,v2:只看名字的认知度与故事性)> 先验值。排除类型仍是 0。
头像加成:作者是「人」(KOL / 社区交易员 / 行为命名巨鲸),有 X 头像且粉丝 ≥ AV_MIN_FOL = 5000,P 加 AV_BONUS = 2(封顶 10)。后台来源列显示「主观v2+头像」。
有头像的人成帖门槛放低(gen_feed3 CFG):绝对下限 2 万 → 5 千美元,相对下限 12% → 3% 本地址最大行,盈亏下限 1 万 → 2 千;刷单地址的抬高从 35% 最大行改为 10%。麻吉 48 小时 80 行原来只成 8 帖,就是被 12% / 35% 两条相对门槛挡住的。
供给的上限:活 feed 918 条存活帖子里,有头像且粉丝 ≥ 5000 的作者只有 11 条帖子。排序只能把这些顶上去,变不出更多。要让首页真正「尽量有头像」,还得:把 KOL 推特流(/xfeed/ 的流③)作为帖子并进来;给更多地址标上 X(这是标注工作)。
用户要求:builder app 的头部用户要突出,权重抬高、多出现在时间线上;时间线和各榜单上要能看出他是哪家 builder 的,放 builder 头像。
数据:flowscan builder intelligence 全量主表 746,890 个地址,取「总榜前 1000 ∪ 每家有名 builder 各自前 100(按累计 builder fee)」= 4,432 个地址 → builders_top.json(主 builder、本 builder 名次 rb、总榜名次 r、累计 / 30 日 / 7 日 fee)。builder logo 来自 flowscan 的 /logos/ 静态图,47 家 → builders_logo.json。
加成(叠在 P 上,封顶 10,后台参数可调):本 builder 交费第 ≤ 20 名 +3;≤ 100 名 +2;总榜 ≤ 1000 名 +1。后台来源列显示「+builder」,算式里写清是哪家第几名。
候选:近 7 日有 builder fee 的头部用户(730 个)全部进全网候选,交费越多分越高,保证他们的动作被抓到。
展示:帖子卡片、地址主页、发现地址(Pro 表)、热门地址、悬浮卡、KOL 榜、推特流上,名字旁边一个圆形 builder logo + 名字的小徽章,悬停看「交费第几名」。
现有 gen_feed3.py 的 score = 名气 + 规模 + 动作 + 盈亏 + 相对规模 + 时效 + 热度,改动是替换不是推倒:
| 现有项 | 去处 |
|---|---|
| 名气(CAT_W 查表 + X + 描述) | 变成 P 的先验值;正式值由 AI 给,乘数 g(P) |
| 规模、动作、盈亏、相对规模、热度 | 归一化后进 B 的 size / type / result / context / m |
| 时效 −0.35 × (小时/12) | 换成 D |
| 贪心重排(同地址 −0.9、同币 −0.45)与热门资产保底 | 换成出流时的每页上限(同地址 2、同资产 4) |
p['id'] = 排名序号 | 换成 (地址, dex, 币, 行起始时间) 哈希 |
| 行的合并、动作判定、句式、行动线 | 原样沿用 |