diff --git a/docs/chanlun.md b/docs/chanlun.md new file mode 100644 index 0000000..6ee3af2 --- /dev/null +++ b/docs/chanlun.md @@ -0,0 +1,148 @@ +# 缠论分析 + +## CLI 用法 + +基于缠论理论的技术分析,计算管道:`K 线合并 → 分型识别 → 笔 → 中枢 → 线段 → 买卖点 → 背驰`。默认输出 JSON,加 `--table` 输出可读表格。:`K 线合并 → 分型识别 → 笔 → 中枢 → 线段 → 买卖点 → 背驰`。默认输出 JSON,加 `--table` 输出可读表格。 + +```bash +easy-tdx chanlun SZ 000001 --table +easy-tdx chanlun SH 600519 --adjust QFQ --table +easy-tdx chanlun SZ 000001 --period 30MIN + +# 多级别联立:分析日线最后一笔在 30 分钟级别中的走势结构 +easy-tdx chanlun SZ 000001 --multi-level 30MIN --table +easy-tdx chanlun SH 600519 --multi-level 5MIN +``` + +### 输出示例 + +以 `easy-tdx chanlun SH 601088 --table` 为例,输出分五个部分: + +**概要统计** + +``` +标的: 601088 周期: DAILY +原始K线: 800 缠论K线: 589 +分型: 275 笔: 131 中枢: 21 线段: 40 +买卖点: 125 背驰: 73 +``` + +| 字段 | 含义 | +|------|------| +| 原始 K 线 | 从服务端获取的原始 K 线条数 | +| 缠论 K 线 | 经过包含处理(合并)后的 K 线条数,数量一定 ≤ 原始 K 线 | +| 分型 | 识别出的顶分型 + 底分型总数 | +| 笔 | 相邻两个异向分型之间的连线(涨跌方向交替) | +| 中枢 | 至少 3 笔重叠区域形成的密集成交区间 | +| 线段 | 由笔构成的更大级别走势单位 | +| 买卖点 | 一二三类买卖点信号总数 | +| 背驰 | 力度衰减信号总数(笔背驰 / 盘整背驰 / 趋势背驰) | + +**笔** + +``` +[0] ↑ 2023-02-17 → 2023-02-23 h=28.46 l=26.76 ✓ +[1] ↓ 2023-02-23 → 2023-02-28 h=28.46 l=27.8 ✓ +[2] ↑ 2023-02-28 → 2023-03-09 h=29.77 l=27.8 ✓ +``` + +笔是缠论的基本走势单位。每条笔连接一个顶分型和一个底分型,方向严格交替(↑↓↑↓…)。`✓` 表示已确认(后续出现了反向笔),`…` 表示仍在进行中。 + +- `↑`:向上笔,起点是底分型(低点),终点是顶分型(高点) +- `↓`:向下笔,起点是顶分型(高点),终点是底分型(低点) +- `h`/`l`:该笔范围内的最高价 / 最低价 + +**中枢** + +``` +[0] zg=28.46 zd=28.11 gg=32.56 dd=26.76 lines=11 ✓ +[1] zg=31.2 zd=30.45 gg=32.56 dd=27.9 lines=3 ✓ +``` + +中枢是至少 3 笔重叠形成的密集成交区间,代表多空博弈的平衡区域。`✓` 表示已脱离,`…` 表示价格仍在中枢区间内震荡。 + +| 字段 | 含义 | +|------|------| +| `zg` | 中枢上沿(区间内最高的低点)— 支撑/压力的关键分界 | +| `zd` | 中枢下沿(区间内最低的高点) | +| `gg` | 中枢区间内的最高价 | +| `dd` | 中枢区间内的最低价 | +| `lines` | 构成该中枢的笔数,笔数越多代表震荡越充分 | + +中枢的意义:价格在中枢内震荡 → 突破中枢上沿看涨,跌破下沿看跌。`zg`/`zd` 是实战中最常用的参考价位。 + +**线段** + +``` +[0] ↑ 2023-02-17 → 2023-03-09 h=29.77 l=26.76 +[1] ↓ 2023-02-28 → 2023-03-29 h=29.77 l=27.18 +``` + +线段是比笔更大的走势单位,由多笔重叠组合而成。线段的方向不严格交替,可能出现连续同向(如连续多段向上),代表更高一级的趋势方向。实战中通常在线段级别判断大方向,在笔级别找买卖点。 + +**买卖点** + +``` +1buy: 中枢下方力度衰减,一类买点 (l=27.30 < zd=46.72) +2buy: 回调不创新低,二类买点 (l=27.33) +3buy: 回调不破中枢上沿,三类买点 (l=27.80 > zg=27.58) +1sell: 中枢上方力度衰减,一类卖点 (h=50.38 > zg=46.97) +2sell: 反弹不创新高,二类卖点 (h=29.32) +3sell: 反弹不破中枢下沿,三类卖点 (h=28.46 < zd=46.72) +``` + +缠论定义三类买点和三类卖点: + +| 类型 | 买点含义 | 卖点含义 | +|------|----------|----------| +| 一类 | 下跌趋势末端,力度衰减后的第一个低点(抄底) | 上涨趋势末端,力度衰减后的第一个高点(逃顶) | +| 二类 | 一类买点后的回调不创新低(确认反转) | 一类卖点后的反弹不创新高(确认反转) | +| 三类 | 回调不进入中枢上沿(趋势确认,中枢上方买) | 反弹不进入中枢下沿(趋势确认,中枢下方卖) | + +括号内的条件是该信号的触发依据,如 `l=27.80 > zg=27.58` 表示回调低点 27.80 高于中枢上沿 27.58,所以是三类买点。 + +**背驰** + +``` +[✓] bi: 笔背驰: 笔[4] 力度=1.32 < 笔[2] 力度=1.97 +[✓] pz: 盘整背驰: 中枢[11] 内末笔力度=2.49 < 首笔力度=6.64 +[✓] qs: 趋势背驰(上): 中枢[1] 离开力度=3.32 < 中枢[0] 离开力度=4.45 +``` + +背驰是力度衰减信号,表明当前走势动力正在减弱,可能即将反转。力度通过 MACD 面积计算,数值越小力度越弱。 + +| 类型 | 含义 | +|------|------| +| `bi`(笔背驰) | 同向相邻两笔比较,后一笔力度 < 前一笔 → 该方向动力减弱 | +| `pz`(盘整背驰) | 同一中枢内,末笔力度 < 首笔 → 中枢内动力衰减,即将突破 | +| `qs`(趋势背驰) | 两个同向中枢之间比较,后一中枢离开力度 < 前一中枢 → 趋势可能终结 | + +`[✓]` 表示确认背驰。趋势背驰(上)代表上涨趋势可能结束,趋势背驰(下)代表下跌趋势可能结束。 + + +## Python 用法 + +基于缠论理论的技术分析模块,接收 easy_tdx 的 K 线 DataFrame,输出笔、中枢、线段、买卖点、背驰等分析结果: + +```python +from easy_tdx.chanlun import ChanlunAnalyser, ChanlunConfig + +# 使用 easy_tdx 获取 K 线数据 +with TdxClient() as client: + df = client.get_security_bars(Market.SH, "600519", KlineCategory.DAY, 0, 800) + +# 缠论分析 +analyser = ChanlunAnalyser("SH600519", "DAILY") +result = analyser.process_klines(df) + +# 获取结果 +print(f"笔数: {len(result.bis)}") +print(f"中枢数: {len(result.zss)}") +print(f"线段数: {len(result.xds)}") +print(f"买卖点: {[m.msg for m in result.mmds]}") +print(f"背驰: {[b.msg for b in result.bcs]}") + +# JSON 兼容字典输出 +print(result.to_dict()) +``` + diff --git a/docs/cli-backtest.md b/docs/cli-backtest.md new file mode 100644 index 0000000..dac2e33 --- /dev/null +++ b/docs/cli-backtest.md @@ -0,0 +1,371 @@ +# CLI 参考 — 回测与寻优 + +## 回测引擎 + +> 📖 **完整使用手册**:[backtest_usage.md](./backtest_usage.md) —— +> 涵盖策略编写(`init()`/`next()`)、行情数据访问、指标注册、订单模拟、 +> 绩效指标、组合回测、调仓引擎与完整示例。回测相关用法以该手册为准。 + +内置向量回测引擎,加载 Python 策略文件即可跑回测。策略继承 `Strategy` 基类,在 `init()` 注册指标,在 `next()` 逐 bar 生成买卖信号,引擎完成订单模拟、持仓跟踪和绩效分析。 + +**单策略回测:** + +```bash +easy-tdx backtest SZ 300308 --strategy-file strategies/expma_cross.py --count 2000 --cash 1000000 --adjust QFQ --table +# 推荐加上 --slippage 0.01 模拟真实滑点(元/股),使回测更贴近实盘 + +# 缠论自动桥接:引擎自动计算缠论分析并注入策略 self.chanlun +easy-tdx backtest SZ 000001 --strategy-file strategies/chanlun_strategy.py --chanlun-level DAILY --table + +# 预计算指标(MACD, KDJ 会作为额外列注入 DataFrame) +easy-tdx backtest SZ 000001 \ + --strategy-file strategies/macd_strategy.py \ + --indicators MACD,KDJ +``` + +`backtest` 命令 CLI 参数: + +| 参数 | 默认值 | 说明 | +|------|--------|------| +| `MARKET` | — | 市场代码:SZ / SH | +| `CODE` | — | 股票代码:如 000001 | +| `--strategy-file` | — | Python 策略文件路径 | +| `--cash` | 100000 | 初始资金 | +| `--commission` | 0.0003 | 佣金率 | +| `--execution` | next_open | 成交价规则 | +| `--period` | DAILY | K 线周期 | +| `--adjust` | NONE | 复权方式:NONE / QFQ / HFQ | +| `--count` | 500 | K 线数量 | +| `--indicators` | — | 预计算指标(逗号分隔) | +| `--table` | False | 表格输出 | +| `--output` | json | 输出格式:json / table / csv | +| `--wf` | False | 附加 Walk-Forward 样本外验证 | +| `--wf-windows` | 7 | Walk-Forward 窗口数 | +| `--evaluate` | False | 一条龙评估(回测+WF+适配性+评分+评级+基准对比) | +| `--auto-fees` | False | 按标的品种自动解析费率 | + +**样本外验证(v1.25):** + +```bash +# 附加 Walk-Forward 七窗样本外验证(每窗独立开仓,窗口数可调) +easy-tdx backtest SZ 300308 --strategy-file strategies/expma_cross.py --wf --wf-windows 7 + +# 一条龙评估:回测 + WF + 适配性体检 + 综合评分 + S-D 评级 + 买入持有基准对比 +easy-tdx backtest SZ 300308 --strategy-file strategies/expma_cross.py --evaluate +``` + +输出示例: + +``` +=== 回测绩效概要 === +总收益率: 1413.51% +年化收益: 40.85% +最大回撤: 76.75% +夏普比率: 0.88 +胜率: 20.8% +交易次数: 24 +``` + +> ⚠️ **回测 ≠ 实盘**。以上收益率为历史数据回测结果,包含幸存者偏差和过拟合风险, +> 不构成投资建议。实际交易需考虑滑点、流动性、涨跌停无法成交等因素。 +> 请在充分理解策略逻辑后谨慎使用。 + +**参数网格寻优(optimize)与内置策略列表(strategies):** + +```bash +# 列出全部内置策略(名称/参数默认值/预设寻优网格) +easy-tdx strategies + +# 单策略网格寻优(预设网格或 --param 自定义,--workers 4 进程并行) +easy-tdx optimize SZ 000001 --strategy ma_cross +easy-tdx optimize SZ 000001 --strategy ma_cross --param fast=5,10,15 --param slow=20,60 + +# 一键寻优所有内置策略:逐策略按预设网格寻优后全局排名(对应 Web UI /optimize 页) +easy-tdx optimize SZ 000001 --all --workers 4 --table + +# strategies 也支持 JSON 输出(含完整参数 schema,与 Web API GET /backtest/strategies 同构) +easy-tdx strategies --output json +``` + +`optimize` 参数: + +| 参数 | 默认值 | 说明 | +|------|--------|------| +| `--strategy` | — | 注册表策略名(与 `--all` 二选一) | +| `--all` | False | 一键寻优所有内置策略(STRATEGY_PRESETS 预设网格) | +| `--param` | 预设网格 | 自定义参数网格,如 `fast=5,10,15`(最多 2 个参数,笛卡尔积 ≤ 200) | +| `--cash` | 1000000 | 初始资金 | +| `--commission` | 0.0003 | 佣金率 | +| `--slippage` | 0.0 | 滑点 | +| `--workers` | 1 | 并行进程数(2+ 进程级并行;1 = 串行 + 指标缓存复用) | +| `--top` | 15 | 表格输出显示前 N 行 | + +Python API 同名能力:`easy_tdx.backtest.optimizer.ParamGridOptimizer`(单策略)与 +`easy_tdx.backtest.optimizer.optimize_all_strategies`(一键全策略)。 + +**全策略批量对比(CLI):** + +`easy-tdx run-all` 一行命令跑完 `strategies/` 下所有策略并排名: + +```bash +easy-tdx run-all SZ 300308 --count 2000 --cash 1000000 --adjust QFQ + +# 多因子组合回测 +easy-tdx run-all SZ 300308 --combo 2 --combo-mode MAJORITY + +# 加 --show 自动弹出最佳策略的资金曲线 vs 股价对比图 +easy-tdx run-all SZ 300308 --count 2000 --cash 1000000 --adjust QFQ --show + +# 自定义策略目录 +easy-tdx run-all SZ 300308 --strategies-dir my_strategies/ +``` + +也可使用项目自带的 `run_all_strategies.py` 脚本(功能相同): + +```bash +python -X utf8 run_all_strategies.py SZ 300308 --count 2000 --cash 1000000 --adjust QFQ + +# 加 --show 自动弹出最佳策略的资金曲线 vs 股价对比图 +python -X utf8 run_all_strategies.py SZ 300308 --count 2000 --cash 1000000 --adjust QFQ --show +``` + +**多因子组合回测:** + +自动遍历所有 2 因子 / 3 因子组合,找到最优搭配: + +```bash +# 自动寻找最佳 2 因子和 3 因子组合(MAJORITY 模式) +python -X utf8 run_all_strategies.py SZ 300308 --combo 2 --combo 3 --combo-mode majority + +# CLI 方式 +easy-tdx run-all SZ 300308 --combo 2 --combo 3 --combo-mode majority +``` + +CLI 指定策略文件组合: + +```bash +easy-tdx backtest SZ 000001 \ + --combo-strategies strategies/macd_cross.py,strategies/rsi_reversal.py,strategies/bollinger_breakout.py \ + --combo-mode majority --table +``` + +Python API: + +```python +from easy_tdx.backtest import CombinationRunner + +runner = CombinationRunner( + strategy_classes=[MACDStrategy, RSIStrategy, BollingerStrategy], + df=df, cash=100000, +) +results = runner.screen(combo_sizes=(2, 3), mode="MAJORITY") +for r in results[:5]: + print(f"{r.name}: 收益={r.result.performance['total_return']:.2%}") +``` + +信号合并模式: + +| 模式 | 买入条件 | 卖出条件 | 特点 | +|------|---------|---------|------| +| `AND` | 所有因子都看多 | 所有因子都看空 | 极保守,交易少但精确 | +| `MAJORITY` | 过半因子看多 | 过半因子看空 | 平衡,推荐默认 | +| `OR` | 任一因子看多 | 任一因子看空 | 激进,信号多噪声大 | + +`--show` 会用 matplotlib 弹出一个双轴对比窗口:左轴蓝色线是归一化股价,右轴红色线是最佳策略的资金曲线,绿三角=买入、黄三角=卖出,标题显示股票名称和关键绩效指标。需要 `pip install matplotlib`。 + +**多标的组合回测(portfolio):** + +`easy-tdx portfolio` 对多只股票同时回测,共享资金池,按均等比例分配,汇总组合整体绩效: + +```bash +# 两只股票组合回测 +easy-tdx portfolio --stocks SZ:000001,SH:600519 --strategy-file strategies/ma_cross.py --table + +# 自定义资金和周期 +easy-tdx portfolio --stocks SZ:000001,SH:600519,SH:600036 \ + --strategy-file strategies/expma_cross.py --cash 500000 --period DAILY --count 1000 --table + +# 搭配缠论桥接 +easy-tdx portfolio --stocks SZ:000001,SH:600519 \ + --strategy-file strategies/chanlun_strategy.py --chanlun-level DAILY --table + +# 组合级 Walk-Forward / 一条龙评估(与 Web UI /portfolio 页同构) +easy-tdx portfolio --stocks SZ:000001,SH:600519 \ + --strategy-file strategies/ma_cross.py --wf --wf-windows 7 +easy-tdx portfolio --stocks SZ:000001,SH:600519 \ + --strategy-file strategies/ma_cross.py --evaluate +``` + +输出示例: + +``` +=== 组合回测绩效概要 === +标的数量: 3 +总资金: 200,000 +组合收益率: 28.50% +组合年化: 28.50% + +── 各标的详情 ── + SZ000001: 收益=35.20% 夏普=0.92 回撤=15.30% 分配=33% 交易=12 + SH600519: 收益=18.40% 夏普=0.68 回撤=8.50% 分配=33% 交易=8 + SH600036: 收益=31.90% 夏普=0.85 回撤=12.10% 分配=33% 交易=15 +``` + +| 参数 | 说明 | +|------|------| +| `--stocks` | 股票列表:逗号分隔的 `市场:代码`(如 `SZ:000001,SH:600519`) | +| `--cash` | 总资金(默认 20 万) | +| `--allocation` | 资金分配方式(目前支持 `equal` 均等分配) | +| `--chanlun-level` | 自动计算缠论分析并注入策略(如 DAILY/30MIN) | + + +## 批量运行全部策略(run-all) + + +``` +发现 9 个策略文件 +标的: SZ 300308 | K线: 2000 | 资金: 1,000,000 | 复权: QFQ +================================================================================ + +>> 运行策略: bias_reversal ... 完成 (2.4s) +>> 运行策略: bollinger_breakout ... 完成 (0.6s) +>> 运行策略: expma_cross ... 完成 (0.6s) +>> 运行策略: kdj_golden ... 完成 (0.1s) +>> 运行策略: ma_cross ... 完成 (1.4s) +>> 运行策略: macd_cross ... 完成 (2.1s) +>> 运行策略: rsi_reversal ... 完成 (0.2s) +>> 运行策略: turtle_breakout ... 完成 (0.1s) +>> 运行策略: volume_price ... 完成 (6.3s) + +================================================================================ +[*] 策略绩效排名 (按总收益率降序) +================================================================================ + 排名 策略 总收益率 年化收益 最大回撤 夏普 胜率 交易次数 盈亏比 +---------------------------------------------------------------------------------------------------- + *1* 1 expma_cross 1413.51% 40.85% 76.75% 0.88 20.8% 24 6.45 + *2* 2 ma_cross 1258.07% 38.94% 58.01% 0.87 38.2% 55 2.21 + *3* 3 turtle_breakout 905.07% 33.76% 48.30% 0.83 75.0% 4 10.14 + 4 bias_reversal 504.94% 25.47% 42.25% 0.70 66.3% 95 2.08 + 5 macd_cross 387.67% 22.11% 61.08% 0.60 40.0% 85 2.20 + 6 volume_price 247.72% 17.01% 65.73% 0.50 43.3% 254 1.40 + 7 bollinger_breakout 169.65% 13.32% 49.71% 0.44 66.7% 24 1.93 + 8 rsi_reversal 95.89% 8.85% 56.51% 0.33 57.1% 7 2.48 + 9 kdj_golden 89.10% 8.36% 61.86% 0.32 66.7% 3 10.49 +``` + +综合评分(夏普 × 0.4 + 收益/回撤 × 0.3 + 胜率 × 0.3): + +``` + *1* 1 turtle_breakout 23.04 0.83 0.70 75.0% + *2* 2 bias_reversal 20.35 0.70 0.60 66.3% + *3* 3 bollinger_breakout 20.26 0.44 0.27 66.7% +``` + +换一个标的再跑: + +```bash +# 贵州茅台 +python -X utf8 run_all_strategies.py SH 600519 --count 2000 --cash 1000000 --adjust QFQ +``` + +### `--show` 可视化效果 + +

+
+ SH601088 中国神华 — bollinger_breakout 策略 | 收益 1281.8% +

+ +

+
+ SH600522 中天科技 — kdj_golden 策略 | 收益 568.6% +

+ +

+
+ SH601179 中国西电 — expma_cross 策略 | 收益 168.0% +

+ +

+
+ SH600519 贵州茅台 — bollinger_breakout 策略 | 收益 187.0% +

+ +> **⚠️ Demo 展示,不作为操作依据。** 历史回测收益不代表未来表现,策略参数未经过样本外验证。 + +### 自带策略示例 + +`strategies/` 目录下有 16 个开箱即用的策略文件,可直接用于 `--strategy-file`: + +| 文件 | 策略 | 类型 | 适合行情 | +|------|------|------|----------| +| `ma_cross.py` | 双均线交叉(MA5/MA20) | 趋势跟踪 | 单边趋势 | +| `expma_cross.py` | EMA12/EMA50 交叉 | 趋势跟踪 | 单边趋势(比 MA 更灵敏) | +| `macd_cross.py` | MACD 金叉死叉 | 趋势跟踪 | 中长线趋势 | +| `bollinger_breakout.py` | 布林带突破 | 震荡反转 | 横盘震荡 | +| `rsi_reversal.py` | RSI 超买超卖 | 反转 | 震荡市 | +| `kdj_golden.py` | KDJ 低位金叉/高位死叉 | 反转 | 短线震荡 | +| `turtle_breakout.py` | 海龟交易法(唐安奇通道) | 趋势突破 | 牛市启动 | +| `bias_reversal.py` | 乖离率反转 | 反转 | 震荡回归 | +| `volume_price.py` | 量价配合 | 综合判断 | 放量突破 | +| `zhuoyao_momentum.py` | 捉妖大师多周期共振 | 趋势跟踪 | 多周期共振强势股 | +| `dmi_trend.py` | DMI/ADX 趋势强度跟踪 | 趋势跟踪 | 单边趋势(过滤震荡) | +| `cci_breakout.py` | CCI ±100 区间突破 | 区间突破 | 震荡转趋势 | +| `mfi_volume.py` | MFI 量价反转 | 量价反转 | 震荡市(带量能确认) | +| `trix_cross.py` | TRIX 三重平滑趋势交叉 | 趋势跟踪 | 中长线(抗噪音) | +| `mtm_momentum.py` | MTM 动量零线穿越 | 动量 | 趋势拐点 | +| `obv_trend.py` | OBV 能量潮趋势 | 量价趋势 | 资金持续流入的上升趋势 | + +编写自定义策略只需继承 `Strategy` 基类: + +```python +from easy_tdx.backtest import Strategy +from easy_tdx import MyTT + + +class MyStrategy(Strategy): + def init(self): + self.ma = self.I(MyTT.MA, self.data.close, 10) + + def next(self): + if self.data.close[0] > self.ma[self._bar_index]: + self.buy(size=0) # size=0 表示全仓 + elif self.position["size"] > 0: + self.sell(size=0) # size=0 表示清仓 +``` + +完整 API 参考:[backtest_usage.md](./backtest_usage.md) +## 量化因子与组合管理 + +新增三大模块:**因子引擎**(19 个内置因子 + 自定义扩展)、**因子分析**(IC/分层/衰减)、**组合管理**(4 种优化器 + 再平衡引擎)。加上**高级回测增强**:可插拔滑点模型(方根冲击/成交量比例)、执行仿真(TWAP/VWAP/限价单)、归因分析(Brinson + 因子归因)。 + +```python +from easy_tdx.factor import FactorEngine, FactorAnalyzer, preprocess +from easy_tdx.portfolio import RebalanceEngine, FactorWeightedOptimizer +from easy_tdx.backtest import BacktestEngine +from easy_tdx.backtest.slippage import SquareRootSlippage +from easy_tdx.backtest.execution import TWAPExecution + +# 因子研究 +engine = FactorEngine() +factor_data = engine.compute_cross_section(data, ["momentum_20d", "rsi_14"]) +clean = preprocess(factor_data, ["momentum_20d", "rsi_14"]) +forward_returns = engine.compute_forward_returns(data, period=5) +report = FactorAnalyzer(clean, forward_returns).full_report("momentum_20d") +print(f"IC均值={report.mean_ic:.4f} ICIR={report.icir:.4f}") + +# 组合回测 +result = RebalanceEngine( + FactorWeightedOptimizer(), factor_name="momentum_20d", n_stocks=50, cash=1_000_000, +).run(data, start_date=20230101, end_date=20240101) +print(f"年化={result.performance['annual_return']:.2%}") + +# 高级回测(滑点 + 执行仿真) +engine = BacktestEngine( + MyStrategy, cash=1_000_000, + slippage_model=SquareRootSlippage(impact_coeff=0.1), + execution_model=TWAPExecution(n_bars=3), +) +``` + +详细用法和完整工作流示例:**[quantitative-guide.md](./quantitative-guide.md)** + diff --git a/docs/cli-finance.md b/docs/cli-finance.md new file mode 100644 index 0000000..4758664 --- /dev/null +++ b/docs/cli-finance.md @@ -0,0 +1,41 @@ +# CLI 参考 — 财务与公告 + +## 公告检索(巨潮资讯网) + +```bash +easy-tdx announcement 688017 # 默认 30 条,JSON 输出 +easy-tdx announcement 601088 --count 10 --page 2 # 翻页 +easy-tdx announcement 000001 --table # 表格输出(不截断 url) + +# 下载最新 5 条公告的 PDF 到 ./pdfs 目录 +easy-tdx announcement 601088 --count 5 --download 5 --download-dir ./pdfs +``` + +> 独立数据源(巨潮资讯网),无需连接 TDX 行情服务器即可使用。 +> 返回的 ``url`` 含 4 参数可直接打开,``pdf_url`` 为 PDF 直链。 + +## 财务 + +```bash +easy-tdx f10 600519 # 茅台利润表,最近 8 期(默认 lrb) +easy-tdx f10 600519 --type fzb --num 4 # 资产负债表,最近 4 期 +easy-tdx f10 000001 --type llb --table # 平安现金流量表,表格输出 +``` + +> 新浪财经数据源,``--type`` 支持 ``lrb``(利润表)/``fzb``(资产负债表)/``llb``(现金流量表)。 +> 独立于 TDX 行情服务器,``item_value`` 已转 float 可直接数值计算,同比附 ``{科目}_同比`` 列。 + +## 通达信原生 F10 与最新财务快照 + +走通达信协议(与 Web 层 ``/finance`` ``/company/*`` 端点同源),覆盖 ``f10``(新浪三表)之外的 F10 全文板块。完整示例见 [examples/06_finance/](../examples/06_finance/README.md)。 + +```bash +easy-tdx finance-info SH 600519 --table # 最新财务快照(30+ 项单期指标) +easy-tdx company-info SH 600519 # F10 板块目录(最新提示/公司概况/...) +easy-tdx company-info SH 600519 "公司概况" # 读板块完整正文(自动解析+读全,无需 offset/length) +easy-tdx company-info SH 600519 600519.txt # 也可直接传文件名(此时用 --offset/--length) +``` + +- ``finance-info``:最新一期财务快照,含股本结构、资产负债、利润、现金流、每股指标(37 字段)。与 ``f10`` 互补——前者是单期快照,后者是多期三表。 +- ``company-info``:**一个命令两种用法**——无板块名参数列 F10 板块目录,有板块名参数读正文。目录含 16 个板块(最新提示、公司概况、财务分析、股东研究、股本结构、资本运作、业内点评、行业分析、公司大事、研究报告、经营分析、主力追踪、分红扩股、高层治理、龙虎榜单、关联个股)。 +- 读正文时传板块名即可自动读取完整内容(按目录 length 分块循环,大板块如「公司大事」也能一次读全);``--offset``/``--length`` 仅在传文件名时生效。通达信多服务器目录版本不一致时自动重试命中。 diff --git a/docs/cli-indicators.md b/docs/cli-indicators.md new file mode 100644 index 0000000..b9e4390 --- /dev/null +++ b/docs/cli-indicators.md @@ -0,0 +1,127 @@ +# CLI 参考 — 技术指标与公式 + +## 技术指标 + +```bash +easy-tdx indicator-list --table # 列出所有可用指标 +easy-tdx indicator MACD -m SH -c 600519 --table # MACD +easy-tdx indicator KDJ -m SZ -c 000001 --table # KDJ +easy-tdx indicator RSI -m SH -c 600519 --table # RSI +easy-tdx indicator BOLL -m SH -c 600519 --table # BOLL 布林带 +easy-tdx indicator DMI -m SH -c 600519 --table # DMI 动向指标 +easy-tdx indicator ATR -m SH -c 600519 --table # ATR 真实波幅 +easy-tdx indicator WR -m SH -c 600519 --table # WR 威廉指标 +easy-tdx indicator CCI -m SH -c 600519 --table # CCI 顺势指标 +easy-tdx indicator BIAS -m SZ -c 000001 --table # BIAS 乖离率 +easy-tdx indicator BIAS_SIGNAL -m SH -c 600519 --table # 30日乖离率信号 +easy-tdx indicator OBV -m SZ -c 000001 --table # OBV 能量潮 + +# 多指标同时计算 +easy-tdx indicator MACD,KDJ,RSI,BOLL -m SH -c 600519 --count 10 --table + +# 自定义参数 +easy-tdx indicator MACD -m SH -c 600519 --params SHORT=10,LONG=22 + +# 分钟线指标 +easy-tdx indicator MACD -m SH -c 600519 --period 5MIN --count 50 + +# 仅输出指标值(不含 OHLCV) +easy-tdx indicator RSI -m SZ -c 000001 --no-ohlcv +``` + +## 通达信公式(v1.27) + +粘贴通达信公式即可计算 / 选股 / 回测——命名布尔输出自动成为买卖信号(名字含「买/卖」或 BUY/SELL 优先),30+ 白名单函数(MA/EMA/SMA/HHV/LLV/REF/CROSS/LONGCROSS/MACD/KDJ/RSI/BOLL/ATR…)向量化求值,无未来数据: + +```bash +# 公式计算(最后一根各列值 + 最近信号明细) +easy-tdx formula compute SH 600519 --formula "金叉: CROSS(MA(C,5), MA(C,20));" + +# 批量选股:信号在最后一根 = 1 的标的(--symbols 支持逗号分隔或 @文件) +easy-tdx formula screen --symbols SH:600519,SZ:000001 --formula "金叉: CROSS(MA(C,5), MA(C,20));" + +# 公式回测:买/卖列自动挑选,信号下一根开盘成交,输出绩效 + 评级 + 评分 +easy-tdx formula backtest SH 600519 --file my_formula.txt +``` + +## 捉妖大师(重点) + +捉妖大师是多周期涨幅共振指标,通过 20/60/120 日涨幅及指数平滑判断短中长线趋势是否同向,用于筛选趋势刚启动的强势股。 + +```bash +easy-tdx indicator ZHUOYAO -m SH -c 600519 --count 30 --table + +# 自定义周期参数 +easy-tdx indicator ZHUOYAO -m SZ -c 000001 --params N1=90,N2=45,N3=15 + +# 结合其他指标一起看 +easy-tdx indicator ZHUOYAO,MACD,KDJ -m SH -c 600519 --count 20 --table +``` + +输出列说明: + +| 列名 | 含义 | +|------|------| +| `ZY_LONG` | 长线 — 120 日涨幅的 10 日指数平滑 | +| `ZY_MID` | 中线 — 60 日涨幅(%) | +| `ZY_SHORT` | 短线 — 20 日涨幅(%) | +| `ZY_TREND` | 趋势 — 中线的 10 日指数平滑 | + +**核心信号:** 四线全部 > 0 且短线 > 中线 > 长线 = 短中长趋势完全一致向上,是强势股特征。详见 [捉妖大师指标详解](./indicator-zhuoyao.md)。 + +## 30日乖离率信号(重点) + +30日乖离率信号指标,在标准乖离率(BIAS)基础上叠加短/长信号线,通过三者位置关系判断趋势方向和转折点。源自通达信经典指标。 + +```bash +easy-tdx indicator BIAS_SIGNAL -m SH -c 600519 --count 60 --table + +# 自定义周期参数 +easy-tdx indicator BIAS_SIGNAL -m SZ -c 000001 --params P=5,M=20 + +# 结合其他指标一起看 +easy-tdx indicator BIAS_SIGNAL,MACD,KDJ -m SH -c 600519 --count 30 --table +``` + +输出列说明: + +| 列名 | 含义 | +|------|------| +| `BS_X` | M日乖离率 — 当前价格偏离30日均线的百分比 | +| `BS_SMA` | 短周期信号线 — 乖离率的 P 日均线,过滤短期噪音 | +| `BS_LMA` | 长周期信号线 — 乖离率的 M 日均线,捕捉中期趋势方向 | + +**核心信号:** X > S_SMA 且 X_LMA 上升 = 多头确认(通达信红色);S_SMA > X 或 X_LMA 下降 = 空头预警(通达信绿色)。多空判断非对称设计——多头需两个条件同时满足,空头只需其一,偏向保守预警。详见 [30日乖离率信号指标详解](./indicator-bias-signal.md)。 + +```python +# Python API 用法 +from easy_tdx import MacClient, Market + +with MacClient.from_best_host() as c: + df = c.get_stock_kline_with_indicators( + Market.SH, "600519", + indicators=["BIAS_SIGNAL"], + count=60, + ) + # df 包含: datetime, open, close, high, low, vol, amount + # + BS_X, BS_SMA, BS_LMA +``` + +支持 34 个指标:MACD, KDJ, RSI, BOLL, DMI, ATR, WR, CCI, BIAS, BIAS_SIGNAL, OBV, VR, EMV, MFI, BRAR, ASI, TRIX, DPO, MTM, ROC, EXPMA, BBI, PSY, DFMA, CR, KTN, XSII, MASS, TAQ, ZHUOYAO, SAR, VWAP, AROON, FK。 + +```python +# Python API 用法 +from easy_tdx import MacClient, Market + +with MacClient.from_best_host() as c: + df = c.get_stock_kline_with_indicators( + Market.SH, "600519", + indicators=["ZHUOYAO"], + count=30, + ) + # df 包含: datetime, open, close, high, low, vol, amount + # + ZY_LONG, ZY_MID, ZY_SHORT, ZY_TREND +``` + +支持 34 个指标:MACD, KDJ, RSI, BOLL, DMI, ATR, WR, CCI, BIAS, BIAS_SIGNAL, OBV, VR, EMV, MFI, BRAR, ASI, TRIX, DPO, MTM, ROC, EXPMA, BBI, PSY, DFMA, CR, KTN, XSII, MASS, TAQ, ZHUOYAO, SAR, VWAP, AROON, FK。 + diff --git a/docs/cli-market.md b/docs/cli-market.md new file mode 100644 index 0000000..6d8372a --- /dev/null +++ b/docs/cli-market.md @@ -0,0 +1,95 @@ +# CLI 参考 — 行情数据 + +## 输出格式 + +`easy-tdx` 默认输出 JSON(一行一条记录),`--table` 切换表格,`--output csv` 输出 CSV。 + +## 基础 + +```bash +easy-tdx ping # 服务器测速 +easy-tdx version # 版本号 +``` + +## 行情 + +```bash +# K 线 +easy-tdx kline SZ 000001 --count 30 --table +easy-tdx kline SH 600519 --period 5MIN --adjust QFQ + +# 实时报价 +easy-tdx quote "SZ 000001,SH 600519" --table + +# 市场分类报价(按涨幅排序) +easy-tdx quote-list A --count 20 --table +easy-tdx quote-list KCB --sort TOTAL_AMOUNT --order ASC +easy-tdx quote-list CYB --count 50 +``` + +## 分时 / 成交 + +```bash +easy-tdx tick SZ 000001 --table +easy-tdx tick SH 600519 --days 5 +easy-tdx tick SZ 000001 --date 20250115 + +easy-tdx transaction SZ 000001 --count 100 --table +easy-tdx transaction SH 600519 --date 20250115 +``` + +## 板块 + +```bash +easy-tdx board-list --type GN --table +easy-tdx board-list --type HY --count 200 +easy-tdx board-members 881001 --table +easy-tdx belong-board SZ 000001 --table +easy-tdx board-summary 881001 --table # 板块汇总(成交额/主力净流入/涨跌家数) +easy-tdx board-summary 881001 --members --table # 含成分股明细 +easy-tdx board-ranking --type HY --top 10 --table # 行业板块排行 +easy-tdx board-ranking --type GN --sort-by amount # 概念板块按成交额排行 + +# 板块 N 日涨跌幅排行(默认全部,支持指定日期) +easy-tdx board-change-ranking --table # 行业 20 日涨跌幅排行 +easy-tdx board-change-ranking --type GN --days 10 --table # 概念 10 日涨跌幅排行 +easy-tdx board-change-ranking --type HY --date 20250530 --days 20 --table +easy-tdx board-change-ranking --type HY --top 10 --asc # 行业跌幅前10 +``` + +## 资金 / 监控 + +```bash +easy-tdx capital-flow SH 600519 --table +easy-tdx auction SZ 000001 --table +easy-tdx unusual SH --count 100 --table +easy-tdx market-stat --table +easy-tdx server-info --table +easy-tdx symbol-info SZ 000001 --table +``` + +## 中金所成交持仓排名(v1.29.1) + +```bash +easy-tdx ccpm IF --table # 最近有数据的交易日(缺省自动回溯) +easy-tdx ccpm IF --date 2026-09-02 # 指定交易日 +easy-tdx ccpm all --date 2026-08-28 --table # 全部 8 个品种一次抓取 +easy-tdx ccpm TL --refresh # 忽略本地缓存,强制重新抓取 +``` + +> 独立数据源(中金所官网),无需连接 TDX 行情服务器。品种:IF 沪深300 / IH 上证50 / IC 中证500 / IM 中证1000 股指期货,TS/TF/T/TL 为 2/5/10/30 年期国债期货。 +> 每个交易日收盘后约 16:15 发布,含该品种**全部合约 × 三类排名(成交量 / 持买单量·多单 / 持卖单量·空单)× 各前 20 名会员**; +> 数据发布后不可变,按日缓存到 `~/.easy_tdx/cache/ccpm/`,历史二次查询零网络。 +> JSON 输出为英文列名(vol/long_pos/short_pos 等,机器友好),`--table` 自动切换中文表头。 +> WebUI 对应「期货持仓排名」页(含新手科普),API 为 `GET /api/v1/ccpm/rank`。 + +## 扩展市场(港股/美股/期货) + +```bash +easy-tdx ex markets # 列出可用市场 +easy-tdx ex kline HK_MAIN_BOARD 00700 --count 30 --table # 港股 K 线 +easy-tdx ex kline US_STOCK AAPL --table # 美股 K 线 +easy-tdx ex quote US_STOCK TSLA --table # 美股报价 +easy-tdx ex quote-list HK_MAIN_BOARD --table # 港股商品列表 +easy-tdx ex tick HK_MAIN_BOARD 00700 --table # 港股分时 +``` diff --git a/docs/cli-screen.md b/docs/cli-screen.md new file mode 100644 index 0000000..0c54d0d --- /dev/null +++ b/docs/cli-screen.md @@ -0,0 +1,160 @@ +# CLI 参考 — 策略选股扫描 + +## 策略选股扫描(screen) + +把策略翻转成选股器:给定一个策略,扫描全市场找出今天触发买入信号的股票,再对这些信号做历史回测排名。**纯离线数据**,读取本地通达信 `.day` 文件,全市场约 30-60 秒。 + +两步走工作流: + +**第一步:信号扫描(scan)** + +```bash +# 扫描沪深全 A,找出 RSI 超卖触发的股票 +easy-tdx screen scan --strategy strategies/rsi_reversal.py --output signals.json + +# 缩小范围 +easy-tdx screen scan --strategy strategies/macd_cross.py --universe sz --output signals.json + +# 从自定义股票列表扫描 +easy-tdx screen scan --strategy strategies/bollinger_breakout.py --universe my_stocks.txt --output signals.json + +# 并发扫描(推荐 4-8 进程,速度提升 4-8 倍) +easy-tdx screen scan --strategy strategies/rsi_reversal.py --workers 4 --output signals.json + +# 增量扫描(缓存未修改的 .day 文件,跳过重复计算) +easy-tdx screen scan --strategy strategies/rsi_reversal.py --cache scan_cache.json --output signals.json +``` + +输出示例(JSON): + +```json +{ + "scan_time": "2026-06-10T18:30:00", + "strategy": "RSIStrategy", + "total_scanned": 4832, + "total_signals": 37, + "signals": [ + {"code": "000001", "market": "SZ", "signal_date": 20260610, "last_close": 12.35}, + {"code": "600519", "market": "SH", "signal_date": 20260610, "last_close": 1800.0} + ] +} +``` + +**第二步:回测排名(rank)** + +```bash +# 按夏普比率排名(默认) +easy-tdx screen rank --from signals.json --sort sharpe --top 20 --table + +# 按最大回撤排名(越小越好,用 --sort-reverse) +easy-tdx screen rank --from signals.json --sort max_drawdown --sort-reverse --table + +# 管道模式:一步到位 +easy-tdx screen scan --strategy strategies/rsi_reversal.py | easy-tdx screen rank --from - --table + +# 补齐股票名称(需要网络) +easy-tdx screen rank --from signals.json --sort sharpe --top 10 --table --names +``` + +输出示例(`--table`): + +``` +[*] 信号排名 (按 sharpe 降序, 共 37 只) +══════════════════════════════════════════════════════════════════════════ +排名 代码 名称 总收益率 年化收益 最大回撤 夏普 胜率 交易 + *1 SZ300308 中际旭创 45.23% 18.72% 12.35% 1.85 62.5% 16 + *2 SH600519 贵州茅台 38.10% 15.90% 8.21% 1.62 58.3% 12 +``` + +| 参数 | 说明 | +|------|------| +| `--universe` | `all`(默认,沪深全 A)/ `sh` / `sz` / 文件路径(每行 "市场 代码") | +| `--vipdoc` | 离线数据目录(默认自动检测通达信安装路径) | +| `--workers` | 并发进程数:`0` 串行(默认)/ `2+` ProcessPoolExecutor 并发(推荐 4-8) | +| `--cache` | 增量扫描缓存文件路径(JSON,mtime 未变的文件自动跳过) | +| `--sort` | 排序指标:`sharpe`(默认)/ `total_return` / `max_drawdown` / `win_rate` 等 | +| `--sort-reverse` | 升序(用于回撤等越小越好的指标) | +| `--names` | 在线补齐股票名称(默认关闭,只查排名中的几十只) | +| `--count` | rank 使用最近 N 条 K 线(0=全部,默认 0) | + +### 强势股排名(strength) + +按 **5 / 20 / 60 日涨幅加权**合成强势分,从全市场选出"最近最强"的股票。**纯离线数据**,读取本地通达信 `.day` 文件,全市场约 30-60 秒(并发可压到 10 秒内)。 + +**三种预设模式:** + +| 模式 | 性格 | 权重 (w5/w20/w60) | 波动率惩罚 | 适合 | +|------|------|-------------------|-----------|------| +| `steady`(默认) | 中长期稳健 | 0.2 / 0.3 / 0.5 | ✅ 除以 vol_20 | 选"稳着涨"的票,妖股被高波动压低 | +| `breakout` | 近期妖股爆发 | 0.6 / 0.3 / 0.1 | ❌ 纯加权涨幅 | 选"短期最猛"的票,妖股本身就是高波动 | +| `balanced` | 三周期均衡 | 等权 + vol 调整 | ✅ 除以 vol_20 | 不确定时的安全默认 | + +> 💡 **为什么 breakout 不除波动率?** 妖股本质高波动,除以 vol 会把它压下去,与"找妖股"目标矛盾。steady 除以 vol 是为了奖励"稳着涨"的票(vol 小,score 放大)。 + +```bash +# 中长期稳健强势 Top 50(默认 steady 模式) +easy-tdx screen strength --preset steady --top 50 --table + +# 近期妖股爆发 Top 20(补齐股票名称) +easy-tdx screen strength --preset breakout --top 20 --names --table + +# 三周期均衡 +easy-tdx screen strength --preset balanced --top 30 --table + +# 自定义权重(自动归一化,5:3:2 = 0.5:0.3:0.2) +easy-tdx screen strength --w5 0.5 --w20 0.3 --w60 0.2 --top 30 --table + +# 并发扫描(推荐 4-8 进程) +easy-tdx screen strength --preset steady --top 100 --workers 4 --table + +# 过滤低流动性(最近 5 日日均成交额 ≥ 5000 万) +easy-tdx screen strength --preset breakout --top 30 --min-amount 50000000 --table + +# 缩小范围 + 输出到文件 +easy-tdx screen strength --universe sz --top 30 --output sz_strength.json +``` + +输出示例(`--table`): + +``` +[*] 强势股排名 [steady] 共 50 只 + 数据截止: 2026-06-24 | 中长期稳健强势:权重偏 60 日,波动率惩罚,选出稳着涨的票 +════════════════════════════════════════════════════════════════════════════════ +排名 代码 名称 现价 5日 20日 60日 波动率 强势分 + *1 SZ300308 中际旭创 85.20 8.12% 15.34% 30.21% 0.0180 9.52 + *2 SH600519 贵州茅台 1800.00 3.25% 5.10% 10.05% 0.0120 6.21 +``` + +输出示例(JSON): + +```json +{ + "scan_time": "2026-06-25T10:30:00", + "preset": "steady", + "preset_desc": "中长期稳健强势:权重偏 60 日,波动率惩罚...", + "data_date": 20260624, + "total_ranked": 50, + "ranking": [ + {"rank": 1, "code": "300308", "market": "SZ", "name": "中际旭创", + "last_close": 85.20, "last_date": 20260624, + "ret_5": 0.0812, "ret_20": 0.1534, "ret_60": 0.3021, + "vol_20": 0.0180, "strength": 9.52} + ] +} +``` + +| 参数 | 说明 | +|------|------| +| `--preset` | 预设模式:`steady`(默认)/ `breakout` / `balanced` | +| `--w5` `--w20` `--w60` | 自定义三周期权重(覆盖预设,自动归一化) | +| `--vol-adjusted` / `--no-vol-adjusted` | 波动率惩罚开关(覆盖预设) | +| `--top` | 返回前 N 名(默认 50) | +| `--universe` | `all`(默认)/ `sh` / `sz` / 文件路径 | +| `--min-listed-days` | 最小上市天数(默认 65,保证能算 60 日涨幅) | +| `--min-amount` | 最近 5 日日均成交额下限(元,默认 0 不过滤) | +| `--workers` | 并发进程数:`0` 串行 / `4+` 并发(推荐 4-8) | +| `--names` | 在线补齐股票名称(默认关闭) | +| `--output` | 输出 JSON 文件(默认 stdout) | + +> ⚠️ **数据时效**:strength 依赖本地 `.day` 文件。输出中的 `data_date` / `last_date` 字段标注数据截止日,请先用 `easy-tdx offline sync` 同步最新数据。 + diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 0000000..0d55d23 --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,83 @@ +# CLI 命令总览 + +`easy-tdx` 全部命令速查表。按域的详细用法与示例见分域文档: + +| 域 | 文档 | +|------|------| +| 行情 / 分时 / 板块 / 资金 / 中金所 / 扩展市场 | [cli-market.md](./cli-market.md) | +| 公告 / 财务 / F10 | [cli-finance.md](./cli-finance.md) | +| 技术指标 / 通达信公式 | [cli-indicators.md](./cli-indicators.md) | +| 缠论分析 | [chanlun.md](./chanlun.md) | +| 回测 / 寻优 / 组合 / run-all | [cli-backtest.md](./cli-backtest.md) | +| 选股扫描 / 强势股排名 | [cli-screen.md](./cli-screen.md) | +| K 线仓库 / 离线数据 | [data-local.md](./data-local.md) | +| Web 服务(serve) | [web-api.md](./web-api.md) | + +## 命令汇总 + +| 命令 | 说明 | +|------|------| +| `ping` | 服务器延迟测速 | +| `version` | 版本号 | +| `kline` | K 线(日/周/月/分钟,支持复权) | +| `quote` | 实时报价(单只/批量) | +| `quote-list` | 市场分类排序报价(A/SH/SZ/KCB/CYB) | +| `tick` | 分时图(单日/多日/历史) | +| `transaction` | 逐笔成交 | +| `board-list` | 板块列表(行业/概念/风格) | +| `board-members` | 板块成分股报价 | +| `board-summary` | 板块汇总(成交额、主力净流入、涨跌家数) | +| `board-ranking` | 板块涨跌幅排行榜(行业/概念排行) | +| `board-change-ranking` | 板块 N 日涨跌幅排行(支持指定截止日期) | +| `belong-board` | 个股所属板块 | +| `capital-flow` | 资金流向 | +| `auction` | 集合竞价 | +| `unusual` | 市场异动 | +| `market-stat` | 全市场涨跌统计 | +| `server-info` | 服务器交易时段 | +| `symbol-info` | 个股特征快照 | +| `indicator` | 技术指标计算(34 个:MACD/KDJ/RSI/BOLL/DMI/ATR...) | +| `indicator-list` | 列出可用技术指标 | +| `chanlun` | 缠论分析(笔/中枢/线段/买卖点/背驰,支持多级别联立) | +| `indicator ZHUOYAO` | 捉妖大师信号(多周期 ROC 共振),详解见 [indicator-zhuoyao.md](./indicator-zhuoyao.md) | +| `indicator BIAS_SIGNAL` | 30 日乖离率信号,详解见 [indicator-bias-signal.md](./indicator-bias-signal.md) | +| `backtest` | 回测引擎(加载策略文件,输出绩效报告) | +| `portfolio` | 多标的组合回测(共享资金池,均等分配,汇总绩效) | +| `factor list` | 列出所有内置因子 | +| `factor analyze` | 因子分析(IC/分层/衰减) | +| `pfactor backtest` | 组合因子选股回测 | +| `run-all` | 批量运行所有策略并排名(绩效排名 + 综合评分 + 可选图表) | +| `optimize` | 参数网格寻优(单策略网格搜索,或 `--all` 一键寻优所有内置策略并排名) | +| `strategies` | 列出内置策略注册表(名称/中文标签/参数默认值/预设寻优网格) | +| `formula compute` | 通达信公式计算(命名布尔输出即买卖信号) | +| `formula screen` | 公式批量选股(信号在最后一根 = 1 的标的) | +| `formula backtest` | 公式回测(买/卖列自动挑选,输出绩效 + 评级 + 评分) | +| `warehouse sync` | 本地 K 线仓库增量同步(DuckDB,需 `easy-tdx[warehouse]`) | +| `warehouse query` | 仓库查询(默认忽略未收盘的临时 bar) | +| `warehouse stats` | 仓库统计(各标的行数/数据范围) | +| `warehouse check` | 仓库健康自检(缺口/除权跳变/新鲜度) | +| `ccpm` | 中金所成交持仓排名(官网每日发布,按日落盘缓存) | +| `announcement` | 公告检索(巨潮资讯网,独立数据源,支持下载 PDF) | +| `screen scan` | 策略选股扫描(纯离线,全市场信号扫描) | +| `screen rank` | 扫描结果回测排名(按夏普/回撤等指标排序) | +| `screen strength` | 强势股排名(5/20/60 日涨幅加权,steady/breakout/balanced 三预设) | +| `serve` | 启动 Web API 服务器(REST + WebSocket,需 `easy-tdx[web]`) | +| `f10` | 财报三表(新浪:利润表/资产负债表/现金流量表) | +| `finance-info` | 最新财务快照(通达信协议,30+ 项单期指标) | +| `company-info` | F10 公司信息(无板块名列目录 / 有板块名读正文) | +| `fund-flow` | 历史资金流向(CLI 暂未实现,Web API `/fund-flow/history` 可用) | +| `ex kline` | 扩展市场 K 线 | +| `ex quote` | 扩展市场报价 | +| `ex quote-list` | 扩展市场商品列表 | +| `ex tick` | 扩展市场分时 | +| `ex markets` | 列出可用扩展市场 | +| `offline home` | 检测通达信安装目录 | +| `offline daily` | A 股日线(本地 .day 文件) | +| `offline sync-daily` | 从服务端同步单只股票日线到本地 .day 文件 | +| `offline sync-all` | 一键同步沪深全市场日线(扫描本地 .day 文件) | +| `offline min` | 分钟线(本地 .5/.lc1/.lc5 文件) | +| `offline ex-files` | 列出扩展市场可用文件 | +| `offline ex-daily` | 扩展市场日线(期货/港股/外盘) | +| `offline gbbq` | 股本变迁数据 | +| `offline financial` | 历史财务数据 | +| `offline blocks` | 自定义板块数据 | diff --git a/docs/data-local.md b/docs/data-local.md new file mode 100644 index 0000000..b83b118 --- /dev/null +++ b/docs/data-local.md @@ -0,0 +1,88 @@ +# 本地数据:K 线仓库与离线文件 + +## 本地 K 线仓库(v1.26) + +行情沉淀为 DuckDB 单文件列存(可选依赖:`pip install easy-tdx[warehouse]`),增量同步 + 临时收盘价状态机 + 健康自检: + +```bash +easy-tdx warehouse sync --symbols SH:600519,SZ:000001 # 首次全量,此后只补尾部 +easy-tdx warehouse query SH 600519 --count 30 # 默认忽略未收盘的临时 bar +easy-tdx warehouse stats # 各标的行数 / 数据范围 +easy-tdx warehouse check # 缺口 / 除权跳变 / 新鲜度体检 +``` + +## 离线数据 CLI + +从本地通达信安装目录直接读取数据文件,无需网络连接: + +```bash +easy-tdx offline home # 检测通达信安装目录 +easy-tdx offline daily SH 600000 --count 10 --table # A 股日线 +easy-tdx offline min SZ 000001 --type lc5 --table # 分钟线(5min/lc1/lc5) +easy-tdx offline ex-files --table # 列出扩展市场可用文件 +easy-tdx offline ex-daily 38#2_CPI --count 5 --table # 扩展市场日线(期货/港股/外盘) +easy-tdx offline gbbq C:\new_jyplug\T0002\hq_cache\gbbq --table # 股本变迁 +easy-tdx offline financial C:\new_jyplug\vipdoc\fin\gpcw20260331.dat # 历史财务 +easy-tdx offline blocks C:\new_jyplug\T0002\blocknew --table # 自定义板块 +``` + +从服务端获取最新日线并写入本地 .day 文件,替代通达信内置下载功能: + +```bash +# 同步单只股票日线(自动增量/全量) +easy-tdx offline sync-daily SZ 000001 +easy-tdx offline sync-daily SH 600519 --vipdoc C:\new_jyplug\vipdoc + +# 一键同步沪深全市场(每天一条命令) +easy-tdx offline sync-all +``` + +> 建议在通达信关闭时执行 sync 命令,避免文件被锁定。空文件自动全量下载,已有数据只做增量追加。 + + +## 离线数据读取(Python) + +无需网络,从本地通达信安装目录直接读取: + +```python +from easy_tdx.offline import detect_tdx_home, read_daily_bars, find_daily_bar_file +from easy_tdx import Market + +home = detect_tdx_home() +filepath = find_daily_bar_file(Market.SH, "600000") +bars = read_daily_bars(filepath) +``` + +支持:日线、分钟线、扩展市场日线、板块、股本变迁、历史财务数据。 + +## 离线数据写入同步(Python) + +从服务端获取最新数据并追加写入本地通达信数据文件: + +```python +from easy_tdx.offline import ( + encode_daily_bar, append_daily_bars, get_last_bar_date, + encode_5min_bar, append_5min_bars, + encode_lc_min_bar, append_lc_min_bars, +) +from easy_tdx import Market +from easy_tdx.client import TdxClient + +# 追加日线到 .day 文件(自动跳过重复日期) +from easy_tdx.offline import sync_daily_bars_from_security_bars + +# 手动编码单条记录 +bar_bytes = encode_daily_bar(bar, price_coeff=0.01, vol_coeff=0.01) + +# 获取文件末尾日期 +last_date = get_last_bar_date("C:/new_jyplug/vipdoc/sh/lday/sh600000.day") +``` + +v1.5.0 起可通过 CLI 直接使用: + +```bash +easy-tdx offline daily SH 600000 --count 10 --table +easy-tdx offline ex-files --table +easy-tdx offline ex-daily 29#A1801 --table +``` + diff --git a/docs/images/demo/1.png b/docs/images/demo/1.png new file mode 100644 index 0000000..807a97f Binary files /dev/null and b/docs/images/demo/1.png differ diff --git a/docs/images/demo/2.png b/docs/images/demo/2.png new file mode 100644 index 0000000..ebb1c89 Binary files /dev/null and b/docs/images/demo/2.png differ diff --git a/docs/images/demo/3.png b/docs/images/demo/3.png new file mode 100644 index 0000000..93c41f4 Binary files /dev/null and b/docs/images/demo/3.png differ diff --git a/docs/images/demo/4.png b/docs/images/demo/4.png new file mode 100644 index 0000000..3c46f40 Binary files /dev/null and b/docs/images/demo/4.png differ