-- ============================================================================ -- astock-kg 因子插槽接口:只读视图(供 akg-factor-bridge 消费) -- ---------------------------------------------------------------------------- -- 应用到 astock-kg 的 PostgreSQL(akg 库): psql "$AKG_PG_DSN" -f astock_kg_slot_views.sql -- 只读投影、零新增计算;基座内部表可自由重构,只要这四个视图的列不变,桥不受影响。 -- 幂等:CREATE OR REPLACE。列/JSON 键均已从 astock-kg 代码核准(见每条注释出处)。 -- ============================================================================ -- 0) 覆盖池 universe = 全部 industry_pools 成员 ts_code 并集 -- (对齐 market_snapshot._pool_ts_codes;members 为 JSONB 数组,元素含 ts_code/name) CREATE OR REPLACE VIEW v_factor_universe AS SELECT DISTINCT m->>'ts_code' AS ts_code FROM industry_pools p CROSS JOIN LATERAL jsonb_array_elements(COALESCE(p.members, '[]'::jsonb)) AS m WHERE m->>'ts_code' IS NOT NULL AND m->>'ts_code' <> ''; -- 1) 一致预期(供 upside):consensus_daily 全 asof 行投影,桥按 trade_date 做 as-of。 -- 列源:market_snapshot._CONSENSUS_DDL。 CREATE OR REPLACE VIEW v_factor_consensus AS SELECT ts_code, asof_date, target_mid_avg, eps_med, np_med, n_orgs, n_reports_90d FROM consensus_daily WHERE target_mid_avg IS NOT NULL; -- 2) 利好利空事件(供 event):EVENT 断言投影。 -- ts_code 取【文档锚】documents.meta->>'company_ts_code'(公告单公司、100% 可靠; -- claim_store 多处以此为公司锚),不用 claims.subject_id(抽取原始名/码、未解析)。 -- event_type / direction / scope 从 qualifiers 取,键名核自 pipeline._event_to_claim: -- qualifiers.event_type(EVENT_TYPES 或 other) -- qualifiers.direction = 预增/预减(业绩预告必填;其余多为空) -- qualifiers.scope = 累计/单次(回购、增减持) CREATE OR REPLACE VIEW v_factor_events AS SELECT d.meta->>'company_ts_code' AS ts_code, c.disclosure_date, c.qualifiers->>'event_type' AS event_type, c.qualifiers->>'direction' AS direction, c.qualifiers->>'scope' AS scope, c.confidence, c.dedup_key FROM claims c JOIN documents d ON d.doc_id = c.doc_id WHERE c.predicate = 'EVENT' AND d.meta->>'company_ts_code' IS NOT NULL; -- 3) 板块传导(供 transmission):transmission_candidates 的未动成员(quiet)摊平成每股一行。 -- 一只股当日可能出现在多个候选(属多个目标环节)→ 多行,桥侧聚合(取最大 n_paths)。 -- 列源:transmission._DDL(paths/quiet 均 JSONB,moved_ratio NUMERIC)。 CREATE OR REPLACE VIEW v_factor_transmission AS SELECT t.scan_date, q->>'ts_code' AS ts_code, jsonb_array_length(COALESCE(t.paths, '[]'::jsonb)) AS n_paths, -- 指向该环节的传导路径数 t.moved_ratio -- 该环节已动成员比例 FROM transmission_candidates t CROSS JOIN LATERAL jsonb_array_elements(COALESCE(t.quiet, '[]'::jsonb)) AS q WHERE q->>'ts_code' IS NOT NULL AND q->>'ts_code' <> '';