65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
"""
|
|
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()
|