██████╗██╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ██╗ ██╗
██╔════╝██║ ██║██╔══██╗████╗ ██║ ██╔══██╗╚██╗ ██╔╝
██║ ███████║███████║██╔██╗ ██║ ██████╔╝ ╚████╔╝
██║ ██╔══██║██╔══██║██║╚██╗██║ ██╔═══╝ ╚██╔╝
╚██████╗██║ ██║██║ ██║██║ ╚████║██╗██║ ██║
╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝
特别说明①:当前公开部分代码暂时只包含基本的静态计算能力,暂未包含策略类,特征,模型,automl框架,交易引擎对接等;
完整代码22000行左右,公开版约5300行;本README对应的是完整版(可能在某些地方使用上和公开版本代码不一致),尽量参考快速上手指南;
如有使用疑惑,欢迎讨论/邮件联系。
特别说明②:依赖最低版本为python3.11;由于本项目是高度计算密集型,鉴于python3.11发布且运算速度大幅提升,实测相比于python 3.8.5计算时间缩短约16%,故后续开发均基于python3.11;
本框架从使用深度上来讲,分四种不同的级别:
.
├── 📁 Bi # 笔
│ ├── 📄 BiConfig.py: 配置类
│ ├── 📄 BiList.py: 笔列表类
│ └── 📄 Bi.py: 笔类
├── 📁 Seg: 线段类
│ ├── 📄 Eigen.py: 特征序列类
│ ├── 📄 EigenFX.py: 特征序列分形类
│ ├── 📄 SegConfig.py: 线段配置类
│ ├── 📄 SegListComm.py: 线段计算框架通用父类
│ ├── 📄 SegListChan.py: 线段计算:根据原文实现
│ ├── 📄 SegListDef.py: 线段计算:根据定义实现
│ ├── 📄 SegListDYH.py: 线段计算:根据都业华1+1突破实现
│ └── 📄 Seg.py: 线段类
├── 📁 ZS: 中枢类
│ ├── 📄 ZSConfig.py: 中枢配置
│ ├── 📄 ZSList.py: 中枢列表类
│ └── 📄 ZS.py: 中枢类
├── 📁 KLine: K线类
│ ├── 📄 KLine_List.py: K线列表类
│ ├── 📄 KLine.py: 合并K线类
│ ├── 📄 KLine_Unit.py: 单根K线类
│ └── 📄 TradeInfo.py: K线指标类(换手率,成交量,成交额等)
├── 📁 BuySellPoint: 形态学买卖点类(即bsp)
│ ├── 📄 BSPointConfig.py: 配置
│ ├── 📄 BSPointList.py: 买卖点列表类
│ └── 📄 BS_Point.py: 买卖点类
├── 📁 Combiner: K线,特征序列合并器
│ ├── 📄 Combine_Item.py: 合并元素通用父类
│ └── 📄 KLine_Combiner.py: K线合并器
├── 📁 Common: 通用函数
│ ├── 📄 cache.py: 缓存装饰器,大幅提高计算性能
│ ├── 📄 CEnum.py: 所有枚举类,K线类型/方向/笔类型/中枢类型等
│ ├── 📄 ChanException.py: 异常类
│ ├── 📄 CTime.py: 缠论时间类(可处理不同级别联立)
│ ├── 📄 func_util.py: 通用函数
│ ├── 📄 send_msg_cmd.py: 消息推送
│ ├── 📄 tools.py: 工具类
│ ├── 📄 CommonThred.py: 线程类
│ └── 📄 TradeUtil.py: 交易通用函数
├── 📁 Config: 配置
│ ├── 📄 config.sh shell脚本读取配置
│ ├── 📄 demo_config.yaml: demo配置
│ ├── 📄 EnvConfig.py: python读取配置类
├── 📁 CustomBuySellPoint: 自定义动力学买卖点类(即cbsp)
│ ├── 📄 Strategy.py: 通用抽象策略父类
│ ├── 📄 CustomStrategy.py: demo策略1
│ ├── 📄 SegBspStrategy.py: demo策略2
│ ├── 📄 ExamStrategy.py: 生成买卖点判断试题的策略
│ ├── 📄 CustomBSP.py: 自定义买卖点
│ └── 📄 Signal.py: 信号类
├── 📁 DataAPI: 数据接口
│ ├── 📄 CommonStockAPI.py: 通用数据接口抽象父类
│ ├── 📄 AkShareAPI.py: akshare数据接口
│ ├── 📄 BaoStockAPI.py: baostock数据接口
│ ├── 📄 ETFStockAPI.py: ETF数据解耦接口
│ ├── 📄 FutuAPI.py: futu数据接口
│ ├── 📄 OfflineDataAPI.py: 离线数据接口
│ ├── 📄 MarketValueFilter.py: 股票市值过滤类
│ └── 📁 SnapshotAPI: 实时股价数据接口
│ ├── 📄 StockSnapshotAPI.py: 统一调用接口
│ ├── 📄 CommSnapshot.py: snapshot通用父类
│ ├── 📄 AkShareSnapshot.py: akshare接口,支持a股,etf,港股,美股
│ ├── 📄 FutuSnapshot.py: 富途接口,支持a股,港股,美股
│ ├── 📄 PytdxSnapshot.py: pytdx,支持A股,ETF
│ └── 📄 SinaSnapshot.py: 新浪接口,支持a股,etf,港股,美股
├── 📁 Math: 计算类
│ ├── 📄 BOLL.py: 布林线计算类
│ ├── 📄 MACD.py: MACD计算类
│ ├── 📄 Demark.py: Demark指标计算类
│ ├── 📄 OutlinerDetection.py: 离群点计算类
│ ├── 📄 TrendModel.py: 趋势类(支持均线,最大值,最小值)
│ └── 📄 TrendLine.py: 趋势线
├── 📁 ModelStrategy: 模型策略
│ ├── 📄 BacktestChanConfig.py: 回测配置
│ ├── 📄 backtest.py: 回测计算框架
│ ├── 📄 FeatureReconciliation.py: 特征离线在线一致性校验
│ ├── 📄 ModelGenerator.py: 训练模型通用父类
│ ├── 📁 models: 提供模型
│ │ ├── 📁 deepModel: 深度学习模型
│ │ │ ├── 📄 MLPModelGenerator.py: 深度学习模型
│ │ │ └── 📄 train_all_model.sh 拉起全流程训练预测评估脚本
│ │ ├── 📁 lightGBM
│ │ │ ├── 📄 LGBMModelGenerator.py: LGBM模型
│ │ │ └── 📄 train_all_model.sh 拉起全流程训练预测评估脚本
│ │ └── 📁 Xgboost
│ │ ├── 📄 train_all_model.sh 拉起全流程训练预测评估脚本
│ │ ├── 📄 XGBTrainModelGenerator.py: XGB模型
│ │ └── 📄 xgb_util.py: XGB便捷调用工具
│ └── 📁 parameterEvaluate: 策略参数评估
│ ├── 📄 eval_strategy.py: 评估策略收益类
│ ├── 📄 multi_cycle_test_data.sh: 多周期策略评估数据生成脚本
│ ├── 📄 multi_cycle_test.py: 多周期策略评估
│ ├── 📄 para_automl.py: Automl计算模型超参
│ ├── 📄 automl_verify.py: 验证Automl结果小脚本
│ ├── 📄 parse_automl_result.py: 解析Automl超参生成交易配置文件
│ └── 📁 AutoML FrameWork: Automl学习框架,本项目不专门提供
├── 📁 ChanModel: 模型
│ ├── 📄 CommModel.py: 通用模型抽象父类
│ ├── 📄 FeatureDesc.py: 特征注册
│ ├── 📄 Features.py: 特征计算
│ └── 📄 XGBModel.py: XGB模型 demo
├── 📁 OfflineData: 离线数据更新
│ ├── 📄 download_all_offline_data.sh 调度下载A股,港股,美股所有数据脚本
│ ├── 📄 ak_update.py: akshare更新港股美股A股离线数据
│ ├── 📄 bao_download.py: baostock下载全量A股数据
│ ├── 📄 bao_update.py: baostock增量更新数据
│ ├── 📄 etf_download.py: 下载A股ETF数据脚本
│ ├── 📄 futu_download.py: 更新futu港股数据
│ ├── 📄 offline_data_util.py: 离线数据更新通用工具类
│ └── 📁 stockInfo: 股票指标数据
│ ├── 📄 CalTradeInfo.py: 计算股票指标数据分布,分位数
│ ├── 📄 query_marketvalue.py: 计算股票市值分位数
│ └── 📄 run_market_value_query.sh 调度脚本
├── 📁 Plot: 画图类
│ ├── 📄 AnimatePlotDriver.py: 动画画图类
│ ├── 📄 PlotDriver.py: matplotlib画图引擎
│ ├── 📄 PlotMeta.py: 图元数据
│ └── 📁 CosApi: COS文件上传类
│ ├── 📄 minio_api.py: minio上传接口
│ ├── 📄 tencent_cos_api.py: 腾讯云cos上传接口
│ └── 📄 cos_config.py: 读取项目配置里面的cos配置参数
├── 📁 Trade: 交易引擎
│ ├── 📄 db_util.py: 数据库操作类
│ ├── 📄 FutuTradeEngine.py: futu交易引擎类
│ ├── 📄 MysqlDB.py: Mysql数据库类
│ ├── 📄 SqliteDB.py: SqliteDB数据库类
│ ├── 📄 OpenQuotaGen.py: 开仓交易手数策略类(用于控制仓位)
│ ├── 📄 TradeEngine.py: 交易引擎核心类
│ └── 📁 Script: 核心交易脚本
│ ├── 📄 update_data_signal.sh: 离线数据更新,信号计算调度脚本
│ ├── 📄 CheckOpenScore.py: 后验检查开仓是否准确
│ ├── 📄 ClosePreErrorOpen.py: 修复错误开仓
│ ├── 📄 MakeOpenTrade.py: 开仓
│ ├── 📄 OpenConfig_demo.yaml: 开仓参数配置
│ ├── 📄 OpenConfig.py: 开仓参数配置类
│ ├── 📄 RealTimeTracker.py: 实时跟踪是否遇到止损,止盈点
│ ├── 📄 RetradeCoverOrder.py: 修复未成功交易平仓单
│ ├── 📄 SignalMonitor.py: 信号计算
│ ├── 📄 StaticsChanConfig.py: 缠论计算配置
│ └── 📄 UpdatePeakPrice.py: 峰值股价更新(用于做动态止损)
├── 📁 Debug: debug工具/策略demo
│ ├── 📄 strategy_demo.py 基于trigger_step的回测实现
│ ├── 📄 strategy_demo2.py 基于trigger_load的回测实现
│ ├── 📄 strategy_demo3.py 基于trigger_load实现小级别触发大级别重算
│ ├── 📄 strategy_demo4.py 基于trigger_load实现多级别喂数据时避免K线时间对齐
│ ├── 📄 strategy_demo5.py 演示框架如何与基础的机器学习框架结合
│ ├── 📄 strategy_demo6.py 演示实盘时如何预测对接demo5产出的模型
│ ├── 📁 cprofile_analysis: 性能分析
│ │ └── 📄 cprofile_analysis.sh 性能分析脚本
│ └── 📁 Notebook
│ └── 📄 xxx.ipynb 各种notebook
├── 📁 App: 其他依赖本项目的应用
│ ├── 📄 ashare_bsp_scanner_gui.py: A股缠论买点扫描器 GUI 应用(热心网友提供)
├── 📄 main.py: demo main函数
├── 📄 Chan.py: 缠论主类
├── 📄 ChanConfig.py: 缠论配置
├── 📄 ExamGenerator.py: 测试题生成API
├── 📄 LICENSE
└── 📄 README.md: 本文件
比如下图表述的就是 1,2,3 类 bsp:
而下图则是由某简易策略计算出来的 cbsp,本框架中一般用虚线表示,如果前面有个 √,表示最后回过头来看,这个 cbsp 是找对了;


from Chan import CChan
from ChanConfig import CChanConfig
from ChanModel.XGBModel import CXGBModel
from Common.CEnum import AUTYPE, KL_TYPE
from Config.EnvConfig import Env
from CustomBuySellPoint.CustomStrategy import CCustomStrategy
from Plot.AnimatePlotDriver import CAnimateDriver
from Plot.PlotDriver import CPlotDriver
config = CChanConfig({}) # 缠论计算配置,见后文
chan = CChan(
code="HK.00700",
begin_time="2012-01-01",
end_time=None,
data_src=DATA_SRC.FUTU, # 数据来源,
lv_list=[KL_TYPE.K_DAY], # 多级别可以从大到小传入
config=config,
autype=AUTYPE.QFQ,
extra_kl=None,
)
plot_config = {
"plot_kline": True,
"plot_kline_combine": True,
"plot_bi": True,
"plot_seg": True,
"plot_eigen": False,
"plot_zs": True,
"plot_macd": False,
"plot_mean": False,
"plot_channel": False,
"plot_bsp": True,
"plot_cbsp": True,
"plot_extrainfo": False,
} # 绘图元素开关,详见后文
plot_para = {
"seg": {
"plot_trendline": True, # 绘制趋势线
},
"bi": {
"show_num": True, # 笔是否显示序号
"disp_end": True, # 是否显示首尾价格
},
"figure": {
"width": 24,
},
"cbsp": {
"plot_cover": True, # 绘制平仓操作
},
} # 空格绘图元素详细配置,详见后文
if not config.trigger_step: # 绘制静态图
plot_driver = CPlotDriver(
chan,
plot_config=plot_config,
plot_para=plot_para,
)
else: # 绘制动画
CAnimateDriver(
chan,
plot_config=plot_config,
plot_para=plot_para,
)
需要计算缠论相关数据,仅需 CChan 调用那一行;
如果需要画图:
- 单幅图使用 CPlotDriver
- 如果需要看回放动画,则使用 CAnimateDriver


核心缠论信息计算类 CChan 接受参数包括:
- code:股票代码,具体格式取决于数据源格式
- begin_time:开始时间,默认为 None(至于 None 怎么理解,也取决于数据源格式)
- end_time:结束时间,默认为 None(至于 None 怎么理解,也取决于数据源格式)
- data_src:数据源,框架提供:
- DATA_SRC.FUTU:富途
- DATA_SRC.BAO_STOCK:BaoStock(默认)
- DATA_SRC.CCXT:ccxt
- DATA_SRC.CSV: csv(具体可以看内部实现)
- "custom:文件名:类名":自定义解析器
- 框架默认提供一个 demo 为:"custom: OfflineDataAPI.CStockFileReader"
- 自己开发参考下文『自定义开发-数据接入』
- lv_list:K 线级别,必须从大到小,默认为 [KL_TYPE.K_DAY, KL_TYPE.K_60M],可选:
- KL_TYPE.K_YEAR(-_-|| 没啥卵用,毕竟全部年线可能就只有一笔。。)
- KL_TYPE.K_QUARTER(-_-|| 季度线,同样没啥卵用)
- KL_TYPE.K_MON
- KL_TYPE.K_WEEK
- KL_TYPE.K_DAY
- KL_TYPE.K_60M
- KL_TYPE.K_30M
- KL_TYPE.K_15M
- KL_TYPE.K_10M
- KL_TYPE.K_5M
- KL_TYPE.K_3M
- KL_TYPE.K_1M
- KL_TYPE.K_30S
- KL_TYPE.K_20S
- KL_TYPE.K_15S
- KL_TYPE.K_10S
- KL_TYPE.K_5S
- KL_TYPE.K_3S
- KL_TYPE.K_1S
- autype:复权类型,传递给获取数据接口,默认为 AUTYPE.QFQ,即前复权,可选
- AUTYPE.QFQ
- AUTYPE.HFQ
- AUTYPE.NONE
- config:CChanConfig 类,缠论元素计算参数配置,参见下文 CChanConfig
- extra_kl:额外K线,常用于补充 data_src 的数据,比如离线 data_src 只有到昨天为止的数据,今天开仓需要加上今天实时获得的部分K线数据;默认为 None;
- 如果是个列表:每个元素必须为描述 klu 的 CKLine_Unit 类;此时如果 lv_list 参数有多个级别,则会报错
- 如果是个字典,key 是 lv_list 参数里面的每个级别,value 是数组,每个元素是 CKLine_Unit 类
如果需要部署成服务对外提供接口,调用
CChan.toJson()可返回所有相关信息。
运行后,可通过 CChan[KL_TYPE] 的 bi_list,seg_list,bs_point_lst,cbsp_strategy 等属性获得笔,线段,bsp,cbsp 信息;
如果只有一个级别,可以省去 KL_TYPE,直接使用
CChan[0].bi_list这种调用方法
该参数主要用于配置计算逻辑,通过字典初始化 CChanConfig 即可,支持配置参数如下:
- 缠论计算相关:
- 中枢
- zs_combine:是否进行中枢合并,默认为 True
- zs_combine_mode: 中枢合并模式,取值
- zs:两中枢区间有重叠才合并(默认)
- peak:两中枢有K线重叠就合并
- one_bi_zs:是否需要计算只有一笔的中枢(分析趋势时会用到),默认为 False
- zs_algo: 中枢算法normal/over_seg/auto(段内中枢/跨段中枢/自动,具体参见中枢算法章节),默认为normal
- 笔
- bi_algo: 笔算法,默认为 normal
- normal: 按缠论笔定义来算
- fx: 顶底分形即成笔
- bi_strict:是否只用严格笔(bi_algo=normal时有效),默认为 Ture中枢算法
- gap_as_kl:缺口是否处理成一根K线,默认为 True
- bi_end_is_peak: 笔的尾部是否是整笔中最低/最高, 默认为 True
- bi_fx_check:检查笔顶底分形是否成立的方法
- strict(默认):底分型的最低点必须比顶分型3元素最低点的最小值还低,顶分型反之。
- totally: 底分型3元素的最高点必须必顶分型三元素的最低点还低
- loss:底分型的最低点比顶分型中间元素低点还低,顶分型反之。
- half:对于上升笔,底分型的最低点比顶分型前两元素最低点还低,顶分型的最高点比底分型后两元素高点还高。下降笔反之。
- bi_allow_sub_peak:是否允许次高点成笔,默认为True
- 线段
- seg_algo:线段计算方法
- chan:利用特征序列来计算(默认)
- 1+1:都业华版本 1+1 终结算法
- break:线段破坏定义来计算线段
-
$ claude mcp add chan.py \
-- python -m otcore.mcp_server <graph>