feat: add OI long-term collection script for cron-based data accumulation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
64
scripts/collect_oi.py
Normal file
64
scripts/collect_oi.py
Normal file
@@ -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()
|
||||
Reference in New Issue
Block a user