lotto-lab: strategy_evolver — EMA/Softmax 가중치 진화 + 스마트 추천
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
72
backend/tests/test_strategy_evolver.py
Normal file
72
backend/tests/test_strategy_evolver.py
Normal file
@@ -0,0 +1,72 @@
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "app"))
|
||||
|
||||
import math
|
||||
import pytest
|
||||
|
||||
|
||||
def test_calc_draw_score_basic():
|
||||
"""세트별 결과 → draw_score 계산"""
|
||||
from strategy_evolver import calc_draw_score
|
||||
|
||||
results = [
|
||||
{"correct": 3, "rank": 5}, # 3/6 + 0.1 = 0.6
|
||||
{"correct": 1, "rank": 0}, # 1/6 + 0 = 0.167
|
||||
]
|
||||
score = calc_draw_score(results)
|
||||
expected = ((3/6 + 0.1) + (1/6)) / 2
|
||||
assert abs(score - expected) < 0.01
|
||||
|
||||
|
||||
def test_calc_draw_score_empty():
|
||||
"""빈 결과 → 0"""
|
||||
from strategy_evolver import calc_draw_score
|
||||
assert calc_draw_score([]) == 0.0
|
||||
|
||||
|
||||
def test_recalculate_weights_softmax():
|
||||
"""EMA → Softmax 가중치 변환"""
|
||||
from strategy_evolver import _softmax_weights
|
||||
|
||||
ema_scores = {
|
||||
"combined": 0.30,
|
||||
"simulation": 0.25,
|
||||
"heatmap": 0.15,
|
||||
"manual": 0.10,
|
||||
"custom": 0.05,
|
||||
}
|
||||
weights = _softmax_weights(ema_scores)
|
||||
|
||||
assert abs(sum(weights.values()) - 1.0) < 0.001
|
||||
assert weights["combined"] > weights["simulation"]
|
||||
assert weights["simulation"] > weights["heatmap"]
|
||||
assert all(w >= 0.049 for w in weights.values())
|
||||
|
||||
|
||||
def test_recalculate_weights_min_weight():
|
||||
"""한 전략의 EMA가 매우 낮아도 최소 5% 보장"""
|
||||
from strategy_evolver import _softmax_weights
|
||||
|
||||
ema_scores = {
|
||||
"combined": 0.50,
|
||||
"simulation": 0.01,
|
||||
"heatmap": 0.01,
|
||||
"manual": 0.01,
|
||||
"custom": 0.01,
|
||||
}
|
||||
weights = _softmax_weights(ema_scores)
|
||||
|
||||
assert weights["simulation"] >= 0.049
|
||||
assert weights["custom"] >= 0.049
|
||||
assert abs(sum(weights.values()) - 1.0) < 0.001
|
||||
|
||||
|
||||
def test_update_ema():
|
||||
"""EMA 갱신 공식 검증"""
|
||||
from strategy_evolver import ALPHA
|
||||
|
||||
old_ema = 0.15
|
||||
draw_score = 0.40
|
||||
new_ema = ALPHA * draw_score + (1 - ALPHA) * old_ema
|
||||
expected = 0.3 * 0.40 + 0.7 * 0.15 # = 0.225
|
||||
assert abs(new_ema - expected) < 0.001
|
||||
Reference in New Issue
Block a user