aimoon 0.1.0__tar.gz

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 (45) hide show
  1. aimoon-0.1.0/PKG-INFO +336 -0
  2. aimoon-0.1.0/README.md +318 -0
  3. aimoon-0.1.0/pyproject.toml +40 -0
  4. aimoon-0.1.0/setup.cfg +4 -0
  5. aimoon-0.1.0/src/aimoon/__init__.py +7 -0
  6. aimoon-0.1.0/src/aimoon/__main__.py +4 -0
  7. aimoon-0.1.0/src/aimoon/backtest.py +81 -0
  8. aimoon-0.1.0/src/aimoon/cache.py +53 -0
  9. aimoon-0.1.0/src/aimoon/cli.py +123 -0
  10. aimoon-0.1.0/src/aimoon/config.py +95 -0
  11. aimoon-0.1.0/src/aimoon/data/__init__.py +15 -0
  12. aimoon-0.1.0/src/aimoon/data/filters.py +380 -0
  13. aimoon-0.1.0/src/aimoon/data/history.py +73 -0
  14. aimoon-0.1.0/src/aimoon/data/spot.py +145 -0
  15. aimoon-0.1.0/src/aimoon/demo.py +64 -0
  16. aimoon-0.1.0/src/aimoon/indicators/__init__.py +3 -0
  17. aimoon-0.1.0/src/aimoon/indicators/technical.py +313 -0
  18. aimoon-0.1.0/src/aimoon/models.py +43 -0
  19. aimoon-0.1.0/src/aimoon/output.py +83 -0
  20. aimoon-0.1.0/src/aimoon/result.py +43 -0
  21. aimoon-0.1.0/src/aimoon/scoring/__init__.py +31 -0
  22. aimoon-0.1.0/src/aimoon/scoring/bollinger.py +13 -0
  23. aimoon-0.1.0/src/aimoon/scoring/kdj.py +17 -0
  24. aimoon-0.1.0/src/aimoon/scoring/macd.py +17 -0
  25. aimoon-0.1.0/src/aimoon/scoring/momentum.py +38 -0
  26. aimoon-0.1.0/src/aimoon/scoring/rps.py +44 -0
  27. aimoon-0.1.0/src/aimoon/scoring/rsi.py +20 -0
  28. aimoon-0.1.0/src/aimoon/scoring/sector.py +16 -0
  29. aimoon-0.1.0/src/aimoon/scoring/trend.py +18 -0
  30. aimoon-0.1.0/src/aimoon/scoring/volume.py +15 -0
  31. aimoon-0.1.0/src/aimoon/screener.py +88 -0
  32. aimoon-0.1.0/src/aimoon.egg-info/PKG-INFO +336 -0
  33. aimoon-0.1.0/src/aimoon.egg-info/SOURCES.txt +43 -0
  34. aimoon-0.1.0/src/aimoon.egg-info/dependency_links.txt +1 -0
  35. aimoon-0.1.0/src/aimoon.egg-info/entry_points.txt +2 -0
  36. aimoon-0.1.0/src/aimoon.egg-info/requires.txt +7 -0
  37. aimoon-0.1.0/src/aimoon.egg-info/top_level.txt +1 -0
  38. aimoon-0.1.0/tests/test_backtest.py +36 -0
  39. aimoon-0.1.0/tests/test_cli.py +30 -0
  40. aimoon-0.1.0/tests/test_filters.py +44 -0
  41. aimoon-0.1.0/tests/test_formatter.py +54 -0
  42. aimoon-0.1.0/tests/test_models.py +56 -0
  43. aimoon-0.1.0/tests/test_rps.py +32 -0
  44. aimoon-0.1.0/tests/test_score_rsi.py +31 -0
  45. aimoon-0.1.0/tests/test_screener.py +32 -0
aimoon-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,336 @@
1
+ Metadata-Version: 2.4
2
+ Name: aimoon
3
+ Version: 0.1.0
4
+ Summary: A股量化筛选与交易建议系统 — 基于技术指标的多因子打分筛选、回测与分析工具
5
+ Author: iloat
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/iloat20/aimoon
8
+ Project-URL: Repository, https://github.com/iloat20/aimoon
9
+ Requires-Python: >=3.12
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: akshare>=1.14
12
+ Requires-Dist: pandas>=2.0
13
+ Requires-Dist: numpy>=1.26
14
+ Requires-Dist: tabulate>=0.9
15
+ Requires-Dist: colorama>=0.4
16
+ Requires-Dist: rich>=13.0
17
+ Requires-Dist: pyyaml>=6.0
18
+
19
+ # aimoon 使用文档
20
+
21
+ A股量化筛选与交易建议系统 — 基于技术指标的多因子打分筛选、回测与分析工具。
22
+
23
+ ---
24
+
25
+ ## 快速开始
26
+
27
+ ### 安装
28
+
29
+ ```bash
30
+ git clone <repo-url>
31
+ cd aimoon
32
+ pip install -e .
33
+ ```
34
+
35
+ ### 30秒体验
36
+
37
+ ```bash
38
+ aimoon --demo
39
+ # 或
40
+ python -m aimoon --demo
41
+ ```
42
+
43
+ 运行后将看到30只模拟股票的筛选结果表格,包含评分、建议和信号。
44
+
45
+ ---
46
+
47
+ ## 基本用法
48
+
49
+ ### 实时筛选(默认模式)
50
+
51
+ ```bash
52
+ aimoon # 默认参数筛选
53
+ aimoon --top 10 # 显示前10名
54
+ aimoon --workers 10 # 10个线程加速
55
+ aimoon --no-csv # 不导出文件
56
+ ```
57
+
58
+ ### 筛选流程
59
+
60
+ 1. 从东方财富获取全市场实时行情(含上市日期字段 f26)
61
+ 2. **上市时间过滤** — 排除上市不满1年的股票
62
+ 3. **基本面过滤** — 按市值、换手率、价格区间筛选
63
+ 4. **排除规则** — ST、退市、北交所、8/4开头股票
64
+ 5. **北向资金过滤** — 北向持股市值 >= 1亿元
65
+ 6. **基金持仓过滤** — 基金持股占流通股 >= 5%
66
+ 7. 多线程并行获取历史K线数据(带缓存,AKShare + 腾讯备用)
67
+ 8. 计算技术指标并打分
68
+ 9. **RPS 计算** — 从K线数据计算 5/10/15/20 日涨幅排名
69
+ 10. 输出排名表格、CSV 和 Markdown 文件
70
+
71
+ ### 输出说明
72
+
73
+ | 列 | 含义 |
74
+ |---|------|
75
+ | No. | 排名 |
76
+ | Code | 股票代码 |
77
+ | Name | 股票名称 |
78
+ | Price | 最新价 |
79
+ | Chg% | 涨跌幅 |
80
+ | Turnover% | 换手率 |
81
+ | Score | 综合评分(越高越看多) |
82
+ | RPS5/10/15/20 | 相对价格强度(0-100,>90为强势) |
83
+ | Suggestion | 操作建议 |
84
+ | Conf. | 置信度 |
85
+ | Signals | 触发的信号列表 |
86
+
87
+ ---
88
+
89
+ ## 评分体系
90
+
91
+ 总分 = 各指标之和(动量为主,RPS 权重5,技术指标为辅)
92
+
93
+ ### 技术指标(动量为主)
94
+
95
+ | 指标 | 看多信号 | 看空信号 |
96
+ |------|---------|---------|
97
+ | **动量 ROC5** | 强势(+5%+)+4, 上升(+2%+)+2 | 弱势(-5%-)-4, 下降(-2%-)-2 |
98
+ | **动量 ROC10** | 强势(+5%+)+2, 上升(+2%+)+1 | 弱势(-5%-)-2, 下降(-2%-)-1 |
99
+ | **动量 ROC20** | 强势(+5%+)+1, 上升+1 | 弱势(-5%-)-1, 下降-1 |
100
+ | **动量加速** | 加速+3, 偏强+1 | 减速-3, 偏弱-1 |
101
+ | **新高/新低** | 5日新高+3, 10日+2, 20日+1 | 5日新低-3, 10日-2, 20日-1 |
102
+ | **ADX** | 强趋势(>25)+2 | — |
103
+ | 趋势 (MA) | 均线多头+2, 金叉+2 | 空头-2, 死叉-2 |
104
+ | MACD | 金叉+2, 零轴上方+1 | 死叉-2, 零轴下方-1 |
105
+ | RSI | 强势(>60)+2, 偏多+1 | 弱势(<40)-2, 偏空-1 |
106
+ | KDJ | 金叉+1, 超卖+1 | 死叉-1, 超买-1 |
107
+ | 成交量 | 放量(2x+)+2, 温和放量+1 | 缩量-1 |
108
+ | 布林带 | 触及下轨+1 | 触及上轨-1 |
109
+ | 板块动量 | 强势板块+3, 全市场Top%+3 | — |
110
+
111
+ ### RPS(相对价格强度)— 权重5
112
+
113
+ RPS 衡量股票近 N 日涨幅在全部股票中的排名百分位(0-100)。
114
+
115
+ | RPS 值 | 含义 |
116
+ |--------|------|
117
+ | > 90 | 涨幅超过 90% 的股票,极度强势 |
118
+ | > 80 | 涨幅超过 80% 的股票,强势 |
119
+ | < 20 | 涨幅低于 80% 的股票,弱势 |
120
+
121
+ **RPS 加分:**
122
+
123
+ | 条件 | 加分 | 信号 |
124
+ |------|------|------|
125
+ | 3-4个周期 RPS > 90 | +5 | RPS三线翻红(3/4 或 4/4) |
126
+ | 2个周期 RPS > 90 | +3 | RPS双线红(2/4) |
127
+
128
+ ### 建议对照
129
+
130
+ | 总分 | 建议 | 置信度 |
131
+ |------|------|--------|
132
+ | >= 8 | 强烈买入 | 高 |
133
+ | >= 5 | 买入 | 中高 |
134
+ | >= 2 | 建议买入 | 中 |
135
+ | >= 0 | 观望 | 低 |
136
+ | >= -3 | 谨慎 | 中 |
137
+ | >= -6 | 建议卖出 | 中高 |
138
+ | < -6 | 强烈卖出 | 高 |
139
+
140
+ ---
141
+
142
+ ## 输出文件
143
+
144
+ 每次运行自动生成两个文件到 `output/` 目录:
145
+
146
+ - `screen_YYYYMMDD_HHMMSS.csv` — CSV 格式,可用 Excel 打开
147
+ - `screen_YYYYMMDD_HHMMSS.md` — Markdown 格式,包含完整 RPS 数据和信号
148
+
149
+ ---
150
+
151
+ ## 回测
152
+
153
+ ```bash
154
+ aimoon backtest --stocks 000001 # 回测单只股票
155
+ aimoon backtest --stocks 000001,600519,300750 # 回测多只
156
+ aimoon backtest --stocks 000001 --hold-days 10 # 指定持仓天数
157
+ ```
158
+
159
+ 回测逻辑:
160
+ - 从第60天开始逐日运行策略
161
+ - 买入信号:总分 >= 2
162
+ - 持有指定天数后卖出
163
+ - 输出:总收益率、胜率、最大回撤
164
+
165
+ ---
166
+
167
+ ## 缓存管理
168
+
169
+ K线数据缓存到 `.aimoon_cache/` 目录,默认4小时过期。
170
+
171
+ ```bash
172
+ aimoon cache clear # 清除所有缓存
173
+ ```
174
+
175
+ ---
176
+
177
+ ## 配置文件
178
+
179
+ ```bash
180
+ aimoon --config my_config.yaml
181
+ ```
182
+
183
+ ### 配置示例
184
+
185
+ ```yaml
186
+ # 筛选参数
187
+ history_days: 250
188
+ min_market_cap_yi: 50.0
189
+ max_market_cap_yi: 2000.0
190
+ min_turnover_pct: 3.0
191
+ max_turnover_pct: 30.0
192
+ min_price: 5.0
193
+ max_price: 100.0
194
+ top_n: 30
195
+ min_list_days: 250 # 上市天数(约1年)
196
+
197
+ # 机构持仓
198
+ min_northbound_cap: 1.0 # 北向持股市值(亿元)
199
+ min_fund_pct: 5.0 # 基金持股占比(%)
200
+
201
+ # 缓存
202
+ cache_ttl_hours: 4
203
+
204
+ # 输出
205
+ output_dir: output
206
+
207
+ # 技术指标参数
208
+ ma_short: 5
209
+ ma_mid: 20
210
+ ma_long: 60
211
+ rsi_period: 14
212
+ macd_fast: 12
213
+ macd_slow: 26
214
+ macd_signal: 9
215
+ kdj_period: 9
216
+ boll_period: 20
217
+ boll_std: 2.0
218
+ volume_ma_period: 20
219
+
220
+ # 排除规则
221
+ exclude_boards:
222
+ - "ST"
223
+ - "退"
224
+ - "北交所"
225
+ exclude_prefixes:
226
+ - "8"
227
+ - "4"
228
+ ```
229
+
230
+ 参数优先级:`命令行参数 > 配置文件 > 默认值`
231
+
232
+ ---
233
+
234
+ ## 评分系统
235
+
236
+ 评分采用函数注册表模式,每个评分器是一个独立函数,返回 `Signal` 或 `None`。
237
+
238
+ ```python
239
+ from aimoon.indicators.technical import TechInd
240
+ from aimoon.models import Signal
241
+ from aimoon.scoring import SCORERS, collect_signals
242
+
243
+ # 内置评分器列表
244
+ # score_momentum, score_rps, score_trend, score_macd,
245
+ # score_rsi, score_kdj, score_bollinger, score_volume, score_sector
246
+
247
+ # 自定义评分器
248
+ def my_scorer(ti: TechInd, code: str = "", ctx: dict | None = None) -> Signal | None:
249
+ close = ti.kline["close"]
250
+ if close.iloc[-1] > close.rolling(60).mean().iloc[-1]:
251
+ return Signal(label="MA60上方", weight=2, direction=1)
252
+ return None
253
+
254
+ # 注册并运行
255
+ SCORERS.append(my_scorer)
256
+ signals = collect_signals(ti, code="000001")
257
+ ```
258
+
259
+ ---
260
+
261
+ ## Python API
262
+
263
+ ```python
264
+ from aimoon.data.spot import get_spot
265
+ from aimoon.data.history import get_kline
266
+ from aimoon.data.filters import filter_universe
267
+ from aimoon.screener import screen_stock
268
+ from aimoon.scoring.rps import compute_rps
269
+ from aimoon.backtest import BacktestEngine
270
+
271
+ # 获取数据
272
+ spot = get_spot()
273
+ filtered = filter_universe(spot)
274
+
275
+ # 筛选单只股票
276
+ kline = get_kline("000001").unwrap()
277
+ result = screen_stock("000001", "平安银行", kline)
278
+
279
+ # 回测
280
+ engine = BacktestEngine(hold_days=5)
281
+ bt = engine.run("000001", "平安银行", kline)
282
+ print(f"收益率: {bt.total_return:+.2f}%, 胜率: {bt.win_rate:.0%}")
283
+ ```
284
+
285
+ ---
286
+
287
+ ## 项目结构
288
+
289
+ ```
290
+ src/aimoon/
291
+ ├── cli.py # CLI 入口
292
+ ├── config.py # 配置管理(AppConfig + YAML 加载)
293
+ ├── result.py # Ok/Err 结果类型
294
+ ├── models.py # 数据模型
295
+ ├── cache.py # 文件缓存(pickle + TTL)
296
+ ├── screener.py # 筛选编排器
297
+ ├── backtest.py # 回测引擎
298
+ ├── demo.py # 模拟数据演示
299
+ ├── output.py # Rich 表格 + CSV/Markdown 导出
300
+ ├── data/
301
+ │ ├── spot.py # 实时行情(东方财富)
302
+ │ ├── history.py # 历史 K 线(AKShare + 腾讯备用)
303
+ │ └── filters.py # 基本面 / 北向 / 基金过滤
304
+ ├── indicators/
305
+ │ └── technical.py # 技术指标计算(MA/RSI/MACD/KDJ/BOLL/ROC/ADX)
306
+ └── scoring/
307
+ ├── momentum.py # 动量评分(ROC/新高新低/加速)
308
+ ├── rps.py # 相对价格强度
309
+ ├── trend.py # 趋势评分(MA/ADX)
310
+ ├── macd.py # MACD 评分
311
+ ├── rsi.py # RSI 评分
312
+ ├── kdj.py # KDJ 评分
313
+ ├── bollinger.py # 布林带评分
314
+ ├── volume.py # 成交量评分
315
+ └── sector.py # 板块动量评分
316
+ ```
317
+
318
+ ---
319
+
320
+ ## 常见问题
321
+
322
+ **Q: 网络错误?**
323
+
324
+ AKShare 可能不稳定,系统会自动切换到腾讯 K 线接口。确保能访问 `eastmoney.com` 和 `gtimg.cn`。
325
+
326
+ **Q: 北向/基金数据获取失败?**
327
+
328
+ 这些数据来自东方财富 datacenter,不影响核心筛选,获取失败时自动跳过。
329
+
330
+ **Q: RPS 值全是 0?**
331
+
332
+ RPS 从 K 线数据计算,需要至少 21 天数据。缓存可能导致数据不足,运行 `aimoon cache clear` 后重试。
333
+
334
+ **Q: CSV/Markdown 输出到哪里?**
335
+
336
+ 默认 `output/` 目录,文件名格式 `screen_YYYYMMDD_HHMMSS.csv/.md`。可通过 `output_dir` 配置修改。
aimoon-0.1.0/README.md ADDED
@@ -0,0 +1,318 @@
1
+ # aimoon 使用文档
2
+
3
+ A股量化筛选与交易建议系统 — 基于技术指标的多因子打分筛选、回测与分析工具。
4
+
5
+ ---
6
+
7
+ ## 快速开始
8
+
9
+ ### 安装
10
+
11
+ ```bash
12
+ git clone <repo-url>
13
+ cd aimoon
14
+ pip install -e .
15
+ ```
16
+
17
+ ### 30秒体验
18
+
19
+ ```bash
20
+ aimoon --demo
21
+ # 或
22
+ python -m aimoon --demo
23
+ ```
24
+
25
+ 运行后将看到30只模拟股票的筛选结果表格,包含评分、建议和信号。
26
+
27
+ ---
28
+
29
+ ## 基本用法
30
+
31
+ ### 实时筛选(默认模式)
32
+
33
+ ```bash
34
+ aimoon # 默认参数筛选
35
+ aimoon --top 10 # 显示前10名
36
+ aimoon --workers 10 # 10个线程加速
37
+ aimoon --no-csv # 不导出文件
38
+ ```
39
+
40
+ ### 筛选流程
41
+
42
+ 1. 从东方财富获取全市场实时行情(含上市日期字段 f26)
43
+ 2. **上市时间过滤** — 排除上市不满1年的股票
44
+ 3. **基本面过滤** — 按市值、换手率、价格区间筛选
45
+ 4. **排除规则** — ST、退市、北交所、8/4开头股票
46
+ 5. **北向资金过滤** — 北向持股市值 >= 1亿元
47
+ 6. **基金持仓过滤** — 基金持股占流通股 >= 5%
48
+ 7. 多线程并行获取历史K线数据(带缓存,AKShare + 腾讯备用)
49
+ 8. 计算技术指标并打分
50
+ 9. **RPS 计算** — 从K线数据计算 5/10/15/20 日涨幅排名
51
+ 10. 输出排名表格、CSV 和 Markdown 文件
52
+
53
+ ### 输出说明
54
+
55
+ | 列 | 含义 |
56
+ |---|------|
57
+ | No. | 排名 |
58
+ | Code | 股票代码 |
59
+ | Name | 股票名称 |
60
+ | Price | 最新价 |
61
+ | Chg% | 涨跌幅 |
62
+ | Turnover% | 换手率 |
63
+ | Score | 综合评分(越高越看多) |
64
+ | RPS5/10/15/20 | 相对价格强度(0-100,>90为强势) |
65
+ | Suggestion | 操作建议 |
66
+ | Conf. | 置信度 |
67
+ | Signals | 触发的信号列表 |
68
+
69
+ ---
70
+
71
+ ## 评分体系
72
+
73
+ 总分 = 各指标之和(动量为主,RPS 权重5,技术指标为辅)
74
+
75
+ ### 技术指标(动量为主)
76
+
77
+ | 指标 | 看多信号 | 看空信号 |
78
+ |------|---------|---------|
79
+ | **动量 ROC5** | 强势(+5%+)+4, 上升(+2%+)+2 | 弱势(-5%-)-4, 下降(-2%-)-2 |
80
+ | **动量 ROC10** | 强势(+5%+)+2, 上升(+2%+)+1 | 弱势(-5%-)-2, 下降(-2%-)-1 |
81
+ | **动量 ROC20** | 强势(+5%+)+1, 上升+1 | 弱势(-5%-)-1, 下降-1 |
82
+ | **动量加速** | 加速+3, 偏强+1 | 减速-3, 偏弱-1 |
83
+ | **新高/新低** | 5日新高+3, 10日+2, 20日+1 | 5日新低-3, 10日-2, 20日-1 |
84
+ | **ADX** | 强趋势(>25)+2 | — |
85
+ | 趋势 (MA) | 均线多头+2, 金叉+2 | 空头-2, 死叉-2 |
86
+ | MACD | 金叉+2, 零轴上方+1 | 死叉-2, 零轴下方-1 |
87
+ | RSI | 强势(>60)+2, 偏多+1 | 弱势(<40)-2, 偏空-1 |
88
+ | KDJ | 金叉+1, 超卖+1 | 死叉-1, 超买-1 |
89
+ | 成交量 | 放量(2x+)+2, 温和放量+1 | 缩量-1 |
90
+ | 布林带 | 触及下轨+1 | 触及上轨-1 |
91
+ | 板块动量 | 强势板块+3, 全市场Top%+3 | — |
92
+
93
+ ### RPS(相对价格强度)— 权重5
94
+
95
+ RPS 衡量股票近 N 日涨幅在全部股票中的排名百分位(0-100)。
96
+
97
+ | RPS 值 | 含义 |
98
+ |--------|------|
99
+ | > 90 | 涨幅超过 90% 的股票,极度强势 |
100
+ | > 80 | 涨幅超过 80% 的股票,强势 |
101
+ | < 20 | 涨幅低于 80% 的股票,弱势 |
102
+
103
+ **RPS 加分:**
104
+
105
+ | 条件 | 加分 | 信号 |
106
+ |------|------|------|
107
+ | 3-4个周期 RPS > 90 | +5 | RPS三线翻红(3/4 或 4/4) |
108
+ | 2个周期 RPS > 90 | +3 | RPS双线红(2/4) |
109
+
110
+ ### 建议对照
111
+
112
+ | 总分 | 建议 | 置信度 |
113
+ |------|------|--------|
114
+ | >= 8 | 强烈买入 | 高 |
115
+ | >= 5 | 买入 | 中高 |
116
+ | >= 2 | 建议买入 | 中 |
117
+ | >= 0 | 观望 | 低 |
118
+ | >= -3 | 谨慎 | 中 |
119
+ | >= -6 | 建议卖出 | 中高 |
120
+ | < -6 | 强烈卖出 | 高 |
121
+
122
+ ---
123
+
124
+ ## 输出文件
125
+
126
+ 每次运行自动生成两个文件到 `output/` 目录:
127
+
128
+ - `screen_YYYYMMDD_HHMMSS.csv` — CSV 格式,可用 Excel 打开
129
+ - `screen_YYYYMMDD_HHMMSS.md` — Markdown 格式,包含完整 RPS 数据和信号
130
+
131
+ ---
132
+
133
+ ## 回测
134
+
135
+ ```bash
136
+ aimoon backtest --stocks 000001 # 回测单只股票
137
+ aimoon backtest --stocks 000001,600519,300750 # 回测多只
138
+ aimoon backtest --stocks 000001 --hold-days 10 # 指定持仓天数
139
+ ```
140
+
141
+ 回测逻辑:
142
+ - 从第60天开始逐日运行策略
143
+ - 买入信号:总分 >= 2
144
+ - 持有指定天数后卖出
145
+ - 输出:总收益率、胜率、最大回撤
146
+
147
+ ---
148
+
149
+ ## 缓存管理
150
+
151
+ K线数据缓存到 `.aimoon_cache/` 目录,默认4小时过期。
152
+
153
+ ```bash
154
+ aimoon cache clear # 清除所有缓存
155
+ ```
156
+
157
+ ---
158
+
159
+ ## 配置文件
160
+
161
+ ```bash
162
+ aimoon --config my_config.yaml
163
+ ```
164
+
165
+ ### 配置示例
166
+
167
+ ```yaml
168
+ # 筛选参数
169
+ history_days: 250
170
+ min_market_cap_yi: 50.0
171
+ max_market_cap_yi: 2000.0
172
+ min_turnover_pct: 3.0
173
+ max_turnover_pct: 30.0
174
+ min_price: 5.0
175
+ max_price: 100.0
176
+ top_n: 30
177
+ min_list_days: 250 # 上市天数(约1年)
178
+
179
+ # 机构持仓
180
+ min_northbound_cap: 1.0 # 北向持股市值(亿元)
181
+ min_fund_pct: 5.0 # 基金持股占比(%)
182
+
183
+ # 缓存
184
+ cache_ttl_hours: 4
185
+
186
+ # 输出
187
+ output_dir: output
188
+
189
+ # 技术指标参数
190
+ ma_short: 5
191
+ ma_mid: 20
192
+ ma_long: 60
193
+ rsi_period: 14
194
+ macd_fast: 12
195
+ macd_slow: 26
196
+ macd_signal: 9
197
+ kdj_period: 9
198
+ boll_period: 20
199
+ boll_std: 2.0
200
+ volume_ma_period: 20
201
+
202
+ # 排除规则
203
+ exclude_boards:
204
+ - "ST"
205
+ - "退"
206
+ - "北交所"
207
+ exclude_prefixes:
208
+ - "8"
209
+ - "4"
210
+ ```
211
+
212
+ 参数优先级:`命令行参数 > 配置文件 > 默认值`
213
+
214
+ ---
215
+
216
+ ## 评分系统
217
+
218
+ 评分采用函数注册表模式,每个评分器是一个独立函数,返回 `Signal` 或 `None`。
219
+
220
+ ```python
221
+ from aimoon.indicators.technical import TechInd
222
+ from aimoon.models import Signal
223
+ from aimoon.scoring import SCORERS, collect_signals
224
+
225
+ # 内置评分器列表
226
+ # score_momentum, score_rps, score_trend, score_macd,
227
+ # score_rsi, score_kdj, score_bollinger, score_volume, score_sector
228
+
229
+ # 自定义评分器
230
+ def my_scorer(ti: TechInd, code: str = "", ctx: dict | None = None) -> Signal | None:
231
+ close = ti.kline["close"]
232
+ if close.iloc[-1] > close.rolling(60).mean().iloc[-1]:
233
+ return Signal(label="MA60上方", weight=2, direction=1)
234
+ return None
235
+
236
+ # 注册并运行
237
+ SCORERS.append(my_scorer)
238
+ signals = collect_signals(ti, code="000001")
239
+ ```
240
+
241
+ ---
242
+
243
+ ## Python API
244
+
245
+ ```python
246
+ from aimoon.data.spot import get_spot
247
+ from aimoon.data.history import get_kline
248
+ from aimoon.data.filters import filter_universe
249
+ from aimoon.screener import screen_stock
250
+ from aimoon.scoring.rps import compute_rps
251
+ from aimoon.backtest import BacktestEngine
252
+
253
+ # 获取数据
254
+ spot = get_spot()
255
+ filtered = filter_universe(spot)
256
+
257
+ # 筛选单只股票
258
+ kline = get_kline("000001").unwrap()
259
+ result = screen_stock("000001", "平安银行", kline)
260
+
261
+ # 回测
262
+ engine = BacktestEngine(hold_days=5)
263
+ bt = engine.run("000001", "平安银行", kline)
264
+ print(f"收益率: {bt.total_return:+.2f}%, 胜率: {bt.win_rate:.0%}")
265
+ ```
266
+
267
+ ---
268
+
269
+ ## 项目结构
270
+
271
+ ```
272
+ src/aimoon/
273
+ ├── cli.py # CLI 入口
274
+ ├── config.py # 配置管理(AppConfig + YAML 加载)
275
+ ├── result.py # Ok/Err 结果类型
276
+ ├── models.py # 数据模型
277
+ ├── cache.py # 文件缓存(pickle + TTL)
278
+ ├── screener.py # 筛选编排器
279
+ ├── backtest.py # 回测引擎
280
+ ├── demo.py # 模拟数据演示
281
+ ├── output.py # Rich 表格 + CSV/Markdown 导出
282
+ ├── data/
283
+ │ ├── spot.py # 实时行情(东方财富)
284
+ │ ├── history.py # 历史 K 线(AKShare + 腾讯备用)
285
+ │ └── filters.py # 基本面 / 北向 / 基金过滤
286
+ ├── indicators/
287
+ │ └── technical.py # 技术指标计算(MA/RSI/MACD/KDJ/BOLL/ROC/ADX)
288
+ └── scoring/
289
+ ├── momentum.py # 动量评分(ROC/新高新低/加速)
290
+ ├── rps.py # 相对价格强度
291
+ ├── trend.py # 趋势评分(MA/ADX)
292
+ ├── macd.py # MACD 评分
293
+ ├── rsi.py # RSI 评分
294
+ ├── kdj.py # KDJ 评分
295
+ ├── bollinger.py # 布林带评分
296
+ ├── volume.py # 成交量评分
297
+ └── sector.py # 板块动量评分
298
+ ```
299
+
300
+ ---
301
+
302
+ ## 常见问题
303
+
304
+ **Q: 网络错误?**
305
+
306
+ AKShare 可能不稳定,系统会自动切换到腾讯 K 线接口。确保能访问 `eastmoney.com` 和 `gtimg.cn`。
307
+
308
+ **Q: 北向/基金数据获取失败?**
309
+
310
+ 这些数据来自东方财富 datacenter,不影响核心筛选,获取失败时自动跳过。
311
+
312
+ **Q: RPS 值全是 0?**
313
+
314
+ RPS 从 K 线数据计算,需要至少 21 天数据。缓存可能导致数据不足,运行 `aimoon cache clear` 后重试。
315
+
316
+ **Q: CSV/Markdown 输出到哪里?**
317
+
318
+ 默认 `output/` 目录,文件名格式 `screen_YYYYMMDD_HHMMSS.csv/.md`。可通过 `output_dir` 配置修改。
@@ -0,0 +1,40 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "aimoon"
7
+ version = "0.1.0"
8
+ description = "A股量化筛选与交易建议系统 — 基于技术指标的多因子打分筛选、回测与分析工具"
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ requires-python = ">=3.12"
12
+ authors = [
13
+ { name = "iloat" },
14
+ ]
15
+ dependencies = [
16
+ "akshare>=1.14",
17
+ "pandas>=2.0",
18
+ "numpy>=1.26",
19
+ "tabulate>=0.9",
20
+ "colorama>=0.4",
21
+ "rich>=13.0",
22
+ "pyyaml>=6.0",
23
+ ]
24
+
25
+ [project.scripts]
26
+ aimoon = "aimoon.cli:main"
27
+
28
+ [project.urls]
29
+ Homepage = "https://github.com/iloat20/aimoon"
30
+ Repository = "https://github.com/iloat20/aimoon"
31
+
32
+ [tool.setuptools.packages.find]
33
+ where = ["src"]
34
+
35
+ [tool.ruff]
36
+ line-length = 100
37
+ target-version = "py312"
38
+
39
+ [tool.ruff.lint]
40
+ select = ["E", "F", "I", "N", "W", "UP"]
aimoon-0.1.0/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,7 @@
1
+ """aimoon — A股量化筛选与交易建议系统"""
2
+ from __future__ import annotations
3
+
4
+ __all__ = [
5
+ "config", "models", "cache", "data", "indicators",
6
+ "scoring", "screener", "backtest", "output", "demo", "cli",
7
+ ]
@@ -0,0 +1,4 @@
1
+ from aimoon.cli import main
2
+
3
+ if __name__ == "__main__":
4
+ main()