Commit Graph

11 Commits

Author SHA1 Message Date
知微 92815aac06 换仓评估逻辑:现金不足时自动分析卖差票换推荐股
新增 evaluate_swap() 函数:
1. 仅对RR>=2.0且含买入关键词的强信号触发
2. 扫描持仓按亏损排序,找最少卖出组合凑现金缺口
3. 预期盈利 > 锁定亏损×1.5 才推荐切换
4. 最多卖3只,单次换仓不超总资产50%
5. 不划算时维持原预算不足1手消息

已验证:海博思创(688411) RR=5.6但预期盈利9k<锁定亏损46k×1.5
→ 不推荐切换,正确。沐曦如果触发也会按同一逻辑判断。
2026-06-24 11:42:26 +08:00
知微 df4f898bc4 持仓来源修复:holding.xls导入+持仓数据修正
老问题:scripts读的是 strategy_staleness_report.json 里的旧现金值,
portfolio.json 被 strategy_lifecycle.regenerate_all 反复覆盖。

修复:
1. import_holding_xls.py — 从 ~/stocks/holding.xls 导入TSV持仓
   (含25只真实持仓,14A/11H,总市值93万,现金8万,仓位92%)
2. stale_push_wlin 现金来源改读 portfolio.json(取代旧stale_report缓存)
3. 港股市值×汇率修正(之前按1:1当人民币算,总资产多估了)
4. 每条策略的决策树同步重建

脚本执行:python3 MoFin/scripts/import_holding_xls.py (含全量重评)
Dad你以后更新holding.xls后跑这条命令就行
2026-06-24 11:19:29 +08:00
知微 3ec5460207 stale_push_wlin: 30分钟同股同操作冷却
push_cooldown.json 记录每只股票每种操作的最后推送时间。
每次推送前检查 (code, action_type) 是否在30分钟内推过。
是 → 跳过该股(不出现在推送中)
全部跳过 → 整条消息静默不推

冷却键: {code}_{action_type}(如 300308_buy、688639_buy)
不同操作不受限:同一只股 买入→止损 隔10分钟也能推
不同股票不受限:华恒的buy不影响中际的buy

同步修复:港股每手股数香港股数(之前patch到旧文件没生效)
2026-06-24 11:01:53 +08:00
知微 9d3f48a502 半手补整阈值50%→90%,防止现金严重不足却标🛒
修正前:长飞光纤预算60K只有1手112K的一半,却因为
budget > lot_cost*0.5 的规则被凑成1手,标了🛒
修正后:只有预算够90%以上才补整1手
实际影响:长飞光纤现在标⚠️而不是🛒
2026-06-24 10:53:31 +08:00
知微 e0b7f49c3a stale_push_wlin: 操作符号标记
- ⚠️ 预算不足1手(列了也没法买,但让你知道)
- 🛒 手数达标(现金够买,可直接操作)

取自 position_advice calc_position 的实际计算结果:
  lots=0 → 预算不足 ⚠️
  lots>0 → 可以买 🛒
2026-06-24 10:47:34 +08:00
知微 b229e6f0cb 推送治理:静默采集+需要操作才出声
核心原则:数据采集类脚本完全静默(做积累不做推送),
只有需要操作/需要看的才到达Dad。

改动:
1. branch_scanner 已完全静默(上一轮改的)
2. stale_push_wlin return 1 → return 0(修复错误退出码)
3. 开盘简报 deliver=local → deliver=origin(之前没到Dad)
4. 收盘简报 deliver=local → deliver=origin
5. 策略评估-每日 deliver=local → deliver=origin
6. stale_push_wlin 输出格式已包含分支信息:
   【弱势震荡→buy】价格回调到支撑区,弱势市场低吸

Dad会收到的消息:
- 自选买入提醒(9:01/12:01)← 需要操作
- 开盘简报(9:35)← 需要看
- 收盘简报(16:10)← 需要看
- 策略评估(21:00)← 需要看
- 价格触发变化 ← 需要知道
其他全部静默
2026-06-24 10:45:51 +08:00
知微 102a64d856 自成长:分支评估+剪枝+报告接入
补齐「顺势而为 环境预判 策略多分枝」体系中缺失的组件:

branch_evaluator.py(新增)— 每30min评估所有策略树分支
  1. detect_scenario() 获取当前宏观情景
  2. 对42只股票评估哪个分支当前适用
  3. 适用分支 trigger_count+1, last_triggered=now
  4. 触发>=3次且成功率<30%→标记pruning_candidate
  5. 无决策树的股票自动初始化(init_default_branches)

prune_branches.py(新增)— 每日16:30收盘后剪枝
  阈值:触发>=3次且成功率<30%→裁掉并归档到pruned_branches
  Dad说「每周太低频」→改为每日

stale_push_wlin.py(修改)— 报告每只股增加分支行:
  【弱势震荡→buy_dip】价格回调到支撑区,弱势市场低吸

cron更新:
  分支扫描(b809fcabfa5b) → 指向branch_evaluator.py, 每30min
  剪枝(a3697c108c7b) → 指向prune_branches.py, 每日16:30

自成长核心:branch_evaluator 运行时自动发现并初始化无策略树股票,
252个分支已生成, trigger_count已开始累积, 反馈循环上线
2026-06-24 10:24:11 +08:00
知微 eb86a9091e stale_push_wlin: 仓位分母改为总资产,输出具体手数/股数
仓位计算:
  分母:总资产(持仓市值+现金),从portfolio.json+strategy_staleness_report.json读取
          非之前用的现金总额
  理论仓位:仅基于RR+大盘+品种特性,不受现金限制,纯% of 总资产
  当前建议:理论占总资产%→按现金锁死→输出具体手数和股数

报告最终一行:
  仓位:理论{theo}%×总资产 | 建议{act}%({N}手({M}股,{cost}元))

Dad要求:仓位是本次操作的仓位,分母是总资产不是现金,
给出仓位后要能直接按手/股操作
2026-06-24 10:08:05 +08:00
知微 3ba2b044d7 stale_push_wlin: 推荐加理论仓位+当前建议仓位(基于现金)
每只推荐新增第四行:
  仓位:理论推荐{theo_pct}% | 当前建议{actual_pct}%({N}手≈预算)

仓位计算:
  理论 — 基于RR(8-25%) + 大盘(±20%) + 品种特性(±20%)
  当前 — 理论×多只稀释系数 + 按实际现金计算可买手数
  兜底 — 预算不够1手时推荐至少1手

Dad要求:买卖不能不写仓位,理论仓位不受现金限制,
当前建议仓位根据portfolio.json实际现金计算
2026-06-24 10:00:52 +08:00
知微 b30a5fcdde stale_push_wlin: 每只推荐含大盘/行业/个股三面分析
每只操作建议输出三段线:
  第一行:名称代码+买区+1手成本+RR+止损止盈
  第二行:大盘走向 | 行业趋势 | PE估值 | 消息面
  第三行:技术位(强撑→弱撑→弱压→强压) | 信号

数据来源:signal_factors(策略富化生成的因子列表)、
          multi_tf_cache.json(PE/EPS)、
          tech_snapshot(技术位)、
          macro_line(大盘背景)

Dad要求:推荐必须能看到操作理由的三个维度分析
2026-06-24 09:56:26 +08:00
知微 f6ee15489c stale_push_wlin: 重评段删除,只推有清晰操作信号的个股
改动:
- 移除「策略需重评」报告段 — 内部流程,Dad不需要看到
- 移除pick/watch拆分的旧逻辑 — 统一为actionable过滤
- 跳过信号含等企稳关注信号不充分neutral持有等无用描述的个股
- 无操作信号 → 静默不推
- 有操作信号 → 标准格式(含行业context+技术位+止损止盈+RR+1手成本)

Dad要求:要看到的是可以直接操作的建议,不是内部流程记录
2026-06-24 09:46:52 +08:00