chansdk 1.0.1__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.
- chansdk-1.0.1/CHANGELOG.md +12 -0
- chansdk-1.0.1/MANIFEST.in +3 -0
- chansdk-1.0.1/PKG-INFO +255 -0
- chansdk-1.0.1/README.md +240 -0
- chansdk-1.0.1/chan/__init__.py +27 -0
- chansdk-1.0.1/chan/bi/__init__.py +1 -0
- chansdk-1.0.1/chan/bi/bi.py +331 -0
- chansdk-1.0.1/chan/bi/config.py +30 -0
- chansdk-1.0.1/chan/bi/list.py +235 -0
- chansdk-1.0.1/chan/bsp/__init__.py +1 -0
- chansdk-1.0.1/chan/bsp/config.py +100 -0
- chansdk-1.0.1/chan/bsp/list.py +413 -0
- chansdk-1.0.1/chan/bsp/point.py +42 -0
- chansdk-1.0.1/chan/chan.py +413 -0
- chansdk-1.0.1/chan/combiner/__init__.py +1 -0
- chansdk-1.0.1/chan/combiner/combiner.py +171 -0
- chansdk-1.0.1/chan/combiner/item.py +25 -0
- chansdk-1.0.1/chan/common/__init__.py +1 -0
- chansdk-1.0.1/chan/common/cache.py +34 -0
- chansdk-1.0.1/chan/common/enum.py +129 -0
- chansdk-1.0.1/chan/common/exception.py +88 -0
- chansdk-1.0.1/chan/common/time.py +52 -0
- chansdk-1.0.1/chan/common/util.py +54 -0
- chansdk-1.0.1/chan/config.py +181 -0
- chansdk-1.0.1/chan/data/__init__.py +1 -0
- chansdk-1.0.1/chan/data/base.py +34 -0
- chansdk-1.0.1/chan/data/cache_api.py +191 -0
- chansdk-1.0.1/chan/data/csv_api.py +108 -0
- chansdk-1.0.1/chan/data/eltdx_api.py +239 -0
- chansdk-1.0.1/chan/kline/__init__.py +1 -0
- chansdk-1.0.1/chan/kline/kline.py +97 -0
- chansdk-1.0.1/chan/kline/list.py +206 -0
- chansdk-1.0.1/chan/kline/trade.py +13 -0
- chansdk-1.0.1/chan/kline/unit.py +154 -0
- chansdk-1.0.1/chan/math/__init__.py +1 -0
- chansdk-1.0.1/chan/math/boll.py +28 -0
- chansdk-1.0.1/chan/math/demark.py +236 -0
- chansdk-1.0.1/chan/math/kdj.py +34 -0
- chansdk-1.0.1/chan/math/macd.py +29 -0
- chansdk-1.0.1/chan/math/rsi.py +38 -0
- chansdk-1.0.1/chan/math/trend_line.py +77 -0
- chansdk-1.0.1/chan/math/trend_model.py +22 -0
- chansdk-1.0.1/chan/model/__init__.py +1 -0
- chansdk-1.0.1/chan/model/features.py +18 -0
- chansdk-1.0.1/chan/seg/__init__.py +1 -0
- chansdk-1.0.1/chan/seg/config.py +13 -0
- chansdk-1.0.1/chan/seg/eigen.py +28 -0
- chansdk-1.0.1/chan/seg/eigen_fx.py +150 -0
- chansdk-1.0.1/chan/seg/list_chan.py +76 -0
- chansdk-1.0.1/chan/seg/list_comm.py +174 -0
- chansdk-1.0.1/chan/seg/list_def.py +60 -0
- chansdk-1.0.1/chan/seg/list_dyh.py +96 -0
- chansdk-1.0.1/chan/seg/seg.py +156 -0
- chansdk-1.0.1/chan/zs/__init__.py +1 -0
- chansdk-1.0.1/chan/zs/config.py +6 -0
- chansdk-1.0.1/chan/zs/list.py +161 -0
- chansdk-1.0.1/chan/zs/zs.py +234 -0
- chansdk-1.0.1/chansdk.egg-info/PKG-INFO +255 -0
- chansdk-1.0.1/chansdk.egg-info/SOURCES.txt +82 -0
- chansdk-1.0.1/chansdk.egg-info/dependency_links.txt +1 -0
- chansdk-1.0.1/chansdk.egg-info/requires.txt +10 -0
- chansdk-1.0.1/chansdk.egg-info/top_level.txt +1 -0
- chansdk-1.0.1/pyproject.toml +20 -0
- chansdk-1.0.1/scripts/fix_mojibake.py +114 -0
- chansdk-1.0.1/scripts/gray_probe.py +274 -0
- chansdk-1.0.1/scripts/verify_docs.py +169 -0
- chansdk-1.0.1/scripts/verify_release.py +347 -0
- chansdk-1.0.1/setup.cfg +4 -0
- chansdk-1.0.1/tests/test_bi.py +107 -0
- chansdk-1.0.1/tests/test_bsp.py +83 -0
- chansdk-1.0.1/tests/test_chan.py +96 -0
- chansdk-1.0.1/tests/test_common.py +214 -0
- chansdk-1.0.1/tests/test_config.py +132 -0
- chansdk-1.0.1/tests/test_data.py +179 -0
- chansdk-1.0.1/tests/test_data_sources.py +131 -0
- chansdk-1.0.1/tests/test_gray_probe.py +29 -0
- chansdk-1.0.1/tests/test_integration.py +186 -0
- chansdk-1.0.1/tests/test_kline.py +182 -0
- chansdk-1.0.1/tests/test_known_bugs.py +102 -0
- chansdk-1.0.1/tests/test_math.py +197 -0
- chansdk-1.0.1/tests/test_seg.py +89 -0
- chansdk-1.0.1/tests/test_verify_docs.py +31 -0
- chansdk-1.0.1/tests/test_verify_release.py +53 -0
- chansdk-1.0.1/tests/test_zs.py +77 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.0.1 - 2026-09-09
|
|
4
|
+
|
|
5
|
+
- 修复 SQLite 数据源连接未显式关闭的问题。
|
|
6
|
+
- 修复 CSV 日期过滤对 `YYYY-MM-DD` 和 `YYYY/MM/DD` 混用的兼容性问题。
|
|
7
|
+
- 增强 Akshare 数据源的重试和空数据诊断。
|
|
8
|
+
- 增强 Pytdx 数据源的连接超时、服务器切换、请求重试和连接释放。
|
|
9
|
+
- 修复多级别对齐、`step_load` 快照隔离、Demark 配置污染、MACD 除零和趋势线垂直距离问题。
|
|
10
|
+
- 移除配置加载中的动态 `exec`,增加配置参数校验。
|
|
11
|
+
- 新增可重复执行的灰度探测和发布门禁脚本。
|
|
12
|
+
- 新增 README 代码块编译和离线示例执行校验。
|
chansdk-1.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: chansdk
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: 缠论核心算法SDK - 纯Python实现,零外部依赖
|
|
5
|
+
License: MIT
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Provides-Extra: eltdx
|
|
9
|
+
Requires-Dist: eltdx>=3.0.0; extra == "eltdx"
|
|
10
|
+
Provides-Extra: all
|
|
11
|
+
Requires-Dist: eltdx>=3.0.0; extra == "all"
|
|
12
|
+
Provides-Extra: dev
|
|
13
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
14
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
15
|
+
|
|
16
|
+
# chansdk - 缠论核心算法 SDK
|
|
17
|
+
|
|
18
|
+
纯 Python 实现的缠论(Chan Theory)核心算法库,零外部依赖。
|
|
19
|
+
|
|
20
|
+
## 功能
|
|
21
|
+
|
|
22
|
+
- **K线合并**:包含关系处理、分型识别
|
|
23
|
+
- **笔(Bi)**:笔的构建、验证、MACD度量
|
|
24
|
+
- **线段(Seg)**:特征序列法、1+1算法、break算法
|
|
25
|
+
- **中枢(ZS)**:中枢构建、合并、背驰判断
|
|
26
|
+
- **买卖点(BSP)**:1/1p/2/2s/3a/3b 六类买卖点识别
|
|
27
|
+
- **技术指标**:MACD、BOLL、RSI、KDJ、Demark、趋势线
|
|
28
|
+
- **多级别分析**:支持多级别K线联动分析
|
|
29
|
+
|
|
30
|
+
## 安装
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 基础安装(零依赖)
|
|
34
|
+
pip install chansdk
|
|
35
|
+
|
|
36
|
+
# 带 eltdx 数据源(Rust实现,支持复权)
|
|
37
|
+
pip install chansdk[eltdx]
|
|
38
|
+
|
|
39
|
+
# 开发依赖(pytest、build)
|
|
40
|
+
pip install chansdk[dev]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 数据源
|
|
44
|
+
|
|
45
|
+
SDK 内置三种数据源,并支持自定义数据源:
|
|
46
|
+
|
|
47
|
+
| 数据源 | 说明 |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `DATA_SRC.ELTDX` | 通达信行情(需 `pip install chansdk[eltdx]`,Rust 实现,支持复权) |
|
|
50
|
+
| `DATA_SRC.CSV` | 本地 CSV 文件(零依赖,始终可用) |
|
|
51
|
+
| `DATA_SRC.CACHE_DB` | 本地 SQLite 缓存库(默认读取 `chan.db` 的 `kline_data` 表) |
|
|
52
|
+
| `custom:module.ClassName` | 自定义数据源(见下文) |
|
|
53
|
+
|
|
54
|
+
未显式传入 `data_src` 时,SDK 按以下顺序选择已安装的数据源:`eltdx` -> `CSV`。
|
|
55
|
+
显式传入 `DATA_SRC` 或自定义数据源时,按指定数据源执行。
|
|
56
|
+
|
|
57
|
+
## 快速开始
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
# docs: run
|
|
61
|
+
import csv
|
|
62
|
+
from pathlib import Path
|
|
63
|
+
from tempfile import TemporaryDirectory
|
|
64
|
+
|
|
65
|
+
from chan import CChan, KL_TYPE, DATA_SRC
|
|
66
|
+
|
|
67
|
+
with TemporaryDirectory() as temp_dir:
|
|
68
|
+
csv_path = Path(temp_dir) / "000001_day.csv"
|
|
69
|
+
with csv_path.open("w", newline="", encoding="utf-8") as handle:
|
|
70
|
+
writer = csv.writer(handle)
|
|
71
|
+
writer.writerow(["time_key", "open", "high", "low", "close"])
|
|
72
|
+
writer.writerows(
|
|
73
|
+
[
|
|
74
|
+
["2024-01-01", 10, 12, 9, 11],
|
|
75
|
+
["2024-01-02", 11, 13, 10, 12],
|
|
76
|
+
["2024-01-03", 12, 14, 11, 13],
|
|
77
|
+
]
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
chan = CChan(
|
|
81
|
+
code="000001",
|
|
82
|
+
begin_time="2024-01-01",
|
|
83
|
+
end_time="2024-01-03",
|
|
84
|
+
data_src=DATA_SRC.CSV,
|
|
85
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
86
|
+
file_path=str(csv_path),
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
kline_list = chan[KL_TYPE.K_DAY]
|
|
90
|
+
print(f"笔数量: {len(kline_list.bi_list)}")
|
|
91
|
+
print(f"线段数量: {len(kline_list.seg_list)}")
|
|
92
|
+
print(f"中枢数量: {len(kline_list.zs_list)}")
|
|
93
|
+
print(f"买卖点数量: {len(kline_list.bs_point_lst)}")
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### eltdx 数据源(推荐的外部行情源)
|
|
97
|
+
|
|
98
|
+
`eltdx` 是基于 Rust 实现的通达信行情客户端,支持服务端复权和 43 台主站自动测速:
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
# docs: eltdx
|
|
102
|
+
from chan import CChan, KL_TYPE, DATA_SRC, AUTYPE
|
|
103
|
+
|
|
104
|
+
# 前复权(默认)
|
|
105
|
+
chan = CChan(
|
|
106
|
+
code="600519",
|
|
107
|
+
data_src=DATA_SRC.ELTDX,
|
|
108
|
+
autype=AUTYPE.QFQ,
|
|
109
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
# 后复权
|
|
113
|
+
chan = CChan(
|
|
114
|
+
code="600519",
|
|
115
|
+
data_src=DATA_SRC.ELTDX,
|
|
116
|
+
autype=AUTYPE.HFQ,
|
|
117
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# 定点复权(需要 eltdx >= 3.0)
|
|
121
|
+
chan = CChan(
|
|
122
|
+
code="600519",
|
|
123
|
+
data_src=DATA_SRC.ELTDX,
|
|
124
|
+
autype=AUTYPE.QFQ,
|
|
125
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
126
|
+
anchor_date="2024-06-03",
|
|
127
|
+
)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
eltdx 特性:
|
|
131
|
+
- 支持 `AUTYPE.QFQ`(前复权)、`AUTYPE.HFQ`(后复权)、`AUTYPE.NONE`(未复权)
|
|
132
|
+
- 支持定点复权(`anchor_date` 参数)
|
|
133
|
+
- 支持 1/5/15/30/60 分钟、日/周/月/季/年线
|
|
134
|
+
- Rust 实现,43 台候选主站自动测速
|
|
135
|
+
- 生产级稳定性(Production/Stable)
|
|
136
|
+
- 零 Python 运行时依赖
|
|
137
|
+
- 许可证:仅允许个人学习和非商业研究
|
|
138
|
+
|
|
139
|
+
> 注意:eltdx 许可证禁止商业使用。外部行情服务可能受网络、服务端限流或历史数据边界影响,生产灰度建议先限制标的数量和时间窗口,并记录 `CChanException` 的错误信息。
|
|
140
|
+
|
|
141
|
+
## 灰度探测
|
|
142
|
+
|
|
143
|
+
仓库提供可重复执行的串行灰度脚本。默认只验证本地 CSV 和 SQLite 链路:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
python scripts/gray_probe.py
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
需要探测外部行情源时显式开启,并限制超时:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
python scripts/gray_probe.py --include-external --begin 2025-01-02 --end 2025-01-10
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
保存灰度报告:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
python scripts/gray_probe.py --json-out build/release/gray_probe.json
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
脚本输出 JSON 结果,外部服务不可用时返回非零退出码,不会把失败伪装成空数据成功。
|
|
162
|
+
|
|
163
|
+
发布前一键检查:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
python scripts/verify_release.py
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
默认执行测试、编译、文档示例、本地灰度、wheel 构建和隔离导入,并将报告写入 `build/release/release_report.json`。
|
|
170
|
+
|
|
171
|
+
单独校验 README 代码块:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
python scripts/verify_docs.py --run-marked --json-out build/release/docs_report.json
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## 使用自定义数据源
|
|
178
|
+
|
|
179
|
+
如果需要接入其他行情服务,可按下方接口实现自定义数据源。
|
|
180
|
+
|
|
181
|
+
```python
|
|
182
|
+
# docs: skeleton
|
|
183
|
+
from chan import CChan, KL_TYPE
|
|
184
|
+
from chan.data.base import CCommonStockApi
|
|
185
|
+
|
|
186
|
+
class MyDataAPI(CCommonStockApi):
|
|
187
|
+
def SetBasciInfo(self):
|
|
188
|
+
self.name = self.code
|
|
189
|
+
self.is_stock = True
|
|
190
|
+
|
|
191
|
+
@classmethod
|
|
192
|
+
def do_init(cls):
|
|
193
|
+
# 初始化连接
|
|
194
|
+
pass
|
|
195
|
+
|
|
196
|
+
@classmethod
|
|
197
|
+
def do_close(cls):
|
|
198
|
+
# 释放连接
|
|
199
|
+
pass
|
|
200
|
+
|
|
201
|
+
def get_kl_data(self):
|
|
202
|
+
# 返回 CKLine_Unit 可迭代对象
|
|
203
|
+
pass
|
|
204
|
+
|
|
205
|
+
chan = CChan(
|
|
206
|
+
code="my_stock",
|
|
207
|
+
data_src="custom:my_module.MyDataAPI",
|
|
208
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
209
|
+
)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## API 参考
|
|
213
|
+
|
|
214
|
+
### CChan
|
|
215
|
+
|
|
216
|
+
```python
|
|
217
|
+
# docs: reference
|
|
218
|
+
CChan(
|
|
219
|
+
code: str, # 股票代码
|
|
220
|
+
begin_time: str = None, # 开始时间
|
|
221
|
+
end_time: str = None, # 结束时间
|
|
222
|
+
data_src: DATA_SRC = ..., # 数据源
|
|
223
|
+
lv_list: List[KL_TYPE] = ..., # 分析级别
|
|
224
|
+
config: CChanConfig = None, # 配置
|
|
225
|
+
autype: AUTYPE = ..., # 复权类型
|
|
226
|
+
**kwargs # 传递给数据源的参数
|
|
227
|
+
)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### CChanConfig
|
|
231
|
+
|
|
232
|
+
```python
|
|
233
|
+
# docs: run
|
|
234
|
+
from chan import CChanConfig
|
|
235
|
+
|
|
236
|
+
config = CChanConfig()
|
|
237
|
+
config.bi_conf.bi_algo = "peak" # 笔算法
|
|
238
|
+
config.seg_conf.seg_algo = "chan" # 线段算法
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
`trigger_step=True`(逐步回放)时,每一步默认产出一份深拷贝快照。可通过 `snapshot_step` 调整快照频率以降低开销:
|
|
242
|
+
|
|
243
|
+
```python
|
|
244
|
+
# docs: run
|
|
245
|
+
from chan import CChanConfig
|
|
246
|
+
|
|
247
|
+
config = CChanConfig({
|
|
248
|
+
"trigger_step": True,
|
|
249
|
+
"snapshot_step": 10, # 每 10 步产出一次深拷贝快照;0 表示不做深拷贝,直接产出实时对象(调用方不应持有引用)
|
|
250
|
+
})
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## 许可证
|
|
254
|
+
|
|
255
|
+
MIT License
|
chansdk-1.0.1/README.md
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# chansdk - 缠论核心算法 SDK
|
|
2
|
+
|
|
3
|
+
纯 Python 实现的缠论(Chan Theory)核心算法库,零外部依赖。
|
|
4
|
+
|
|
5
|
+
## 功能
|
|
6
|
+
|
|
7
|
+
- **K线合并**:包含关系处理、分型识别
|
|
8
|
+
- **笔(Bi)**:笔的构建、验证、MACD度量
|
|
9
|
+
- **线段(Seg)**:特征序列法、1+1算法、break算法
|
|
10
|
+
- **中枢(ZS)**:中枢构建、合并、背驰判断
|
|
11
|
+
- **买卖点(BSP)**:1/1p/2/2s/3a/3b 六类买卖点识别
|
|
12
|
+
- **技术指标**:MACD、BOLL、RSI、KDJ、Demark、趋势线
|
|
13
|
+
- **多级别分析**:支持多级别K线联动分析
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# 基础安装(零依赖)
|
|
19
|
+
pip install chansdk
|
|
20
|
+
|
|
21
|
+
# 带 eltdx 数据源(Rust实现,支持复权)
|
|
22
|
+
pip install chansdk[eltdx]
|
|
23
|
+
|
|
24
|
+
# 开发依赖(pytest、build)
|
|
25
|
+
pip install chansdk[dev]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 数据源
|
|
29
|
+
|
|
30
|
+
SDK 内置三种数据源,并支持自定义数据源:
|
|
31
|
+
|
|
32
|
+
| 数据源 | 说明 |
|
|
33
|
+
|---|---|
|
|
34
|
+
| `DATA_SRC.ELTDX` | 通达信行情(需 `pip install chansdk[eltdx]`,Rust 实现,支持复权) |
|
|
35
|
+
| `DATA_SRC.CSV` | 本地 CSV 文件(零依赖,始终可用) |
|
|
36
|
+
| `DATA_SRC.CACHE_DB` | 本地 SQLite 缓存库(默认读取 `chan.db` 的 `kline_data` 表) |
|
|
37
|
+
| `custom:module.ClassName` | 自定义数据源(见下文) |
|
|
38
|
+
|
|
39
|
+
未显式传入 `data_src` 时,SDK 按以下顺序选择已安装的数据源:`eltdx` -> `CSV`。
|
|
40
|
+
显式传入 `DATA_SRC` 或自定义数据源时,按指定数据源执行。
|
|
41
|
+
|
|
42
|
+
## 快速开始
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
# docs: run
|
|
46
|
+
import csv
|
|
47
|
+
from pathlib import Path
|
|
48
|
+
from tempfile import TemporaryDirectory
|
|
49
|
+
|
|
50
|
+
from chan import CChan, KL_TYPE, DATA_SRC
|
|
51
|
+
|
|
52
|
+
with TemporaryDirectory() as temp_dir:
|
|
53
|
+
csv_path = Path(temp_dir) / "000001_day.csv"
|
|
54
|
+
with csv_path.open("w", newline="", encoding="utf-8") as handle:
|
|
55
|
+
writer = csv.writer(handle)
|
|
56
|
+
writer.writerow(["time_key", "open", "high", "low", "close"])
|
|
57
|
+
writer.writerows(
|
|
58
|
+
[
|
|
59
|
+
["2024-01-01", 10, 12, 9, 11],
|
|
60
|
+
["2024-01-02", 11, 13, 10, 12],
|
|
61
|
+
["2024-01-03", 12, 14, 11, 13],
|
|
62
|
+
]
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
chan = CChan(
|
|
66
|
+
code="000001",
|
|
67
|
+
begin_time="2024-01-01",
|
|
68
|
+
end_time="2024-01-03",
|
|
69
|
+
data_src=DATA_SRC.CSV,
|
|
70
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
71
|
+
file_path=str(csv_path),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
kline_list = chan[KL_TYPE.K_DAY]
|
|
75
|
+
print(f"笔数量: {len(kline_list.bi_list)}")
|
|
76
|
+
print(f"线段数量: {len(kline_list.seg_list)}")
|
|
77
|
+
print(f"中枢数量: {len(kline_list.zs_list)}")
|
|
78
|
+
print(f"买卖点数量: {len(kline_list.bs_point_lst)}")
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### eltdx 数据源(推荐的外部行情源)
|
|
82
|
+
|
|
83
|
+
`eltdx` 是基于 Rust 实现的通达信行情客户端,支持服务端复权和 43 台主站自动测速:
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
# docs: eltdx
|
|
87
|
+
from chan import CChan, KL_TYPE, DATA_SRC, AUTYPE
|
|
88
|
+
|
|
89
|
+
# 前复权(默认)
|
|
90
|
+
chan = CChan(
|
|
91
|
+
code="600519",
|
|
92
|
+
data_src=DATA_SRC.ELTDX,
|
|
93
|
+
autype=AUTYPE.QFQ,
|
|
94
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# 后复权
|
|
98
|
+
chan = CChan(
|
|
99
|
+
code="600519",
|
|
100
|
+
data_src=DATA_SRC.ELTDX,
|
|
101
|
+
autype=AUTYPE.HFQ,
|
|
102
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# 定点复权(需要 eltdx >= 3.0)
|
|
106
|
+
chan = CChan(
|
|
107
|
+
code="600519",
|
|
108
|
+
data_src=DATA_SRC.ELTDX,
|
|
109
|
+
autype=AUTYPE.QFQ,
|
|
110
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
111
|
+
anchor_date="2024-06-03",
|
|
112
|
+
)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
eltdx 特性:
|
|
116
|
+
- 支持 `AUTYPE.QFQ`(前复权)、`AUTYPE.HFQ`(后复权)、`AUTYPE.NONE`(未复权)
|
|
117
|
+
- 支持定点复权(`anchor_date` 参数)
|
|
118
|
+
- 支持 1/5/15/30/60 分钟、日/周/月/季/年线
|
|
119
|
+
- Rust 实现,43 台候选主站自动测速
|
|
120
|
+
- 生产级稳定性(Production/Stable)
|
|
121
|
+
- 零 Python 运行时依赖
|
|
122
|
+
- 许可证:仅允许个人学习和非商业研究
|
|
123
|
+
|
|
124
|
+
> 注意:eltdx 许可证禁止商业使用。外部行情服务可能受网络、服务端限流或历史数据边界影响,生产灰度建议先限制标的数量和时间窗口,并记录 `CChanException` 的错误信息。
|
|
125
|
+
|
|
126
|
+
## 灰度探测
|
|
127
|
+
|
|
128
|
+
仓库提供可重复执行的串行灰度脚本。默认只验证本地 CSV 和 SQLite 链路:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
python scripts/gray_probe.py
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
需要探测外部行情源时显式开启,并限制超时:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
python scripts/gray_probe.py --include-external --begin 2025-01-02 --end 2025-01-10
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
保存灰度报告:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
python scripts/gray_probe.py --json-out build/release/gray_probe.json
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
脚本输出 JSON 结果,外部服务不可用时返回非零退出码,不会把失败伪装成空数据成功。
|
|
147
|
+
|
|
148
|
+
发布前一键检查:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
python scripts/verify_release.py
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
默认执行测试、编译、文档示例、本地灰度、wheel 构建和隔离导入,并将报告写入 `build/release/release_report.json`。
|
|
155
|
+
|
|
156
|
+
单独校验 README 代码块:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
python scripts/verify_docs.py --run-marked --json-out build/release/docs_report.json
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## 使用自定义数据源
|
|
163
|
+
|
|
164
|
+
如果需要接入其他行情服务,可按下方接口实现自定义数据源。
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
# docs: skeleton
|
|
168
|
+
from chan import CChan, KL_TYPE
|
|
169
|
+
from chan.data.base import CCommonStockApi
|
|
170
|
+
|
|
171
|
+
class MyDataAPI(CCommonStockApi):
|
|
172
|
+
def SetBasciInfo(self):
|
|
173
|
+
self.name = self.code
|
|
174
|
+
self.is_stock = True
|
|
175
|
+
|
|
176
|
+
@classmethod
|
|
177
|
+
def do_init(cls):
|
|
178
|
+
# 初始化连接
|
|
179
|
+
pass
|
|
180
|
+
|
|
181
|
+
@classmethod
|
|
182
|
+
def do_close(cls):
|
|
183
|
+
# 释放连接
|
|
184
|
+
pass
|
|
185
|
+
|
|
186
|
+
def get_kl_data(self):
|
|
187
|
+
# 返回 CKLine_Unit 可迭代对象
|
|
188
|
+
pass
|
|
189
|
+
|
|
190
|
+
chan = CChan(
|
|
191
|
+
code="my_stock",
|
|
192
|
+
data_src="custom:my_module.MyDataAPI",
|
|
193
|
+
lv_list=[KL_TYPE.K_DAY],
|
|
194
|
+
)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## API 参考
|
|
198
|
+
|
|
199
|
+
### CChan
|
|
200
|
+
|
|
201
|
+
```python
|
|
202
|
+
# docs: reference
|
|
203
|
+
CChan(
|
|
204
|
+
code: str, # 股票代码
|
|
205
|
+
begin_time: str = None, # 开始时间
|
|
206
|
+
end_time: str = None, # 结束时间
|
|
207
|
+
data_src: DATA_SRC = ..., # 数据源
|
|
208
|
+
lv_list: List[KL_TYPE] = ..., # 分析级别
|
|
209
|
+
config: CChanConfig = None, # 配置
|
|
210
|
+
autype: AUTYPE = ..., # 复权类型
|
|
211
|
+
**kwargs # 传递给数据源的参数
|
|
212
|
+
)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### CChanConfig
|
|
216
|
+
|
|
217
|
+
```python
|
|
218
|
+
# docs: run
|
|
219
|
+
from chan import CChanConfig
|
|
220
|
+
|
|
221
|
+
config = CChanConfig()
|
|
222
|
+
config.bi_conf.bi_algo = "peak" # 笔算法
|
|
223
|
+
config.seg_conf.seg_algo = "chan" # 线段算法
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
`trigger_step=True`(逐步回放)时,每一步默认产出一份深拷贝快照。可通过 `snapshot_step` 调整快照频率以降低开销:
|
|
227
|
+
|
|
228
|
+
```python
|
|
229
|
+
# docs: run
|
|
230
|
+
from chan import CChanConfig
|
|
231
|
+
|
|
232
|
+
config = CChanConfig({
|
|
233
|
+
"trigger_step": True,
|
|
234
|
+
"snapshot_step": 10, # 每 10 步产出一次深拷贝快照;0 表示不做深拷贝,直接产出实时对象(调用方不应持有引用)
|
|
235
|
+
})
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## 许可证
|
|
239
|
+
|
|
240
|
+
MIT License
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""缠论核心算法 SDK - 零外部依赖"""
|
|
3
|
+
|
|
4
|
+
from chan.chan import CChan
|
|
5
|
+
from chan.config import CChanConfig
|
|
6
|
+
from chan.common.enum import (
|
|
7
|
+
KL_TYPE, DATA_SRC, AUTYPE, BSP_TYPE,
|
|
8
|
+
KLINE_DIR, FX_TYPE, BI_DIR, BI_TYPE,
|
|
9
|
+
)
|
|
10
|
+
from chan.common.exception import CChanException
|
|
11
|
+
from chan.common.time import CTime
|
|
12
|
+
from chan.kline.unit import CKLine_Unit
|
|
13
|
+
from chan.bi.bi import CBi
|
|
14
|
+
from chan.seg.seg import CSeg
|
|
15
|
+
from chan.zs.zs import CZS
|
|
16
|
+
from chan.bsp.point import CBS_Point
|
|
17
|
+
from chan.data.base import CCommonStockApi
|
|
18
|
+
|
|
19
|
+
__version__ = "1.0.1"
|
|
20
|
+
__all__ = [
|
|
21
|
+
"CChan", "CChanConfig",
|
|
22
|
+
"KL_TYPE", "DATA_SRC", "AUTYPE", "BSP_TYPE",
|
|
23
|
+
"KLINE_DIR", "FX_TYPE", "BI_DIR", "BI_TYPE",
|
|
24
|
+
"CChanException", "CTime",
|
|
25
|
+
"CKLine_Unit", "CBi", "CSeg", "CZS", "CBS_Point",
|
|
26
|
+
"CCommonStockApi",
|
|
27
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|