51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
'''
|
|
📁 risk_manage_engine/risk_scorer.py
|
|
|
|
여러 리스크 지표를 종합하여 종합 리스크 점수를 계산하는 모듈
|
|
정규화 및 안정성 고려한 계산 방식 적용
|
|
'''
|
|
|
|
import numpy as np
|
|
|
|
# 안정성 유지를 위한 정규화 함수
|
|
def normalize(value, min_val, max_val):
|
|
if max_val == min_val:
|
|
return 0.0 # 모든 값이 동일한 경우 → 중립값
|
|
return (value - min_val) / (max_val - min_val)
|
|
|
|
def compute_risk_score(risk_values: dict) -> float:
|
|
"""
|
|
입력된 리스크 지표들을 기반으로 종합 리스크 점수를 계산합니다.
|
|
|
|
Parameters:
|
|
risk_values (dict): 각 리스크 지표들의 원시 값
|
|
예: {'var': 0.02, 'svar': 0.03, 'atr': 0.015, 'monte_carlo': 0.05}
|
|
|
|
Returns:
|
|
score (float): 0 ~ 100 사이의 리스크 점수 (높을수록 안정적)
|
|
"""
|
|
# 기준 범위 지정 (샘플 기준)
|
|
expected_ranges = {
|
|
'var': (0.01, 0.10),
|
|
'svar': (0.01, 0.12),
|
|
'atr': (0.005, 0.05),
|
|
'monte_carlo': (0.01, 0.20)
|
|
}
|
|
|
|
weights = {
|
|
'var': 0.25,
|
|
'svar': 0.25,
|
|
'atr': 0.25,
|
|
'monte_carlo': 0.25
|
|
}
|
|
|
|
score = 0
|
|
for key, value in risk_values.items():
|
|
min_v, max_v = expected_ranges.get(key, (0, 1))
|
|
norm = normalize(value, min_v, max_v)
|
|
inverted = 1 - norm # 위험이 낮을수록 점수는 높아야 함
|
|
weighted = inverted * weights.get(key, 0.25)
|
|
score += weighted
|
|
|
|
return round(score * 100, 2) # 점수를 0~100 범위로 환산
|