Tcmb Reserve Terminal
TCMB rezerv, swap, likidite ve altın hareketlerini EVDS 3'ten izleyen; müdahale sinyali üreten finansal istihbarat dashboard'u. Next.js + Fastify + PostgreSQL.
TCMB Rezerv & Müdahale Terminali
Türkiye Cumhuriyet Merkez Bankası'nın piyasa davranışını tek ekrandan izleyen finansal istihbarat dashboard'u
Rezervler · Net rezerv · Swap · Likidite · Altın ayrıştırması · Müdahale sinyalleri · AI yorumu
Ekran görüntüleri · AI yorum katmanı · Kurulum · EVDS tuzakları · Sinyal metodolojisi · API
</div><details> <summary><b>English summary</b></summary>⚠️ Önce bunu okuyun
TCMB'nin döviz ve altın işlemleri işlem bazında ve gerçek zamanlı olarak kamuya açıklanmamaktadır. Bu proje hiçbir koşulda tahmini bir işlemi kesin gerçek gibi göstermez.
Bu sistem demez Bunun yerine der ❌ "TCMB bugün 750 milyon USD sattı" ✅ "Döviz satış sinyali — güven 62/100" ❌ "Altın rezervi 40 ton azaldı" ✅ "İma edilen altın miktarı −40 ton (fiyata bölünerek tahmin edildi)" Her analitik çıktının altında kaynağı, yöntemi ve şu uyarı yer alır: "Bu gösterge doğrudan açıklanan TCMB işlem verisi değildir."
Yatırım tavsiyesi değildir. Bkz. Bilinen sınırlar.
A financial-intelligence dashboard that tracks the Central Bank of the Republic of Türkiye (CBRT/TCMB) reserves, swap stock, TL liquidity operations and gold, and derives analytical intervention signals from published data.
The CBRT does not publish transaction-level FX or gold operations. This project therefore never claims an intervention happened — it produces explicitly labelled signals with a documented, config-driven confidence score, and shows the source, series code, observation date and native frequency behind every number.
Data comes from EVDS 3 (evds3.tcmb.gov.tr/igmevdsms-dis). All 48 series codes
are verified against the live EVDS catalogue on every seed run.
📊 Ekran görüntüleri
AI yorumu — "grafiklerden bir şey anlamıyorum" diyenler için
Her ekranın başında, o ekrandaki verileri sade Türkçe ile açıklayan bir panel. Sayılar sistemden, cümleler dil modelinden — ve metindeki her sayı doğrulanmadan gösterilmez.

Overview — "Şu anda TCMB piyasada ne yapıyor?"
Tek ekranda rezerv yönü, sinyaller, likidite yorumu ve kaynak/tazelik bilgisi.

Rezervler
Brüt · döviz · altın · swap hariç net rezerv; değişimin kaynağına ayrıştırılması.

Döviz
USD/TRY ile rezervin aynı eksende karşılaştırılması, kur–rezerv ayrışma kontrolü.

Altın
Değişimin fiyat etkisi ve miktar etkisi olarak ayrıştırılması, resmî ons verisiyle çapraz kontrol.

Likidite
Net fonlama, bileşen kırılımı ve "TCMB bugün ne kadar TL verdi/çekti" yorumu.

TCMB İşlemleri
Repo/ters repo, döviz depo ihaleleri, swap stoku ve doğrulanmış işlem katmanı.

Müdahale Sinyalleri
Sinyal geçmişi ve sinyallerin rezerv/kur grafiği üzerinde işaretlenmesi.

Timeline
Resmî duyurular, yayın takvimi ve veriden türetilen olaylar — ayrı etiketlerle.

Ayarlar
API anahtarları, kaynak sağlığı, seri kataloğu, alarm kuralları ve dışa aktarma.

✨ Öne çıkan özellikler
| 🎯 Sinyal değil, gerekçe | Her sinyalin faktör kırılımı açılabilir: hangi faktör kaç puan kattı, neden. Ağırlıklar merkezî config'te. |
| 📐 Yöntemi görünür | Net rezerv ve altın ayrıştırması gibi hesaplanmış her metrik, yöntemini ve bilinen sınırlarını yanında taşır. |
| 🕐 "LIVE" yalanı yok | Haftalık veri "Haftalık veri" olarak etiketlenir. Her metrikte gözlem tarihi + son çekim zamanı gösterilir. |
| 🚫 Eksik veri ≠ 0 | Veri yoksa null döner, ekranda "veri yok" yazar. Grafikte boşluk boşluk kalır. |
| 🔍 Kaynak izlenebilir | Her sayının altında EVDS seri kodu ve metaveri bağlantısı. |
| 🛡️ Veri bütünlüğü koruması | EVDS'nin sessiz toplulaştırması tespit edilir ve bozuk veri yazılmaz (detay). |
| 📉 Değerleme etkisi ayrıştırılır | Altın fiyatı hareketi rezerv artışının ne kadarını açıklıyor? Sinyal skorunda ceza faktörü olarak kullanılır. |
| 🔔 Alarm sistemi | Rezerv düşüşü, sinyal seviyesi, net fonlama eşiği. Telegram/e-posta/push için kanal soyutlaması hazır. |
| 🤖 AI yorumu (doğrulamalı) | Gemini verileri sade Türkçe ile açıklar; metindeki HER sayı ve tarih sistem verisiyle karşılaştırılır. Eşleşmeyen varsa metin gösterilmez. |
| 🔑 Arayüzden anahtar girişi | API anahtarları Ayarlar ekranından girilir; kaydedilmeden önce canlı test edilir, AES-256-GCM ile şifreli saklanır. |
| 📤 Export | Her seri CSV/JSON; dosya başlığında veri modu belirtilir. |
| 🧪 165 test | Toplulaştırma tespiti, ayrıştırma matematiği, sinyal skoru, eksik veri davranışı. |
🚀 Kurulum
Gereksinimler: Node.js ≥ 20, Docker (PostgreSQL için), opsiyonel EVDS API anahtarı.
git clone https://github.com/<kullanici>/<repo>.git
cd <repo>
npm install
cp .env.example .env # Windows: copy .env.example .env
npm run db:up # PostgreSQL 16 + Redis (docker compose)
npm run build -w @tcmb/shared
npm run migrate # şema
npm run seed:series # seri kataloğunu EVDS'den doğrula (ANAHTAR GEREKTİRMEZ)
npm run collect -- --full # 5 yıllık geçmişi çek
npm run dev # API :4000 · Web :3000
Dashboard → http://localhost:3000
API anahtarı olmadan denemek
.env içinde DATA_MODE=mock bırakın. Sentetik veri üretilir ve ekranın üstünde
kalıcı bir "MOCK VERİ" bandı çıkar; her metriğin kaynağı "MOCK ÜRETİCİ — GERÇEK
VERİ DEĞİLDİR" olarak görünür, dışa aktarılan dosyaların başlığına da bu not düşülür.
Canlı veriye geçmek
- https://evds3.tcmb.gov.tr → üye ol → Profilim → API Key
.env:EVDS_API_KEY=...veDATA_MODE=livenpm run evds:verify→ servis tabanını ve anahtarı doğrularnpm run collect -- --full
<details> <summary><b>Port çakışması / Docker'sız PostgreSQL / Next.js .env notu</b></summary>Güvenlik:
EVDS_API_KEYyalnızca backend'de kullanılır. HiçbirNEXT_PUBLIC_*değişkenine konmaz, API cevaplarında yer almaz, frontend TCMB'ye doğrudan istek yapmaz..envve.evds-endpoint.json.gitignore'dadır.
Port: API_PORT varsayılanı 4000. Doluysa .env içinde hem API_PORT
hem NEXT_PUBLIC_API_BASE_URL değerini birlikte değiştirin:
API_PORT=4010
NEXT_PUBLIC_API_BASE_URL=http://localhost:4010
PostgreSQL: docker-compose.yml PostgreSQL'i 5433 portunda yayımlar (yerel
5432 ile çakışmasın diye). Kendi sunucunuzu kullanacaksanız yalnızca DATABASE_URL
yeterli.
Next.js: Next normalde sadece apps/web içindeki .env dosyalarını okur. Bu
projede apps/web/next.config.mjs monorepo kökündeki .env'i yükler; tek dosya
hem backend'i hem frontend'i besler.
Cannot find module './xxx.js' hatası: Dev sunucusu açıkken next build
çalıştırıldıysa .next bozulmuştur. Çözüm: rm -rf apps/web/.next && npm run dev:web
🏗️ Mimari
Frontend TCMB'ye hiç gitmez. Toplama işleri zamanlanmış çalışır, veri PostgreSQL'de durur, analiz motoru üzerine hesaplar.
TCMB EVDS 3 ──key: HTTP header──┐
▼
┌──────────────────────────────────────────┐
│ Data collector apps/api/collectors │ katalog senk. · frekans koruması
│ │ normalize · anomali tespiti
└────────────────────┬─────────────────────┘
▼
┌──────────────────────────────────────────┐
│ PostgreSQL │ observations · indicators
│ │ signals · timeline · alerts
└────────────────────┬─────────────────────┘
▼
┌──────────────────────────────────────────┐
│ Analytics engine apps/api/analytics │ calculateNetReserves()
│ │ decomposeGoldChange()
│ │ InterventionAnalyzer
└────────────────────┬─────────────────────┘
▼
┌──────────────────────────────────────────┐
│ AI katmanı apps/api/ai │ olgu özeti → Gemini
│ │ → sayı/tarih/iddia doğrulaması
└────────────────────┬─────────────────────┘
▼
┌──────────────────────────────────────────┐
│ REST API (Fastify) → Next.js dashboard │
└──────────────────────────────────────────┘
packages/shared Tipler · EVDS seri kayıt defteri · sinyal ağırlıkları · biçimlendirme
apps/api Fastify API · collector'lar · analytics · scheduler · testler
apps/web Next.js 15 App Router · Tailwind · Recharts
docs/screenshots Arayüz görüntüleri
<details>
<summary><b>Veritabanı şeması</b></summary>
| Tablo | Amaç |
|---|---|
data_sources | Kaynak sağlığı: son başarılı fetch, HTTP durumu, OK/DEGRADED/FAILED |
economic_series | Seri metaverisi: kod, veri grubu, birim, unit_confirmed, frekans |
observations | Gözlemler. value NULL = "veri yok", 0 değil. (series_id, date) tekil |
observation_revisions | TCMB bir değeri revize ederse eski değer burada saklanır |
calculated_indicators | Türetilmiş seriler + yöntem + güven skoru |
intervention_signals | Sinyaller + faktör kırılımı (JSONB) |
timeline_events | Olaylar; derived alanı resmî/türetilmiş ayrımını taşır |
alert_rules / alert_events | Alarm kuralları ve tetiklenmeleri |
collection_runs | Toplama denetim kaydı |
Migration: bağımlısız SQL çalıştırıcı (npm run migrate), schema_migrations tablosu.
| Cron | Ne zaman | İş |
|---|---|---|
15 9,12,16,18 * * 1-5 | Hafta içi gün içi | İş günü serileri + analiz + alarm |
35 14 * * 4 | Perşembe 14:35 | Haftalık rezerv yayını (yayın 14:30) |
30 15 * * 4 | Perşembe 15:30 | Gecikmeli yayına karşı ikinci deneme |
45 14 8-13 * * | Ayın 8–13'ü | Aylık IRFCL |
0 3 * * 0 | Pazar 03:00 | Katalog senkronizasyonu (kod/birim değişiklikleri) |
0 4 1 * * | Ayın 1'i | 5 yıllık tam geçmiş tazeleme (revizyon yakalama) |
Yatay ölçeklemede scheduler yalnızca tek örnekte açık olmalıdır
(SCHEDULER_ENABLED=false).
🤖 AI yorum katmanı
"Bu grafikler iyi güzel de ben çok bir şey anlamıyorum."
Her ekranın başında, o ekrandaki verileri sade Türkçe ile açıklayan bir panel var. Ayrıca serbest soru sorulabilen bir kutu.
Temel ilke: sayılar sistemden, cümleler modelden
Dil modeli veri kaynağı değildir. Veri tabanına, EVDS'ye ya da internete erişmez. Yalnızca sistemin hesapladığı bir olgu özeti görür ve onu anlatır.
snapshot → olgu özeti (facts + bağlam) → Gemini → DOĞRULAMA → önbellek → arayüz
│
└─ geçemezse → kural tabanlı yedek
Üç katmanlı doğrulama
Model akıcı ama yanlış üretebilir. Bu yüzden çıktı, kullanıcıya ulaşmadan önce üç denetimden geçer:
| Denetim | Ne yakalar | Canlı testte yakalanan gerçek örnek |
|---|---|---|
| Sayı | Olgu kümesinde bulunmayan her sayı | Modelin kendi hesapladığı "bir hafta önce 164.448 milyon USD idi" |
| Tarih | Sisteme verilmemiş her tarih | Model "3 Eylül'de açıklanacak" dedi; gerçek yayın 20 Ağustostu |
| İddia | Kesinlik bildiren ifadeler | "TCMB 750 milyon USD sattı", "müdahale etti" |
Sayı denetimi birim ölçeğini bilir: sistem 178366 milyon USD tutarken model
"178,4 milyar USD" yazabilir — kabul edilir; "185 milyar" edilmez. Sıra sayıları
("33. Hafta"), gün sayıları ("son 7 günde") ve skor paydası ("70/100") veri
sayılmaz; bunlar denetim dışıdır.
Doğrulamayı geçemeyen metin kullanıcıya gösterilmez. Yerine kural tabanlı (şablon) özet konur ve neden düşüldüğü ekranda yazar. Reddedilen metin denetim izi olarak saklanır ama önbellekten bir daha servis edilmez.
Kural tabanlı yedek
Anahtar yoksa, model çağrısı başarısızsa ya da doğrulama düşerse devreye giren tamamen deterministik özet. Daha az akıcıdır ama sayıları doğrudan sistemden alır — yani en kötü durumda kullanıcı daha sade bir metin görür, asla yanlış bir sayı görmez.
Maliyet kontrolü
Yorumlar veri durumunun parmak izine göre önbelleklenir: veri değişmediyse model tekrar çağrılmaz. Yeni haftalık rezerv verisi geldiğinde parmak izi değişir ve yorum kendiliğinden tazelenir.
Kurulum
Ayarlar ekranından ya da .env üzerinden:
GEMINI_API_KEY=...
GEMINI_MODEL=gemini-2.5-flash
Anahtar yoksa dashboard tam olarak çalışmaya devam eder; yalnızca yorumlar şablonla üretilir.
🔑 API anahtarlarının arayüzden yönetimi

Ayarlar ekranından hem EVDS hem Gemini anahtarı girilebilir.
| Önlem | Nasıl |
|---|---|
| Şifreli saklama | AES-256-GCM. Şifreleme anahtarı SETTINGS_SECRET ortam değişkeninden ya da .settings-key dosyasından gelir (gitignore'da). Veritabanı yedeği tek başına anahtarları açığa çıkarmaz. |
| Geri dönmez | API ham anahtarı ASLA döndürmez; yalnızca son 4 karakteri maskelenmiş hâlde gösterilir. |
| Kaydetmeden önce test | Anahtar önce gerçek servise sorulur (EVDS: seri isteği, Gemini: model listesi). Çalışmayan anahtar kaydedilmez. |
| Yazma koruması | ADMIN_TOKEN tanımlıysa x-admin-token başlığı zorunlu. Tanımlı değilse yazma uçları yalnızca localhost'tan çalışır. |
⚠️ API'yi dışarı açacaksanız
ADMIN_TOKENtanımlamanız zorunludur. Aksi hâlde anahtar yazma uçları uzak isteklere kapalı kalır (403 döner).
Öncelik sırası: Ayarlar ekranından girilen değer > .env dosyası. Hangi
kaynağın aktif olduğu ekranda rozetle gösterilir.
⚠️ EVDS entegrasyonunda üç tuzak
Kendi EVDS entegrasyonunuzu yazacaksanız bu bölüm projenin en değerli kısmıdır. Üçü de canlı veriyle çalışırken yakalandı ve üçü de sessizce yanlış veri üretiyor.
1. EVDS 2 kapatıldı — internetteki tüm örnekler ölü
TCMB duyurusu #1006 (09.02.2026): EVDS 2, 20 Şubat 2026'da sonlandırıldı.
- https://evds2.tcmb.gov.tr/service/evds/... → 302, JSON yerine HTML döner
+ https://evds3.tcmb.gov.tr/igmevdsms-dis/... → güncel
Anahtar URL'de değil, key HTTP başlığında gönderilir (duyuru #195, Nisan 2024).
curl -H "key: $EVDS_API_KEY" \
"https://evds3.tcmb.gov.tr/igmevdsms-dis/series=TP.AB.TOPLAM&startDate=01-01-2026&endDate=18-08-2026&type=json"
Anahtar gerektirmeyen uçlar (bu projede katalog ve timeline için kullanılır):
| Uç | İçerik |
|---|---|
/serieList/fe/type=json&code=<grup> | Gruptaki seri kodları, adları, frekansları |
/categories/withDatagroups/type=json | Veri grubu metaverisi (birim, kaynak, metaveri linki) |
/announcements | TCMB EVDS duyuruları |
/calendar/yillikYayinlar | Resmî veri yayım takvimi (tarih + saat) |
Bu projede eski URL hard-code edilmemiştir; npm run evds:verify aday tabanları
gerçek anahtarla dener ve çalışanı kaydeder.
2. Farklı frekanslar aynı istekte → sessiz toplulaştırma
Tek istekte farklı frekanstaki seriler sorulduğunda EVDS cevabın tamamını en düşük frekansa indirger ve satırları dönem-sonu tarihiyle etiketler. Uyarı yok, cevapta bunu belirten bir alan yok.
| İstenen | Aynı istekteki seri | Dönen veri | Sonuç |
|---|---|---|---|
TP.APIFON3 (iş günü) | TP.AB.TOPLAM (haftalık) | Haftalık, Cuma etiketli | Son gözlem 2026-08-21 — gelecek tarih |
TP.DK.USD.S.YTL (günlük) | TP.REZVARPD.* (aylık) | Aylık, ay-sonu | 5 yılda 1826 yerine 61 gözlem |
TP.ALTINPIYASA.KAP03 (iş günü) | aynı | Aylık | Altın fiyatı iki rezerv gözlemi arasında hiç değişmedi |
Son satırın etkisi kritikti: fiyat sabit görünürse altın rezervindeki tüm artış "miktar etkisi" sayılır ve sistem sahte bir ALTIN ALIM SİNYALİ üretir (güven 71/100). Frekans düzeltildikten sonra aynı dönem için doğru sonuç ALTIN SATIŞ SİNYALİ çıktı — yani toplulaştırma sinyalin yönünü ters çevirmişti.
3. 1000 satır tavanı — en eski uçtan sessizce keser
Tek cevapta azami 1000 satır döner; fazlası baştan kırpılır. 5 yıllık günlük seri istendiğinde son ~4 yıl gelir, gerisi sessizce kaybolur.
Bu projedeki üç katmanlı savunma
apps/api/src/collectors/frequency-guard.ts
- Frekansa göre gruplama — istekler yalnızca aynı frekanstaki serileri içerir.
- Zaman penceresi bölme — 1000 satır tavanına çarpılmaması için aralık frekansa göre pencerelere bölünür.
- Doğrulama — cevaptaki gözlem aralığı beklenenden 2 kat kabaysa veya bugünden ileri tarihli gözlem varsa veri yazılmaz, toplama hatası olarak raporlanır.
| Öncesi | Sonrası | |
|---|---|---|
| 5 yıllık toplama | 5.624 satır | 55.308 satır |
| Seri frekansları | haftalık/aylığa çökmüş | her seri kendi doğal frekansında |
| Gelecek tarihli gözlem | var | yok |
📚 Veri serileri
48 seri kodunun tamamı canlı EVDS kataloğundan doğrulanmıştır.
npm run seed:series her çalıştığında registry EVDS ile karşılaştırılır; bir kod
bulunamazsa katalog uyumsuzluğu olarak raporlanır ve komut çıkış kodu 2 döner.
Rezervler — bie_abres2 · haftalık (Cuma) · milyon USD · yayın Perşembe 14:30
| Seri kodu | Ad | Beslediği metrik |
|---|---|---|
TP.AB.TOPLAM | Toplam rezerv | Brüt rezerv, rezerv grafiği, net rezerv, FX sinyali |
TP.AB.C2 | Döviz | Döviz rezervi kartı, döviz paneli, FX sinyali |
TP.AB.C1 | Altın | Altın rezervi kartı, altın paneli, altın sinyali |
Swap — bie_swaptektarf · iş günü · milyon USD
| Seri kodu | Ad |
|---|---|
TP.SWAPTEKTAR.TOTALSTOKALIMYONLU | Toplam swap stoku (alım yönlü) → swap hariç net rezerv |
TP.SWAPTEKTAR.TOTALSTOKSATIMYONLU | Toplam swap stoku (satım yönlü) |
TP.SWAPTEKTAR.SWAPKUSDTUTAR | Döviz karşılığı TL swap piyasası (günlük işlem) |
TP.SWAPTEKTAR.SWAPKSTOKUSDTUTAR | Aynı piyasa — stok |
TP.SWAPTEKTAR.SWAPASTOKUSDTUTAR | TL karşılığı altın swap — stok |
TP.SWAPTEKTAR.SWAPDSTOKUSDTUTAR | Döviz karşılığı altın swap — stok |
Likidite / APİ — bie_apifon · iş günü · milyon TL
| Seri kodu | Ad |
|---|---|
TP.APIFON3 | TCMB Net Fonlama (A−B) |
TP.APIFON1.TOP / .IHA / .KOT.T | Toplam / ihale / kotasyon fonlaması |
TP.APIFON1.KOT.A | BİST O/N + kotasyon + PY repo → repo kartı |
TP.APIFON1.KOT.B / .KOT.C | TL depo / GLP depo-repo |
TP.APIFON2.TOP | Toplam sterilizasyon → ters repo kartı |
TP.APIFON2.IHA / .KOT / .LIK | Sterilizasyon kırılımı |
TP.APIFON4 | Ağırlıklı ortalama fonlama maliyeti |
Diğer
| Seri kodu | Veri grubu | Ad |
|---|---|---|
TP.RP01.MYR … TP.RP04.MKT | bie_rtrnr | Repo / ters repo (müşteri + mali kuruluş) |
TP.PPIBSM / TP.PPIGBTL | bie_ppibsm | Bankalar serbest mevduatı / gün başı likidite |
TP.FXSWAP01 … 03 | bie_fxswap | TL karşılığı döviz depo ihaleleri |
TP.AB.A02 / A10 / A11 / A14 / A24 / A19 | bie_abanlbil | Analitik bilanço (TL) |
TP.REZVARPD.K11 | bie_ulusdovlkd | Altın — milyon saf troy ons (ton hesabı) |
TP.REZVARPD.K10 / K1 / K2, TP.DOVVARNC.K14 | bie_ulusdovlkd | IRFCL çapraz kontrol kalemleri |
TP.DK.USD.S.YTL / .A.YTL, TP.DK.EUR.S.YTL, TP.DK.EUR.C.YTL | bie_dkdovytl | Kurlar |
TP.ALTINPIYASA.KAP03 | bie_altinbistbul | Altın kapanış USD/ons (BİST) |
TP.ALIM.USD / TP.SATIM.USD | bie_dovefmud | Doğrudan müdahaleler — ARŞİV |
EVDS'nin BIRIMI alanı seri değil, veri grubu birimidir ve gruptaki her seri
için geçerli olmayabilir:
bie_apifon→"milyon TL ve yüzde"(iki farklı birim bir arada)bie_ulusdovlkd→"milyon ABD doları"amaTP.REZVARPD.K11ons cinsinden
Bu yüzden gösterilen birim her zaman seri bazlı registry birimidir; EVDS grup
birimi yalnızca doğrulama için kullanılır. Eşleşmeyen seriler unit_confirmed = false ile işaretlenir ve arayüzde * ile gösterilir (48 serinin 11'i). Hiçbir
seriye yanlış birim yapıştırılmaz.
🧮 Analytics
Net rezerv — iki yöntem, iki güven seviyesi
TCMB "net rezerv" diye tek bir seri yayımlamaz.
Yöntem 1 — gross_minus_swap (varsayılan, güven 85)
Swap Hariç Rezerv = TP.AB.TOPLAM − TP.SWAPTEKTAR.TOTALSTOKALIMYONLU
Her iki girdi de milyon USD → kur dönüşümü varsayımı yok. Swap iş günü, rezerv
haftalık olduğundan swap değeri rezerv tarihine as-of hizalanır; swap verisi
bulunamazsa gözlem null bırakılır (brüt değer "net" gibi gösterilmez).
Sınır: bankaların TCMB nezdindeki döviz mevduatı düşülmez — bu yüzden dar tanımlı NUR ile birebir aynı değildir. Metriğin adı bu yüzden "Swap Hariç Rezerv"dir.
Yöntem 2 — analytical_balance_sheet (deneysel, güven 45, varsayılan kapalı)
Yaklaşık Net Rezerv = (TP.AB.A02 − TP.AB.A10) ÷ USD/TRY
Analitik bilanço TL cinsindendir; tüm döviz kalemlerinin USD olduğu varsayılır — EUR, altın ve SDR nedeniyle sistematik sapma taşır. Seviye olarak değil, eğilim göstergesi olarak okunmalıdır.
Altın — fiyat mı, miktar mı?
Q_t = V_t / P_t (ima edilen miktar, milyon ons)
Fiyat etkisi = Q₀ × (P₁ − P₀)
Miktar etkisi = (Q₁ − Q₀) × P₁
ΔV = Fiyat etkisi + Miktar etkisi (tam olarak toplanır — testle doğrulanır)
Aylık resmî ons verisiyle çapraz kontrol edilir; sapmaya göre güven 85/75/60/40 olarak ayarlanır. Fiyat verisi yoksa ayrıştırma yapılmaz ve nedeni yazılır.
🎯 Müdahale sinyali nasıl hesaplanır
confidence = clamp( Σ ( maxWeight_i × f_i ) , 0 , 100 )
f_i = clamp( value_i / scale_i , 0 , 1 )
Ağırlıklar packages/shared/src/signal-config.ts içinde; analiz motorunda sabit
sayı yoktur.
| Faktör | Ağırlık | Tam puan eşiği |
|---|---|---|
| Doğrudan açıklanan TCMB satış verisi | +40 | 1.000 mn USD |
| Döviz rezervindeki azalış | +20 | −3.000 mn USD |
| Swap hariç net rezerv azalışı | +15 | −2.500 mn USD |
| Swap stokundaki artış (maskeleme) | +10 | +2.000 mn USD |
| USD/TRY yükselişi | +10 | +%1,5 |
| Net fonlama artışı (TL çekilmesi) | +10 | +150.000 mn TL |
| Bankalar döviz mevduatındaki azalış | +5 | 20 mr bin TL |
| Veri gecikmesi cezası | −10 | beklenen gecikme + 14 gün |
| Değerleme etkisi cezası | −10 | değişimin %100'ü fiyattan |
Seviyeler: <25 NORMAL · 25–44 DİKKAT · 45–64 SİNYAL · ≥65 GÜÇLÜ SİNYAL
Güvenin yapısal üst sınırı — bilinçli bir tercih
direct_transaction faktörü yalnızca TCMB'nin doğrudan açıkladığı işlem verisi
varsa puan üretir. Bu veri grubu (bie_dovefmud) arşiv durumunda olduğundan
pratikte ulaşılabilir azami güven ~65'tir.
Doğrudan işlem verisi olmadan %90 güven iddia etmek kullanıcıyı yanıltmak olurdu. Veri gelirse sinyal otomatik olarak "DOĞRULANMIŞ İŞLEM VERİSİ" etiketine ve GÜÇLÜ seviyeye yükselir.
Altın sinyalinde de aynı ilke: miktar ölçülmediği (fiyata bölünerek ima edildiği) için −15 puanlık yapısal belirsizlik cezası her zaman uygulanır.
🔌 API endpointleri
Tüm cevaplar ortak zarf kullanır:
{
"data": { /* ... */ },
"meta": {
"generatedAt": "2026-08-18T14:30:00.000Z",
"dataMode": "live",
"oldestObservationDate": "2025-08-18",
"warnings": ["Veri güncellenemedi (TCMB EVDS) — son başarılı çekim: ..."]
}
}
Her metrik value · unit · freshness (gözlem tarihi + frekans + etiket + bayat
mı) · source (ad + seri kodu + veri grubu + metaveri linki) taşır.
| Endpoint | Açıklama |
|---|---|
GET /api/overview | Tek ekran özeti |
GET /api/reserves · /api/reserves/history?range= | Rezervler + net rezerv yöntemi |
GET /api/fx · /api/gold · /api/liquidity · /api/swaps · /api/operations | Panel verileri |
GET /api/signals · /api/interventions | Güncel + geçmiş sinyaller |
GET /api/timeline | Olay zaman çizelgesi |
GET /api/history?keys=&from=&to= | Çoklu seri + sinyal işaretleri |
GET /api/series/:key | Tekil seri |
GET /api/export?format=csv|json&keys= | Dışa aktarma |
GET /api/data-quality | Kaynak sağlığı + seri kataloğu + toplama kayıtları |
GET/POST/PATCH/DELETE /api/alerts | Alarm kuralları |
GET /api/ai/commentary?scope= | Sade dille yorum (overview/reserves/gold/liquidity/signals) |
POST /api/ai/ask | Ekrandaki veriye serbest soru |
GET /api/settings/keys | Anahtar durumu (maskeli; ham değer dönmez) |
PUT/DELETE /api/settings/keys/:key · POST .../test | Anahtar kaydet / sil / test et |
POST /api/admin/collect | Toplama zincirini elle tetikle |
range: 1w · 1m · 3m · 6m · 1y · 3y · max
🧪 Testler
npm test
165 test / 9 dosya — vitest.
| Dosya | Kapsam |
|---|---|
evds/normalize.test.ts | Sayı/tarih ayrıştırma, eksik veri ≠ 0, aynı tarihin iki kez gelmesi, seri kodu değişikliği, anomali tespiti |
collectors/frequency-guard.test.ts | Sessiz toplulaştırma tespiti, gelecek tarihli gözlem, 1000 satır tavanına göre pencere bölme |
collectors/collector.test.ts | URL sınırı bölme, frekans takvimi, mock determinizmi, arşiv serisinde veri uydurmama, birim doğrulama |
analytics/reserves.test.ts | As-of hizalama, net rezerv (iki yöntem), eksik swapta null, rezerv atıfı |
analytics/gold.test.ts | Fiyat + miktar etkisi toplamının değişime tam eşitliği, fiyat yokken hesaplamama, çapraz kontrol |
analytics/intervention.test.ts | Stres/ayna senaryoları, skorun faktör toplamına eşitliği, gecikme/değerleme cezaları |
ai/verifier.test.ts | Halüsinasyon yakalama: uydurma sayı, modelin kendi hesapladığı türev, uydurma yayın tarihi, kesinlik iddiası; ölçek/sıra sayısı/skor paydası yanlış alarmları |
ai/brief.test.ts | Olgu özeti üretimi, parmak izi kararlılığı, gösterilmeyen tarihin izinli listeye girmemesi, yedek özetin kendi doğrulayıcısından geçmesi |
routes/routes.test.ts | Uçtan uca API (DB taklitli): zarf yapısı, freshness'ın asla "LIVE" olmaması, eksik veride null |
🚫 Bilinen sınırlar — ne HESAPLANAMAZ
| Soru | Durum |
|---|---|
| "TCMB bugün kaç dolar sattı?" | Hesaplanamaz. İşlem bazlı veri açıklanmıyor; bie_dovefmud arşivde. Sistem yalnızca sinyal üretir. |
| "Rezervlerin USD/EUR kırılımı ne?" | Hesaplanamaz. Haftalık para birimi kompozisyonu yayımlanmıyor. Dashboard bunun yerine EUR/USD parite etkisini gösterir. |
| "Altın rezervi kaç ton?" (haftalık) | İma edilir, ölçülmez. Aylık resmî ons ile çapraz kontrol edilir, sapma gösterilir. |
| "Net uluslararası rezerv (dar tanım)" | Kısmen. Varsayılan yöntem swap düzeltmesi yapar, banka döviz mevduatını düşmez. |
| "TCMB bugün gün içinde kaç TL fonladı?" | Yaklaşık. Net fonlamadaki günlük değişim; gün içi brüt toplam ayrı yayımlanmaz. |
| "Bu sinyal kesin mi?" | Hayır. Hiçbir sinyal kesin değildir. |
Sistemin asla yapmadıkları
- Eksik veriyi 0 kabul etmez →
nulldöner, ekranda "veri yok" yazar - API hatasını veri gibi göstermez → eski veriyi gösterir + "Veri güncellenemedi" uyarısı
- Haftalık veriyi "LIVE" diye etiketlemez → rozette "Haftalık veri" yazar
- Tahmini müdahaleyi kesin işlem olarak sunmaz
- Rezerv düşüşünü doğrudan "TCMB dolar sattı" diye yorumlamaz
- Swap ve değerleme etkilerini yok saymaz — ikisi de sinyal skorunda ceza üretir
📄 Lisans
Veri kaynağı: TCMB EVDS ve Borsa İstanbul (EVDS üzerinden). Veriler ilgili kurumlara aittir; bu proje yalnızca kamuya açık veriyi işler ve görselleştirir.
⚖️ Sorumluluk reddi
Bu yazılım eğitim ve analiz amaçlıdır, yatırım tavsiyesi değildir. Üretilen tüm müdahale sinyalleri, yayımlanan verilerden hesaplanan analitik tahminlerdir ve TCMB'nin gerçekleştirdiği işlemleri temsil etmez. Kararlarınızın sorumluluğu size aittir.