Cai
2026-08-16 2992aee3f9bb2eaa5dd4da28a598be3d67ea0ec0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
WITH latest_profile AS (
  SELECT MAX(snapshot_date) AS snapshot_date
  FROM a_share_profile_snapshot
  WHERE snapshot_date <= '2026-07-04'
),
universe AS (
  SELECT
    p.symbol,
    p.stock_name,
    p.industry_l1,
    p.industry_l2,
    p.concepts_raw,
    p.main_business_raw
  FROM a_share_profile_snapshot p
  JOIN latest_profile lp ON lp.snapshot_date = p.snapshot_date
  WHERE p.status = 'OK'
    AND ((p.industry_l1 LIKE '%机器人%' ESCAPE '\\' OR p.industry_l2 LIKE '%机器人%' ESCAPE '\\' OR p.concepts_raw LIKE '%机器人%' ESCAPE '\\' OR p.main_business_raw LIKE '%机器人%' ESCAPE '\\' OR p.stock_name LIKE '%机器人%' ESCAPE '\\') OR (p.industry_l1 LIKE '%人形机器人%' ESCAPE '\\' OR p.industry_l2 LIKE '%人形机器人%' ESCAPE '\\' OR p.concepts_raw LIKE '%人形机器人%' ESCAPE '\\' OR p.main_business_raw LIKE '%人形机器人%' ESCAPE '\\' OR p.stock_name LIKE '%人形机器人%' ESCAPE '\\') OR (p.industry_l1 LIKE '%工业机器人%' ESCAPE '\\' OR p.industry_l2 LIKE '%工业机器人%' ESCAPE '\\' OR p.concepts_raw LIKE '%工业机器人%' ESCAPE '\\' OR p.main_business_raw LIKE '%工业机器人%' ESCAPE '\\' OR p.stock_name LIKE '%工业机器人%' ESCAPE '\\') OR (p.industry_l1 LIKE '%机器视觉%' ESCAPE '\\' OR p.industry_l2 LIKE '%机器视觉%' ESCAPE '\\' OR p.concepts_raw LIKE '%机器视觉%' ESCAPE '\\' OR p.main_business_raw LIKE '%机器视觉%' ESCAPE '\\' OR p.stock_name LIKE '%机器视觉%' ESCAPE '\\') OR (p.industry_l1 LIKE '%减速器%' ESCAPE '\\' OR p.industry_l2 LIKE '%减速器%' ESCAPE '\\' OR p.concepts_raw LIKE '%减速器%' ESCAPE '\\' OR p.main_business_raw LIKE '%减速器%' ESCAPE '\\' OR p.stock_name LIKE '%减速器%' ESCAPE '\\') OR (p.industry_l1 LIKE '%伺服%' ESCAPE '\\' OR p.industry_l2 LIKE '%伺服%' ESCAPE '\\' OR p.concepts_raw LIKE '%伺服%' ESCAPE '\\' OR p.main_business_raw LIKE '%伺服%' ESCAPE '\\' OR p.stock_name LIKE '%伺服%' ESCAPE '\\') OR (p.industry_l1 LIKE '%丝杠%' ESCAPE '\\' OR p.industry_l2 LIKE '%丝杠%' ESCAPE '\\' OR p.concepts_raw LIKE '%丝杠%' ESCAPE '\\' OR p.main_business_raw LIKE '%丝杠%' ESCAPE '\\' OR p.stock_name LIKE '%丝杠%' ESCAPE '\\') OR (p.industry_l1 LIKE '%灵巧手%' ESCAPE '\\' OR p.industry_l2 LIKE '%灵巧手%' ESCAPE '\\' OR p.concepts_raw LIKE '%灵巧手%' ESCAPE '\\' OR p.main_business_raw LIKE '%灵巧手%' ESCAPE '\\' OR p.stock_name LIKE '%灵巧手%' ESCAPE '\\') OR (p.industry_l1 LIKE '%传感器%' ESCAPE '\\' OR p.industry_l2 LIKE '%传感器%' ESCAPE '\\' OR p.concepts_raw LIKE '%传感器%' ESCAPE '\\' OR p.main_business_raw LIKE '%传感器%' ESCAPE '\\' OR p.stock_name LIKE '%传感器%' ESCAPE '\\') OR (p.industry_l1 LIKE '%具身智能%' ESCAPE '\\' OR p.industry_l2 LIKE '%具身智能%' ESCAPE '\\' OR p.concepts_raw LIKE '%具身智能%' ESCAPE '\\' OR p.main_business_raw LIKE '%具身智能%' ESCAPE '\\' OR p.stock_name LIKE '%具身智能%' ESCAPE '\\'))
),
price_with_prev AS (
  SELECT
    d.symbol,
    d.trade_date,
    d.open_price,
    d.high_price,
    d.low_price,
    d.close_price,
    d.volume,
    d.amount,
    LAG(d.close_price) OVER (PARTITION BY d.symbol ORDER BY d.trade_date) AS prev_close,
    AVG(d.amount) OVER (
      PARTITION BY d.symbol
      ORDER BY d.trade_date
      ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING
    ) AS avg_amount_20
  FROM a_share_daily_price d
  JOIN universe u ON u.symbol = d.symbol
  WHERE d.trade_date BETWEEN DATE_SUB('2026-04-04', INTERVAL 30 DAY) AND '2026-07-04'
),
window_rows AS (
  SELECT
    u.stock_name,
    u.industry_l1,
    u.industry_l2,
    u.concepts_raw,
    u.main_business_raw,
    p.*,
    CASE
      WHEN p.prev_close IS NULL OR p.prev_close = 0 THEN NULL
      ELSE (p.close_price / p.prev_close - 1) * 100
    END AS daily_return_pct,
    CASE
      WHEN p.avg_amount_20 IS NULL OR p.avg_amount_20 = 0 THEN NULL
      ELSE p.amount / p.avg_amount_20
    END AS amount_ratio_20
  FROM price_with_prev p
  JOIN universe u ON u.symbol = p.symbol
  WHERE p.trade_date BETWEEN '2026-04-04' AND '2026-07-04'
),
ranked AS (
  SELECT
    w.*,
    ROW_NUMBER() OVER (PARTITION BY w.symbol ORDER BY w.trade_date) AS rn_first,
    ROW_NUMBER() OVER (PARTITION BY w.symbol ORDER BY w.trade_date DESC) AS rn_last
  FROM window_rows w
),
agg AS (
  SELECT
    symbol,
    MAX(stock_name) AS company_name,
    MAX(industry_l1) AS industry_l1,
    MAX(industry_l2) AS industry_l2,
    MAX(concepts_raw) AS concepts_raw,
    MAX(main_business_raw) AS main_business_raw,
    MIN(trade_date) AS window_start,
    MAX(trade_date) AS window_end,
    MAX(CASE WHEN rn_first = 1 THEN close_price END) AS first_close,
    MAX(CASE WHEN rn_last = 1 THEN close_price END) AS last_close,
    COUNT(*) AS trading_days,
    SUM(CASE WHEN daily_return_pct >= 9.5 THEN 1 ELSE 0 END) AS strong_up_days,
    MAX(daily_return_pct) AS max_daily_return_pct,
    MAX(amount_ratio_20) AS max_amount_ratio_20,
    MAX(amount) AS max_amount
  FROM ranked
  GROUP BY symbol
),
scored AS (
  SELECT
    *,
    CASE
      WHEN first_close IS NULL OR first_close = 0 THEN NULL
      ELSE (last_close / first_close - 1) * 100
    END AS period_return_pct
  FROM agg
)
SELECT
  'SCAN-ANA-ROBOT-MARKET-GAP-20260704-001' AS scan_id,
  '机器人案例' AS industry_case,
  symbol,
  company_name,
  industry_l1,
  industry_l2,
  window_start,
  window_end,
  trading_days,
  ROUND(first_close, 4) AS first_close,
  ROUND(last_close, 4) AS last_close,
  ROUND(period_return_pct, 4) AS period_return_pct,
  strong_up_days,
  ROUND(max_daily_return_pct, 4) AS max_daily_return_pct,
  ROUND(max_amount_ratio_20, 4) AS max_amount_ratio_20,
  CASE
    WHEN period_return_pct >= 20.0 OR strong_up_days >= 1 OR max_amount_ratio_20 >= 2.0
    THEN 'STRONG_MANIFESTATION'
    ELSE 'WEAK_OR_NORMAL'
  END AS manifestation_type,
  'REVIEW_REQUIRED' AS scope_type,
  'REVIEW_REQUIRED' AS suspected_missing_track,
  'MARKET_REVERSE_GAP_SCAN' AS gap_type,
  CASE
    WHEN period_return_pct >= 20.0 OR strong_up_days >= 1 OR max_amount_ratio_20 >= 2.0
    THEN 1
    ELSE 0
  END AS supplement_required_flag,
  'Review core business against industry scheme before adding to evidence queue' AS supplement_question,
  'DRAFT_FOR_REVIEW' AS review_status,
  LEFT(concepts_raw, 500) AS concepts_excerpt,
  LEFT(main_business_raw, 500) AS main_business_excerpt
FROM scored
WHERE period_return_pct >= 20.0
   OR strong_up_days >= 1
   OR max_amount_ratio_20 >= 2.0
ORDER BY supplement_required_flag DESC, period_return_pct DESC, strong_up_days DESC, max_amount_ratio_20 DESC;