🔍 信号分析查询手册

本手册包含了用于投资组合信号分析的专业 SQL 查询。这些查询可以帮助您诊断策略信号的质量和合理性。

💡 使用提示

点击每个查询右上角的 "📋 复制 SQL" 按钮,即可复制完整的查询语句到剪贴板

📋 数据说明

  • 主数据表: trade_signals - 包含所有交易信号数据
  • 信号类型: B(买入) | S(卖出) | H(持有) | E(空仓)
  • 数据字段: date(日期) | symbol(股票代码) | signal(信号类型)

🏥 信号健康检查

快速诊断数据质量,检查数据完整性、记录数量、时间范围和信号有效性。

-- 信号数据健康检查
WITH health_metrics AS (
    SELECT
        COUNT(*) as total_records,
        COUNT(DISTINCT symbol) as symbol_count,
        COUNT(DISTINCT date) as date_count,
        MIN(date) as start_date,
        MAX(date) as end_date,
        COUNT(CASE WHEN signal NOT IN ('B','S','H','E') OR signal IS NULL THEN 1 END) as invalid_signals
    FROM trade_signals
)
SELECT
    '数据规模' as check_item,
    total_records || ' records, ' || symbol_count || ' symbols' as result,
    CASE WHEN total_records > 0 THEN '✅ 正常' ELSE '❌ 无数据' END as status
FROM health_metrics
UNION ALL
SELECT
    '时间范围',
    start_date || ' to ' || end_date || ' (' || date_count || ' days)',
    CASE WHEN date_count > 0 THEN '✅ 正常' ELSE '❌ 无数据' END
FROM health_metrics
UNION ALL
SELECT
    '信号有效性',
    CASE WHEN invalid_signals = 0 THEN 'All signals are valid (B/S/H/E)'
         ELSE invalid_signals || ' invalid signals found' END,
    CASE WHEN invalid_signals = 0 THEN '✅ 正常' ELSE '❌ 发现无效信号' END
FROM health_metrics;

🔄 信号切换逻辑检查

检测不符合交易逻辑的信号切换,识别异常的买卖时机。

正常切换逻辑:

  • 标准流程: E → B → H → S → E
  • 定投场景: H → B (继续加仓)
  • 必须卖出: H → E 必须经过 S
-- 信号切换逻辑验证
WITH signal_transitions AS (
    SELECT
        date,
        symbol,
        signal as current_signal,
        LAG(signal) OVER (PARTITION BY symbol ORDER BY date) as prev_signal
    FROM trade_signals
),
transition_analysis AS (
    SELECT
        prev_signal || ' → ' || current_signal as transition,
        COUNT(*) as count,
        CASE
            -- 异常切换
            WHEN prev_signal = 'H' AND current_signal = 'E' THEN '❌ 异常: 持有直接空仓(应经过卖出)'
            WHEN prev_signal = 'B' AND current_signal = 'S' THEN '❌ 异常: 买入直接卖出'
            WHEN prev_signal = 'E' AND current_signal = 'S' THEN '❌ 异常: 空仓时卖出'
            WHEN prev_signal = 'S' AND current_signal = 'B' THEN '❌ 异常: 卖出直接买入'
            -- 正常切换
            WHEN prev_signal = 'E' AND current_signal = 'B' THEN '✅ 正常: 空仓买入'
            WHEN prev_signal = 'B' AND current_signal = 'H' THEN '✅ 正常: 买入后持有'
            WHEN prev_signal = 'H' AND current_signal = 'S' THEN '✅ 正常: 持有后卖出'
            WHEN prev_signal = 'S' AND current_signal = 'E' THEN '✅ 正常: 卖出后空仓'
            WHEN prev_signal = 'H' AND current_signal = 'B' THEN '✅ 正常: 定投加仓'
            WHEN prev_signal = current_signal THEN '⚪ 无变化: 状态保持'
            ELSE '❓ 其他: ' || prev_signal || ' → ' || current_signal
        END as logic_check
    FROM signal_transitions
    WHERE prev_signal IS NOT NULL
    GROUP BY prev_signal, current_signal
)
SELECT
    transition,
    count,
    ROUND(count * 100.0 / (SELECT SUM(count) FROM transition_analysis), 2) as percentage,
    logic_check
FROM transition_analysis
WHERE count > 0
ORDER BY
    CASE WHEN logic_check LIKE '❌%' THEN 1
         WHEN logic_check LIKE '❓%' THEN 2
         WHEN logic_check LIKE '✅%' THEN 3
         ELSE 4 END,
    count DESC
LIMIT 50;

📊 信号分布分析

分析策略的交易特征和风格,了解主动交易与被动持仓的比例。

-- 信号分布和策略特征分析
WITH signal_stats AS (
    SELECT
        signal,
        COUNT(*) as count,
        ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM trade_signals), 2) as percentage
    FROM trade_signals
    GROUP BY signal
),
activity_summary AS (
    SELECT
        SUM(CASE WHEN signal IN ('B', 'S') THEN count ELSE 0 END) as active_count,
        SUM(CASE WHEN signal IN ('H', 'E') THEN count ELSE 0 END) as passive_count,
        SUM(count) as total_count
    FROM signal_stats
)
SELECT
    signal || ' (' ||
    CASE
        WHEN signal = 'B' THEN 'Buy'
        WHEN signal = 'S' THEN 'Sell'
        WHEN signal = 'H' THEN 'Hold'
        WHEN signal = 'E' THEN 'Empty'
        ELSE 'Unknown'
    END || ')' as signal_type,
    count,
    percentage || '%' as percentage_str,
    CASE
        WHEN signal IN ('B', 'S') THEN '🔥 Active Trading'
        WHEN signal IN ('H', 'E') THEN '💤 Passive Holding'
        ELSE '❓ Unknown'
    END as activity_style
FROM signal_stats
UNION ALL
SELECT
    '--- 策略风格评估 ---',
    NULL,
    ROUND(active_count * 100.0 / total_count, 2) || '% Active, ' ||
    ROUND(passive_count * 100.0 / total_count, 2) || '% Passive',
    CASE
        WHEN active_count * 100.0 / total_count > 10 THEN '🔥 激进型策略'
        WHEN active_count * 100.0 / total_count > 2 THEN '⚖️ 平衡型策略'
        ELSE '💤 保守型策略'
    END
FROM activity_summary
ORDER BY count DESC NULLS LAST;

🕐 最近信号状态

查看最新的信号状态,了解当前策略的持仓情况。

-- 最近信号状态查询
SELECT
    date,
    symbol,
    signal,
    CASE
        WHEN signal = 'B' THEN '🟢 Buy'
        WHEN signal = 'S' THEN '🔴 Sell'
        WHEN signal = 'H' THEN '🟡 Hold'
        WHEN signal = 'E' THEN '⚪ Empty'
        ELSE '❓ Unknown'
    END as signal_status
FROM trade_signals
WHERE date >= (SELECT date(MAX(date), '-7 days') FROM trade_signals)
ORDER BY date DESC, symbol
LIMIT 30;

💡 使用技巧

  • 复制查询到 Datasette 的 SQL 编辑器中执行
  • 修改 WHERE 条件来筛选特定时间段或股票
  • 结合 GROUP BY 和聚合函数进行自定义统计
  • 使用 ORDER BY 对结果进行排序
  • 添加 LIMIT 控制返回的记录数量
logo策引
策引为个人开发的全球市场数据分析工具,通过付费方式开通使用权限,不构成公开服务。
本平台仅提供数据分析工具,不提供投资咨询、投资建议或任何交易信号。
所有分析结果、技术指标及AI生成内容仅供参考,不构成任何投资建议。
用户需遵守所在地区法律法规并独立判断并自主决策,承担所有投资风险。