# =============================================# REFINTIV FUNDAMENTAL ESTIMATE HISTORY# (CORRECT CH/RH VERSION)# =============================================
import warningswarnings.filterwarnings("ignore")
import refinitiv.data as rdimport pandas as pdfrom tqdm import tqdmimport time
# =========================# SETTINGS# =========================
RIC_FILE = r"C:\Users\471196.AXISSEC\Desktop\API\Riccode1.csv"START_DATE = "2026-01-01"SAVE_FILE = r"C:\Users\471196.AXISSEC\Desktop\API\fundamental_estimates_all_periods.csv"
PERIODS = ["FY1", "FY2", "FQ"]BATCH_SIZE = 120
FIELDS = { # "TR.PreferredMeasureMeanEst": "eps_mean", "TR.RevenueMean": "rev_mean", "TR.RevenueNumIncEstimates": "rev_up", "TR.EBITDAMean": "ebitda_mean", "TR.EBITDANumIncEstimates": "ebitda_up", "TR.EBITMean": "ebit_mean", "TR.EBITNumIncEstimates": "ebit_up", "TR.NetProfitMean": "np_mean", "TR.NetProfitNumIncEstimates": "np_up", "TR.NumberOfAnalysts": "num_analysts"}
# =========================# LOAD RICS# =========================
rics = pd.read_csv(RIC_FILE)["RIC"].dropna().unique().tolist()
print("Total RICs:", len(rics))
def chunker(lst, n): for i in range(0, len(lst), n): yield lst[i:i+n]
# =========================# DOWNLOAD FUNCTION# =========================
def download_period(period):
dfs = []
for batch in tqdm(list(chunker(rics, BATCH_SIZE)), desc=period):
retries = 3
while retries > 0: try: df = rd.get_data( universe=batch, fields=list(FIELDS.keys()), parameters={ "SDate": START_DATE, "EDate": "-1D", "Frq": "CW", # weekly "Period": period, "Curn": "Native",
# ⭐⭐⭐ CRITICAL ⭐⭐⭐ "CH": "IN;Fd", "RH": "date" } ) break
except Exception: retries -= 1 time.sleep(2)
if df is not None and len(df): dfs.append(df)
if not dfs: return pd.DataFrame()
data = pd.concat(dfs, ignore_index=True)
# ------------------------- # CLEAN COLUMNS # ------------------------- data = data.rename(columns={ "Instrument": "ticker", "Date": "date" })
data["date"] = pd.to_datetime(data["date"]) data["period"] = period
data = data.rename(columns=FIELDS)
# numeric safety for c in FIELDS.values(): if c in data.columns: data[c] = pd.to_numeric(data[c], errors="coerce")
return data
# =========================# MAIN# =========================
rd.open_session()
all_data = []
for p in PERIODS: tmp = download_period(p) if len(tmp): all_data.append(tmp)
rd.close_session()
final_df = pd.concat(all_data, ignore_index=True)
final_df = final_df.sort_values(["ticker", "period", "date"])
final_df.to_csv(SAVE_FILE, index=False)
print("\nSaved:", SAVE_FILE)print(final_df.head())