riskval 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+
2
+ .venv/
3
+ __pycache__/
4
+ *.pyc
5
+ dist/
6
+ build/
7
+ *.egg-info/
8
+ .pytest_cache/
9
+ .ruff_cache/
10
+ .coverage
@@ -0,0 +1,215 @@
1
+ # riskval — Agent Çalışma Talimatı
2
+
3
+ Bu dosya, `riskval` paketi üzerinde çalışan agent'ın sözleşmesidir. Kod yazmadan önce tamamını oku.
4
+
5
+ ---
6
+
7
+ ## 1. Misyon
8
+
9
+ Python'da **bakımlı, test edilmiş, düzenleyici doğrulama bataryası** yok. Bankaların model
10
+ risk yönetimi (MRM) ekipleri bu testleri her yıl Excel/SAS'ta yeniden yazıyor. `mlfinlab`
11
+ boşluğun bir kısmını dolduruyordu, kapalı kaynağa geçti. `riskval` bu vakumu dolduruyor.
12
+
13
+ Kapsam: **kredi riski PD kalibrasyon testleri + piyasa riski VaR/ES backtest'leri + Basel IRB
14
+ sermaye hesabı.** Bunların hepsi bir arada, doğrulanmış ve dokümante edilmiş.
15
+
16
+ Paket aynı zamanda bir araştırma makalesinin (P1) altyapısı: sentetik veriyle eğitilen kredi
17
+ modellerinin düzenleyici testlerden geçip geçmediğini ölçecek.
18
+
19
+ ---
20
+
21
+ ## 2. Pazarlık konusu olmayan kurallar
22
+
23
+ Bunları ihlal eden bir PR kabul edilmez.
24
+
25
+ 1. **Her istatistiksel test, yayımlanmış bir referans değere karşı unit test edilecek.**
26
+ Finansal bir pakette sayılara güven *tek* satın alma gerekçesidir. Referans yoksa
27
+ fonksiyonu yazma — önce referansı bul. Referans kaynakları için §5.
28
+ 2. **Tescilli veriye bağımlılık yok.** Bloomberg/Refinitiv gereken kod bu pakete girmez.
29
+ Testler sentetik veya kamuya açık veriyle çalışır.
30
+ 3. **Girdi `numpy` array veya `pandas` Series/DataFrame'dir.** Kendi veri sınıfını dayatma.
31
+ 4. **Bağımlılık minimum:** numpy, scipy, pandas. Başka bir şey eklemek için gerekçe yaz.
32
+ 5. **Her fonksiyonun docstring'i literatür referansı içerir** — yazar, yıl, formülün geldiği
33
+ denklem. Kullanıcı "bu sayı nereden geliyor" sorusunu docstring'den cevaplayabilmeli.
34
+ 6. **Sessiz başarısızlık yok.** Geçersiz girdi (negatif n, [0,1] dışı olasılık, boş dizi)
35
+ açık bir `ValueError` fırlatır.
36
+ 7. **Test kapsamı %85 altına düşmez.**
37
+
38
+ ---
39
+
40
+ ## 3. Modüller ve API
41
+
42
+ Hepsi `src/riskval/` altında. Sıra, yapılış sırasıdır.
43
+
44
+ ### 3.1 `calibration.py` — PD kalibrasyon testleri (ÖNCE BUNU YAZ)
45
+
46
+ Kredi riskinde denetim otoritesinin fiilen uyguladığı testler. Rating sınıfı (grade) bazlı.
47
+
48
+ ```python
49
+ binomial_test(n: int, defaults: int, pd_hat: float, alpha: float = 0.05,
50
+ alternative: str = "greater") -> TestResult
51
+ # Tek rating sınıfı için. H0: gerçekleşen temerrüt oranı <= tahmin edilen PD.
52
+ # Tam binom testi (normal yaklaşım DEĞİL — küçük sınıflarda yanlış sonuç verir).
53
+
54
+ jeffreys_test(n: int, defaults: int, pd_hat: float, alpha: float = 0.05) -> TestResult
55
+ # Bayesçi alternatif. Beta(defaults + 0.5, n - defaults + 0.5) posterior'undan p-değeri.
56
+ # ECB/EBA IRB doğrulama talimatlarında önerilen test — bunu doğru yap, ayırt edici özellik.
57
+
58
+ hosmer_lemeshow(y_true, y_prob, n_bins: int = 10, strategy: str = "quantile") -> TestResult
59
+ # C-istatistiği. chi2, serbestlik derecesi = n_bins - 2.
60
+ # strategy: "quantile" (eşit sayıda gözlem) veya "uniform" (eşit genişlik).
61
+
62
+ spiegelhalter_z(y_true, y_prob) -> TestResult
63
+ # Brier skorunun ayrıştırılmasına dayalı Z testi. Spiegelhalter (1986).
64
+
65
+ calibration_curve_table(y_true, y_prob, n_bins=10) -> pd.DataFrame
66
+ # Sınıf başına: n, gözlenen temerrüt, tahmin edilen PD, güven aralığı.
67
+ ```
68
+
69
+ `TestResult`: `dataclass` — `statistic`, `pvalue`, `reject`, `alpha`, `test_name`, `detail: dict`.
70
+ `__repr__` insan tarafından okunabilir tek satır versin.
71
+
72
+ **Toplu arayüz:**
73
+ ```python
74
+ grade_level_report(df: pd.DataFrame, grade_col, n_col, defaults_col, pd_col,
75
+ alpha=0.05) -> pd.DataFrame
76
+ # Her rating sınıfı için binom + Jeffreys, ve toplam red oranı.
77
+ # P1'in ana çıktısı bu — "düzenleyici red oranı" buradan geliyor.
78
+ ```
79
+
80
+ ### 3.2 `backtest.py` — VaR / ES backtest'leri
81
+
82
+ ```python
83
+ kupiec_pof(violations, n_obs: int, alpha: float) -> TestResult
84
+ # Koşulsuz kapsama LR testi. Kupiec (1995). chi2, df=1.
85
+
86
+ christoffersen_independence(violations) -> TestResult
87
+ # Bağımsızlık LR testi. Christoffersen (1998). chi2, df=1.
88
+
89
+ christoffersen_cc(violations, alpha: float) -> TestResult
90
+ # Koşullu kapsama = POF + bağımsızlık. chi2, df=2.
91
+
92
+ basel_traffic_light(n_violations: int, n_obs: int = 250, alpha: float = 0.01) -> str
93
+ # "green" | "yellow" | "red" + sermaye çarpanı eklentisi.
94
+ # n_obs=250, alpha=0.01 için BCBS eşikleri: yeşil 0-4, sarı 5-9, kırmızı 10+.
95
+ # Bu tam sayıları unit test'e sabitle.
96
+
97
+ acerbi_szekely(returns, var_forecast, es_forecast, alpha) -> TestResult
98
+ # ES backtest, Z1 ve Z2 istatistikleri. Acerbi & Szekely (2014).
99
+ ```
100
+
101
+ ### 3.3 `discrimination.py` — Ayrıştırma gücü
102
+
103
+ ```python
104
+ auc_with_ci(y_true, y_prob, n_boot=1000, seed=None) -> tuple[float, float, float]
105
+ gini(y_true, y_prob) -> float # = 2*AUC - 1, bankacılığın kullandığı ölçüt
106
+ ks_statistic(y_true, y_prob) -> float
107
+ somers_d(y_true, y_prob) -> float
108
+ ```
109
+
110
+ ### 3.4 `capital.py` — Basel IRB sermaye
111
+
112
+ ```python
113
+ irb_risk_weight(pd: float, lgd: float, maturity: float = 2.5,
114
+ asset_class: str = "corporate", size_adj_turnover: float | None = None) -> float
115
+ # BCBS Basel çerçevesi / CRR Md. 153-154 formülü.
116
+ # Korelasyon R, vade ayarı b, sermaye gereksinimi K, RW = K * 12.5.
117
+ # asset_class: "corporate" | "retail_mortgage" | "retail_qrre" | "retail_other"
118
+ # Her varlık sınıfının kendi R formülü var — hepsini ayrı ayrı test et.
119
+
120
+ rwa(pd, lgd, ead, **kwargs) -> float
121
+
122
+ rwa_deviation(pd_true, pd_hat, lgd, ead, **kwargs) -> dict
123
+ # Miskalibrasyonun sermaye etkisi: mutlak ve yüzde sapma.
124
+ # P1'in punchline'ı: "%X sermaye hatası".
125
+ ```
126
+
127
+ ### 3.5 `report.py` — Üst seviye arayüz
128
+
129
+ ```python
130
+ validate(y_true, y_prob, grades=None, alpha=0.05) -> ValidationReport
131
+ ```
132
+ Tüm bataryayı çalıştırır. `ValidationReport`: `.to_frame()`, `.summary()` (metin),
133
+ `.rejected` (red edilen testlerin listesi).
134
+
135
+ **README'nin ilk ekranında bu beş satır çalışır olmalı:**
136
+ ```python
137
+ from riskval import validate
138
+ report = validate(y_true, y_prob)
139
+ print(report.summary())
140
+ ```
141
+
142
+ ---
143
+
144
+ ## 4. Yapılış sırası
145
+
146
+ | Adım | İş | Bitmiş sayılma koşulu |
147
+ |---|---|---|
148
+ | 1 | `TestResult` dataclass + `_validation.py` (girdi kontrolleri) | Testleri geçiyor |
149
+ | 2 | `calibration.py` — binom, Jeffreys | Referans değerlere karşı test yeşil |
150
+ | 3 | `calibration.py` — Hosmer-Lemeshow, Spiegelhalter Z | R karşılaştırması yeşil |
151
+ | 4 | `calibration.grade_level_report` | Örnek veri üzerinde çalışıyor |
152
+ | 5 | `discrimination.py` | sklearn ile AUC karşılaştırması yeşil |
153
+ | 6 | `capital.py` — IRB formülü | BCBS örnek değerlerine karşı test yeşil |
154
+ | 7 | `backtest.py` — Kupiec, Christoffersen, trafik ışığı | Referans değerler yeşil |
155
+ | 8 | `report.py` + README quickstart | 5 satır çalışıyor |
156
+ | 9 | CI (GitHub Actions), ruff, kapsam raporu | Yeşil |
157
+ | 10 | v0.1.0 → PyPI | `pip install riskval` çalışıyor |
158
+
159
+ `acerbi_szekely` v0.2'ye ertelenebilir. Diğerleri v0.1 kapsamındadır.
160
+
161
+ ---
162
+
163
+ ## 5. Referans değerleri nereden bulacaksın
164
+
165
+ Bu, işin en önemli kısmı. Sıra:
166
+
167
+ 1. **Orijinal makaledeki sayısal örnek.** Kupiec (1995) ve Christoffersen (1998) makalelerinde
168
+ çalışılmış örnekler var. Spiegelhalter (1986) aynı şekilde.
169
+ 2. **BCBS / EBA / ECB dokümanları.** Basel trafik ışığı eşik tablosu ve IRB formülü resmî
170
+ metinlerde açık. IRB formülünü BCBS'in kendi örnek hesaplamasıyla doğrula.
171
+ 3. **R paketleriyle çapraz doğrulama.** En pratik yol:
172
+ - `rugarch::VaRTest` → Kupiec + Christoffersen
173
+ - `ResourceSelection::hoslem.test` → Hosmer-Lemeshow
174
+ - `pROC::roc` → AUC ve CI
175
+ R'ı bir kez çalıştır, çıkan sayıları test dosyasına **sabit olarak göm** ve yorumda
176
+ hangi komuttan geldiğini yaz. R'ı bağımlılık yapma.
177
+ 4. **Analitik özel durumlar.** Örn. binom testinde `defaults=0` veya `defaults=n` gibi
178
+ uç durumlar elle hesaplanabilir.
179
+
180
+ Her test dosyasının başında referansın kaynağı yorumda belirtilecek.
181
+
182
+ ---
183
+
184
+ ## 6. Yapma
185
+
186
+ - Yeni özellik eklemeden önce mevcut modülleri bitirme. Kapsam genişletme en büyük risk.
187
+ - Makine öğrenmesi modeli eğitme. Bu paket **değerlendirir**, model kurmaz.
188
+ - Grafik çizme (matplotlib) v0.1'e girmez. Veri döndür, çizimi kullanıcıya bırak.
189
+ - Veri indirme kodu yazma. Paket veri kaynağı değil.
190
+ - Performans optimizasyonu yapma. Doğruluk > hız. Vektörize et, Cython'a girme.
191
+ - Paket adını değiştirme. `riskval` PyPI'da rezerve edildi.
192
+
193
+ ---
194
+
195
+ ## 7. Bağlam
196
+
197
+ - Sahibi: PhD öğrencisi, sentetik veri değerlendirme metodolojisi üzerine çalışıyor.
198
+ Yayımlanmış işi: IEEE Access 2026 (LLM tabular synthesizers config sensitivity).
199
+ - Bu paket, `~/Desktop/PhD/finance-studies/` altındaki P1 makalesinin altyapısı.
200
+ Makale sorusu: *sentetik veriyle eğitilen kredi modelleri AUC'de iyi görünürken
201
+ düzenleyici testlerden kalıyor mu?*
202
+ - İlk gerçek kullanım: `~/Desktop/PhD/tstr-calibration-audits/results/reliability.csv`
203
+ (kutu bazlı `mean_pred`, `frac_pos`, `weight`) üzerinde `grade_level_report` çalıştırmak.
204
+ API'yi tasarlarken bu girdiyi aklında tut.
205
+ - Hedef: JOSS (Journal of Open Source Software) makalesi. JOSS'un kabul kriterleri
206
+ (dokümantasyon, testler, katkı rehberi, açık lisans) baştan sağlanacak şekilde çalış.
207
+
208
+ ## 8. Geliştirme
209
+
210
+ ```bash
211
+ source ../.venv/bin/activate # üst dizindeki ortam
212
+ pip install -e ".[dev]"
213
+ pytest --cov=riskval --cov-report=term-missing
214
+ ruff check src tests
215
+ ```
riskval-0.0.1/PKG-INFO ADDED
@@ -0,0 +1,32 @@
1
+ Metadata-Version: 2.5
2
+ Name: riskval
3
+ Version: 0.0.1
4
+ Summary: Regulatory validation battery for credit-risk and market-risk models: PD calibration tests, VaR/ES backtests, Basel IRB capital.
5
+ Project-URL: Homepage, https://github.com/muratsahin/riskval
6
+ Project-URL: Issues, https://github.com/muratsahin/riskval/issues
7
+ Author: Murat Sahin
8
+ License-Expression: MIT
9
+ Keywords: backtesting,basel,calibration,credit-risk,model-risk,model-validation
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Financial and Insurance Industry
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
16
+ Requires-Python: >=3.10
17
+ Requires-Dist: numpy>=1.24
18
+ Requires-Dist: pandas>=2.0
19
+ Requires-Dist: scipy>=1.10
20
+ Provides-Extra: dev
21
+ Requires-Dist: build; extra == 'dev'
22
+ Requires-Dist: pytest-cov; extra == 'dev'
23
+ Requires-Dist: pytest>=8; extra == 'dev'
24
+ Requires-Dist: ruff; extra == 'dev'
25
+ Requires-Dist: twine; extra == 'dev'
26
+ Description-Content-Type: text/markdown
27
+
28
+ # riskval
29
+
30
+ Regulatory validation battery for credit- and market-risk models.
31
+
32
+ **Status: skeleton. Name reserved on PyPI.**
@@ -0,0 +1,5 @@
1
+ # riskval
2
+
3
+ Regulatory validation battery for credit- and market-risk models.
4
+
5
+ **Status: skeleton. Name reserved on PyPI.**
@@ -0,0 +1,38 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "riskval"
7
+ version = "0.0.1"
8
+ description = "Regulatory validation battery for credit-risk and market-risk models: PD calibration tests, VaR/ES backtests, Basel IRB capital."
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = "MIT"
12
+ authors = [{ name = "Murat Sahin" }]
13
+ keywords = ["credit-risk", "model-validation", "calibration", "basel", "backtesting", "model-risk"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Intended Audience :: Science/Research",
17
+ "Intended Audience :: Financial and Insurance Industry",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Programming Language :: Python :: 3",
20
+ "Topic :: Scientific/Engineering :: Mathematics",
21
+ ]
22
+ dependencies = ["numpy>=1.24", "scipy>=1.10", "pandas>=2.0"]
23
+
24
+ [project.optional-dependencies]
25
+ dev = ["pytest>=8", "pytest-cov", "ruff", "build", "twine"]
26
+
27
+ [project.urls]
28
+ Homepage = "https://github.com/muratsahin/riskval"
29
+ Issues = "https://github.com/muratsahin/riskval/issues"
30
+
31
+ [tool.hatch.build.targets.wheel]
32
+ packages = ["src/riskval"]
33
+
34
+ [tool.ruff]
35
+ line-length = 100
36
+
37
+ [tool.pytest.ini_options]
38
+ testpaths = ["tests"]
@@ -0,0 +1,3 @@
1
+ """riskval — regulatory validation battery for risk models."""
2
+
3
+ __version__ = "0.0.1"
File without changes