feat: add standalone AI/Tech regime-change monitor tab
A new /regime tab scoring how far the AI/Tech bull regime has deteriorated toward a re-rating as a single 0-100 index with per-signal breakdown and a 7/30-day trend. Intentionally decoupled: nothing reads its output to gate or score trades — the daily-pipeline membership is scheduling only. - regime_monitor_service: price sub-scores (P1-P6 via Alpaca, like market_regime), VIX + HY credit spreads via a small FRED helper, weighted aggregation over available signals (missing source -> n/a, dropped from the denominator), one snapshot row/day, and a ~90-day history backfill by replaying the already-fetched series as-of each past day. - F1/F3 fundamentals proposed by the configured grounded LLM (reuses sentiment_provider_service config resolution), with a manual override + lock. - regime_snapshots table (migration 011); endpoints on the existing market router; admin-editable weights/threshold; standalone /regime page. Data needs: prices via Alpaca, VIX/credit via FRED (optional key — signals show n/a without it). No LLM needed for history. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
import apiClient from './client';
|
||||
import type { RegimeMonitor, RegimeConfig, RegimeFundamentals } from '../lib/types';
|
||||
|
||||
export function getRegimeMonitor() {
|
||||
return apiClient.get<RegimeMonitor>('regime/monitor').then((r) => r.data);
|
||||
}
|
||||
|
||||
export function getRegimeConfig() {
|
||||
return apiClient.get<RegimeConfig>('regime/config').then((r) => r.data);
|
||||
}
|
||||
|
||||
export function updateRegimeConfig(updates: Partial<RegimeConfig>) {
|
||||
return apiClient.put<RegimeConfig>('regime/config', updates).then((r) => r.data);
|
||||
}
|
||||
|
||||
export function getRegimeFundamentals() {
|
||||
return apiClient.get<RegimeFundamentals>('regime/fundamentals').then((r) => r.data);
|
||||
}
|
||||
|
||||
export function updateRegimeFundamentals(body: {
|
||||
f1_score?: number;
|
||||
f3_score?: number;
|
||||
locked?: boolean;
|
||||
}) {
|
||||
return apiClient.put<RegimeFundamentals>('regime/fundamentals', body).then((r) => r.data);
|
||||
}
|
||||
|
||||
export function refreshRegimeFundamentals() {
|
||||
return apiClient
|
||||
.post<RegimeFundamentals>('regime/fundamentals/refresh')
|
||||
.then((r) => r.data);
|
||||
}
|
||||
Reference in New Issue
Block a user