refactor: rename stock-lab → stock (graduation)
- git mv stock-lab/ → stock/ - docker-compose.yml: 서비스 키 + container_name + build.context + frontend.depends_on + agent-office STOCK_LAB_URL → STOCK_URL - agent-office/app: config.py, service_proxy.py, agents/stock.py, tests/ STOCK_LAB_URL → STOCK_URL - nginx/default.conf: proxy_pass http://stock-lab → http://stock (3 lines) - CLAUDE.md / README.md / STATUS.md / scripts/ 문구 갱신 - stock/ 내부 자기 참조 갱신 lab 네이밍 정책 (feedback_lab_naming.md) graduation. API URL / Python import / DB 파일명 변경 없음.
This commit is contained in:
76
stock/app/screener/_test_fixtures.py
Normal file
76
stock/app/screener/_test_fixtures.py
Normal file
@@ -0,0 +1,76 @@
|
||||
"""Synthetic fixtures for screener tests — no DB / no FDR / no naver."""
|
||||
|
||||
import datetime as dt
|
||||
import pandas as pd
|
||||
|
||||
|
||||
def make_master(tickers: list[str], market_caps: dict | None = None,
|
||||
preferred: set | None = None, managed: set | None = None) -> pd.DataFrame:
|
||||
market_caps = market_caps or {t: 100_000_000_000 for t in tickers}
|
||||
preferred = preferred or set()
|
||||
managed = managed or set()
|
||||
return pd.DataFrame([
|
||||
{
|
||||
"ticker": t,
|
||||
"name": f"테스트{t}",
|
||||
"market": "KOSPI",
|
||||
"market_cap": market_caps.get(t),
|
||||
"is_managed": int(t in managed),
|
||||
"is_preferred": int(t in preferred),
|
||||
"is_spac": 0,
|
||||
"listed_date": None,
|
||||
}
|
||||
for t in tickers
|
||||
]).set_index("ticker")
|
||||
|
||||
|
||||
def make_prices(tickers: list[str], days: int = 260, start_close: int = 50000,
|
||||
trend_pct: float = 0.0,
|
||||
asof: dt.date = dt.date(2026, 5, 12)) -> pd.DataFrame:
|
||||
"""trend_pct: 일별 종가 등락률(%). 양수면 상승 추세."""
|
||||
rows = []
|
||||
for t in tickers:
|
||||
close = start_close
|
||||
for i in range(days):
|
||||
day_idx = days - 1 - i # asof가 마지막
|
||||
date = asof - dt.timedelta(days=day_idx)
|
||||
high = int(close * 1.012)
|
||||
low = int(close * 0.988)
|
||||
rows.append({
|
||||
"ticker": t, "date": date.isoformat(),
|
||||
"open": close, "high": high, "low": low, "close": close,
|
||||
"volume": 1_000_000, "value": close * 1_000_000,
|
||||
})
|
||||
close = int(close * (1 + trend_pct / 100))
|
||||
return pd.DataFrame(rows)
|
||||
|
||||
|
||||
def make_flow(tickers: list[str], days: int = 260,
|
||||
foreign_per_day: dict | None = None,
|
||||
asof: dt.date = dt.date(2026, 5, 12)) -> pd.DataFrame:
|
||||
foreign_per_day = foreign_per_day or {t: 0 for t in tickers}
|
||||
rows = []
|
||||
for t in tickers:
|
||||
for i in range(days):
|
||||
day_idx = days - 1 - i
|
||||
date = asof - dt.timedelta(days=day_idx)
|
||||
rows.append({
|
||||
"ticker": t, "date": date.isoformat(),
|
||||
"foreign_net": foreign_per_day.get(t, 0),
|
||||
"institution_net": 0,
|
||||
})
|
||||
return pd.DataFrame(rows)
|
||||
|
||||
|
||||
def make_kospi(days: int = 260, start: int = 2500, trend_pct: float = 0.0,
|
||||
asof: dt.date = dt.date(2026, 5, 12)) -> pd.Series:
|
||||
values = []
|
||||
dates = []
|
||||
v = start
|
||||
for i in range(days):
|
||||
day_idx = days - 1 - i
|
||||
d = asof - dt.timedelta(days=day_idx)
|
||||
dates.append(d.isoformat())
|
||||
values.append(v)
|
||||
v = v * (1 + trend_pct / 100)
|
||||
return pd.Series(values, index=dates, name="kospi")
|
||||
Reference in New Issue
Block a user