- Add scripts/scoring/ module with normalizer, sensitivity analysis, and config - Enhance stock_viewer.html with standardized scoring display - Add integration tests and normalization verification scripts - Add documentation for standardization implementation and usage guides - Add data distribution analysis reports for strength scoring dimensions - Update discussion documents with algorithm optimization plans
637 lines
26 KiB
Markdown
637 lines
26 KiB
Markdown
让我查看一下 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? |