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.
- riskval-0.0.1/.gitignore +10 -0
- riskval-0.0.1/CLAUDE.md +215 -0
- riskval-0.0.1/PKG-INFO +32 -0
- riskval-0.0.1/README.md +5 -0
- riskval-0.0.1/pyproject.toml +38 -0
- riskval-0.0.1/src/riskval/__init__.py +3 -0
- riskval-0.0.1/tests/__init__.py +0 -0
riskval-0.0.1/.gitignore
ADDED
riskval-0.0.1/CLAUDE.md
ADDED
|
@@ -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.**
|
riskval-0.0.1/README.md
ADDED
|
@@ -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"]
|
|
File without changes
|