aboutsummaryrefslogtreecommitdiff
path: root/services/data_service.py
diff options
context:
space:
mode:
authorTyler <tyler@tylerhoang.xyz>2026-04-02 18:54:01 -0700
committerTyler <tyler@tylerhoang.xyz>2026-04-02 18:54:01 -0700
commitccfbce79a66b2d8aa136fddbed7c61c7436f2733 (patch)
treeed1d0f883a904c1a677b013d8c6ed08bafc11d72 /services/data_service.py
parentee9691828bc06334c58a58902615b1c0b654f39a (diff)
Improve DCF model accuracy
Diffstat (limited to 'services/data_service.py')
-rw-r--r--services/data_service.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/services/data_service.py b/services/data_service.py
index 67f2e7b..bfd1290 100644
--- a/services/data_service.py
+++ b/services/data_service.py
@@ -684,3 +684,27 @@ def get_free_cash_flow_series(ticker: str) -> pd.Series:
return (op + capex).dropna()
except KeyError:
return pd.Series(dtype=float)
+
+
+@st.cache_data(ttl=3600)
+def get_free_cash_flow_ttm(ticker: str) -> float | None:
+ """Return trailing-twelve-month free cash flow from quarterly cash flow statements."""
+ t = yf.Ticker(ticker.upper())
+ cf_q = t.quarterly_cashflow
+ if cf_q is None or cf_q.empty:
+ return None
+
+ if "Free Cash Flow" in cf_q.index:
+ vals = cf_q.loc["Free Cash Flow"].iloc[:4].dropna()
+ if len(vals) == 4:
+ return float(vals.sum())
+
+ try:
+ op = cf_q.loc["Operating Cash Flow"].iloc[:4].dropna()
+ capex = cf_q.loc["Capital Expenditure"].iloc[:4].dropna()
+ if len(op) == 4 and len(capex) == 4:
+ return float((op + capex).sum())
+ except KeyError:
+ return None
+
+ return None