stock-analyzer-skill 1.1.0 → 1.2.0

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 (102) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +110 -39
  3. package/data/reports/202506_Stock_Analysis_Summary.md +271 -0
  4. package/experts/README.md +23 -2
  5. package/experts/buffett.md +44 -1
  6. package/experts/chaogu_yangjia.md +50 -0
  7. package/experts/decide.md +54 -2
  8. package/experts/duan_yongping.md +45 -0
  9. package/experts/lynch.md +48 -1
  10. package/experts/soros.md +43 -0
  11. package/experts/xu_xiang.md +44 -0
  12. package/experts/zhao_laoge.md +53 -0
  13. package/experts/zuoshou_xinyi.md +66 -0
  14. package/methodology.md +313 -13
  15. package/package.json +1 -1
  16. package/scripts/__pycache__/screener.cpython-314.pyc +0 -0
  17. package/scripts/api/__init__.py +22 -0
  18. package/scripts/api/__pycache__/__init__.cpython-314.pyc +0 -0
  19. package/scripts/api/__pycache__/quote_cli.cpython-314.pyc +0 -0
  20. package/scripts/api/__pycache__/screener_cli.cpython-314.pyc +0 -0
  21. package/scripts/api/quote_cli.py +106 -0
  22. package/scripts/api/screener_cli.py +149 -0
  23. package/scripts/business/__init__.py +15 -0
  24. package/scripts/business/__pycache__/__init__.cpython-314.pyc +0 -0
  25. package/scripts/business/__pycache__/screening_service.cpython-314.pyc +0 -0
  26. package/scripts/business/__pycache__/stock_analysis.cpython-314.pyc +0 -0
  27. package/scripts/business/screening_service.py +267 -0
  28. package/scripts/business/stock_analysis.py +183 -0
  29. package/scripts/common/__init__.py +334 -0
  30. package/scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  31. package/scripts/common/__pycache__/http.cpython-314.pyc +0 -0
  32. package/scripts/common/__pycache__/parsers.cpython-314.pyc +0 -0
  33. package/scripts/common/__pycache__/utils.cpython-314.pyc +0 -0
  34. package/scripts/common/__pycache__/validators.cpython-314.pyc +0 -0
  35. package/scripts/common/exceptions/__init__.py +172 -0
  36. package/scripts/common/exceptions/__pycache__/__init__.cpython-314.pyc +0 -0
  37. package/scripts/common/http.py +79 -0
  38. package/scripts/common/metrics.py +92 -0
  39. package/scripts/common/parsers.py +125 -0
  40. package/scripts/common/utils.py +195 -0
  41. package/scripts/common/validators.py +219 -0
  42. package/scripts/config/__init__.py +24 -0
  43. package/scripts/config/__pycache__/__init__.cpython-314.pyc +0 -0
  44. package/scripts/config/__pycache__/loader.cpython-314.pyc +0 -0
  45. package/scripts/config/data_source.yaml +126 -0
  46. package/scripts/config/industry_thresholds.yaml +158 -0
  47. package/scripts/config/limits.yaml +48 -0
  48. package/scripts/config/loader.py +141 -0
  49. package/scripts/config/notification.yaml +57 -0
  50. package/scripts/config/scoring.yaml +159 -0
  51. package/scripts/data/__pycache__/config.cpython-314.pyc +0 -0
  52. package/scripts/data/__pycache__/types.cpython-314.pyc +0 -0
  53. package/scripts/data/config.py +56 -4
  54. package/scripts/data/portfolio.json +100 -0
  55. package/scripts/data/portfolio_example.json +66 -11
  56. package/scripts/data/sector_stocks.json +244 -80
  57. package/scripts/data/types.py +3 -3
  58. package/scripts/fetchers/__init__.py +54 -0
  59. package/scripts/fetchers/__pycache__/__init__.cpython-314.pyc +0 -0
  60. package/scripts/fetchers/__pycache__/akshare_quote.cpython-314.pyc +0 -0
  61. package/scripts/fetchers/__pycache__/eastmoney_event.cpython-314.pyc +0 -0
  62. package/scripts/fetchers/__pycache__/eastmoney_flow.cpython-314.pyc +0 -0
  63. package/scripts/fetchers/__pycache__/eastmoney_lhb.cpython-314.pyc +0 -0
  64. package/scripts/fetchers/__pycache__/eastmoney_quote.cpython-314.pyc +0 -0
  65. package/scripts/fetchers/__pycache__/efinance_quote.cpython-314.pyc +0 -0
  66. package/scripts/fetchers/__pycache__/sina_quote.cpython-314.pyc +0 -0
  67. package/scripts/fetchers/__pycache__/tencent_quote.cpython-314.pyc +0 -0
  68. package/scripts/fetchers/akshare_quote.py +17 -3
  69. package/scripts/fetchers/eastmoney_event.py +148 -0
  70. package/scripts/fetchers/eastmoney_flow.py +118 -0
  71. package/scripts/fetchers/eastmoney_lhb.py +134 -0
  72. package/scripts/fetchers/eastmoney_quote.py +3 -3
  73. package/scripts/fetchers/efinance_quote.py +17 -3
  74. package/scripts/fetchers/sina_quote.py +5 -9
  75. package/scripts/fetchers/tencent_quote.py +3 -1
  76. package/scripts/monitor/__init__.py +13 -0
  77. package/scripts/monitor/__pycache__/__init__.cpython-314.pyc +0 -0
  78. package/scripts/monitor/__pycache__/manager.cpython-314.pyc +0 -0
  79. package/scripts/monitor/channels/__init__.py +6 -0
  80. package/scripts/monitor/channels/__pycache__/__init__.cpython-314.pyc +0 -0
  81. package/scripts/monitor/channels/__pycache__/bark.cpython-314.pyc +0 -0
  82. package/scripts/monitor/channels/__pycache__/base.cpython-314.pyc +0 -0
  83. package/scripts/monitor/channels/bark.py +75 -0
  84. package/scripts/monitor/channels/base.py +36 -0
  85. package/scripts/monitor/health.py +148 -0
  86. package/scripts/monitor/manager.py +229 -0
  87. package/scripts/portfolio/__init__.py +13 -0
  88. package/scripts/portfolio/__pycache__/__init__.cpython-314.pyc +0 -0
  89. package/scripts/portfolio/__pycache__/manager.cpython-314.pyc +0 -0
  90. package/scripts/portfolio/manager.py +329 -0
  91. package/scripts/portfolio/performance.py +209 -0
  92. package/scripts/screener.py +78 -23
  93. package/scripts/strategies/factors/__pycache__/liquidity.cpython-314.pyc +0 -0
  94. package/scripts/strategies/factors/liquidity.py +1 -1
  95. package/skills/backtest/SKILL.md +57 -0
  96. package/skills/help/SKILL.md +69 -5
  97. package/skills/monitor/SKILL.md +98 -0
  98. package/skills/portfolio/SKILL.md +135 -40
  99. package/skills/stock/SKILL.md +99 -1
  100. package/skills/{init → stock-init}/SKILL.md +5 -5
  101. package/workflow.md +36 -2
  102. package/scripts/common.py +0 -507
@@ -0,0 +1,100 @@
1
+ {
2
+ "version": 2,
3
+ "note": "示例持仓配置(v2)。复制此文件为 portfolio.json 并修改为你的真实持仓。",
4
+ "positions": [
5
+ {
6
+ "code": "sh600989",
7
+ "name": "宝丰能源",
8
+ "cost": 18.5,
9
+ "quantity": 1000,
10
+ "buy_date": "2025-03-15",
11
+ "tags": [
12
+ "能源",
13
+ "长线"
14
+ ]
15
+ },
16
+ {
17
+ "code": "sz000807",
18
+ "name": "云铝股份",
19
+ "cost": 28.75,
20
+ "quantity": 1200,
21
+ "buy_date": "2026-06-09",
22
+ "tags": [
23
+ "资源",
24
+ "有色",
25
+ "长线"
26
+ ]
27
+ },
28
+ {
29
+ "code": "sh518880",
30
+ "name": "黄金ETF",
31
+ "cost": 9.241,
32
+ "quantity": 5200,
33
+ "buy_date": "2025-02-20",
34
+ "tags": [
35
+ "避险",
36
+ "长线"
37
+ ]
38
+ },
39
+ {
40
+ "code": "sh603993",
41
+ "name": "洛阳钼业",
42
+ "cost": 17.31,
43
+ "quantity": 2100,
44
+ "buy_date": "2025-05-08",
45
+ "tags": [
46
+ "资源",
47
+ "有色"
48
+ ]
49
+ },
50
+ {
51
+ "code": "sz002920",
52
+ "name": "德赛西威",
53
+ "cost": 96.628,
54
+ "quantity": 300,
55
+ "buy_date": "2026-06-09",
56
+ "tags": [
57
+ "科技",
58
+ "智能驾驶"
59
+ ]
60
+ },
61
+ {
62
+ "code": "sh600276",
63
+ "name": "恒瑞医药",
64
+ "cost": 46.905,
65
+ "quantity": 400,
66
+ "buy_date": "2026-06-09",
67
+ "tags": [
68
+ "医药",
69
+ "长线"
70
+ ]
71
+ },
72
+ {
73
+ "code": "sh603799",
74
+ "name": "华友钴业",
75
+ "cost": 55.407,
76
+ "quantity": 700,
77
+ "buy_date": "2026-06-09",
78
+ "tags": [
79
+ "有色",
80
+ "新能源"
81
+ ]
82
+ }
83
+ ],
84
+ "watchlist": [
85
+ {
86
+ "code": "sh601211",
87
+ "name": "国泰君安",
88
+ "target_buy": 14.0,
89
+ "target_sell": 20.0,
90
+ "added_date": "2025-05-15"
91
+ },
92
+ {
93
+ "code": "sz300438",
94
+ "name": "鹏辉能源",
95
+ "target_buy": 22.0,
96
+ "target_sell": 35.0,
97
+ "added_date": "2025-06-03"
98
+ }
99
+ ]
100
+ }
@@ -1,14 +1,69 @@
1
1
  {
2
- "version": 1,
3
- "note": "示例持仓配置。复制此文件到 portfolio.json 并修改 codes 字段为你的实际持仓。",
4
- "codes": [
5
- "sh600989",
6
- "sz000807",
7
- "sh518880",
8
- "sh603993",
9
- "sz002415",
10
- "sh603799",
11
- "sh601211",
12
- "sz300438"
2
+ "version": 2,
3
+ "note": "示例持仓配置(v2)。复制此文件为 portfolio.json 并修改为你的真实持仓。",
4
+ "positions": [
5
+ {
6
+ "code": "sh600989",
7
+ "name": "宝丰能源",
8
+ "cost": 18.5,
9
+ "quantity": 1000,
10
+ "buy_date": "2025-03-15",
11
+ "tags": ["能源", "长线"]
12
+ },
13
+ {
14
+ "code": "sz000807",
15
+ "name": "云铝股份",
16
+ "cost": 14.2,
17
+ "quantity": 2000,
18
+ "buy_date": "2025-04-10",
19
+ "tags": ["资源"]
20
+ },
21
+ {
22
+ "code": "sh518880",
23
+ "name": "黄金ETF",
24
+ "cost": 6.5,
25
+ "quantity": 5000,
26
+ "buy_date": "2025-02-20",
27
+ "tags": ["避险", "长线"]
28
+ },
29
+ {
30
+ "code": "sh603993",
31
+ "name": "洛阳钼业",
32
+ "cost": 8.8,
33
+ "quantity": 3000,
34
+ "buy_date": "2025-05-08",
35
+ "tags": ["资源", "有色"]
36
+ },
37
+ {
38
+ "code": "sz002415",
39
+ "name": "海康威视",
40
+ "cost": 32.0,
41
+ "quantity": 500,
42
+ "buy_date": "2025-03-22",
43
+ "tags": ["科技"]
44
+ }
45
+ ],
46
+ "watchlist": [
47
+ {
48
+ "code": "sh603799",
49
+ "name": "华友钴业",
50
+ "target_buy": 28.0,
51
+ "target_sell": 42.0,
52
+ "added_date": "2025-06-01"
53
+ },
54
+ {
55
+ "code": "sh601211",
56
+ "name": "国泰君安",
57
+ "target_buy": 14.0,
58
+ "target_sell": 20.0,
59
+ "added_date": "2025-05-15"
60
+ },
61
+ {
62
+ "code": "sz300438",
63
+ "name": "鹏辉能源",
64
+ "target_buy": 22.0,
65
+ "target_sell": 35.0,
66
+ "added_date": "2025-06-03"
67
+ }
13
68
  ]
14
69
  }
@@ -1,67 +1,119 @@
1
1
  {
2
2
  "_meta": {
3
- "updated": "2026-06-05T16:07:35",
3
+ "updated": "2026-06-08T23:04:59",
4
4
  "source": "eastmoney_push2",
5
5
  "total_sectors": 14,
6
- "total_stocks": 99
6
+ "total_stocks": 263
7
7
  },
8
8
  "金融": [
9
9
  "sh601398",
10
10
  "sh601288",
11
- "sh601939",
12
- "sh601988",
13
11
  "sh600036",
12
+ "sh601988",
14
13
  "sh601166",
15
14
  "sh601328",
16
- "sh601318",
15
+ "sh600919",
16
+ "sh601939",
17
+ "sz000001",
18
+ "sz002142",
19
+ "sh601998",
17
20
  "sh600016",
21
+ "sh600926",
18
22
  "sh600000",
23
+ "sh601009",
24
+ "sh601818",
25
+ "sh601658",
19
26
  "sh601169",
20
- "sh601688",
21
- "sh600030",
22
- "sh601881",
23
- "sh601601"
27
+ "sh601229",
28
+ "sh601916"
24
29
  ],
25
30
  "消费": [
26
31
  "sh600519",
32
+ "sz002342",
27
33
  "sz000858",
34
+ "sh600887",
35
+ "sz002183",
28
36
  "sh600809",
37
+ "sz000799",
29
38
  "sz000568",
30
- "sz002304",
31
- "sh600887",
32
- "sz002714",
33
- "sh603288",
34
- "sz000661"
39
+ "sh600382",
40
+ "sz002570",
41
+ "sh600996",
42
+ "sz000729",
43
+ "sz300972",
44
+ "sz000895",
45
+ "sh600872",
46
+ "sh603156",
47
+ "sh600702",
48
+ "sh603369",
49
+ "sh600704",
50
+ "sh600779"
35
51
  ],
36
52
  "医药": [
37
- "sz300760",
38
- "sh600436",
39
- "sz300015",
40
- "sh600276",
41
53
  "sh603259",
42
- "sz300122",
43
- "sz000538",
44
- "sh600196",
45
- "sz002007",
46
- "sh688185"
54
+ "sh600276",
55
+ "sh688690",
56
+ "sz300347",
57
+ "sz300199",
58
+ "sz300436",
59
+ "sh688235",
60
+ "sz002940",
61
+ "sz002294",
62
+ "sz300204",
63
+ "sz002821",
64
+ "sz300759",
65
+ "sh603127",
66
+ "sz300723",
67
+ "sh688166",
68
+ "sz301246",
69
+ "sz002422",
70
+ "sh688578",
71
+ "sh688131",
72
+ "sz000963"
47
73
  ],
48
74
  "资源": [
49
- "sz000807",
75
+ "sh601899",
76
+ "sz002428",
77
+ "sh600549",
78
+ "sh600111",
50
79
  "sh603993",
51
- "sh603799",
52
- "sh600989",
80
+ "sz000960",
81
+ "sh600367",
82
+ "sz002353",
83
+ "sh600362",
53
84
  "sh601088",
54
- "sh601899",
55
- "sh600489"
85
+ "sz300179",
86
+ "sz000630",
87
+ "sz002015",
88
+ "sz000792",
89
+ "sz002378",
90
+ "sh600988",
91
+ "sh600021",
92
+ "sh600188",
93
+ "sh600489",
94
+ "sz002738"
56
95
  ],
57
96
  "电力": [
58
- "sh600900",
59
- "sh600025",
60
- "sh600886",
61
- "sh601985",
62
- "sh600795",
63
- "sh600011",
64
- "sh600027"
97
+ "sz000100",
98
+ "sh600396",
99
+ "sh601991",
100
+ "sh600667",
101
+ "sz002202",
102
+ "sz002015",
103
+ "sh600021",
104
+ "sh601868",
105
+ "sz000539",
106
+ "sz000767",
107
+ "sh601016",
108
+ "sh601615",
109
+ "sh600821",
110
+ "sz002617",
111
+ "sh601669",
112
+ "sh601778",
113
+ "sh600744",
114
+ "sz000601",
115
+ "sh600310",
116
+ "sz000600"
65
117
  ],
66
118
  "石化": [
67
119
  "sh600028",
@@ -69,67 +121,179 @@
69
121
  "sh600346"
70
122
  ],
71
123
  "高股息": [
124
+ "sh601899",
125
+ "sh688525",
126
+ "sz301308",
127
+ "sz000100",
128
+ "sh601991",
129
+ "sh603993",
130
+ "sh603259",
131
+ "sz300475",
72
132
  "sh601398",
73
- "sh600900",
74
- "sh600028",
75
- "sh601857",
76
- "sh601088",
77
- "sh601328",
78
- "sz000807",
79
- "sh600886"
133
+ "sh600089",
134
+ "sz000960",
135
+ "sh600519",
136
+ "sh601288",
137
+ "sz002460",
138
+ "sh603799",
139
+ "sh600036",
140
+ "sh600362",
141
+ "sz000630",
142
+ "sz000792",
143
+ "sh601988"
80
144
  ],
81
145
  "科技": [
82
- "sz002415",
83
- "sh603986",
84
- "sh688981",
85
- "sh600588",
86
- "sz300496",
87
- "sz002236"
146
+ "sz300308",
147
+ "sh600522",
148
+ "sh600487",
149
+ "sz300502",
150
+ "sz300394",
151
+ "sz002281",
152
+ "sz000063",
153
+ "sh600498",
154
+ "sh600105",
155
+ "sh601869",
156
+ "sz002491",
157
+ "sz300620",
158
+ "sh603083",
159
+ "sz301205",
160
+ "sz300548",
161
+ "sh688313",
162
+ "sh688668",
163
+ "sz300570",
164
+ "sz000070",
165
+ "sz001267"
88
166
  ],
89
167
  "机器人": [
90
- "sh688017",
91
- "sz300124",
92
- "sz002747",
93
- "sz300503",
94
- "sz002472",
95
- "sh688698",
96
- "sz002527",
97
- "sz300024"
168
+ "sz300476",
169
+ "sz000636",
170
+ "sh688525",
171
+ "sz300433",
172
+ "sz002008",
173
+ "sz301308",
174
+ "sz300975",
175
+ "sz300857",
176
+ "sh600869",
177
+ "sz300014",
178
+ "sz002460",
179
+ "sz002859",
180
+ "sz002600",
181
+ "sz301013",
182
+ "sz002273",
183
+ "sh688396",
184
+ "sh603296",
185
+ "sz300322",
186
+ "sh603893",
187
+ "sz002975"
98
188
  ],
99
189
  "PCB/AI算力": [
190
+ "sz300394",
100
191
  "sz300476",
101
- "sz002463",
102
- "sz002916",
103
- "sh603228",
104
- "sz002436"
192
+ "sz002384",
193
+ "sh601138",
194
+ "sh688008",
195
+ "sz000063",
196
+ "sh688041",
197
+ "sz002008",
198
+ "sz000657",
199
+ "sz300857",
200
+ "sz000938",
201
+ "sz000977",
202
+ "sh601208",
203
+ "sh600176",
204
+ "sh600330",
205
+ "sh603019",
206
+ "sh603256",
207
+ "sz300570",
208
+ "sz002859",
209
+ "sz002080"
105
210
  ],
106
211
  "军工": [
107
- "sh600760",
108
- "sz000768",
109
- "sh600893",
110
- "sh600150",
111
- "sh601989",
112
- "sh600862"
212
+ "sz002484",
213
+ "sh603678",
214
+ "sh603601",
215
+ "sz300302",
216
+ "sz000733",
217
+ "sz002080",
218
+ "sz002465",
219
+ "sz000070",
220
+ "sh605589",
221
+ "sz000066",
222
+ "sz002049",
223
+ "sh603011",
224
+ "sh688629",
225
+ "sz002056",
226
+ "sz300726",
227
+ "sz002179",
228
+ "sh600353",
229
+ "sh600482",
230
+ "sh688333",
231
+ "sh600497"
113
232
  ],
114
233
  "半导体": [
115
- "sz002371",
116
- "sh603501",
117
- "sh688012",
118
- "sz300661",
119
- "sh688008",
120
- "sz002049"
234
+ "sh600584",
235
+ "sh688525",
236
+ "sz002156",
237
+ "sz002428",
238
+ "sz002185",
239
+ "sh600667",
240
+ "sz300475",
241
+ "sz000021",
242
+ "sh688126",
243
+ "sh688048",
244
+ "sh603678",
245
+ "sh600330",
246
+ "sz300672",
247
+ "sz000733",
248
+ "sz300751",
249
+ "sz301013",
250
+ "sz300782",
251
+ "sz002409",
252
+ "sz300054",
253
+ "sh601231"
121
254
  ],
122
255
  "新能源": [
123
- "sz300750",
256
+ "sz300476",
257
+ "sz300285",
258
+ "sz300433",
259
+ "sz002484",
260
+ "sz000021",
124
261
  "sz300014",
125
- "sz300438",
126
- "sz300274",
127
- "sz002459"
262
+ "sh600330",
263
+ "sh603601",
264
+ "sh603799",
265
+ "sz000733",
266
+ "sh601231",
267
+ "sh603011",
268
+ "sh688629",
269
+ "sz002056",
270
+ "sz300747",
271
+ "sz300328",
272
+ "sz002579",
273
+ "sz000062",
274
+ "sh600563",
275
+ "sz300806"
128
276
  ],
129
277
  "光伏": [
130
- "sh601012",
131
- "sh600438",
132
- "sz002459",
133
- "sh688599"
278
+ "sz300433",
279
+ "sz002428",
280
+ "sh601991",
281
+ "sh600667",
282
+ "sh600089",
283
+ "sh600330",
284
+ "sz300751",
285
+ "sz300450",
286
+ "sz002015",
287
+ "sz002585",
288
+ "sz300373",
289
+ "sz002056",
290
+ "sh600021",
291
+ "sz300806",
292
+ "sz301458",
293
+ "sz002897",
294
+ "sz000767",
295
+ "sz300316",
296
+ "sh688676",
297
+ "sz002929"
134
298
  ]
135
299
  }
@@ -14,8 +14,8 @@ class Quote:
14
14
  low: float = 0.0
15
15
  change_pct: float = 0.0
16
16
  change_amt: float = 0.0
17
- volume: int = 0 # 手(腾讯源)或 股(新浪源),data 层不归一化
18
- amount: float = 0.0 # 万元
17
+ volume: int = 0 # 股(统一单位:腾讯手×100,新浪/东财原值)
18
+ amount: float = 0.0 # 元(统一单位:腾讯万×10000,东财万×10000,新浪原值)
19
19
  turnover: float = 0.0 # %
20
20
  pe: float = 0.0
21
21
  pb: float = 0.0
@@ -38,7 +38,7 @@ class KlineBar:
38
38
  high: float = 0.0
39
39
  low: float = 0.0
40
40
  close: float = 0.0
41
- volume: int = 0 #
41
+ volume: int = 0 # 股(统一单位)
42
42
  amount: float = 0.0
43
43
  pct_chg: float = 0.0
44
44
  source: str = ""
@@ -103,10 +103,43 @@ def get_finance_fetchers() -> list:
103
103
  return fetchers
104
104
 
105
105
 
106
+ def get_flow_fetchers() -> list:
107
+ """获取所有可用的资金流向数据源。"""
108
+ fetchers = []
109
+
110
+ from .eastmoney_flow import NorthboundFlowFetcher, StockFlowFetcher
111
+ fetchers.extend([NorthboundFlowFetcher(), StockFlowFetcher()])
112
+
113
+ return fetchers
114
+
115
+
116
+ def get_lhb_fetchers() -> list:
117
+ """获取所有可用的龙虎榜数据源。"""
118
+ fetchers = []
119
+
120
+ from .eastmoney_lhb import LhbDetailFetcher, LhbSeatFetcher
121
+ fetchers.extend([LhbDetailFetcher(), LhbSeatFetcher()])
122
+
123
+ return fetchers
124
+
125
+
126
+ def get_event_fetchers() -> list:
127
+ """获取所有可用的事件日历数据源。"""
128
+ fetchers = []
129
+
130
+ from .eastmoney_event import EarningsCalendarFetcher, LockupCalendarFetcher, DividendCalendarFetcher
131
+ fetchers.extend([EarningsCalendarFetcher(), LockupCalendarFetcher(), DividendCalendarFetcher()])
132
+
133
+ return fetchers
134
+
135
+
106
136
  # 全局管理器(延迟初始化)
107
137
  _quote_manager = None
108
138
  _kline_manager = None
109
139
  _finance_manager = None
140
+ _flow_manager = None
141
+ _lhb_manager = None
142
+ _event_manager = None
110
143
 
111
144
 
112
145
  def get_quote_manager() -> DataFetcherManager:
@@ -128,3 +161,24 @@ def get_finance_manager() -> DataFetcherManager:
128
161
  if _finance_manager is None:
129
162
  _finance_manager = DataFetcherManager(get_finance_fetchers())
130
163
  return _finance_manager
164
+
165
+
166
+ def get_flow_manager() -> DataFetcherManager:
167
+ global _flow_manager
168
+ if _flow_manager is None:
169
+ _flow_manager = DataFetcherManager(get_flow_fetchers())
170
+ return _flow_manager
171
+
172
+
173
+ def get_lhb_manager() -> DataFetcherManager:
174
+ global _lhb_manager
175
+ if _lhb_manager is None:
176
+ _lhb_manager = DataFetcherManager(get_lhb_fetchers())
177
+ return _lhb_manager
178
+
179
+
180
+ def get_event_manager() -> DataFetcherManager:
181
+ global _event_manager
182
+ if _event_manager is None:
183
+ _event_manager = DataFetcherManager(get_event_fetchers())
184
+ return _event_manager