53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
"""
|
|
Fetch real XAUUSD H1 data from Yahoo Finance (GC=F gold futures).
|
|
Saves to CSV for training pipeline.
|
|
"""
|
|
|
|
import argparse
|
|
from datetime import datetime, timezone
|
|
from pathlib import Path
|
|
|
|
import pandas as pd
|
|
import yfinance as yf
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
DATA_DIR = ROOT / "data"
|
|
DATA_DIR.mkdir(exist_ok=True)
|
|
OUT_CSV = DATA_DIR / "xauusd_h1.csv"
|
|
|
|
|
|
def fetch_xauusd(period: str = "2y", interval: str = "1h") -> pd.DataFrame:
|
|
ticker = yf.Ticker("GC=F")
|
|
df = ticker.history(period=period, interval=interval, auto_adjust=True)
|
|
if df.empty:
|
|
raise RuntimeError("No data returned from Yahoo Finance for GC=F")
|
|
df.index = df.index.tz_convert("UTC").tz_localize(None)
|
|
df.index.name = "datetime"
|
|
df.reset_index(inplace=True)
|
|
df.rename(columns={
|
|
"Open": "open", "High": "high", "Low": "low",
|
|
"Close": "close", "Volume": "volume"
|
|
}, inplace=True)
|
|
df = df[["datetime", "open", "high", "low", "close", "volume"]].copy()
|
|
df.dropna(subset=["open", "high", "low", "close"], inplace=True)
|
|
df["volume"] = df["volume"].fillna(0)
|
|
return df
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--period", default="2y", help="yfinance period (1y, 2y, max)")
|
|
parser.add_argument("--interval", default="1h", help="yfinance interval (1h, 4h, 1d)")
|
|
parser.add_argument("--out", default=str(OUT_CSV))
|
|
args = parser.parse_args()
|
|
|
|
print(f"Fetching XAUUSD (GC=F) {args.interval} for {args.period}...")
|
|
df = fetch_xauusd(args.period, args.interval)
|
|
df.to_csv(args.out, index=False)
|
|
print(f"Saved {len(df)} rows -> {args.out}")
|
|
print(df.tail(3).to_string(index=False))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|