백테스트 수정중
This commit is contained in:
@@ -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 = {}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 []
|
||||
|
||||
Reference in New Issue
Block a user