diff --git a/scripts/collect_oi.py b/scripts/collect_oi.py new file mode 100644 index 0000000..d4bc241 --- /dev/null +++ b/scripts/collect_oi.py @@ -0,0 +1,64 @@ +""" +OI 장기 수집 스크립트. +15분마다 cron 실행하여 Binance OI를 data/oi_history.parquet에 누적한다. + +사용법: + python scripts/collect_oi.py + python scripts/collect_oi.py --symbol XRPUSDT + +crontab 예시: + */15 * * * * cd /path/to/cointrader && .venv/bin/python scripts/collect_oi.py >> logs/collect_oi.log 2>&1 +""" +import sys +from pathlib import Path +sys.path.insert(0, str(Path(__file__).parent.parent)) + +import argparse +from datetime import datetime, timezone + +import pandas as pd +from binance.client import Client +from dotenv import load_dotenv +import os + +load_dotenv() + +OI_PATH = Path("data/oi_history.parquet") + + +def collect(symbol: str = "XRPUSDT"): + client = Client( + api_key=os.getenv("BINANCE_API_KEY", ""), + api_secret=os.getenv("BINANCE_API_SECRET", ""), + ) + + result = client.futures_open_interest(symbol=symbol) + oi_value = float(result["openInterest"]) + ts = datetime.now(timezone.utc) + + new_row = pd.DataFrame([{ + "timestamp": ts, + "symbol": symbol, + "open_interest": oi_value, + }]) + + if OI_PATH.exists(): + existing = pd.read_parquet(OI_PATH) + combined = pd.concat([existing, new_row], ignore_index=True) + else: + OI_PATH.parent.mkdir(parents=True, exist_ok=True) + combined = new_row + + combined.to_parquet(OI_PATH, index=False) + print(f"[{ts.isoformat()}] OI={oi_value:.2f} → {OI_PATH}") + + +def main(): + parser = argparse.ArgumentParser(description="OI 장기 수집") + parser.add_argument("--symbol", default="XRPUSDT") + args = parser.parse_args() + collect(symbol=args.symbol) + + +if __name__ == "__main__": + main()