wmshare 1.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. wmshare/__init__.py +46 -0
  2. wmshare/_catalog/domains/corp.equity.yaml +87 -0
  3. wmshare/_catalog/domains/disc.bonus.yaml +187 -0
  4. wmshare/_catalog/domains/disc.events.yaml +91 -0
  5. wmshare/_catalog/domains/disc.filings.yaml +39 -0
  6. wmshare/_catalog/domains/disc.notice.yaml +160 -0
  7. wmshare/_catalog/domains/disc.workout.yaml +18 -0
  8. wmshare/_catalog/domains/fund.estimates.yaml +24 -0
  9. wmshare/_catalog/domains/fund.indicators.yaml +162 -0
  10. wmshare/_catalog/domains/fund.segments.yaml +184 -0
  11. wmshare/_catalog/domains/fund.statements.yaml +77 -0
  12. wmshare/_catalog/domains/market.cbond.yaml +32 -0
  13. wmshare/_catalog/domains/market.index.yaml +24 -0
  14. wmshare/_catalog/domains/market.intl.yaml +31 -0
  15. wmshare/_catalog/domains/market.kline.yaml +224 -0
  16. wmshare/_catalog/domains/market.margin.yaml +21 -0
  17. wmshare/_catalog/domains/market.moneyflow.yaml +73 -0
  18. wmshare/_catalog/generated/inventory.json +7299 -0
  19. wmshare/_catalog/generated/metrics.json +8795 -0
  20. wmshare/_catalog/schema/domain.schema.json +128 -0
  21. wmshare/_catalog/symbols/companies.cn.json +1 -0
  22. wmshare/_catalog/symbols/companies.hk.json +1 -0
  23. wmshare/_catalog/symbols/companies.us.json +1 -0
  24. wmshare/_catalog/symbols/manifest.json +10 -0
  25. wmshare/api/__init__.py +1398 -0
  26. wmshare/api/_generated.py +1648 -0
  27. wmshare/catalog.py +355 -0
  28. wmshare/client.py +548 -0
  29. wmshare/errors.py +78 -0
  30. wmshare/notice_stream.py +360 -0
  31. wmshare/py.typed +0 -0
  32. wmshare/skills/wmshare/SKILL.md +173 -0
  33. wmshare/units.py +207 -0
  34. wmshare-1.7.0.dist-info/METADATA +274 -0
  35. wmshare-1.7.0.dist-info/RECORD +38 -0
  36. wmshare-1.7.0.dist-info/WHEEL +5 -0
  37. wmshare-1.7.0.dist-info/licenses/LICENSE +154 -0
  38. wmshare-1.7.0.dist-info/top_level.txt +1 -0
wmshare/__init__.py ADDED
@@ -0,0 +1,46 @@
1
+ """wmshare — WinMale 个股开放数据 SDK。
2
+
3
+ 机器可读数据目录(catalog/)+ OpenAPI 取数客户端。返回值统一基础单位:
4
+ 比率/涨跌幅=小数(0.332=33.2%)、金额/价格/市值=元(报表原币)、股数/成交量=股;
5
+ 每次返回都经过目录声明的量级守护与关系不变量校验(违例抛 DataError)。
6
+
7
+ import wmshare
8
+
9
+ cat = wmshare.load() # 数据目录(域/函数/参数/返回 schema)
10
+ fn = cat.function("kline.query_bars")
11
+
12
+ cli = wmshare.Client.from_env() # 读 WMSHARE_CLIENT_ID/SECRET(或凭证文件)
13
+ bars = cli.call("kline.query_bars", sym="600519", limit=30)
14
+ # _units="native" 保留脚本输出单位;_raw=True 返回 store 原始行;
15
+ # Client(validate=False) 关闭校验(换算仍执行)
16
+ """
17
+ from wmshare.catalog import Catalog, load
18
+ from wmshare.client import BatchResult, Client, normalize_symbol
19
+ from wmshare.errors import (
20
+ ApiError, AuthError, CatalogError, DataError, WmshareError, LimitError,
21
+ ServerError, StreamResetError, TransportError, UsageError,
22
+ )
23
+ from wmshare.notice_stream import NoticePoller, NoticeStreamEvent
24
+
25
+ __version__ = "1.7.0"
26
+
27
+ __all__ = [
28
+ "Catalog", "load", "Client", "BatchResult", "normalize_symbol", "__version__",
29
+ "skill_dir",
30
+ "NoticePoller", "NoticeStreamEvent",
31
+ "WmshareError", "AuthError", "UsageError", "LimitError", "TransportError",
32
+ "ServerError", "ApiError", "DataError", "CatalogError", "StreamResetError",
33
+ ]
34
+
35
+
36
+ def skill_dir():
37
+ """随包分发的 AI agent skill 目录(Agent Skills 格式,含 SKILL.md)。
38
+
39
+ 装入 agent(复制到其发现路径之一)::
40
+
41
+ cp -r "$(python3 -c 'import wmshare; print(wmshare.skill_dir())')" \\
42
+ ~/.agents/skills/wmshare
43
+ """
44
+ from pathlib import Path
45
+
46
+ return Path(__file__).resolve().parent / "skills" / "wmshare"
@@ -0,0 +1,87 @@
1
+ id: corp.equity
2
+ version: 2.1.0
3
+ cn: 股东与股本
4
+ kind: raw
5
+ category: reference
6
+ priority: P1
7
+ description: 股东治理与股本全景——十大股东、股东户数、股权质押(明细+比例+市场/行业/
8
+ 机构分布)、限售解禁、机构持股(明细/占比/沪港通/国家队)、高管名册与增减持、股本结构、
9
+ 回购(方案+执行)、并购重组、关联交易、一致行动人、对外担保、诉讼处罚。披露原值直采,
10
+ 比例字段统一换算为小数(0.0522 = 5.22%)。
11
+ data_origin: [交易所披露, 平台数据服务]
12
+ stores: [biz.equity, ref.info]
13
+ units:
14
+ ratio: 小数(比例字段以各函数 units 声明为准:上游 fmt 部分接口已预换算小数、
15
+ 部分仍为百分数——2026-10-28 全量审计逐函数核验,勿按字段名臆断)
16
+ money: 元(持股市值/质押市值/回购金额等,披露源口径)
17
+ shares: 股(持股数/解禁数量/质押数量)
18
+ price: 元(交易均价/回购价)
19
+ requires: {path: sys/equity/init.xs, preloaded: true}
20
+ notes:
21
+ - '公司档案(名称/行业/上市日期/简介)经 cli.info.profile() 与 fund.indicators 的
22
+ profile 指标组($NAME/$INDUSTRY_CUR/$ORG_ORGTYPE/$ORG_LISTINGDATE)获取'
23
+ - '比例字段换算以各函数 units 声明为准(同接口内可能混排:institution_summary 的
24
+ all_shares_ratio 为百分数、total_shares_ratio 已是小数);ranges 为 2026-10-28
25
+ live 审计实测界;其余未声明字段保持披露原值'
26
+ - '2026-10-28 审计已核验为元/股/小数并补 ranges:reorg.deal_amount(元)、
27
+ violation.punish_amt(元)、executives.salary(元/年)、capital_change.total_shares
28
+ (股)、holdernum 比例族(小数)、pledge_market.pledge_ratio_total(小数,
29
+ 上游 inventory cn「百分数」为遗留标注);guarantee_amt、exec_change 族仍待样本'
30
+ - 'query_exec_change_at / query_capital_change_at 按报告期取数(annual 如 2024、
31
+ sampling 如 Q4)'
32
+ functions:
33
+ # ---- 股东 ----
34
+ - {name: equity.query_holder10, cn: 最新一期十大股东, layer: L0, normalize_with: equity.fmt_holder10, ranges: {hold_num_ratio: [0, 1]}}
35
+ - {name: equity.query_holdernum, cn: 最新股东户数, layer: L0, normalize_with: equity.fmt_holdernum, ranges: {hold_ratio_total: [0, 1], freehold_ratio_total: [0, 1], total_num_ratio: [0, 1], avg_freeshares_ratio: [-1, 1], avg_hold_amt: [0, 1.0e+09], avg_free_shares: [0, 1.0e+10]}}
36
+ # ---- 质押 ----
37
+ - {name: equity.query_pledge_detail, cn: 主要股东质押明细, layer: L0, normalize_with: equity.fmt_pledge_detail, units: {accum_pledge_tsr: percent, pf_hold_ratio: percent, pf_tsr: percent}, ranges: {accum_pledge_tsr: [0, 1], pf_hold_ratio: [0, 1], pf_tsr: [0, 1]}}
38
+ - {name: equity.query_pledge_summary, cn: 公司质押比例, layer: L0, normalize_with: equity.fmt_pledge_summary, ranges: {pledge_ratio: [0, 1]}}
39
+ - {name: equity.query_pledge_market, cn: 市场整体质押, layer: L0, normalize_with: equity.fmt_pledge_market, ranges: {pledge_ratio_total: [0, 1], csi300_chg: [-1, 1], pledge_market_value: [0, 1.0e+14], total_pledged_shares: [0, 1.0e+13]}}
40
+ - {name: equity.query_pledge_industry, cn: 行业质押比例, layer: L0, normalize_with: equity.fmt_pledge_industry, ranges: {avg_pledge_ratio: [0, 1]}}
41
+ - {name: equity.query_pledge_org, cn: 质押机构分布, layer: L0, normalize_with: equity.fmt_pledge_org}
42
+ # ---- 机构 ----
43
+ - {name: equity.query_institution_detail, cn: 机构持股明细, layer: L0, normalize_with: equity.fmt_institution_detail, units: {total_shares_ratio: percent, free_shares_ratio: percent}, ranges: {total_shares_ratio: [0, 1], free_shares_ratio: [0, 1]}}
44
+ - {name: equity.query_institution_summary, cn: 机构持仓占比, layer: L0, normalize_with: equity.fmt_institution_summary, units: {all_shares_ratio: percent}, ranges: {all_shares_ratio: [0, 1], total_shares_ratio: [0, 1], change_ratio: [-1, 1]}}
45
+ - {name: equity.query_hgt, cn: 沪港通持股, layer: L0, normalize_with: equity.fmt_hgt, units: {add_shares_pct: percent}, ranges: {add_shares_pct: [0, 1], free_shares_ratio: [0, 1], total_shares_ratio: [0, 1]}}
46
+ - {name: equity.query_national_team, cn: 国家队持股, layer: L0, normalize_with: equity.fmt_national_team, units: {shares_ratio: percent, shares_ratio_change: percent}, ranges: {shares_ratio: [0, 1], shares_ratio_change: [-1, 1]}}
47
+ # ---- 治理事件 ----
48
+ - {name: equity.query_release, cn: 限售解禁日程, layer: L0, normalize_with: equity.fmt_release, units: {total_shares_ratio: percent, unlimited_ratio: percent}, ranges: {total_shares_ratio: [0, 1], unlimited_ratio: [0, 1]}}
49
+ - {name: equity.query_buyback_plan, cn: 回购方案全览, layer: L0, normalize_with: equity.fmt_buyback_plan}
50
+ - {name: equity.query_buyback_detail, cn: 回购执行明细, layer: L0, normalize_with: equity.fmt_buyback_detail}
51
+ - {name: equity.query_reorg, cn: 并购重组, layer: L0, normalize_with: equity.fmt_reorg, units: {transfer_ratio: percent}, ranges: {transfer_ratio: [0, 1]}}
52
+ - {name: equity.query_related_trade, cn: 关联交易, layer: L0, normalize_with: equity.fmt_related_trade}
53
+ - {name: equity.query_concert, cn: 一致行动人, layer: L0, normalize_with: equity.fmt_concert, units: {hold_ratio: percent}, ranges: {hold_ratio: [0, 1]}}
54
+ - {name: equity.query_guarantee, cn: 对外担保, layer: L0, normalize_with: equity.fmt_guarantee}
55
+ - {name: equity.query_litigation, cn: 诉讼记录, layer: L0, normalize_with: equity.fmt_litigation}
56
+ - {name: equity.query_violation, cn: 违规处罚, layer: L0, normalize_with: equity.fmt_violation, ranges: {punish_amt: [0, 1.0e+11]}}
57
+ # ---- 高管与股本 ----
58
+ - {name: equity.query_executives, cn: 高管名册, layer: L0, normalize_with: equity.fmt_executives, ranges: {salary: [0, 1.0e+8], hold_num: [0, 1.0e+10]}}
59
+ - {name: equity.query_exec_change, cn: 高管增减持最新, layer: L0, normalize_with: equity.fmt_exec_change}
60
+ - {name: equity.query_exec_change_at, cn: 指定报告期增减持, layer: L1, normalize_with: equity.fmt_exec_change}
61
+ - {name: equity.query_capital_change, cn: 股本结构最新, layer: L0, normalize_with: equity.fmt_capital_change, ranges: {total_shares: [0, 1.0e+13], free_shares: [0, 1.0e+13]}}
62
+ - {name: equity.query_capital_change_at, cn: 指定报告期股本, layer: L1, normalize_with: equity.fmt_capital_change}
63
+ # ---- L1:规范化工具 ----
64
+ - {name: equity.fmt_holder10, cn: 十大股东行规范化, layer: L1}
65
+ - {name: equity.fmt_holdernum, cn: 股东户数规范化, layer: L1}
66
+ - {name: equity.fmt_pledge_detail, cn: 质押明细规范化, layer: L1}
67
+ - {name: equity.fmt_pledge_summary, cn: 质押比例规范化, layer: L1}
68
+ - {name: equity.fmt_pledge_market, cn: 市场质押规范化, layer: L1}
69
+ - {name: equity.fmt_pledge_industry, cn: 行业质押规范化, layer: L1}
70
+ - {name: equity.fmt_pledge_org, cn: 质押机构分布规范化, layer: L1}
71
+ - {name: equity.fmt_institution_detail, cn: 机构明细规范化, layer: L1}
72
+ - {name: equity.fmt_institution_summary, cn: 机构占比规范化, layer: L1}
73
+ - {name: equity.fmt_hgt, cn: 沪港通行规范化, layer: L1}
74
+ - {name: equity.fmt_national_team, cn: 国家队行规范化, layer: L1}
75
+ - {name: equity.fmt_release, cn: 解禁行规范化, layer: L1}
76
+ - {name: equity.fmt_buyback_plan, cn: 回购方案行规范化, layer: L1}
77
+ - {name: equity.fmt_buyback_detail, cn: 回购明细规范化, layer: L1}
78
+ - {name: equity.fmt_reorg, cn: 重组行规范化, layer: L1}
79
+ - {name: equity.fmt_related_trade, cn: 关联交易行规范化, layer: L1}
80
+ - {name: equity.fmt_concert, cn: 一致行动人行规范化, layer: L1}
81
+ - {name: equity.fmt_guarantee, cn: 担保行规范化, layer: L1}
82
+ - {name: equity.fmt_litigation, cn: 诉讼行规范化, layer: L1}
83
+ - {name: equity.fmt_violation, cn: 处罚行规范化, layer: L1}
84
+ - {name: equity.fmt_executives, cn: 高管行规范化, layer: L1}
85
+ - {name: equity.fmt_exec_change, cn: 增减持行规范化, layer: L1}
86
+ - {name: equity.fmt_capital_change, cn: 股本行规范化, layer: L1}
87
+ - {name: equity.fmt_lines, cn: 规范化行转文本, layer: L1}
@@ -0,0 +1,187 @@
1
+ id: disc.bonus
2
+ version: 1.3.0
3
+ cn: 分红
4
+ kind: raw
5
+ category: disclosure
6
+ priority: P0
7
+ description: 分红历史明细(预案/实施)、每股股利、窗口合计。列表与 DPS 为披露原值;
8
+ 股息率/派息率 TTM 快照及全市场筛选为计算派生(函数级标注性质)。
9
+ data_origin: [公司公告披露]
10
+ units:
11
+ dps: 元/股
12
+ total: 元(窗口合计金额)
13
+ window: '如 "3y" / "5y" 窗口字符串'
14
+ rate: 小数(0.03 = 3%)
15
+ requires: {path: sys/bonus/init.xs, preloaded: true}
16
+ notes:
17
+ - '已知问题:最新年度/中期分红记录的 net_profit/payout_ratio 列可能回填滞后(暂为 0),
18
+ 仅影响 history 明细展示;筛选/快照走 TTM 派息指标($BONUS_TTM_RATE_LAST)不受影响。
19
+ screen_quality 默认「精品」窗口=股息率>3% 且派息率 30%–70%,出界判 False 属设计'
20
+ functions:
21
+ - name: bonus.query_list
22
+ cn: 分红历史明细
23
+ kind: raw
24
+ layer: L0
25
+ params:
26
+ - {name: sym, type: string, required: true, desc: 6 位裸码}
27
+ - {name: limit, type: int, required: false, desc: 条数}
28
+ returns: {desc: 'ARR · 分红行(announce/ex_date/pay/dps/total/content/sas/payout_ratio)'}
29
+ example: 'bonus.query_list("600519", 20)'
30
+ normalize_with: bonus.fmt_maps
31
+ notes: [输出为规范化的扁平行(announce/ex_date/pay/dps/total/content/sas/payout_ratio),不再嵌套 props]
32
+ - name: bonus.query_last
33
+ cn: 最近一次分红
34
+ kind: raw
35
+ layer: L0
36
+ params:
37
+ - {name: sym, type: string, required: true}
38
+ returns: {desc: 分红行 MAP 或 nil}
39
+ example: 'bonus.query_last("600519")'
40
+ - name: bonus.query_at_sas
41
+ cn: 指定报告期分红
42
+ kind: raw
43
+ layer: L0
44
+ params:
45
+ - {name: sym, type: string, required: true}
46
+ - {name: sas, type: string, required: true, desc: '报告期,如 "2024-Q4"'}
47
+ returns: {desc: 分红行 MAP 或 nil}
48
+ example: 'bonus.query_at_sas("600519", "2024-Q4")'
49
+ - name: bonus.dps_rpt
50
+ cn: 财报期每股分红
51
+ kind: raw
52
+ layer: L0
53
+ params:
54
+ - {name: sym, type: string, required: true}
55
+ returns: {desc: float · 财报期每股分红(元/股)}
56
+ example: 'bonus.dps_rpt("600519")'
57
+ - name: bonus.dps_rpt_asof
58
+ cn: 财报期每股分红(截至日)
59
+ kind: raw
60
+ layer: L0
61
+ params:
62
+ - {name: rows, type: array, required: true, desc: dps_rpt 结果}
63
+ - {name: asof, type: string, required: true, desc: 截至日期}
64
+ returns: {desc: 截至日的 DPS}
65
+ example: 'bonus.dps_rpt_asof(rows, "2025-06-30")'
66
+ - name: bonus.query_dps_window
67
+ cn: 窗口内每股股利合计
68
+ kind: computed
69
+ layer: L0
70
+ params:
71
+ - {name: sym, type: string, required: true}
72
+ - {name: window, type: string, required: true, desc: 窗口(如 3y)}
73
+ returns: {desc: float · 元/股}
74
+ example: 'bonus.query_dps_window("600519", "3y")'
75
+ - name: bonus.query_total_window
76
+ cn: 窗口内总分红
77
+ kind: computed
78
+ layer: L0
79
+ params:
80
+ - {name: sym, type: string, required: true}
81
+ - {name: window, type: string, required: true}
82
+ returns: {desc: float · 元}
83
+ example: 'bonus.query_total_window("600519", "3y")'
84
+ - name: bonus.query_count_window
85
+ cn: 窗口内分红次数
86
+ kind: computed
87
+ layer: L0
88
+ params:
89
+ - {name: sym, type: string, required: true}
90
+ - {name: window, type: string, required: true}
91
+ returns: {desc: int}
92
+ example: 'bonus.query_count_window("600519", "5y")'
93
+ notes: ['已知问题:上游 count 聚合当前恒为 0(同窗口 sum 正常),待上游修复;SDK 的 window_stats 暂不返回该值']
94
+ - name: bonus.query_valid
95
+ cn: 有效分红序列(过滤无效行)
96
+ kind: raw
97
+ layer: L0
98
+ params:
99
+ - {name: sym, type: string, required: true}
100
+ - {name: limit, type: int, required: false}
101
+ returns: {desc: ARR · 分红行}
102
+ example: 'bonus.query_valid("600519", 20)'
103
+ - name: bonus.snapshot
104
+ cn: 股息快照
105
+ kind: computed
106
+ layer: L0
107
+ params:
108
+ - {name: sym, type: string, required: true}
109
+ returns: {desc: MAP · 股息/率快照}
110
+ example: 'bonus.snapshot("600519")'
111
+ - name: bonus.snapshot_yield_ttm
112
+ cn: LTM 股息率
113
+ kind: computed
114
+ layer: L0
115
+ params:
116
+ - {name: sym, type: string, required: true}
117
+ returns: {desc: 'float · 小数(0.0396 = 3.96%)'}
118
+ example: 'bonus.snapshot_yield_ttm("600519")'
119
+ notes: [股息率 = TTM 分红总额 / 最新市值;数值为小数口径]
120
+ - name: bonus.snapshot_payout_ttm
121
+ cn: TTM 派息率
122
+ kind: computed
123
+ layer: L0
124
+ params:
125
+ - {name: sym, type: string, required: true}
126
+ returns: {desc: 'float · 小数(0.799 = 79.9%)'}
127
+ example: 'bonus.snapshot_payout_ttm("600519")'
128
+ notes: [派息率 = TTM 分红 / 归母净利 TTM;数值为小数口径]
129
+ # ---- L1:单票质量筛选(computed)----
130
+ - {name: bonus.screen_active, cn: 近年有分红, kind: computed, layer: L1}
131
+ - {name: bonus.screen_has_dividend, cn: 有分红记录, kind: computed, layer: L1}
132
+ - {name: bonus.screen_high_yield, cn: 高股息, kind: computed, layer: L1}
133
+ - {name: bonus.screen_ample_payout, cn: 慷慨派息, kind: computed, layer: L1}
134
+ - {name: bonus.screen_danger_payout, cn: 派息不可持续, kind: computed, layer: L1}
135
+ - {name: bonus.screen_quality, cn: 分红质量优, kind: computed, layer: L1}
136
+ - {name: bonus.screen_stable_yield, cn: 股息稳定, kind: computed, layer: L1}
137
+ - {name: bonus.screen_improving_yield, cn: 股息改善, kind: computed, layer: L1}
138
+ - {name: bonus.screen_trend_ok, cn: 分红趋势健康, kind: computed, layer: L1}
139
+ - {name: bonus.screen_declining_yield, cn: 股息下滑, kind: computed, layer: L1}
140
+ - {name: bonus.screen_undervalued_yield, cn: 低估+高股息, kind: computed, layer: L1}
141
+ # ---- L1:全市场筛选积木(computed,内部用途)----
142
+ - {name: bonus.index_where_active, cn: where·有分红, kind: computed, layer: L1}
143
+ - {name: bonus.index_where_no_dividend, cn: where·无分红, kind: computed, layer: L1}
144
+ - {name: bonus.index_where_has_dividend, cn: where·有记录, kind: computed, layer: L1}
145
+ - {name: bonus.index_where_high_yield, cn: where·高股息, kind: computed, layer: L1}
146
+ - {name: bonus.index_where_high_yield_5, cn: where·连续5年高股息, kind: computed, layer: L1}
147
+ - {name: bonus.index_where_ample_payout, cn: where·慷慨派息, kind: computed, layer: L1}
148
+ - {name: bonus.index_where_danger_payout, cn: where·派息危险, kind: computed, layer: L1}
149
+ - {name: bonus.index_where_quality, cn: where·质量, kind: computed, layer: L1}
150
+ - {name: bonus.index_where_stable, cn: where·稳定, kind: computed, layer: L1}
151
+ - {name: bonus.index_where_improving, cn: where·改善, kind: computed, layer: L1}
152
+ - {name: bonus.index_where_declining, cn: where·下滑, kind: computed, layer: L1}
153
+ - {name: bonus.index_where_trend_up, cn: where·趋势向上, kind: computed, layer: L1}
154
+ - {name: bonus.index_where_undervalued, cn: where·低估, kind: computed, layer: L1}
155
+ - {name: bonus.index_yield_bin_expr, cn: 股息率分桶 where 表达式, kind: computed, layer: L1}
156
+ - {name: bonus.index_field_load, cn: 分红索引字段预加载, kind: computed, layer: L1}
157
+ - {name: bonus.index_field_load_analysis, cn: 分红分析字段预加载, kind: computed, layer: L1}
158
+ - {name: bonus.index_fields_basic, cn: 分红基础字段列表, kind: computed, layer: L1}
159
+ - {name: bonus.index_fields_analysis, cn: 分红分析字段列表, kind: computed, layer: L1}
160
+ # ---- L1:格式化(raw 传递)----
161
+ - name: bonus.fmt_maps
162
+ cn: 分红行规范化
163
+ kind: raw
164
+ layer: L1
165
+ returns:
166
+ desc: ARR · 规范化分红行
167
+ shape:
168
+ kind: array
169
+ cn: 规范化分红行列表
170
+ items:
171
+ kind: object
172
+ cn: 分红行
173
+ fields:
174
+ - {name: sas, type: string, cn: SAS, optional: true}
175
+ - {name: ex_date, type: string, cn: 除权日, optional: true}
176
+ - {name: ex_div, type: string, cn: 除权除息日, optional: true}
177
+ - {name: dps, type: float64, cn: 每股股利, optional: true}
178
+ - {name: total, type: float64, cn: 分红总额, optional: true}
179
+ - {name: ccy, type: string, cn: 货币, optional: true}
180
+ - {name: announce, type: string, cn: 公告日, optional: true}
181
+ - {name: pay, type: string, cn: 派息日, optional: true}
182
+ - {name: content, type: string, cn: 方案摘要, optional: true}
183
+ - {name: net_profit, type: float64, cn: 归母净利润, optional: true}
184
+ - {name: payout_ratio, type: float64, cn: 派息率, optional: true}
185
+ - {name: bonus.fmt_lines, cn: 分红文本行, kind: raw, layer: L1}
186
+ - {name: bonus.fmt_line, cn: 单条分红文本, kind: raw, layer: L1}
187
+ - {name: bonus.fmt_snapshot_line, cn: 股息快照一行文本, kind: raw, layer: L1}
@@ -0,0 +1,91 @@
1
+ id: disc.events
2
+ version: 1.1.0
3
+ cn: 业绩披露事件
4
+ kind: raw
5
+ category: disclosure
6
+ priority: P0
7
+ description: 业绩预告(yjyg:净利/扣非/营收区间+同比+修正轨迹)、业绩快报(yjkb)、
8
+ 财报预约披露日历(disclosure)。均为交易所披露文件的结构化直采。
9
+ data_origin: [交易所披露]
10
+ units:
11
+ money: 元(预告/快报区间与单期金额)
12
+ yoy: 小数(0.1467 = 14.67%;SDK 自动由脚本的百分数口径换算)
13
+ date: YYYY-MM-DD
14
+ requires: {path: sys/forecast/init.xs, preloaded: false}
15
+ notes:
16
+ - 预告为区间(下限/上限);快报为披露的近似单值——两者在报告期正式报表发布前使用
17
+ - 脚本原生 np_amp_* / rev_amp_* / np_yoy / rev_yoy / roe 为百分数;SDK 已换算为
18
+ 小数并守护范围;_units="native"/_raw=True 取脚本原值
19
+ functions:
20
+ - name: forecast.yjyg_rows
21
+ cn: 业绩预告历史
22
+ kind: raw
23
+ layer: L0
24
+ params:
25
+ - {name: sym, type: string, required: true, desc: 6 位裸码}
26
+ - {name: limit, type: int, required: false, desc: 条数}
27
+ returns: {desc: ARR · 预告行(报告期/类型/净利与扣非区间/同比/修正轨迹)}
28
+ example: 'forecast.yjyg_rows("688008", 8)'
29
+ units: {np_amp_lower: percent, np_amp_upper: percent, rev_amp_lower: percent, rev_amp_upper: percent}
30
+ ranges: {np_amp_lower: [-1, 1000], np_amp_upper: [-1, 1000], rev_amp_lower: [-1, 1000], rev_amp_upper: [-1, 1000]}
31
+ - name: forecast.yjyg_latest
32
+ cn: 最新业绩预告
33
+ kind: raw
34
+ layer: L0
35
+ params:
36
+ - {name: sym, type: string, required: true}
37
+ returns: {desc: 预告行 MAP 或 nil}
38
+ example: 'forecast.yjyg_latest("688008")'
39
+ units: {np_amp_lower: percent, np_amp_upper: percent, rev_amp_lower: percent, rev_amp_upper: percent}
40
+ ranges: {np_amp_lower: [-1, 1000], np_amp_upper: [-1, 1000], rev_amp_lower: [-1, 1000], rev_amp_upper: [-1, 1000]}
41
+ - name: forecast.yjkb_rows
42
+ cn: 业绩快报历史
43
+ kind: raw
44
+ layer: L0
45
+ params:
46
+ - {name: sym, type: string, required: true}
47
+ - {name: limit, type: int, required: false}
48
+ returns: {desc: ARR · 快报行}
49
+ example: 'forecast.yjkb_rows("603092", 8)'
50
+ units: {np_yoy: percent, rev_yoy: percent, roe: percent}
51
+ ranges: {np_yoy: [-1, 1000], rev_yoy: [-1, 1000], roe: [-2, 5]}
52
+ - name: forecast.yjkb_latest
53
+ cn: 最新业绩快报
54
+ kind: raw
55
+ layer: L0
56
+ params:
57
+ - {name: sym, type: string, required: true}
58
+ returns: {desc: 快报行 MAP 或 nil}
59
+ example: 'forecast.yjkb_latest("603092")'
60
+ units: {np_yoy: percent, rev_yoy: percent, roe: percent}
61
+ ranges: {np_yoy: [-1, 1000], rev_yoy: [-1, 1000], roe: [-2, 5]}
62
+ - name: forecast.disclosure_rows
63
+ cn: 财报预约披露历史
64
+ kind: raw
65
+ layer: L0
66
+ params:
67
+ - {name: sym, type: string, required: true}
68
+ - {name: limit, type: int, required: false}
69
+ returns: {desc: ARR · 预约披露行(报告期/计划披露日)}
70
+ example: 'forecast.disclosure_rows("600519", 8)'
71
+ - name: forecast.disclosure_next
72
+ cn: 下次财报披露
73
+ kind: raw
74
+ layer: L0
75
+ params:
76
+ - {name: sym, type: string, required: true}
77
+ returns: {desc: 预约披露行 MAP 或 nil}
78
+ example: 'forecast.disclosure_next("600519")'
79
+ - name: forecast.snapshot
80
+ cn: 业绩披露快照(预告+快报+日历合并视图)
81
+ kind: raw
82
+ layer: L0
83
+ params:
84
+ - {name: sym, type: string, required: true}
85
+ returns: {desc: MAP · 快照}
86
+ example: 'forecast.snapshot("688008")'
87
+ units: {np_amp_lower: percent, np_amp_upper: percent, rev_amp_lower: percent, rev_amp_upper: percent, np_yoy: percent, rev_yoy: percent, roe: percent}
88
+ ranges: {np_amp_lower: [-1, 1000], np_amp_upper: [-1, 1000], rev_amp_lower: [-1, 1000], rev_amp_upper: [-1, 1000], np_yoy: [-1, 1000], rev_yoy: [-1, 1000], roe: [-2, 5]}
89
+ # ---- L1:格式化 ----
90
+ - {name: forecast.fmt_line, cn: 预告文本行, kind: raw, layer: L1}
91
+ - {name: forecast.fmt_lines, cn: 预告文本行列表, kind: raw, layer: L1}
@@ -0,0 +1,39 @@
1
+ id: disc.filings
2
+ version: 1.0.0
3
+ cn: 定期报告清单
4
+ kind: raw
5
+ category: disclosure
6
+ priority: P0
7
+ description: 年报/半年报/季报清单(报告期、标题、PDF 链接)。与 fund.statements
8
+ (结构化数字)分工:清单与原文链接走本域,结构化科目数字走三表。
9
+ data_origin: [交易所披露]
10
+ units:
11
+ date: YYYY-MM-DD
12
+ requires: {path: sys/filings/init.xs, preloaded: true}
13
+ notes:
14
+ - 'type_key 取值:all | annual(年报) | semi(半年报) | quarter(季报)'
15
+ functions:
16
+ - name: filings.query
17
+ cn: 定期报告列表
18
+ kind: raw
19
+ layer: L0
20
+ params:
21
+ - {name: sym, type: string, required: true, desc: 6 位裸码}
22
+ - {name: type_key, type: string, required: false, default: all, enum: [all, annual, semi, quarter]}
23
+ - {name: limit, type: int, required: false}
24
+ returns: {desc: ARR · 报告行(报告期/类型/标题/PDF 链接)}
25
+ example: 'filings.query("600519", "annual", 5)'
26
+ - name: filings.latest
27
+ cn: 最新一条定期报告
28
+ kind: raw
29
+ layer: L0
30
+ params:
31
+ - {name: sym, type: string, required: true}
32
+ - {name: type_key, type: string, required: false, default: all}
33
+ returns: {desc: 报告行 MAP 或 nil}
34
+ example: 'filings.latest("600519", "annual")'
35
+ # ---- L1:辅助 ----
36
+ - {name: filings.type_zh, cn: type_key 转中文, kind: raw, layer: L1}
37
+ - {name: filings.fmt_maps, cn: 报告行规范化列表, kind: raw, layer: L1}
38
+ - {name: filings.fmt_map, cn: 单条报告规范化, kind: raw, layer: L1}
39
+ - {name: filings.fmt_date_short, cn: 日期缩短 YYYY-MM-DD, kind: raw, layer: L1}
@@ -0,0 +1,160 @@
1
+ id: disc.notice
2
+ version: 1.1.0
3
+ cn: 公告
4
+ kind: raw
5
+ category: disclosure
6
+ priority: P0
7
+ description: 公告检索(单票/日期/类别/区间)与公告信号(回购/减持/增持/股权激励证据行)。
8
+ 公告标题与元数据为资讯源直采;signal_* 为窗口判定的薄计算(证据行仍为公告原值)。
9
+ data_origin: [披露公告库(含港股)]
10
+ units:
11
+ window: '枚举 "7d"|"1m"|"3m"|"6m"|"1y"|"3y"|"5y" 或天数整数'
12
+ date: YYYY-MM-DD
13
+ requires: {path: sys/notice/init.xs, preloaded: true}
14
+ notes:
15
+ - type_regex 按公告标题/类型正则过滤;market 缺省 cn,港股自动路由
16
+ functions:
17
+ - name: notice.query_by_symbol
18
+ cn: 单票公告列表
19
+ kind: raw
20
+ layer: L0
21
+ params:
22
+ - {name: sym, type: string, required: true, desc: 6 位裸码(港股 5 位)}
23
+ - {name: window, type: string, required: false, desc: 时间窗}
24
+ - {name: type_regex, type: string, required: false, desc: 类型正则}
25
+ - {name: limit, type: int, required: false}
26
+ returns: {desc: ARR · 公告行(date/title/type/url/pdf_url)}
27
+ example: 'notice.query_by_symbol("600519", "3m", "", 20)'
28
+ normalize_with: notice.fmt_maps
29
+ - name: notice.query_recent
30
+ cn: 近期公告(全市场)
31
+ kind: raw
32
+ layer: L0
33
+ params:
34
+ - {name: window, type: string, required: false}
35
+ - {name: type_regex, type: string, required: false}
36
+ - {name: limit, type: int, required: false}
37
+ - {name: market, type: string, required: false, desc: 缺省 cn}
38
+ returns: {desc: ARR · 公告行(date/title/type/url/pdf_url)}
39
+ example: 'notice.query_recent("7d", "", 50)'
40
+ normalize_with: notice.fmt_maps
41
+ - name: notice.query_by_category
42
+ cn: 按类别查公告
43
+ kind: raw
44
+ layer: L0
45
+ params:
46
+ - {name: category, type: string, required: true}
47
+ - {name: window, type: string, required: false}
48
+ - {name: limit, type: int, required: false}
49
+ - {name: market, type: string, required: false}
50
+ returns: {desc: ARR · 公告行(date/title/type/url/pdf_url)}
51
+ example: 'notice.query_by_category("回购", "1m", 20)'
52
+ normalize_with: notice.fmt_maps
53
+ - name: notice.query_on_date
54
+ cn: 指定日期公告
55
+ kind: raw
56
+ layer: L0
57
+ params:
58
+ - {name: date, type: string, required: true}
59
+ - {name: type_regex, type: string, required: false}
60
+ - {name: limit, type: int, required: false}
61
+ - {name: market, type: string, required: false}
62
+ returns: {desc: ARR · 公告行(date/title/type/url/pdf_url)}
63
+ example: 'notice.query_on_date("2026-09-30")'
64
+ normalize_with: notice.fmt_maps
65
+ - name: notice.query_find
66
+ cn: 按日期区间查公告
67
+ kind: raw
68
+ layer: L0
69
+ params:
70
+ - {name: from_date, type: string, required: true}
71
+ - {name: to_date, type: string, required: true}
72
+ - {name: type_regex, type: string, required: false}
73
+ - {name: stock_code, type: string, required: false}
74
+ - {name: limit, type: int, required: false}
75
+ - {name: market, type: string, required: false}
76
+ returns: {desc: ARR · 公告行(date/title/type/url/pdf_url)}
77
+ example: 'notice.query_find("2026-01-01", "2026-03-31", "业绩", "", 50)'
78
+ normalize_with: notice.fmt_maps
79
+ # ---- L0:信号(窗口判定薄计算,证据行=公告原值)----
80
+ - name: notice.signal_has_buyback
81
+ cn: 窗口内是否有回购公告
82
+ kind: computed
83
+ layer: L0
84
+ params:
85
+ - {name: sym, type: string, required: true}
86
+ - {name: window, type: string, required: false}
87
+ returns: {desc: bool}
88
+ example: 'notice.signal_has_buyback("600519", "6m")'
89
+ - name: notice.signal_has_reduction
90
+ cn: 窗口内是否有减持公告
91
+ kind: computed
92
+ layer: L0
93
+ params:
94
+ - {name: sym, type: string, required: true}
95
+ - {name: window, type: string, required: false}
96
+ returns: {desc: bool}
97
+ example: 'notice.signal_has_reduction("600519", "6m")'
98
+ - name: notice.signal_has_insider_buy
99
+ cn: 窗口内是否有增持公告
100
+ kind: computed
101
+ layer: L0
102
+ params:
103
+ - {name: sym, type: string, required: true}
104
+ - {name: window, type: string, required: false}
105
+ returns: {desc: bool}
106
+ example: 'notice.signal_has_insider_buy("600519", "6m")'
107
+ - name: notice.signal_has_equity_incentive
108
+ cn: 窗口内是否有股权激励公告
109
+ kind: computed
110
+ layer: L0
111
+ params:
112
+ - {name: sym, type: string, required: true}
113
+ - {name: window, type: string, required: false}
114
+ returns: {desc: bool}
115
+ example: 'notice.signal_has_equity_incentive("600519", "1y")'
116
+ - name: notice.signal_evidence_rows
117
+ cn: 信号证据(原始公告行)
118
+ kind: raw
119
+ layer: L0
120
+ params:
121
+ - {name: sym, type: string, required: true}
122
+ - {name: type_regex, type: string, required: true}
123
+ - {name: window, type: string, required: false}
124
+ - {name: lim, type: int, required: false}
125
+ returns: {desc: ARR · 公告行}
126
+ example: 'notice.signal_evidence_rows("600519", "回购", "1y", 10)'
127
+ - name: notice.signal_evidence_buyback
128
+ cn: 回购证据(规范化行)
129
+ kind: computed
130
+ layer: L0
131
+ params:
132
+ - {name: sym, type: string, required: true}
133
+ - {name: window, type: string, required: false}
134
+ returns: {desc: ARR · 规范化证据行}
135
+ example: 'notice.signal_evidence_buyback("600519", "1y")'
136
+ - name: notice.signal_evidence_reduction
137
+ cn: 减持证据(规范化行)
138
+ kind: computed
139
+ layer: L0
140
+ params:
141
+ - {name: sym, type: string, required: true}
142
+ - {name: window, type: string, required: false}
143
+ returns: {desc: ARR · 规范化证据行}
144
+ example: 'notice.signal_evidence_reduction("600519", "1y")'
145
+ # ---- L1:通用信号与检索辅助 ----
146
+ - {name: notice.signal_has, cn: 窗口内是否匹配类型正则, kind: computed, layer: L1}
147
+ - {name: notice.signal_has_category, cn: 窗口内是否有指定类别, kind: computed, layer: L1}
148
+ - {name: notice.signal_no_reduction, cn: 窗口内是否无减持, kind: computed, layer: L1}
149
+ - {name: notice.signal_evidence, cn: 信号证据(规范化), kind: computed, layer: L1}
150
+ - {name: notice.query_symbols_on_date, cn: 指定日期出现公告的代码列表, kind: raw, layer: L1}
151
+ - {name: notice.query_stats_recent, cn: 近期公告类别计数, kind: raw, layer: L1}
152
+ - {name: notice.query_build, cn: 构建公告 Mongo filter, kind: raw, layer: L1, status: internal}
153
+ - {name: notice.query_build_visible, cn: 构建可见日公告 filter, kind: raw, layer: L1, status: internal}
154
+ - {name: notice.query_date_range, cn: 日期区间条件, kind: raw, layer: L1, status: internal}
155
+ - {name: notice.query_ts_range, cn: 入库时间区间条件, kind: raw, layer: L1, status: internal}
156
+ # ---- L1:格式化 ----
157
+ - {name: notice.fmt_maps, cn: 公告行规范化, kind: raw, layer: L1}
158
+ - {name: notice.fmt_lines, cn: 公告文本行, kind: raw, layer: L1}
159
+ - {name: notice.fmt_line, cn: 单条公告文本, kind: raw, layer: L1}
160
+ - {name: notice.fmt_count_by_type, cn: 按类型计数, kind: raw, layer: L1}
@@ -0,0 +1,18 @@
1
+ id: disc.workout
2
+ version: 1.0.0
3
+ cn: 契约套利
4
+ kind: raw
5
+ category: disclosure
6
+ priority: P2
7
+ description: 契约套利条款事件——要约收购/换股吸收合并/现金选择权等(披露原文提取),
8
+ 提供进行中看板与单票条款查询。同业数据商暂无对应接口,属平台独有面。
9
+ data_origin: [披露原文提取, 平台数据服务]
10
+ units:
11
+ price: 元(公告对价/现价)
12
+ requires: {path: sys/workout/init.xs, preloaded: false}
13
+ notes:
14
+ - 'board() 返回 {as_of, deals, quotes} 进行中看板;query(sym) 返回单票规范化条款行'
15
+ - '现价 < 公告对价 的折价窗口由调用方自行判定,SDK 不内置收益测算(算法放工具仓)'
16
+ functions:
17
+ - {name: workout.board, cn: 进行中契约套利看板, layer: L0}
18
+ - {name: workout.query, cn: 单票契约套利条款, layer: L0}
@@ -0,0 +1,24 @@
1
+ id: fund.estimates
2
+ version: 1.1.0
3
+ cn: 盈利预测与研报
4
+ kind: raw
5
+ category: fundamentals
6
+ priority: P1
7
+ description: 卖方研究数据——机构盈利预测(逐年 EPS/PE,A=实际 E=预测)、预测明细
8
+ (机构/研究员/归母净利/评级)、评级统计(综合评级与买卖家数按窗口)、个股研报列表。
9
+ 金额=元、EPS=元/股、PE=倍。
10
+ data_origin: [券商研究披露, 平台数据服务]
11
+ units:
12
+ eps: 元/股
13
+ money: 元(归母净利润)
14
+ pe: 倍(预测市盈率)
15
+ requires: {path: sys/estimates/init.xs, preloaded: true}
16
+ notes:
17
+ - 'year_mark A=实际值 E=预测值;YEAR1..YEAR4 为预测年份序列'
18
+ - '研报行含标题/机构/作者/行业/报告链接;研报正文不在接口范围'
19
+ functions:
20
+ - {name: estimates.query_forecast, cn: 机构盈利预测, layer: L0, normalize_with: estimates.fmt_maps, ranges: {eps1: [0, 1.0e+4], eps2: [0, 1.0e+4], eps3: [0, 1.0e+4], eps4: [0, 1.0e+4], pe1: [0, 1.0e+4], pe2: [0, 1.0e+4], pe3: [0, 1.0e+4], pe4: [0, 1.0e+4]}}
21
+ - {name: estimates.query_forecast_detail, cn: 盈利预测明细, layer: L0, normalize_with: estimates.fmt_maps, ranges: {eps1: [0, 1.0e+4], eps2: [0, 1.0e+4], eps3: [0, 1.0e+4], eps4: [0, 1.0e+4], pe1: [0, 1.0e+4], pe2: [0, 1.0e+4], pe3: [0, 1.0e+4], pe4: [0, 1.0e+4]}}
22
+ - {name: estimates.query_rating, cn: 评级统计, layer: L0, normalize_with: estimates.fmt_maps}
23
+ - {name: estimates.query_reports, cn: 个股研报, layer: L0, normalize_with: estimates.fmt_maps}
24
+ - {name: estimates.fmt_maps, cn: 预测行规范化, layer: L1}