让我查看一下 technical-patterns-lab 项目中关于标准化维度和预设模式的内容。 [10 tools called] 非常好!现在我完全理解了。你们已经实现了**标准化维度系统**和**预设模式配置**。让我重新设计函数接口,将这些体系整合进去: --- ## 🎯 重新设计:函数接口 + 标准化维度 + 预设模式 基于你们已经实现的 `normalizer.py` 和 `config.py`,函数应该这样设计: ### **1. 函数接口设计(集成标准化+预设模式)** ```python # ============================================================================ # 批量计算函数(全历史扫描) # ============================================================================ def 收敛三角形( # === 计算范围 === 掩码: Optional[np.ndarray] = None, 起始日期: int = -1, 结束日期: int = -1, # === 检测参数 === 检测窗口: int = 240, 最小收敛度: float = 0.45, 突破阈值: float = 0.005, 放量倍数: float = 1.5, # === 强度分配置(新增) === 预设模式: str = "等权", # "等权"|"激进"|"保守"|"放量"|"自定义" 自定义权重: Optional[dict] = None, # 仅当预设模式="自定义"时有效 # === 输出控制 === 返回详细维度: bool = False, # True时返回dict包含所有6个维度 ) -> Union[np.ndarray, dict]: """ 全历史批量计算收敛三角形强度分 Args: 掩码: (n_stocks, n_days) 布尔矩阵,True表示需要计算的位置 起始日期/结束日期: 日期索引范围 预设模式: 强度分计算模式,选择权重分配策略 - "等权": 6个维度各1/6 (默认,探索性分析) - "激进": 突破35% + 成交量25% (趋势行情,追涨) - "保守": 收敛30% + 活跃25% (震荡市,等形态完善) - "放量": 成交量35% + 突破25% (捕获主力异动) - "自定义": 使用自定义权重字典 自定义权重: 当预设模式="自定义"时,传入权重字典,例如: { "突破幅度": 0.40, "收敛度": 0.20, "成交量": 0.20, "形态规则": 0.05, "价格活跃": 0.10, "倾斜度": 0.05 } 注意:6个权重之和必须=1.0 返回详细维度: 若为True,返回dict包含: - "强度分": 综合强度分矩阵 - "突破幅度分_向上": 标准化后的突破幅度分(向上) - "突破幅度分_向下": 标准化后的突破幅度分(向下) - "收敛度分": 标准化后的收敛度分 - "成交量分": 标准化后的成交量分 - "形态规则度分": 标准化后的形态规则度分 - "价格活跃度分": 标准化后的价格活跃度分 - "倾斜度分": 标准化后的倾斜度分 Returns: np.ndarray (n_stocks, n_days): 强度分矩阵 - 范围: [0, 1] (标准化后) - 正值: 向上突破强度 - 负值: 向下突破强度 - NaN: 无有效形态 或 掩码为False的位置 或 dict (当返回详细维度=True时): 包含"强度分"和6个子维度的标准化分数 Examples: # 示例1: 等权模式全市场扫描 强度 = 收敛三角形(预设模式="等权") 强突破 = 强度 > 0.7 # 标准化后阈值通常在0.6-0.8 # 示例2: 激进模式筛选突破股 强度 = 收敛三角形(预设模式="激进") # 激进模式: 突破35%权重 + 成交量25%权重 # 示例3: 带掩码的定向计算 沪深300 = 指数成分("000300.SH") 强度 = 收敛三角形(掩码=沪深300, 预设模式="保守") # 示例4: 自定义权重 强度 = 收敛三角形( 预设模式="自定义", 自定义权重={ "突破幅度": 0.50, "收敛度": 0.30, "成交量": 0.10, "形态规则": 0.03, "价格活跃": 0.05, "倾斜度": 0.02 } ) # 示例5: 获取详细维度进行分析 结果 = 收敛三角形(预设模式="等权", 返回详细维度=True) 综合强度 = 结果["强度分"] 收敛度 = 结果["收敛度分"] # 可以组合使用: 综合强度>0.7 且 收敛度>0.8 """ pass # ============================================================================ # 单股详情函数(查询+可视化) # ============================================================================ def 收敛三角形详情( 股票代码: str, # === 检测参数 === 检测窗口: int = 240, 最小收敛度: float = 0.45, 突破阈值: float = 0.005, 放量倍数: float = 1.5, 图表天数: int = 300, # === 强度分配置(新增) === 预设模式: str = "等权", 自定义权重: Optional[dict] = None, ) -> dict: """ 获取单只股票的三角形形态详细信息 Args: 股票代码: "SH600519", "SZ000001" 等 图表天数: 前端图表显示的K线数量 预设模式/自定义权重: 同收敛三角形()函数 Returns: dict 包含以下字段: { # === 核心指标 === "强度分": float, # 综合强度分 [0, 1] "方向": str, # "向上突破" | "向下突破" | "未突破" "是否有效": bool, # === 标准化维度分数(6个维度,已标准化到[0,1]) === "维度分数": { "突破幅度分_向上": float, # 标准化后 [0, 1] "突破幅度分_向下": float, "收敛度分": float, # 标准化后 [0, 1] "成交量分": float, # 标准化后 [0, 1] "形态规则度分": float, # 标准化后 [0, 1] "价格活跃度分": float, # 标准化后 [0, 1] "倾斜度分": float, # 标准化后 [0, 1] }, # === 原始维度分数(未标准化,用于Agent深度解释) === "原始分数": { "突破幅度_向上_原始": float, # 未标准化原始值 "突破幅度_向下_原始": float, "收敛度_原始": float, "成交量_原始": float, "形态规则度_原始": float, "价格活跃度_原始": float, "倾斜度_原始": float, }, # === 权重配置(用于解释) === "权重配置": { "预设模式": str, # "等权"|"激进"|"保守"|"放量"|"自定义" "突破幅度权重": float, # 例如: 0.35 (激进模式) "收敛度权重": float, # 例如: 0.15 "成交量权重": float, "形态规则度权重": float, "价格活跃度权重": float, "倾斜度权重": float, }, # === 几何属性 === "形态属性": { "收敛比例": float, # width_ratio,未标准化原始值 "上沿斜率": float, "下沿斜率": float, "触碰上沿次数": int, "触碰下沿次数": int, "成交量确认": bool, }, # === 前端绘图数据 === "图表数据": { "日期": [...], "K线": [...], "上边界线": [[x1,y1], [x2,y2]], "下边界线": [[x1,y1], [x2,y2]], "检测窗口": [起始索引, 结束索引], "突破点": {"日期": ..., "价格": ...}, }, # === 标准化统计信息(帮助Agent理解分数含义) === "标准化参考": { "中位数": 0.50, # 标准化后所有维度中位数都是0.5 "P75阈值": 0.75, # 前25%水平 "P90阈值": 0.90, # 前10%水平 "当前强度分位": float, # 该股票强度分在全市场的百分位 }, # === 元数据 === "计算参数": { "股票代码": str, "检测窗口": 240, "最小收敛度": 0.45, "标准化方法": "分层标准化_v1", ... } } Examples: # 示例1: 基本查询 详情 = 收敛三角形详情("SH600519") print(f"综合强度: {详情['强度分']:.2f}") print(f"方向: {详情['方向']}") # 示例2: Agent解读维度分数 详情 = 收敛三角形详情("SH600519", 预设模式="激进") 维度 = 详情["维度分数"] if 详情["强度分"] > 0.7: # 强度分>0.7属于前10%水平(标准化后) print(f"发现强突破!") print(f"- 突破幅度: {维度['突破幅度分_向上']:.2f} (权重{详情['权重配置']['突破幅度权重']:.0%})") print(f"- 成交量确认: {维度['成交量分']:.2f} (权重{详情['权重配置']['成交量权重']:.0%})") # 对比原始值看绝对水平 原始 = 详情["原始分数"] print(f"- 原始突破幅度: {原始['突破幅度_向上_原始']:.3f}") print(f"- 原始收敛度: {原始['收敛度_原始']:.3f}") # 示例3: 前端渲染 chart = 详情["图表数据"] # 直接传给ECharts渲染 # 示例4: 自定义权重查询 详情 = 收敛三角形详情( "SH600519", 预设模式="自定义", 自定义权重={ "突破幅度": 0.50, "收敛度": 0.30, "成交量": 0.10, "形态规则": 0.03, "价格活跃": 0.05, "倾斜度": 0.02 } ) """ pass ``` --- ### **2. Agent 知识卡片设计(更新版)** #### **函数卡片 (config_support_function)** ```json { "title": "converging_triangle", "title_chinese": "收敛三角形", "format": "收敛三角形(掩码, 起始日期, 结束日期, 检测窗口, 最小收敛度, 预设模式, 自定义权重, 返回详细维度)", "example": "收敛三角形(预设模式=\"激进\", 返回详细维度=True)", "input": "掩码(可选):2维布尔矩阵; 日期范围:整数; 预设模式:字符串; 自定义权重:字典", "output": "2维浮点矩阵 [0,1] 或 字典(含6个维度)", "output_shape": "stay | dict", "instruction": "批量计算全市场收敛三角形形态的标准化强度分。返回[0,1]区间的二维矩阵,基于6个标准化维度加权计算(突破幅度/收敛度/成交量/形态规则度/价格活跃度/倾斜度)。支持4种预设模式(等权/激进/保守/放量)和自定义权重,解决了原始维度不可比性问题(中位数从0~0.8统一到0.5)。可选返回详细维度用于多维度筛选。", "short_instruction": "识别三角形并输出标准化强度分[0,1]", "effect": "择股, 形态识别, 多维度筛选", "common_params": [ { "预设模式": "等权", "说明": "6个维度各1/6,探索性分析", "适用场景": "不确定哪个维度重要时" }, { "预设模式": "激进", "说明": "突破35%+成交量25%", "适用场景": "牛市/趋势行情追涨" }, { "预设模式": "保守", "说明": "收敛30%+活跃25%", "适用场景": "震荡市等形态完善" }, { "预设模式": "放量", "说明": "成交量35%+突破25%", "适用场景": "寻找主力资金异动" }, { "预设模式": "自定义", "自定义权重": { "突破幅度": 0.40, "收敛度": 0.30, "成交量": 0.20, "形态规则": 0.03, "价格活跃": 0.05, "倾斜度": 0.02 }, "说明": "根据策略需求定制权重" } ], "standard_thresholds": { "说明": "标准化后推荐阈值(基于18,004个样本)", "宽松筛选": 0.55, "适中筛选": 0.65, "严格筛选": 0.75, "极严格筛选": 0.85, "中位数": 0.50, "P75": 0.75, "P90": 0.90 }, "weight": 5, "group_id": "技术形态识别", "vector_id": "...", "remark": "强度分已经过分层标准化处理,所有维度中位数=0.5,可直接等权相加或自定义权重。预设模式基于18,004个样本的分布分析优化。" } ``` ```json { "title": "converging_triangle_detail", "title_chinese": "收敛三角形详情", "format": "收敛三角形详情(股票代码, 检测窗口, 预设模式, 自定义权重, 图表天数)", "example": "收敛三角形详情(\"SH600519\", 预设模式=\"激进\")", "input": "股票代码:字符串; 预设模式:字符串; 自定义权重:字典(可选)", "output": "详情对象(字典),包含标准化维度分数/原始分数/权重配置/图表数据", "output_shape": "dict", "instruction": "获取单只股票的三角形形态详细信息。返回字典包含:(1)综合强度分[0,1]; (2)6个标准化维度分数[0,1]; (3)原始维度分数(未标准化); (4)权重配置; (5)几何属性; (6)前端绘图数据; (7)标准化参考信息。支持4种预设模式和自定义权重,用于深度分析和可视化展示。", "short_instruction": "查询单股三角形详情(标准化+原始+图表)", "effect": "深度分析, 可视化, 维度解释", "common_params": [ {"预设模式": "等权", "图表天数": 300}, {"预设模式": "激进", "图表天数": 200}, {"预设模式": "保守", "图表天数": 300} ], "weight": 4, "group_id": "技术形态识别", "vector_id": "..." } ``` --- #### **知识卡片 (knowledge_card_basic) - 更新版** ```json { "card_type": "pattern_detection_card_v2", "name": "收敛三角形标准化强度分策略", "card_id": "pattern_triangle_normalized_strength_001", "insight": "通过分层标准化方法(针对零膨胀/点质量/低区分度等4种分布类型),将收敛三角形的6个原始维度统一标准化到[0,1]区间(中位数=0.5),解决维度间不可比性问题。配合4种预设权重模式(等权/激进/保守/放量),可灵活适应不同市场环境和交易风格,实现从主观形态识别到定量信号筛选的转变", "insight_en": "WHEN raw scores from 6 dimensions (price breakout, convergence, volume, geometry, activity, tilt) are normalized using stratified methods to [0,1] range with median=0.5, THEN combined with preset weight modes (equal/aggressive/conservative/volume-focus), the system generates comparable strength scores suitable for quantitative screening across market conditions", "insight_Z": "该策略解决了技术形态量化的核心难题:如何将不同尺度、不同分布类型的维度公平组合。基于18,004个样本的分布分析,采用零膨胀标准化(突破/成交量)、点质量标准化(倾斜度)、对数变换(形态规则度)等分层方法,确保等权相加不被某些维度'主导',同时提供预设模式快速适配不同策略需求", "user_intent_examples": [ "找出收敛三角形突破的股票,要综合质量高的", "筛选有效三角形,我偏好追涨,看重突破和放量", "震荡市找三角形整理形态,要收敛度好的", "检测三角形向上突破,放量确认的优先", "自定义三角形筛选条件,我要突破50%权重", "查询某只股票的三角形形态,看看各维度得分多少" ], "user_intent_tags": [ "技术形态", "三角形整理", "标准化强度分", "多维度筛选", "预设模式", "量价配合" ], "environment_X": { "描述": "适用于震荡整理行情,基于标准化强度分系统可适配不同市场环境", "可计算信号": [ "标准化综合强度分[0,1]筛选", "等权模式探索性分析(各维度1/6)", "激进模式(突破35%+成交量25%,趋势行情)", "保守模式(收敛30%+活跃25%,震荡市)", "放量模式(成交量35%+突破25%,主力异动)", "自定义权重配置(6个维度灵活组合)", "多维度阈值联合筛选(强度>0.7 且 收敛>0.8)", "单股详情查询(标准化分数+原始分数+图表)" ] }, "data_set_input": [ "高开低收价格数据(OHLC)", "成交量数据", "可选:计算范围掩码", "可选:预设模式选择", "可选:自定义权重字典" ], "data_set_output": [ "标准化强度分矩阵[0,1] (n_stocks, n_days)", "可选:6个标准化维度分数矩阵", "单股详情(综合强度+6维度标准化分数+原始分数+权重配置+图表数据)" ], "action_process": "1.检测收敛三角形并计算6个原始维度分数; 2.根据分布类型应用分层标准化(零膨胀/点质量/标准/对数变换); 3.根据预设模式或自定义权重计算综合强度分; 4.输出标准化强度分[0,1]和可选的详细维度", "action_Y": [ { "类型": "公式", "目的": "等权模式全市场初筛(探索性分析)", "行为": "使用等权模式(6个维度各1/6)扫描全市场,筛选强度分>0.7的高质量形态", "内容": "强度 = 收敛三角形(预设模式=\"等权\")\n强形态 = 强度 > 0.7 # 标准化后,0.7约为前15%水平" }, { "类型": "公式", "目的": "激进模式追涨(趋势行情)", "行为": "激进模式重视突破(35%)和成交量(25%),捕获强突破+放量信号", "内容": "强度 = 收敛三角形(预设模式=\"激进\")\n追涨信号 = 强度 > 0.75 # 突破和放量双重确认" }, { "类型": "公式", "目的": "保守模式等形态(震荡市)", "行为": "保守模式重视收敛度(30%)和价格活跃度(25%),等待形态质量高时再入场", "内容": "强度 = 收敛三角形(预设模式=\"保守\")\n保守信号 = 强度 > 0.70 # 形态质量优先" }, { "类型": "公式", "目的": "放量模式捕获主力异动", "行为": "放量模式重视成交量(35%),识别资金异动股票", "内容": "强度 = 收敛三角形(预设模式=\"放量\")\n异动信号 = 强度 > 0.75 # 成交量确认为主" }, { "类型": "公式", "目的": "定向范围筛选(提高效率)", "行为": "在指定股票池内识别,配合掩码减少计算量", "内容": "沪深300 = 指数成分(\"000300.SH\")\n强度 = 收敛三角形(掩码=沪深300, 预设模式=\"等权\")\n信号 = 强度 > 0.70" }, { "类型": "公式", "目的": "多维度联合筛选(精细控制)", "行为": "获取详细维度,组合多个条件进行精细筛选", "内容": "结果 = 收敛三角形(预设模式=\"等权\", 返回详细维度=True)\n综合强度 = 结果[\"强度分\"]\n收敛度 = 结果[\"收敛度分\"]\n成交量 = 结果[\"成交量分\"]\n\n# 组合筛选: 综合强度高 且 收敛度优秀 且 有放量\n精选 = (综合强度 > 0.70) & (收敛度 > 0.80) & (成交量 > 0.60)" }, { "类型": "公式", "目的": "自定义权重策略", "行为": "根据自己的策略逻辑定制权重分配", "内容": "强度 = 收敛三角形(\n 预设模式=\"自定义\",\n 自定义权重={\n \"突破幅度\": 0.50, # 最看重突破\n \"收敛度\": 0.30, # 其次收敛度\n \"成交量\": 0.10, # 成交量作参考\n \"形态规则\": 0.03,\n \"价格活跃\": 0.05,\n \"倾斜度\": 0.02\n }\n)\n自定义信号 = 强度 > 0.75" }, { "类型": "函数调用", "目的": "单股详情分析(含标准化+原始分数)", "行为": "查询目标股票的完整形态信息,获取标准化维度、原始维度、权重配置和图表数据", "内容": "详情 = 收敛三角形详情(\"SH600519\", 预设模式=\"激进\")\n\nprint(f\"综合强度: {详情['强度分']:.2f}\")\nprint(f\"方向: {详情['方向']}\")\n\n维度 = 详情[\"维度分数\"]\nprint(f\"突破幅度(标准化): {维度['突破幅度分_向上']:.2f}\")\nprint(f\"收敛度(标准化): {维度['收敛度分']:.2f}\")\n\n原始 = 详情[\"原始分数\"]\nprint(f\"收敛度(原始): {原始['收敛度_原始']:.3f}\")\n\n权重 = 详情[\"权重配置\"]\nprint(f\"预设模式: {权重['预设模式']}\")\nprint(f\"突破权重: {权重['突破幅度权重']:.0%}\")" } ], "scope": "适用于A股、港股等流动性良好的市场,日线级别数据,基于18,004个样本优化", "accuracy": 0.85, "inspiration": 0.90, "need_revise": 0.20, "need_revise_remark": "标准化方法基于当前18,004个样本,未来数据分布变化时可能需要重新校准。预设模式权重建议根据实际回测效果调整。", "remark": "该方法通过分层标准化解决了技术形态量化的核心难题,实现了维度间的公平组合。4种预设模式覆盖常见策略需求,也支持自定义权重灵活适配。标准化后阈值通常在0.6-0.8区间(对应P60-P80)。", "formula_info": { "示例公式1_等权": "收敛三角形(预设模式=\"等权\") > 0.70", "示例公式2_激进": "收敛三角形(预设模式=\"激进\") > 0.75", "示例公式3_多维度": "结果=收敛三角形(返回详细维度=True); (结果[\"强度分\"]>0.7) & (结果[\"收敛度分\"]>0.8)", "示例公式4_自定义": "收敛三角形(预设模式=\"自定义\", 自定义权重={\"突破幅度\":0.5, \"收敛度\":0.3, ...})", "示例函数调用": "收敛三角形详情(\"SH600519\", 预设模式=\"激进\")", "公式解释": "通过标准化+预设模式系统,实现多维度技术形态的定量筛选和深度分析" }, "technical_details": { "标准化方法": "分层标准化_v1", "样本量": 18004, "维度数量": 6, "标准化后中位数": 0.50, "预设模式数量": 4, "支持自定义权重": true, "分布类型处理": { "零膨胀分布": "突破幅度分、成交量分 (零值→0.5,非零值→[0.5,1.0])", "点质量分布": "倾斜度分 (中心值保持0.5,偏离值拉伸)", "标准分布": "收敛度分、价格活跃度分 (分位数标准化)", "低区分度分布": "形态规则度分 (对数变换+分位数)" } }, "extractor": "pattern_detection_standardized_v2" } ``` --- ### **3. 实施要点** 在 `dunhe_dataServer/src/library/expression/funcs/pattern.py` 中修改: ```python from library.pattern.converging_triangle import ( ConvergingTriangleParams, detect_converging_triangle_batch, ) # 新增导入标准化模块 from scripts.scoring.normalizer import normalize_all from scripts.scoring.config import ( CONFIG_EQUAL, CONFIG_AGGRESSIVE, CONFIG_CONSERVATIVE, CONFIG_VOLUME_FOCUS, calculate_strength ) # 在 _compute_all_metrics 中增加标准化步骤 def _compute_all_metrics(...) -> Dict[str, np.ndarray]: # ... 现有计算逻辑 ... # 构建DataFrame用于标准化 df = pd.DataFrame({ 'price_score_up': strength_up_mtx.flatten(), 'price_score_down': strength_down_mtx.flatten(), 'convergence_score': convergence_score_mtx.flatten(), 'volume_score': volume_score_mtx.flatten(), 'geometry_score': geometry_score_mtx.flatten(), 'activity_score': activity_score_mtx.flatten(), 'tilt_score': tilt_score_mtx.flatten(), }) # 应用标准化 df_norm = normalize_all(df) # 转回矩阵形状 result = { 'price_score_up_norm': df_norm['price_score_up_norm'].values.reshape(n_stocks, n_days), 'price_score_down_norm': df_norm['price_score_down_norm'].values.reshape(n_stocks, n_days), 'convergence_score_norm': df_norm['convergence_score_norm'].values.reshape(n_stocks, n_days), # ... 其他维度 ... } return result def 收敛三角形( 掩码: Optional[np.ndarray] = None, 起始日期: int = -1, 结束日期: int = -1, 检测窗口: int = 240, 最小收敛度: float = 0.45, 突破阈值: float = 0.005, 放量倍数: float = 1.5, 预设模式: str = "等权", 自定义权重: Optional[dict] = None, 返回详细维度: bool = False, ) -> Union[np.ndarray, dict]: # 获取标准化后的所有维度 result = _compute_all_metrics(...) # 根据预设模式选择配置 if 预设模式 == "等权": config = CONFIG_EQUAL elif 预设模式 == "激进": config = CONFIG_AGGRESSIVE elif 预设模式 == "保守": config = CONFIG_CONSERVATIVE elif 预设模式 == "放量": config = CONFIG_VOLUME_FOCUS elif 预设模式 == "自定义": if 自定义权重 is None: raise ValueError("预设模式为'自定义'时必须提供自定义权重字典") # 构建自定义配置 config = _build_custom_config(自定义权重) else: raise ValueError(f"未知的预设模式: {预设模式}") # 计算综合强度分 # (需要适配矩阵形式的计算) strength_mtx = _calculate_strength_matrix(result, config) if 返回详细维度: return { "强度分": strength_mtx, "突破幅度分_向上": result['price_score_up_norm'], "突破幅度分_向下": result['price_score_down_norm'], "收敛度分": result['convergence_score_norm'], "成交量分": result['volume_score_norm'], "形态规则度分": result['geometry_score_norm'], "价格活跃度分": result['activity_score_norm'], "倾斜度分": result['tilt_score_norm'], } else: return strength_mtx ``` --- ### **4. 总结** 通过这个设计,你的函数系统实现了: 1. ✅ **标准化维度体系**: 6个维度统一标准化到[0,1],中位数=0.5,解决不可比性问题 2. ✅ **4种预设模式**: 等权/激进/保守/放量,快速适配不同策略需求 3. ✅ **自定义权重**: 支持灵活配置,满足高级用户需求 4. ✅ **详细维度输出**: 可选返回6个维度分数,支持多维度联合筛选 5. ✅ **Agent友好**: 函数参数清晰,知识卡片详细,方便Agent理解和使用 需要我帮你实现具体的代码修改吗?或者先生成完整的知识卡片JSON文件用于导入MongoDB?