게시판한국투자증권 API와 LLM 주식 응용 프로그램예제 소스

예제 소스

한국투자증권 API와 LLM 주식 응용 프로그램 · 파일 19개

surge_redis_common.py

# -*- coding: utf-8 -*-
"""1분봉 OHLCV 를 Redis 에 JSON 으로 저장/로드 (writer ↔ consumer 공통).

키: ``{prefix}{종목코드}``  (기본 prefix ``hankook:surge:minute:``)

환경 변수 ``REDIS_URL`` (예: ``redis://127.0.0.1:6379/0``) 를 consumer/writer 가 공유합니다.
"""

from __future__ import annotations

import json
from datetime import datetime
from typing import TYPE_CHECKING, Any

if TYPE_CHECKING:
    import pandas as pd

DEFAULT_MINUTE_KEY_PREFIX = "hankook:surge:minute:"


def minute_key(code: str, *, prefix: str = DEFAULT_MINUTE_KEY_PREFIX) -> str:
    return f"{prefix}{code}"


def bars_json_from_df(df: "pd.DataFrame") -> str:
    import pandas as pd

    bars: list[dict[str, Any]] = []
    for idx, row in df.iterrows():
        ts = idx if isinstance(idx, pd.Timestamp) else pd.Timestamp(idx)
        bars.append(
            {
                "t": ts.isoformat(),
                "O": float(row["Open"]),
                "H": float(row["High"]),
                "L": float(row["Low"]),
                "C": float(row["Close"]),
                "V": float(row["Volume"]),
            }
        )
    payload = {"updated_at": datetime.now().isoformat(timespec="seconds"), "bars": bars}
    return json.dumps(payload, ensure_ascii=False)


def df_from_redis_value(raw: str | bytes | None) -> tuple["pd.DataFrame", datetime | None]:
    """Redis GET 값 → (DataFrame index=DateTime, columns OHLCV), updated_at."""
    import pandas as pd

    if raw is None:
        return pd.DataFrame(columns=["Open", "High", "Low", "Close", "Volume"]), None
    if isinstance(raw, bytes):
        raw = raw.decode("utf-8")
    try:
        data = json.loads(raw)
    except Exception:
        return pd.DataFrame(columns=["Open", "High", "Low", "Close", "Volume"]), None
    upd_raw = data.get("updated_at")
    updated: datetime | None = None
    if upd_raw:
        try:
            updated = datetime.fromisoformat(str(upd_raw))
        except Exception:
            updated = None
    rows = data.get("bars") or []
    if not rows:
        return pd.DataFrame(columns=["Open", "High", "Low", "Close", "Volume"]), updated
    rec: list[dict[str, Any]] = []
    for b in rows:
        rec.append(
            {
                "DateTime": pd.Timestamp(b["t"]),
                "Open": float(b["O"]),
                "High": float(b["H"]),
                "Low": float(b["L"]),
                "Close": float(b["C"]),
                "Volume": float(b["V"]),
            }
        )
    out = pd.DataFrame(rec).set_index("DateTime").sort_index()
    return out[["Open", "High", "Low", "Close", "Volume"]], updated