每日A股早参 | 2026-07-07

来源:Hermes cron 968d0c94b4db · 2026-07-07_01-01-08.md

astock-pick — A 股推荐 + 复盘

目标:用真实数据 + 每日复盘 + 持续学习,提升 A 股推荐能力。

⚠️ v1.7.0 资金过滤集成:见 a-stock-briefing skill 的 references/user-investor-profile.md + scripts/stock_filter_by_capital.py。本 skill 的 recommend / review / 持仓诊断输出在写入 picks 或生成报告前必先过滤,过滤后被排除的票不展示

核心组件

组件作用
scripts/astock_pick.pyCLI 主程序(推荐/复盘/持仓/历史/买卖)
/root/.hermes/picks/2026/*.json每日推荐记录(按日期)
/root/.hermes/picks/trades.json交易流水(建仓/平仓)
/root/.hermes/picks/review.log复盘日志(每日反思)

工作流

#

1) 每日 09:30 早参前(cron 自动)

recommend 命令拉昨日涨停池 + 今日新闻 + 实时价,输出 3-5 只主线股。v1.7.0 必走资金过滤scripts/stock_filter_by_capital.py --capital 20000 过滤后写入 picks/2026/<日期>.jsonv1.7.9 必走:写入 picks 前先拉 5 日 K 线算累计跌幅(见坑 #44),剔除 -5% 以下下跌趋势票。

#

2) 每日 15:30 收盘后(cron 自动)

review 命令:

#

3) 每天你看完报告

CLI 用法


# 推荐(输出到 stdout)

python3 ~/.hermes/skills/astock-pick/scripts/astock_pick.py recommend --count 5



# 推荐 + 保存到今日文件

python3 ~/.hermes/skills/astock-pick/scripts/astock_pick.py recommend --count 5 --save --note "AI 算力主线"



# 按主题推荐

python3 ~/.hermes/skills/astock-pick/scripts/astock_pick.py recommend --theme 光模块



# 复盘昨日推荐

python3 ~/.hermes/skills/astock-pick/scripts/astock_pick.py review



# 持仓状态

python3 ~/.hermes/skills/astock-pick/scripts/astock_pick.py status



# 交易记录

python3 ~/.hermes/skills/astock-pick/scripts/astock_pick.py buy 300308 1275 --qty 100 --name 中际旭创

python3 ~/.hermes/skills/astock-pick/scripts/astock_pick.py close 300308 1350 --qty 100



# 历史推荐

python3 ~/.hermes/skills/astock-pick/scripts/astock_pick.py history

每日推荐新版框架(2026-06-18 固化)

核心原则:先判断能不能买,再决定买什么、买多少、怎么买;允许空仓,不强行凑数。

每日推荐必须按 6 段输出:

每只标的必须给 5 类状态之一:现价可买 / 等回踩买 / 突破确认买 / 只观察 / 不买。推荐必须带仓位:强信号 30%-40%,普通 10%-20%,左侧试错 5%-10%,弱市空仓或观察。2 万资金下单票默认不超过 5000-8000,左侧票 2000-3000,至少留 30%-50% 现金。

"等回踩"写作纪律(v1.7.9 新增):写"等回踩"必须明确列出预期止跌信号(K 线形态 + 量能 + 大盘配合),预设"建议买点 X 元"这种数学目标价(参见坑 #44 山东黄金案例)。改写为 "触发任一条件则建仓,止损位 X"。

收盘复盘必须归因到:方向错 / 节奏错 / 个股错 / 市场错 / 风控错 / 规则正确但随机波动,并每天最多新增 3 条规则,形成长期规则库。

选股逻辑(重要!)

核心原则不追已涨停的 (15%+);找跟涨 + 低吸

涨跌区间操作
+15% 以上⚠️ 已涨停,次日不接(分化风险)
+5% ~ +15%⚠️ 强势但已透支,等回调
0% ~ +5%跟涨:资金开始进攻但还没爆发
-3% ~ 0%低吸:同主线但没涨,安全边际高
<-3%❌ 弱势股,剔除(不在主线)

等回调 =收盘前1 小时 +第二天早盘

-早盘冲高5-8% →14:30 后回落 →第二天早盘低开入场

-这种节奏风险收益比最高

#

⚠️新补丁(2026-06-08):主线高潮日 =反向信号核心反逻辑:涨停潮当日(zt_pool.total>50 +涨停集中在同一板块 +板块5 日累计>+10% 三者同时满足)= 主线高潮 = 不进

实战证据:6/3 AI算力涨停潮 →6/3 推荐了5 只AI/光通信/半导体 →6/8全部下跌(0/5、平均 -6.76%)。

应对

-重点是等高潮后回调2-3 天再低吸(板块跌 -3%~-5%、龙头股 -10% 以上时)

###选股风格补丁(2026-06-05)

创业板/科创板高 beta风险:6/5/6/8两次杀跌,300570(创业)/688012(科创)都跌幅最大。默认优先主板/中小板(60xxxx/00xxxx开头),创业板/科创板只在主线极强(涨停潮 +板块 >+3%)时考虑。

v1.7.6 权限修正(2026-06-18):科创板 688/689 默认完全排除(用户无权限);创业板 300/301 用户可以买,不得标"无权限/不可买",但因 2 万资金和一手成本问题默认最多 1 只、需控制仓位。002/003 属深市主板/中小板口径,可买,绝不能误判为创业板。recommend 脚本如果输出 68xxxx 票,必须显式标"❌ 科创板无权限,参考用",并不写入 picks

#

🆕 v1.7.5 用户可买白名单 (2026-06-17 实战固化)

v1.7.3 SKILL.md 写 "默认排除科创板",但 astock_pick.py 候选池硬编码了 688012/688268/300570 等无权限票,6/15/16/17 三天反复违规。用户原话 (6/17): "既然有些推荐的股票我买不了,为什么不换股"。

白名单 (单一事实源: references/buyable-prefix-table-2026-06-17.md)

板块代码前缀权限推荐限
沪市主板600/601/603/605无限制
深市主板000/001/002/003无限制
创业板300/3011 只限额 (一手成本普遍 > 1 万)
❌ 科创板688/689永不推荐
❌ 北交所8/4/920❌ (需 50 万+)永不推荐

代码实现 (astock_pick.py:191-235):is_buyable(code) 白名单函数 + 创业板 1 只限额。被跳过的票 stdout 输出 ⛔ 跳过 (无权限): {code} {name}⏭️ 跳过 (创业板 1 只限额): {code} {name}用户能直接看到为什么没推荐它

升级时的强制自检 (改完任何候选池/过滤逻辑必跑,5 步全过才能合入,v1.7.9 加 Step 5):


# Step 1 — 语法

python3 -c "import py_compile; py_compile.compile('/root/.hermes/skills/astock-pick/scripts/astock_pick.py', doraise=True)"



# Step 2 — 跑一次看输出

cd /root/.hermes/skills/astock-pick/scripts && python3 astock_pick.py recommend 2>&1 | tail -40



# Step 3 — 硬断言: 不能含 688/689/8/4/920 开头

cd /root/.hermes/skills/astock-pick/scripts && python3 astock_pick.py recommend 2>&1 \

  | grep -oP '\b[0-9]{6}\b' | sort -u | grep -E '^(688|689|8[0-9]{5}|4[0-9]{5}|920[0-9]{3})' \

  && echo "❌ FAIL: 出现不可买板块代码" || echo "✅ PASS: 无 688/689/8/4/920"



# Step 4 — 硬断言: 创业板 ≤ 1 只

cd /root/.hermes/skills/astock-pick/scripts && python3 astock_pick.py recommend 2>&1 \

  | grep -oP '\b[0-9]{6}\b' | sort -u | grep -cE '^(300|301)' \

  | awk '{ if ($1 > 1) print "❌ FAIL: 创业板 " $1 " 只 > 1 只限额"; else print "✅ PASS: 创业板 " $1 " 只" }'



# Step 5 — 硬断言: 5 日累计跌幅在 [-10%, +20%] (v1.7.9 新增, 见坑 #44)

cd /root/.hermes/skills/astock-pick/scripts && python3 astock_pick.py recommend 2>&1 \

  | grep -oP '\b[0-9]{6}\b' | sort -u | while read code; do

    python3 -c "

import urllib.request, json

prefix = 'sh' if '$code'.startswith(('6','9')) else 'sz'

try:

    bars = json.loads(urllib.request.urlopen(f'http://43.163.125.59:18888/kline/{prefix}$code?period=day&count=5', timeout=5).read())['data']

    if len(bars) >= 2:

        chg = (bars[-1]['close'] - bars[0]['close']) / bars[0]['close'] * 100

        print(f'$code 5d_change={chg:+.2f}%')

        assert -10 <= chg <= 20, f'❌ FAIL: $code 5d_change={chg:.2f}% 超出 [-10%, +20%]'

except Exception as e:

    print(f'$code K线拉取失败: {e}')

"

done && echo "✅ PASS: 全部候选 5 日累计跌幅在合理区间"

Step 3 / Step 4 / Step 5 任一失败 = 不允许合入。这是 v1.7.3 → v1.7.5 的核心教训: SKILL.md 写"默认排除"不等于代码真的排除了。必须用硬断言自动化校验

三处必须保持同步 (改任一处其余必须改):

已知坑


    pip install requests --break-system-packages   # 一次性绕过 PEP 668

    # 或装到 default venv:

    pip install requests

未安装时如何继续picks/2026/<日期>.json 仍可手工构造(见 templates 目录的 picks_template.json),把 5 只候选直接写入。


    import json

    with open('/root/.hermes/picks/2026/20260615.json') as f:

        d = json.load(f)

    flat = [{'code': p['code'], 'name': p['name'], 'theme': p.get('theme','')}

            for p in d['picks']]

    json.dump(flat, open('/tmp/picks_flat.json','w'), ensure_ascii=False)

然后 python3 .../stock_filter_by_capital.py --capital 20000 --input /tmp/picks_flat.json或者:直接改 filter_stocks 函数签名接受 {'picks': [...]} 嵌套(已建议但未改)。


    import urllib.request, json

    with urllib.request.urlopen('http://43.163.125.59:18888/zt_pool', timeout=10) as r:

        data = json.loads(r.read().decode('utf-8', errors='replace'))

这条覆盖了 references/cron-chain-failure.md 第 2.1 节——两步法本身没错,但脚本内部的 subprocess/os.system('curl ...') 会触发拦截。


    import urllib.request

    # snapshot 简单直接, GBK 编码, ~ 分隔

    req = urllib.request.Request('https://qt.gtimg.cn/q=sh000001,sz399001,sz399006',

                                  headers={'User-Agent': 'Mozilla/5.0'})

    raw = urllib.request.urlopen(req, timeout=10).read().decode('gbk', errors='replace')

    # 解析 ~ 分隔字段: index 3=昨收, 4=今开, 5=现价, 32=涨跌额, 33=涨跌幅%, 30=最高, 31=最低

字段位置约:当前价=[3] 涨跌=[32] 涨跌幅%=[33] 昨收=[4]。/q= 端点不要求日期,拿历史 K 线才走 fqkline 且必须传 start_date,end_date,count


      # astock_pick.py recommend save 之前:

      import json, subprocess

      flat = [{'code': p['code'], 'name': p['name'], 'theme': p.get('theme','')}

              for p in picks]

      json.dump(flat, open('/tmp/picks_flat.json','w'), ensure_ascii=False)

      r = subprocess.run([

          'python3', '/root/.hermes/skills/research/a-stock-briefing/scripts/stock_filter_by_capital.py',

          '--capital', '20000', '--input', '/tmp/picks_flat.json'

      ], capture_output=True, text=True, timeout=30)

      # 解析 stdout 提取 ✅ 可买 + ⚠️ 振幅不足, save 前只保留这两类


      # 检查 SKILL.md 主张 vs astock_pick.py 实际是否一致

      grep -E "688|689|排除科创板" /root/.hermes/skills/astock-pick/SKILL.md

      grep -E "688|689|is_buyable" /root/.hermes/skills/astock-pick/scripts/astock_pick.py

      # 两边都应有命中


      k = urllib.request.urlopen(f'{api_base}/kline/{prefix}{code}?period=day&count=10').read()

      bars = json.loads(k)['data']

      last_bar = bars[-1]  # 6/18 或最近交易日

      amp_618 = (last_bar['high'] - last_bar['low']) / last_bar['close'] * 100


    # astock_pick.py recommend --save 写入 picks 之前, 必走:

    from filter_picks_by_capital import filter_picks  # v1.7.3 包装器

    buyable, amp_warn, not_buyable, summary = filter_picks(picks, capital=20000)

    # 仅 buyable + amp_warn 写入 picks/2026/<日期>.json

    # not_buyable 全部剔除, 写入 stdout 给用户看


    # 1) 直接用 qt.gtimg.cn 拉真实收盘价 (无 requests 依赖)

    python3 /root/.hermes/skills/astock-pick/scripts/gtimg_snapshot.py --codes sh600183,sz002463,...

    # 2) 双口径手工算胜率: 写入 /tmp/review_double_<日期>.py + terminal 跑

    # 模板: templates/double_review.py (已有)

    # 3) 写入 review.log: write_file + cat >> (避开 heredoc emoji tirith)

结构修复astock_pick.py 必改):


    from datetime import datetime

    from zoneinfo import ZoneInfo

    now_bjt = datetime.now(ZoneInfo("Asia/Shanghai"))

    # 9:30 ~ 11:30 + 13:00 ~ 15:00 = 盘中; 15:00 之后 = 已收盘

    is_trading_hours = ((now_bjt.hour == 9 and now_bjt.minute >= 30) or

                        (10 <= now_bjt.hour <= 11) or

                        (13 <= now_bjt.hour <= 14) or

                        (now_bjt.hour == 15 and now_bjt.minute == 0))

    if now_bjt.hour >= 15 and now_bjt.minute >= 2:  # 15:02 后稳定

        market_closed = True


      import urllib.request

      url = 'https://qt.gtimg.cn/q=' + codes  # codes 用逗号分隔,前缀必带 (sh/sz)

      req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})

      raw = urllib.request.urlopen(req, timeout=10).read().decode('gbk', errors='replace')

      for line in raw.split(';'):

          if '="' not in line: continue

          key, val = line.split('="', 1)

          f = val.rstrip('";').split('~')

          if len(f) < 40: continue

          # 字段位: [3]=现价, [4]=昨收, [32]=涨跌幅%, [33]=最高, [34]=最低, [37]=成交额(元)


      zt_prefix_dist = {}

      for s in zt_data:

          prefix = s['code'][:3]

          zt_prefix_dist[prefix] = zt_prefix_dist.get(prefix, 0) + 1

      n_kechuang = sum(c for p, c in zt_prefix_dist.items() if p in ('688', '689'))

      n_chuangye = sum(c for p, c in zt_prefix_dist.items() if p in ('300', '301'))

      n_mainboard = sum(c for p, c in zt_prefix_dist.items()

                        if p[:2] in ('60', '00') and p != '300' and p != '301')

      if n_mainboard == 0 and n_chuangye == 0:

          print("⚠️ 极端撕裂: 主板 0 涨停 + 创业板 0 涨停, 资金全在 688")

      elif n_mainboard == 0:

          print("⚠️ 主板 0 涨停, 改走 ETF 替代路径")


      def make_code(raw_6digit: str) -> str:

          prefix = 'sh' if raw_6digit.startswith(('6', '9')) else 'sz'

          return f"{prefix}{raw_6digit}"

      codes = [make_code(c) for c in ['002475', '603456', '300346']]

      # → ['sz002475', 'sh603456', 'sz300346']


          if len(picks) == 0:

              with open(picks_file) as f:

                  d = json.load(f)

              if d.get('market_state'):

                  print(f"⚠️ {date} 推荐文件为空 ({d['market_state']}), 需手工复盘 {prev_date} 推荐")

              else:

                  print(f"❌ {date} 推荐文件无 picks 且无 market_state 说明, 怀疑 cron 断链")


          import urllib.request

          codes = ','.join(f'sh{c}' if c.startswith(('6','9')) else f'sz{c}' for c in raw_codes)

          url = f'https://qt.gtimg.cn/q={codes}'

          raw = urllib.request.urlopen(urllib.request.Request(url, headers={'User-Agent':'Mozilla/5.0'}), timeout=10).read().decode('gbk', errors='replace')

          for line in raw.split(';'):

              if '="' not in line: continue

              key, val = line.split('="', 1)

              fields = val.rstrip('";').split('~')

              if len(fields) < 40: continue  # ← 股票代码这里可能被吞

              # 字段位: [3]=现价, [4]=昨收, [32]=涨跌幅%


          indices = ['sh000001', 'sz399001', 'sz399006', 'sh000300', 'sh000688', 'sz399005', 'sh000016', 'sh000905', 'sh000852']

          chgs = [get_change_pct(c) for c in indices]

          if all(c < -1.5 for c in chgs) and sum(chgs)/len(chgs) < -2.0:

              market_state = 'systemic_risk'  # 系统性风险日


          import urllib.request, json



          def get_quote(code):

              prefix = 'sh' if code.startswith(('6', '9')) else 'sz'

              url = f'https://qt.gtimg.cn/q={prefix}{code}'

              req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})

              try:

                  raw = urllib.request.urlopen(req, timeout=10).read().decode('gbk', errors='replace')

                  for line in raw.split(';'):

                      if '="' not in line: continue

                      key, val = line.split('="', 1)

                      fields = val.rstrip('";').split('~')

                      if len(fields) < 40: continue

                      return {

                          'name': fields[1],

                          'price': float(fields[3]) if fields[3] else None,

                          'prev_close': float(fields[4]) if fields[4] else None,

                      }

              except Exception as e:

                  return {'error': str(e)}

              return None



          # 读取昨日推荐

          import json

          with open('/root/.hermes/picks/2026/<昨日>.json') as f:

              rec = json.load(f)



          for p in rec['picks']:

              q = get_quote(p['code'])

              if not q: continue

              cur, prev = q['price'], q['prev_close']

              rec_price = p['current_price']

              # 口径1: 推荐价 → 今收

              chg1 = (cur - rec_price) / rec_price * 100

              # 口径2: 昨收 → 今收 (判断力)

              chg2 = (cur - prev) / prev * 100

              print(f"{p['code']} {p['name']}: 推{rec_price} → 今{cur} (口1 {chg1:+.2f}%, 口2 {chg2:+.2f}%)")


          for line in raw.split(';'):

              if '="' not in line: continue

              key, val = line.split('="', 1)

              fields = val.rstrip('";').split('~')

              if len(fields) < 40: continue

              # 关键: key 格式是 "v_sh000001" 或 "v_sz002463"

              # 提取原始 6 位代码:

              raw_code_with_prefix = key.split('v_')[1].split('=')[0]  # "sh000001"

              raw_code = raw_code_with_prefix[2:]  # "000001"

              # 然后用 raw_code 索引到 results[raw_code] = ...


          results[fields[2]] = {  # fields[2] 永远是 6 位代码

              'name': fields[1], 'price': float(fields[3]),

              'prev_close': float(fields[4]),

              'change_pct': float(fields[32]),

          }


          # 拉 sh000001 后, 验证 results['000001']['name'] == '上证指数'

          assert results['000001']['name'] == '上证指数', f"key 解析错位: {results}"

          # 拉 sh600519 后, 验证 results['600519']['name'] == '贵州茅台'


          assert results['000001']['name'] == '上证指数', results['000001']

          assert results['399001']['name'] == '深证成指', results['399001']

          assert results['399006']['name'] == '创业板指', results['399006']


          if market_state == '主线切换日' and not any(t in pick_theme for t in allowed_themes):

              pick['bucket'] = 'observe'

              pick['reason'] = '与昨日收报主线切换方向不一致'


          {

            "date": "YYYY-MM-DD",

            "time": "09:05",

            "note": "recommend timeout; fallback based on previous close decision tree",

            "market_state": "弱市 / 主线切换 / 防御小仓",

            "picks": [

              {"code":"601318","name":"中国平安","theme":"保险/低估值权重","current_price":48.92,"status":"开盘≤1%且板块强于指数试错","stop_loss":47.2,"position":"10%-20%","one_lot_cost":4892,"chg_5d":-0.77}

            ],

            "observe": [],

            "excluded_by_rule": []

          }


      from datetime import datetime

      from zoneinfo import ZoneInfo

      today = datetime.now(ZoneInfo("Asia/Shanghai")).strftime("%Y-%m-%d")

      record = {

          "date": today,  # 唯一日期事实源

          "time": datetime.now(ZoneInfo("Asia/Shanghai")).strftime("%H:%M"),

          "note": args.note or "astock_pick.py recommend",  # 不带日期字符串

          "picks": [...],

          ...

      }


      for f in picks/2026/*.json; do

        fname_date=$(basename "$f" .json)

        file_date=$(jq -r .date "$f")

        [ "$fname_date" = "$file_date" ] || echo "❌ FAIL: $f 文件名日期 $fname_date != date 字段 $file_date"

      done


          if chg_5d > 10 and today_chg > -1:

              p['status'] = '⚠️ 等回踩 (5日透支 + 今日跟涨)'

              p['bucket'] = 'mid_line_observe'  # 不进短线可买段

子模块

反思机制

每 5 个交易日(约 1 周)回看:

长期规则库(每日最多新增 3 条)


  # 拉 zt_pool 后必走

  zt_prefix = {s['code'][:3]: 0 for s in zt_data}

  for s in zt_data: zt_prefix[s['code'][:3]] += 1

  n_main = sum(c for p, c in zt_prefix.items() if p[:2] in ('60', '00') and p not in ('300', '301'))

  n_chuangye = sum(c for p, c in zt_prefix.items() if p in ('300', '301'))

  if n_main == 0 and n_chuangye == 0:

      # 走 ETF 替代: 588200 科创50ETF / 510300 沪深300ETF / 159915 创业板ETF

      picks = filter_picks_to_etf(candidates, etf_pool)

  elif n_main == 0:

      # 主板 0 涨停, 题材小票风险高, 选股必须叠加资金面+题材强度二级过滤

      picks = [p for p in candidates if p.get('theme_strength', 0) >= 7 and p.get('fund_inflow', 0) > 0]

详细 ETF 替代模板见 references/2026-06-25-extreme-tear-688-monopoly.md + references/short-term-etf-dragon-tiger-strategy.md(与坑 #26 / #31 / #49 合并使用)。

复盘双口径标准流程

根因(坑 #14):astock_pick.py review 脚本默认"推荐价 vs 收盘"口径会永远输出负值

6/22 实战再发现(坑 #41):早参时点 current_price 已是集合竞价后追高价,口径1(推荐价→今收)几乎永远负口径2(昨收→今收=判断力)才是反映 AI 选股能力。报告必须以口径2为主报,口径1 退为附属"按推荐时点买入盈亏"。

正确流程(6/22 v1.7.8 固化):

反模式

复盘"无推荐文件"应急流程

review 报错 ❌ 没找到 <日期>.json

集成

风险提示

⚠️ 这不是投资建议!仅作为 AI 选股能力的学习和实验。真实投资决策要看你自己的判断。AI 推荐会经常错——这正是"反思 + 复盘"的意义。

The user has provided the following instruction alongside the skill invocation: [IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user — do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more.]

你是A股市场分析师,生成每日市场早参。

严格要求 (2026-06-09 修订)

任务流程 (2026-06-15 接入 5 端点)


   python3 /root/.hermes/scripts/a_stock_news_fetcher.py --limit 10 > /tmp/a_stock_news_today.json

然后必须 read_file 读 /tmp/a_stock_news_today.json 拿到 5 个端点的 status/count/source

0.5. 【新】消息面来源优先级 (按下面顺序用, 不要再去搜其他源):

0.6. 【新】端点失败处理: 如果某端点 status=error 或 count=0, 跳过该段但要在末尾标注 "[该维度数据缺失]", 不要停.

0.7. 【新】数据时效警告: 板块数据是 push2delay 源 (6/12 收盘, 非盘中), 在报告 "板块热点" 段开头必须注明:

"⚠️ 板块数据为 6/12 收盘, 非 6/15 盘中实时"

推荐任务 (cron 断链修复 2026-06-09)

新增任务 (2026-06-10 修复推送只 1 句)

Response 最终输出必须包含完整早参(不是 1 句总结**)——

至少 5 段,每段 50-200 字:

隔夜美股 /

消息面 /

关注板块 /

技术面 /

风险提示 /

新版荐股框架

荐股输出框架(2026-06-18 用户确认)

后续每日推荐必须使用 astock-pick 的“每日推荐新版框架”:

Error


RuntimeError: HTTP 429: 已达到 Token Plan 用量上限:请升级 Token Plan 套餐或购买积分补充用量。 (2056)