from typing import Optional import pandas as pd import tushare as ts TUSHARE_TOKEN = "76efd8465f9f2591aa42a385268e06acf6b80b7a15be2267ad2281b7" def _init_api(): ts.set_token(TUSHARE_TOKEN) return ts.pro_api() def fetch_contract(ts_code: str, limit: int = 100) -> pd.DataFrame: """拉取指定期货合约的日线数据,返回按 trade_date 升序排列的 DataFrame。""" pro = _init_api() df = pro.fut_daily(ts_code=ts_code) if df.empty: raise RuntimeError(f"未返回 {ts_code} 的任何数据,可能合约代码错误或 token 积分不足") cols = [ "ts_code", "trade_date", "open", "high", "low", "close", "vol", "amount", "oi", "oi_chg", "pre_close", ] df = df[[c for c in cols if c in df.columns]].copy() numeric = ["open", "high", "low", "close", "vol", "amount", "oi", "oi_chg", "pre_close"] for c in numeric: if c in df.columns: df[c] = pd.to_numeric(df[c], errors="coerce") df = df.sort_values("trade_date").reset_index(drop=True) return df