35 lines
1.0 KiB
Python
35 lines
1.0 KiB
Python
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
|