백테스트 수정중

This commit is contained in:
2026-03-07 13:16:01 +09:00
parent ea355eb60c
commit 7c9b596098
13 changed files with 908 additions and 303 deletions

View File

@@ -334,7 +334,7 @@ class BacktestEngine:
avg_lose=0.0,
max_win=0.0,
max_lose=0.0,
equity_curve=[],
equity_curve=self.equity_curve,
trades=[],
final_positions=[]
)
@@ -445,7 +445,8 @@ class BacktestEngine:
prev_portfolio_value = config.initial_capital
for current_date in all_dates:
current_date_obj = datetime.strptime(current_date, "%Y%m%d").date()
fmt = "%Y%m%d" if len(current_date) == 8 else "%Y-%m-%d"
current_date_obj = datetime.strptime(current_date, fmt).date()
# 각 종목별 신호 생성 및 주문 실행
current_prices = {}

View File

@@ -111,8 +111,8 @@ class StockLSTM:
self.seq_std = X_seq.std(axis=(0, 1)) + 1e-8
X_norm = (X_seq - self.seq_mean) / self.seq_std
X_tensor = torch.FloatTensor(X_norm).to(self.device)
y_tensor = torch.LongTensor(y).to(self.device)
X_tensor = torch.FloatTensor(X_norm.copy()).to(self.device)
y_tensor = torch.LongTensor(y.copy()).to(self.device)
dataset = TensorDataset(X_tensor, y_tensor)
loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
@@ -157,7 +157,7 @@ class StockLSTM:
self.model.eval()
X_norm = (X_seq - self.seq_mean) / self.seq_std
X_tensor = torch.FloatTensor(X_norm).to(self.device)
X_tensor = torch.FloatTensor(X_norm.copy()).to(self.device)
with torch.no_grad():
outputs = self.model(X_tensor)

View File

@@ -274,8 +274,24 @@ async def get_all_krx_stocks_from_fdr(
return stocks
except ImportError:
logger.error("FinanceDataReader 미설치. pip install finance-datareader")
return []
logger.warning("FinanceDataReader 미설치. DB 폴백 사용")
return await _get_stocks_from_db(market)
except Exception as e:
logger.error(f"FDR 조회 실패: {e}")
logger.warning(f"FDR 조회 실패: {e}. DB 폴백 사용")
return await _get_stocks_from_db(market)
async def _get_stocks_from_db(market: Optional[str] = None) -> List[Dict[str, Any]]:
"""FDR 실패 시 DB의 StockDailyPrice에서 고유 종목 코드 조회"""
try:
from sqlalchemy import distinct
async with AsyncSessionLocal() as session:
stmt = select(distinct(StockDailyPrice.stock_code))
result = await session.execute(stmt)
codes = [row[0] for row in result.all()]
logger.info(f"DB 폴백: {len(codes)}개 종목 조회 (market 필터 미적용)")
return [{'code': c, 'name': c, 'market': market or 'KOSPI'} for c in codes]
except Exception as e:
logger.error(f"DB 폴백 조회 실패: {e}")
return []