Перейти к содержанию

Operations and Rollout

Эта страница описывает runtime и calibration loop, которые позволяют развивать Signal Engine без увеличения шума в delivery.

Runtime Fingerprint

/health, /ready и /admin/api/settings возвращают runtime fingerprint:

Field Meaning
app_version Версия package/runtime из APP_VERSION или package metadata.
commit_sha Build commit из APP_COMMIT_SHA, GitHub SHA или локального git rev-parse.
build_time Build timestamp из APP_BUILD_TIME, BUILD_TIME или unknown.

Signal Cockpit показывает этот fingerprint в верхней status bar после первого запроса settings. Используйте его, чтобы проверить, какой commit создал Telegram alert или admin row.

Docker builds могут передавать:

docker build \
  --build-arg APP_VERSION=0.1.0 \
  --build-arg APP_COMMIT_SHA="$(git rev-parse --short=12 HEAD)" \
  --build-arg APP_BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  -t tinvest-signal-engine .

CI

.github/workflows/ci.yml запускается на pushes, pull requests и manual dispatch:

python -m pytest -q
node --check src/tinvest_signal_engine/static/admin_app.js
python -m mkdocs build --strict
cp .env.example .env
docker compose config --quiet
docker build \
  --build-arg APP_COMMIT_SHA="${GITHUB_SHA}" \
  --build-arg APP_BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
  -t tinvest-signal-engine:ci .
docker run --rm tinvest-signal-engine:ci python -c "from tinvest_signal_engine.runtime_info import runtime_fingerprint; from tinvest_signal_engine.services.api import create_app; app = create_app(); print(app.title, runtime_fingerprint())"

.github/workflows/docs.yml отвечает за GitHub Pages deployment из main.

Delivery Policy v3

Delivery v3 сохраняет storage-first rule: detector и enrichment сохраняют signals, а delivery решает, что может выйти из системы наружу.

Каждый signal payload получает дополнительную read-only metadata:

Field Values
delivery_priority high, medium, low.
delivery_channel realtime для доставленных alerts, digest для digest candidates, admin_only для suppressed/admin-only signals.
delivery_explanation_ru Человекочитаемое русское объяснение решения.

/admin/api/delivery/simulation dry-runs candidate policy поверх сохраненных signals. Endpoint не обновляет payloads и не отправляет Telegram/webhook messages.

Simulation presets:

Preset Purpose
current Повторяет активные runtime delivery settings.
conservative Поднимает quality floor, чтобы проверить более строгий Telegram gate.
admin_only_rollout Принудительно переводит experimental rollout types в admin_only, даже если текущие env rules продвигают их выше.

SIGNAL_DELIVERY_TYPE_RULES_JSON можно использовать для явного per-type promotion или holdback:

{
  "candle_range_spike": { "admin_only": true },
  "aggressive_trade_burst": { "channel": "digest", "min_quality": 75 },
  "obi_dynamics": { "always": true }
}

Используйте always только после feedback/accuracy review: это продвигает тип в realtime. channel=digest оставляет signal вне realtime Telegram, но помечает его как digest candidate в admin analytics.

Feedback Loop

/admin/api/feedback/overview агрегирует существующие admin feedback labels и не требует отдельной migration для чтения summary:

  • totals по useful/noise/unsure;
  • type x delivery x feedback;
  • ticker x delivery x feedback;
  • delivered signals, отмеченные как noise;
  • suppressed signals, отмеченные как useful.

Используйте страницу Feedback перед изменением thresholds. Useful suppressed signal - кандидат на digest или realtime review; noisy delivered signal - кандидат на более строгую delivery policy.

Source Health

/admin/api/source-health объединяет conf/instruments.yaml, detector config и ClickHouse raw-event freshness.

Для каждого instrument endpoint показывает availability последних trade, last_price, orderbook, candle, trading_status и open_interest. Также он объясняет, почему signal type сейчас невозможен:

Reason Meaning
source_not_subscribed Required source не включен для instrument.
source_stale Source настроен, но recent raw events не найдены.
source_unknown ClickHouse недоступен или не настроен.
config_disabled Detector config отключает signal type.

Если ClickHouse недоступен, endpoint возвращает status=unknown, а admin остается usable.

Accuracy Job

scripts/duckdb_label_signals.py может сформировать admin accuracy JSON:

python scripts/duckdb_label_signals.py \
  --signals var/exports/signals.csv \
  --bars var/exports/bars.csv \
  --forward-bars 1,5,15 \
  --output var/accuracy/signal_accuracy.json

Report группирует forward VWAP metrics по signal type, ticker, quality tier и delivery status. /admin/api/accuracy читает SIGNAL_ACCURACY_JSON_PATH; если файла нет, endpoint возвращает empty state вместо ошибки страницы.

Controlled Rollout

Новые или ранее отключенные signals должны начинаться как storage/admin-only data:

Stage Signal type Initial channel
1 candle_range_spike на 5-10 liquid TQBR instruments с включенными candles admin_only
2 obi_dynamics на core equities/futures со стабильным orderbook admin_only
3 open_interest_spike только для futures с реальными source data admin_only
4 aggressive_trade_burst на самых liquid instruments admin_only
5 lead_lag_divergence только для явно настроенных pairs admin_only

Продвигайте signal из admin-only в digest или realtime только после того, как source health, feedback и accuracy data подтверждают изменение.