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