Аналитика сигналов в Postgres¶
В таблице market_signals хранятся только срабатывания; сырой поток — в Kafka / ClickHouse. Ниже — практичные запросы для оценки пользы сигналов: плотность по типам, совместные события и разбор комбо.
Разбор комбо (microstructure_combo_*)¶
Комбо-сигналы содержат в payload_json объект combo_detail: флаги, начисленные баллы по компонентам и пороги. Пример: выбрать комбо за сутки с явным разбором вкладов.
SELECT
detected_at,
ticker,
signal_type,
payload_json->'combo_detail'->'points_awarded' AS points_awarded,
payload_json->'combo_detail'->'flags' AS flags,
(payload_json->'combo_detail'->'scores'->>'long')::int AS score_long,
(payload_json->'combo_detail'->'scores'->>'short')::int AS score_short
FROM market_signals
WHERE signal_type IN ('microstructure_combo_long', 'microstructure_combo_short')
AND detected_at > now() - interval '1 day'
ORDER BY detected_at DESC;
Фильтр «только комбо, где реально участвовали и спред, и дельта»:
SELECT *
FROM market_signals
WHERE signal_type = 'microstructure_combo_long'
AND (payload_json->'combo_detail'->'points_awarded'->>'spread')::int > 0
AND (payload_json->'combo_detail'->'points_awarded'->>'delta_long')::int > 0;
Совместность типов по инструменту (окно времени)¶
Сколько раз за час по тикеру встречались разные типы сигналов (признак «насыщенного» микроструктурного эпизода):
WITH w AS (
SELECT *
FROM market_signals
WHERE instrument_id = $1
AND detected_at > now() - interval '1 hour'
)
SELECT signal_type, count(*) AS n
FROM w
GROUP BY signal_type
ORDER BY n DESC;
Пары типов, попавшие в одно узкое окно (например 30 с) — для ручной проверки гипотез «A часто следует за B»:
SELECT
a.signal_type AS t1,
b.signal_type AS t2,
count(*) AS pair_count
FROM market_signals a
JOIN market_signals b
ON a.instrument_id = b.instrument_id
AND b.detected_at > a.detected_at
AND b.detected_at <= a.detected_at + interval '30 seconds'
AND a.signal_type < b.signal_type
WHERE a.detected_at > now() - interval '7 days'
GROUP BY 1, 2
ORDER BY pair_count DESC
LIMIT 30;
Качество и шум¶
Если в payload_json или в связанном слое обогащения пишется оценка качества (см. signal_enrichment / API), можно отфильтровать слабые срабатывания на стороне отчётов. Минимальный вариант без дополнительных колонок — по severity и по наличию combo_detail.points_awarded с ненулевыми полями.
Связь с ClickHouse¶
Для привязки сигнала к микросекундной ленте событий используйте instrument_id + интервал detected_at ± window_seconds и запросы к архиву сырых событий (см. sql/clickhouse/init/).