新闻详情

新闻详情

首页 / 资讯中心 / 详情

chan.py 缠论量化框架快速上手全指南:从 K 线计算到策略回测与机器学习接入

发布时间:2026/10/4 13:56:36来源:尧图网络
chan.py 缠论量化框架快速上手全指南:从 K 线计算到策略回测与机器学习接入
金融科技数据分析数据可视化【免费下载链接】chan.py开放式的缠论python实现框架支持形态学/动力学买卖点分析计算多级别K线联立区间套策略可视化绘图多种数据接入策略开发交易系统对接项目地址https://gitcode.com/gh_mirrors/ch/chan.py点击查看免费下载chan.py 是一套开放式的缠论缠中说禅Python 实现框架覆盖笔、线段、中枢、买卖点等形态学元素的增量计算并支持多级别 K 线联立、自定义数据源、可视化绘图与策略回测。本文以仓库 quick_guide.md 为骨架结合 Chan.py、ChanConfig.py、KLine/KLine_List.py 等源码实现系统讲解框架的运行机制、当前帧计算模型、核心配置项、缠论元素的取用方法、数据接入、策略与回测、指标扩展、机器学习接入与常见问题排查读完即可基于本仓库组装自己的缠论策略。写在前面这个开源项目包含什么作者创建该项目的初衷是自动化买卖股票需要一套容易程序化描述股票走势的理论最终选择缠论并将其实现后开源。开源部分包含缠论元素笔、线段、中枢、买卖点的计算而不包含以下内容策略定制化很强官方只把典型策略用法放进 demo见 Debug 目录下的strategy_demo*.py交易引擎不通用不对外提供机器学习相关特征/模型由于并非所有知识产权都归属于作者无法对外提供需要特别强调的是仓库 README 主要面向个人完整版撰写对于开源版以 quick_guide.md 为准画图与 CChanConfig 等配置的详细定义可参考 README。如何开始安装依赖后在仓库根目录直接运行python3 main.py即可体验完整的拉取 K 线 → 计算缠论元素 → 绘图流程。main.py 中默认以 baostock 数据源拉取sz.000001平安银行从 2018-01-01 至今的日线数据计算并绘制 K 线、合并 K 线、笔、线段、中枢、买卖点等。运行时依赖最低版本为Python 3.11——项目是高度计算密集型作者实测相比 Python 3.8.5 计算时间缩短约 16%后续开发均基于 3.11。框架核心能力一言以蔽之框架的能力是根据给定范围的 K 线算出当前静态范围下的缠论元素笔、线段、中枢、买卖点各元素均有独立参数配置基于上述能力提供增加 K 线时的增量更新缠论元素支持开发自己的数据源接入计算见下文数据接入速成班支持取出算好的元素组装自己的策略见下文取出缠论元素关于当前帧的详细说明框架支持两种计算模式计算指定时间范围内 K 线所组成的缠论元素逐根 K 线投喂更新已有的缠论元素。任何时刻比如每新增一根 K 线都可以通过CChan类获得当下到目前给定的 K 线为止所有缠论元素。对于最重要的买卖点可以理解成每次计算出来的都是当下的形态学买卖点——有些买卖点不是已经确定的可能在将来消失。所以随着 K 线新增你可能会发现某个位置的买点突然消失或者某个买卖点的位置一直在变动。举例说明图源 Image/frame.png在某下降线段尾部单边下跌的一笔中每根新增 K 线的低点都比上一根更低每新增一根 K 线这根 K 线都可能被标识为一类买卖点而上一根 K 线的标识被取消如果某根 K 线之后开始反弹那么在最低点这根 K 线被跌破之前新投喂 K 线后这根最低点的 K 线会一直被持续标记为一买直到形态上认为这个一买不再成立。这张示意图完整演示了一买在下跌段尾部被反复标记、反弹后被持续保留、最终跌破失效的全流程正是当前帧计算模型的直观体现每一次计算都只反映当前 K 线范围下的静态结果。关于 is_sure 标记框架会对所有元素标明是否已经确定或说已经完成可以参见各个类的is_sure属性is_sureFalse在画图结果中表现为虚线虚笔、虚段、虚线中枢对于is_sureTrue的元素在后续 K 线新增过程中不会再被变更也不可能会被标记为is_sureFalseis_sureFalse的元素只可能出现在所有 K 线的头部或者尾部。以笔为例Bi/Bi.py 中CBi的is_sure与used_to_be_sure属性共同刻画了笔的确定状态当尾部出现新 K 线导致最后一笔被虚拟延长时update_virtual_end笔会变为is_sureFalse直到走势给出充分证据才恢复确认。你需要做的框架会一直提示你当下这一帧里的缠论元素分别是什么样子。随着 K 线投喂很多 K 线都曾在某个时刻被标记为当下的买卖点且大部分is_sureFalse。对于这些不确定最终是否成立的买卖点你需要自己开发策略判断它们是否会最终成立或当下是否需要交易比如考虑买卖点的背驰度、中枢数等。需要特别说明由于走势的多义性而框架在任何一个时刻只能给出一种缠论元素的计算结果必然存在某些将来成立的买卖点在 K 线新增的全过程中一次都不曾被标记为买卖点。破解方法也比较简单每根 K 线进来后跑两组不同的缠论计算参数交叉验证。作者本人在此处的策略判断实现是尝试通过机器学习模型来解决详见下文机器学习接入。不可绕过的步骤CChanConfig 重点关注配置直接提取框架算好的缠论元素来组装策略时建议先了解以下三部分README 中有细讲CChan类的输入参数及格式CChanConfig接受的配置——默认配置基本可用关注自己想了解的即可画图的两个配置plot_config需要画什么plot_para每种元素单独配置。CChanConfig.py 中配置项众多其中最容易被影响计算结果的几个如下以下默认值均以当前仓库源码 ChanConfig.py 实际实现为准配置项含义源码默认值bi_strict是否只用严格笔这里的严格笔只考虑顶底分形之间相隔几个合并 K 线Truebi_fx_check检查笔顶底分形是否成立的方法strict/loss/half/totally对应 Common/CEnum.py 的FX_CHECK_METHODstrictbi_end_is_peak笔的尾部是否是整笔中最低/最高Truedivergence_rate1 类买卖点背驰比例即离开中枢的笔的 MACD 指标相对于进入中枢的笔的比值float(inf)不限制min_zs_cnt1 类买卖点至少要经历几个中枢1max_bs2_rate2 类买卖点那一笔回撤最大比例0.9999zs_algo中枢算法涉及中枢是否允许跨段normal其中两点需要特别说明quick_guide 中描述的divergence_rate常用参考值为 0.9、max_bs2_rate常用参考值为 0.618而当前仓库源码的默认值分别为float(inf)与0.9999见 ChanConfig.py。max_bs2_rate若设为 1.0相当于允许回撤到 1 类买卖点的位置策略回测时可结合背驰严格程度自行调整。bi_fx_check的分形检查方法在 KLine/KLine.py 的check_fx_valid中有完整实现HALF只检测前两根合并 K 线LOSS只检测顶底分形合并 K 线STRICT/TOTALLY会考察前后更多合并 K 线的价格关系。除上述外CChanConfig还支持seg_algo线段算法默认chan另有已弃用的11、break见 KLine/KLine_List.py、zs_combine、one_bi_zs、trigger_step、skip_step、kl_data_check、auto_skip_illegal_sub_lv、macd默认{fast:12,slow:26,signal:9}、cal_demark、cal_rsi、cal_kdj、boll_n默认 20等。配置类还通过ConfigWithCheck校验未知键传入不在支持范围内的键会直接抛出invalid CChanConfig异常防止拼写错误被静默忽略。取出缠论元素CChan类内部有一个变量kl_datas这是一个字典键是KL_TYPE级别取值参见 Common/CEnum.py从秒级K_1S到K_60M、K_DAY、K_WEEK、K_MON、K_QUARTER、K_YEAR共 19 种值是CKLine_List类。CKLine_List是所有元素取值的入口见 KLine/KLine_List.py关键成员是lst: List[CKLine]所有的合并 K 线bi_listCBiList类管理所有的笔seg_listCSegListComm类管理所有的线段zs_listCZSList类管理所有的中枢bs_point_lstCBSPointList类管理所有的买卖点其余大部分人可能不关注的segseg_list线段的线段、segzs_list线段中枢、seg_bs_point_lst线段买卖点提示CChan还提供了__getitem__便捷索引chan[0]等价于chan.kl_datas[chan.lv_list[0]]可按级别序号或KL_TYPE直接取CKLine_List。CKLine合并 K 线成员包括idx第几根lst可以取到所有的单根 K 线变量CKLine_UnitfxFX_TYPE分形类型BOTTOM/TOP/UNKNOWNdir方向pre/next前一/后一合并 K 线high高点low低点CKLine_Unit单根 K 线成员包括idx第几根time时间CTimelow/close/open/highklc获取所属的合并 K 线即CKLinesub_kl_list: List[CKLine_Unit]次级别 K 线列表范围在这根 K 线范围内的sup_kl: CKLine_Unit父级别 K 线单根 K 线还承载所有指标计算结果macd、boll、trend均线/高低点趋势、demark、rsi、kdj等由 KLine/KLine_Unit.py 的set_metric统一注入。bi_list笔管理类成员包含bi_list: List[CBi]每个元素是一笔这个类的实现基本可以不用关注除非你想实现自己的画笔算法CBiList.update_bi_sure会在新合并 K 线出现时尝试生成新笔try_add_virtual_bi负责生成尾部虚笔。CBi笔类成员包含idx第几笔dir方向BI_DIR类UP/DOWNis_sure是否是确定的笔klc_lstList[CKLine]该笔全部合并 K 线seg_idx所属线段 idparent_seg: CSeg所属线段next/pre前一/后一笔可以关注的关键函数Bi/Bi.py_high/_low笔的最高/最低价get_first_klu/get_last_klu获取笔第一根/最后一根 K 线get_begin_klu/get_end_klu获取起止 K 线注意与get_first_klu的区别比如下降笔这里获取的是第一个合并 K 线里面high 最大的 K 线而不是第一个合并 K 线里面的第一根 K 线get_begin_val/get_end_val获取笔起止 K 线的价格比如下降笔的get_begin_val就是get_begin_klu的高点。CSegListComm线段管理类lst: List[CSeg]每一个成员是一根线段这个类的实现基本可以不用关注除非你想实现自己的画段算法——参照 Seg 目录下提供的几个实现SegListChan.py、SegListDYH.py、SegListDef.py实现CSegListComm的子类即可。CSeg线段类成员包括idxstart_bi起始笔end_bi终止笔is_sure是否已确定dir方向BI_DIR类zs_lst: List[CZS]线段内中枢列表pre/next前一/后一线段bi_list: List[CBi]线段内笔的列表CSeg与CBi一样实现了同名关键函数_high/_low、get_first_klu/get_last_klu、get_begin_klu/get_end_klu、get_begin_val/get_end_val用法完全一致。CZSList中枢管理类zs_lst: List[CZS]中枢列表CZS中枢类成员包括begin/end起止 K 线CKLine_Unitbegin_bi/end_bi中枢内部的第一笔/最后一笔bi_in进中枢的那一笔在中枢外面bi_out出中枢的那一笔在中枢外面不一定存在low/high中枢的高低点peak_low/peak_high中枢内所有笔的最高/最低值bi_lst中枢内笔列表sub_zs_lst子中枢如果出现过中枢合并的话中枢的高低点计算方式见 ZS/ZS.py 的update_zs_rangelow max(笔的_low)、high min(笔的_high)mid为二者均值。CBSPointList买卖点管理类lst: List[CBS_Point]所有的买卖点CBS_Point买卖点类成员包括bi所属的笔买卖点一定在某一笔末尾klu所在 K 线is_buyTrue为买点False为卖点typeList[BSP_TYPE]买卖点类别是个数组——比如 2、3 类买卖点可能落在同一根 K 线上BSP_TYPE的取值Common/CEnum.py包括1、1p、2、2s、3a中枢在 1 类后面、3b中枢在 1 类前面可通过bs_type配置开启/关闭。买卖点对象还自带featuresCFeatures内置了bsp_bi_amp买卖点所在笔的振幅等通用特征供机器学习使用。获取买卖点的推荐接口是CChan.get_latest_bsp(idxNone, number1)number0取全部返回从最新到最旧的排序列表旧接口get_bsp已标记 deprecated见 Chan.py。数据接入速成班CCommonStockApi 子类实现参考 DataAPI/BaoStockAPI.py实现一个类继承自CCommonStockApi抽象基类定义见 DataAPI/CommonStockAPI.py接受输入参数为codek_typeKL_TYPE类型begin_date/end_date能否为None、格式如何由你自己决定——它们会通过CChan的初始化参数传进来并在该类里面实现关键方法get_kl_data(self)这是一个生成器yield返回每一根 K 线信息CKLine_Unit也可以直接返回一个有序数组每个元素为CKLine_Unit只不过性能可能会差一些。class C_YOUR_OWN_DATA_CLS(CCommonStockApi): def __init__(self, code, k_typeKL_TYPE.K_DAY, begin_dateNone, end_dateNone, autypeAUTYPE.QFQ): super(C_YOUR_OWN_DATA_CLS, self).__init__(code, k_type, begin_date, end_date, autype) def get_kl_data(self) - Iterable[CKLine_Unit]: ... yield CKLine_Unit(item_dict)其中item_dict是一个字典包含时间必须是框架实现的CTime类开收高低必须要有换手率、成交额、成交量这三个可以没有{ DATA_FIELD.FIELD_TIME: time, # 必须是CTime DATA_FIELD.FIELD_OPEN: float(_open), # 必填 DATA_FIELD.FIELD_CLOSE: float(_close), # 必填 DATA_FIELD.FIELD_LOW: float(_low), # 必填 DATA_FIELD.FIELD_HIGH: float(_high), # 必填 DATA_FIELD.FIELD_VOLUME: float(volume), # 可选 DATA_FIELD.FIELD_TURNOVER: float(amount), # 可选 DATA_FIELD.FIELD_TURNRATE: float(turn), # 可选 }字段名常量DATA_FIELD定义在 Common/CEnum.py。CKLine_Unit在构造时会校验 OHLC 合法性若low不是四价最小或high不是四价最大默认抛异常KL_DATA_INVALIDCKLine_Unit(kl_dict, autofixTrue)可自动修正数字货币类数据源常使用该参数参见 DataAPI/ccxt.py。CTime构造CTime(year, month, day, hour, minute)实例即可Common/CTime.py。其核心机制在于auto参数默认True若hour 0 and minute 0且autoTrue时间戳会按23:59计算从而保证当天的分钟线是对应日期的次级别 K 线解决日线与分钟线的时间对齐问题若autoFalse则按字面时间0:00计算时间戳。初始化和结束如果数据来源于其他服务、需要有初始化和结束操作那么需要额外重载实现两个类函数classmethod def do_init(cls): ... classmethod def do_close(cls): ...例如 baostock 需要实现login/logout操作DataAPI/BaoStockAPI.py 的do_init/do_close即封装了bs.login()/bs.logout()futu 数据源需要初始化和关闭 ctx 操作。接入数据源最简单的方法把实现的类放在./DataAPI/目录下然后把CChan的data_src参数配置为custom:文件名.类名即可。CChan.GetStockAPIChan.py会通过importlib动态导入DataAPI.文件名并取出对应类。仓库内置的数据源包括BAO_STOCKbaostockDataAPI/BaoStockAPI.pyAKSHAREakshareDataAPI/AkshareAPI.pyCCXT加密货币交易所DataAPI/ccxt.pyCSV本地 CSV 文件DataAPI/csvAPI.py线段框架默认提供的线段画法基于特征序列那一套不了解的话可搜索缠论 线段 特征序列。线段部分是整个框架代码里最复杂、最绕、最难以维护的部分除非作为挑战或确有重要特性需要实现不建议贸然阅读实现。关于划段算法简单来说就是把上升线段里面的下降笔或者下降线段里面的上升笔当作 K 线也叫特征序列进行合并后找顶底分形分析主要区分两种情况以上升线段为例特征序列形成的顶分型第一、二元素之间有跳空需要在后面找到反向且合法的特征序列底分型这个上升线段才会被判断为确认即CSeg.is_sureTrue画图为实线没有跳空顶分型出现时即被判断为确认。这段逻辑在 Seg/EigenFX.py 中有对应实现CEigenFX.can_be_end判断特征序列元素之间是否存在gap有跳空时调用find_revert_fx向后寻找反向合法底分型无跳空时只要出现顶/底分形treat_third_ele中update_fx得到有效分形即确认。seg_algo默认chan即走此实现若用plot_eigen开关开启特征序列绘制可以直观辅助理解划段结果。开源代码也提供了其他线段算法实现SegListDYH.py、SegListDef.py 等可自行开发切换。虚段线段的确定时刻具有很强滞后性因此框架在计算当前帧元素时会产生一些推断的线段CSeg.is_sureFalse画图为虚线。这些虚段在后续新增 K 线过程中随时可能变化。虚段可能出现在线段的开头和结尾主要是框架认为当下的 K 线信息不足以确定某些线段或者特征序列的顶底分形尚未完成。开头处的虚段参考意义不大。如果给出的 K 线算出来的所有线段都是虚的不要进行任何回测或在上面交易至少等出现一条实段后再做策略分析。中枢中枢的计算与笔、线段联动CKLine_List.cal_seg_and_zsKLine/KLine_List.py中先画线段再调用zs_list.cal_bi_zs计算中枢随后update_zs_in_seg把中枢挂回所属线段计算seg.zs_lst以及中枢的bi_in/bi_out。中枢相关配置zs_combine、zs_combine_mode、one_bi_zs、zs_algo定义于 ZS/ZSConfig.py。中枢是否允许跨段由zs_algo控制会影响 1 类买卖点计算的背驰基准属于高频调参项。策略实现 回测具体 demo 参见 Debug/strategy_demo.py。原理如下打开CChanConfig中的trigger_step开关后CChan初始化时不会做任何计算手动调用CChan.step_load()才会启动计算有多少根 K 线就返回多少次该函数是一个生成器每喂一根 K 线后就计算当前 K 线位置的静态元素返回当前的CChan类可用上文方法获取需要的元素每一帧的计算不是完全重算只重新计算不确定的部分故计算性能尚可。step_load的实现见 Chan.py内部还支持skip_step配置跳过前 N 根 K 线。回测就靠自行组装了——strategy_demo.py 演示了一个只交易一类买卖点、底分型形成后开仓、顶分型形成后平仓的极简策略展示如何遍历chan.step_load()、用chan_snapshot.get_latest_bsp()取买卖点、再用FX_TYPE.BOTTOM/TOP判断分形来触发交易。从外部喂 K 线实盘时需要在获取到 K 线之后触发缠论计算可以使用CChan.trigger_load来触发计算。该函数的输入参数格式为Dict[KL_TYPE, List[CKLine_Unit]]。具体使用 case 可以参考 Debug/strategy_demo2.py它先CBaoStock.do_init()然后逐根从数据源get_kl_data()取 K 线每取到一根就调用chan.trigger_load({KL_TYPE.K_DAY: [klu]})随后立即读取chan.get_latest_bsp()做交易判断。注意trigger_load要求最高级别必须传入数据否则抛出NO_DATA异常Chan.py。更新小级别触发大级别重算这种场景一般是实盘中用 1 分钟、5 分钟两个级别构建策略每过一分钟当前 5 分钟的 K 线由于数据源没提供是由 1 分钟 K 线合成的也可能券商接口提供了当前 5 分钟 K 线但由于未完成下一分钟它可能有变化把两个级别的 K 线用CChan.trigger_load()喂进去。问题是当把当前的 5 分钟 K 线喂进去后下一分钟框架无法回退/更新这个 5 分钟 K 线而这个 5 分钟 K 线可能相较于前一分钟是变化的。解决方法参考 Debug/strategy_demo3.py。原理是当某一个时刻所有级别的 K 线在将来都不需要变化时比如每 5 分钟结束时把当前CChan保存成快照深度拷贝到临时变量或序列化到本地文件之后每根最小级别 K 线产生时均重新加载这个快照重新计算当前的所有级别。strategy_demo3 中展示了用 15 分钟 K 线合成 60 分钟 K 线combine_60m_klu_form_15m每凑齐 4 根 15 分钟 K 线就把当前chan深拷贝为新的chan_snapshot并清空缓存数组随后每来一根新 15 分钟 K 线都基于该快照copy.deepcopy后trigger_load重算。开源版本指标添加以实现 RSI 指标为例只需要三步第一步实现一个计算类见 Math/RSI.py类可以接收指标计算的参数如周期类对外提供一个方法接收需要的 K 线信息不要直接接收CKLine_Unit否则后续可能会有循环引用问题返回指标值或者包含所有指标结果的一个类比如 MACD 类需要返回快线、慢线、红绿柱等信息性能建议指标尽量优化成增量计算即新的一根 K 线 部分之前 K 线计算的中间结果就能算出当前 K 线的指标而不是每次都要用前面所有 K 线重算。本框架所有开源指标均遵循此原则Math/RSI.py 中 RSI 用up/down数组保存了前一时刻的均值新增 K 线时只做一次指数平滑更新。第二步在CChanConfig的GetMetricModel方法修改res变量的注解增加你的指标类然后 append 一个上面实现的指标计算实例RSI 的周期参数通过rsi_cycle配置def GetMetricModel(self): res: List[CMACD | CTrendModel | BollModel | CDemarkEngine | RSI] [] # 其他已有指标 # balabala.... res.append(RSI(self.rsi_cycle)) return res第三步在CKLine_Unit的set_metric方法最后增加一行调用你实现的指标类的计算方法def set_metric(self, metric_model_lst: list) - None: for metric_model in metric_model_lst: # balabala... elif isinstance(metric_model, RSI): self.rsi metric_model.add(self.close)至此你就可以通过CKLine_Unit.rsi取得指标值参与后续计算了KLine/KLine_Unit.py 展示了全部内置指标的标准接线方式。指标画图若想让你的指标支持绘制在 Plot/PlotDriver.py 的DrawElement方法增加一行def DrawElement(self, plot_config: Dict[str, bool], meta: CChanPlotMeta, ax: Axes, lv, plot_para, ax_macd: Optional[Axes], x_limits): # balabala... if plot_config.get(plot_rsi, False): self.draw_rsi(meta, ax.twinx(), **plot_para.get(rsi, {}))然后实现draw_rsi方法即可与仓库内置实现 Plot/PlotDriver.py 一致def draw_rsi(self, meta: CChanPlotMeta, ax, colorb): data [klu.rsi for klu in meta.klu_iter()] x_begin, x_end int(ax.get_xlim()[0]), int(ax.get_xlim()[1]) ax.plot(range(x_begin, x_end), data[x_begin: x_end], ccolor)meta为CChanPlotMetaPlot/PlotMeta.py已提前完成 K 线时间到 X 轴坐标的转化klu_iter()按 K 线序号迭代因此自定义绘图只需按klu.idx取值即可。机器学习接入缠论的好处在于基础元素的定义大多非常精确包括买卖点很容易程序化实现因此策略可以接入机器学习让机器学习判断当下状态框架也能较方便地接入这些能力。机器学习相关演示位于项目machinelearning分支的 Debug/strategy_demo5.py里面演示了如何在 bsp 各个地方增加特征计算如何在 bsp 里面增加通用特征策略如何与 bsp 特征联动如何在策略生效时新增策略特征如何绘图分析 label 是否正确如何训练 预测。strategy_demo5 的完整流程是跑step_load逐帧记录每个买卖点的featuresCBS_Point.features见 BuySellPoint/BS_Point.py策略层面再通过add_feat追加开仓 K 线特征如(close-open)/open最终导出 libsvm 格式样本feature.libsvm与特征元信息feature.meta以 XGBoost 为示例训练二分类模型预测买卖点的准确性并用plot_marker在图上以 √/× 标记 label 便于人工核验。注意 demo 训练与预测用的是同一份数据仅作演示实际使用应划分训练/测试集。机器学习分支和主分支区别机器学习分支仅在主分支基础上在CChan内部增加了一些特征计算的 demo 和机器学习特有的 demo 策略。主分支的所有特性都会合并进机器学习分支只是额外的特征计算会消耗计算性能——考虑到不是所有人都需要机器学习特征计算所以专门开了分支。不介意性能的话无脑用机器学习分支亦可。一致性框架支持两种计算模式直接给定一批 K 线计算出所有缠论元素trigger_stepFalse时的CChan.load全量计算路径在已有可为空K 线基础上逐根投喂更新得到当下为止的缠论元素trigger_stepTruestep_load或trigger_load。两种方法实现上略有区别前者计算速度快于后者。但框架保证或说目标是要保证如果给定同样范围的 K 线两种模式最终计算状态完全一致。如果不一致说明有 bug可联系作者排查。如何防止未来信息如果你使用CChan.trigger_load触发计算那么每次触发后框架只拿到当前位置的 K 线数据来计算缠论元素你只要在下一次trigger_load之前完成策略的判断那么你的策略模型在没有 Bug 的情况下是拿不到未来信息的。这为严格无未来函数回测提供了基础设施保障。可能遇到的问题运行报错依赖最低版本为Python 3.11。项目是高度计算密集型python3.11 相比 python 3.8.5 实测计算时间缩短约 16%后续开发均基于 3.11。运行完啥也没有某些系统画图窗口会在程序运行完后自动关闭常用解法在 jupyter notebook 之类应用上运行在代码最后加上一句input()。README 里面有些文件为啥仓库里面没有README.md主要为个人完整版撰写开源版主要参考quick_guide.md即可。另外画图 / CChanConfig 等配置以及框架里一些定义解释可以参考 README其他部分看 README 意义不大。关于完整版完整版与开源版的差异部分主要为作者个人策略和交易引擎定制开发的代码不具备可泛化性机器学习模型相关代码和特征也由于知识产权归属问题无法对外提供。开源部分提供了所有可用的基座和演示代码足以自行组装策略。为啥信号会消失大家所说的信号就是框架计算出来的买卖点bsp。因为框架计算得永远是当前帧下的缠论元素随着 K 线增加原有买卖点可能被证明不成立比如跌破一买原本被标记为买卖点的 K 线将不再被标记为 bsp。画图为啥不能交互框架默认画图能力对接的是matplotlib库。如果希望在别的画图引擎上实现如某些 web 页面或 plotly 这类可交互库欢迎提交 PR。框架提供了画图元素类PlotMetaPlot/PlotMeta.py里面提供了各种元素在绘图时的坐标信息比如已经完成 K 线时间到 X 轴坐标的转化方便自行对接到不同画图引擎上。关于动态图使用main.py画动态图trigger_stepTrue时走CAnimateDriver见 Plot/AnimatePlotDriver.py特别吃内存且会越来越卡。动图是纯实验性功能内存泄露是已知问题多年未优化仅作为演示使用。CChan 类序列化/deepcopy 时报递归溢出原因框架里很多缠论元素类都有next/pre成员指向上一个/下一个元素Python 导出时可能遇到递归导致溢出。解决方法加一行配置增大系统递归深度sys.setrecursionlimit(0x100000)对于 pickle 序列化可以直接使用框架提供的接口Chan.pychan.chan_dump_pickle(chan.pkl) chan_new CChan.chan_load_pickle(chan.pkl)chan_dump_pickle在 dump 前会临时断开所有元素的pre/next指针并自动提升递归上限chan_load_pickle加载后再通过chan_pickle_restore重建链表关系。报 k 线时间相关错误常见报错类似kline time err, cur2024/01/01 00:05, last2024/01/01。处理方法如果数据级别为天级别以下不包含天级别且 K 线时间可能出现 0 点 0 分数据那么在数据源类返回的 K 线时间CTime中把auto设置为False即可。根本原因一般日线 K 的时间不包含小时信息或为 0 点 0 分。为处理天级别分钟级别 K 线时间对齐问题autoTrue默认会自动将天的小时分钟信息设置为 23:59从而保证当天的分钟线是对应日期的次级别 K 线但对于数字货币类的分钟 K 线如果也出现 0 点 0 分则会有误判CTime.set_timestamp的实现见 Common/CTime.pyload_iterator中的时间单调性校验见 Chan.py。我觉得线段画的不太对线段逻辑简要说明可参考上文线段一章。如果不太能理解划段结果可以在画图开关里打开plot_eigen开关绘制出特征序列辅助分析。如果还有问题只能联系作者了。其他问题如需作者排查尽量提供可以直接运行的主函数文件和数据文件。结语从python3 main.py的一键体验到当前帧计算模型、is_sure确定态标记、CChanConfig 关键参数、五类缠论元素的对象模型、自定义数据源接入、step_load/trigger_load两种驱动方式、快照式多级别重算、RSI 指标三步扩展再到机器学习特征接入与无未来函数保障chan.py 的开源基座已经覆盖了从数据到策略的全链路。推荐路径是先跑通 main.py 与 Debug/strategy_demo.py再按需阅读 ChanConfig.py 的配置与 KLine/KLine_List.py 的计算入口最后基于 CChan 提供的元素接口组装你自己的策略。赞分享金融科技数据分析数据可视化【免费下载链接】chan.py开放式的缠论python实现框架支持形态学/动力学买卖点分析计算多级别K线联立区间套策略可视化绘图多种数据接入策略开发交易系统对接项目地址https://gitcode.com/gh_mirrors/ch/chan.py点击查看免费下载相关推荐缠论量化框架 chan.py 完全指南从笔段中枢计算到策略开发、机器学习打分与交易系统对接缠论量化框架 chan.py 完全指南从笔段中枢计算到策略开发、机器学习打分与交易系统对接 导读 本文以开源仓库 chan.py开放式的缠论 Python金融科技数据分析数据可视化终极缠论Python框架chan.py快速入门指南 终极缠论Python框架chan.py快速入门指南 chan.py是一个功能强大的开放式缠论Python实现框架支持形态学/动力学买卖点分析计算、多级金融科技数据分析数据可视化缠论框架完整使用指南从基础计算到策略开发缠论框架完整使用指南从基础计算到策略开发 缠论框架是一个基于Python的开源项目旨在提供一套完整的缠论计算工具集。该项目实现了缠论中的基本元素计算包括分金融科技数据分析数据可视化上一篇Windows Cleaner5分钟快速解决C盘爆红问题的完整指南下一篇小红书批量下载神器XHS-Downloader完整使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/10/4 14:32:28

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/10/4 14:31:41

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/10/4 14:31:34

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/10/4 14:31:34

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →
Driver Assistant: Persuading Drivers to Adjust Secondary Tasks Using Large Language Models 2026/10/4 14:31:27

Driver Assistant: Persuading Drivers to Adjust Secondary Tasks Using Large Language Models

文章主要内容和创新点 主要内容 本文针对L3级自动驾驶系统中,司机在进行次要任务(如使用手机、进食等)时易分心,导致紧急情况下需手动接管车辆时认知负荷过高的问题,提出了一种基于大语言模型(LLM)的“驾驶助手”工具。该工具通过分析路况风险(如交通流量、行人、天气…

阅读更多 →
Large Language Models Transform Organic Synthesis From Reaction Prediction to Automation 2026/10/4 14:31:27

Large Language Models Transform Organic Synthesis From Reaction Prediction to Automation

文章主要内容总结 本文是一篇关于大型语言模型(LLMs)在有机合成领域应用的系统性综述,核心围绕LLMs如何从理论工具转变为实用的实验室辅助手段展开,主要内容包括: 背景与范式转变:有机合成是医药、农药、可再生材料等领域的基石,但传统方法受限于反应路径组合爆炸和数据…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉