Skip to main content

finance_query/models/fundamentals/
ttm.rs

1//! Trailing-twelve-month (TTM) fundamentals snapshots.
2//!
3//! Served through the [`Capability::FUNDAMENTALS`](crate::Capability::FUNDAMENTALS)
4//! route; FMP is currently the only provider. A TTM snapshot is a single
5//! always-current rollup — unlike [`FinancialStatement`](super::FinancialStatement),
6//! it is not indexed by fiscal period, so callers do not need to know whether
7//! the latest filed period is still current.
8//!
9//! The `TTM`-suffixed `serde` aliases let the provider's wire shape deserialize
10//! straight into these types instead of through a field-identical DTO; aliases
11//! are deserialize-only, so serialized output stays snake_case.
12//!
13//! Per-share metrics live on [`FinancialRatiosTtm`], not [`KeyMetricsTtm`] —
14//! FMP's stable tier serves them from `ratios-ttm`.
15
16use serde::{Deserialize, Serialize};
17
18/// Valuation, capital-efficiency, and working-capital metrics over the
19/// trailing twelve months.
20#[derive(Debug, Clone, Default, Serialize, Deserialize)]
21#[non_exhaustive]
22pub struct KeyMetricsTtm {
23    /// Ticker symbol.
24    pub symbol: Option<String>,
25    /// Market capitalization.
26    #[serde(alias = "marketCap")]
27    pub market_cap: Option<f64>,
28    /// Enterprise value.
29    #[serde(alias = "enterpriseValueTTM")]
30    pub enterprise_value: Option<f64>,
31    /// Enterprise value to sales.
32    #[serde(alias = "evToSalesTTM")]
33    pub ev_to_sales: Option<f64>,
34    /// Enterprise value to operating cash flow.
35    #[serde(alias = "evToOperatingCashFlowTTM")]
36    pub ev_to_operating_cash_flow: Option<f64>,
37    /// Enterprise value to free cash flow.
38    #[serde(alias = "evToFreeCashFlowTTM")]
39    pub ev_to_free_cash_flow: Option<f64>,
40    /// Enterprise value to EBITDA.
41    #[serde(alias = "evToEBITDATTM")]
42    pub ev_to_ebitda: Option<f64>,
43    /// Net debt to EBITDA.
44    #[serde(alias = "netDebtToEBITDATTM")]
45    pub net_debt_to_ebitda: Option<f64>,
46    /// Current ratio.
47    #[serde(alias = "currentRatioTTM")]
48    pub current_ratio: Option<f64>,
49    /// Operating cash flow divided by net income.
50    #[serde(alias = "incomeQualityTTM")]
51    pub income_quality: Option<f64>,
52    /// Graham number.
53    #[serde(alias = "grahamNumberTTM")]
54    pub graham_number: Option<f64>,
55    /// Graham net-net working capital per share.
56    #[serde(alias = "grahamNetNetTTM")]
57    pub graham_net_net: Option<f64>,
58    /// Net income divided by pre-tax income (fraction).
59    #[serde(alias = "taxBurdenTTM")]
60    pub tax_burden: Option<f64>,
61    /// Pre-tax income divided by EBIT (fraction).
62    #[serde(alias = "interestBurdenTTM")]
63    pub interest_burden: Option<f64>,
64    /// Working capital.
65    #[serde(alias = "workingCapitalTTM")]
66    pub working_capital: Option<f64>,
67    /// Invested capital.
68    #[serde(alias = "investedCapitalTTM")]
69    pub invested_capital: Option<f64>,
70    /// Return on assets (fraction).
71    #[serde(alias = "returnOnAssetsTTM")]
72    pub return_on_assets: Option<f64>,
73    /// Operating income divided by total assets (fraction).
74    #[serde(alias = "operatingReturnOnAssetsTTM")]
75    pub operating_return_on_assets: Option<f64>,
76    /// Return on tangible assets (fraction).
77    #[serde(alias = "returnOnTangibleAssetsTTM")]
78    pub return_on_tangible_assets: Option<f64>,
79    /// Return on equity (fraction).
80    #[serde(alias = "returnOnEquityTTM")]
81    pub return_on_equity: Option<f64>,
82    /// Return on invested capital (fraction).
83    #[serde(alias = "returnOnInvestedCapitalTTM")]
84    pub return_on_invested_capital: Option<f64>,
85    /// Return on capital employed (fraction).
86    #[serde(alias = "returnOnCapitalEmployedTTM")]
87    pub return_on_capital_employed: Option<f64>,
88    /// Earnings yield (fraction).
89    #[serde(alias = "earningsYieldTTM")]
90    pub earnings_yield: Option<f64>,
91    /// Free cash flow yield (fraction).
92    #[serde(alias = "freeCashFlowYieldTTM")]
93    pub free_cash_flow_yield: Option<f64>,
94    /// Capital expenditure to operating cash flow (fraction).
95    #[serde(alias = "capexToOperatingCashFlowTTM")]
96    pub capex_to_operating_cash_flow: Option<f64>,
97    /// Capital expenditure to depreciation (fraction).
98    #[serde(alias = "capexToDepreciationTTM")]
99    pub capex_to_depreciation: Option<f64>,
100    /// Capital expenditure to revenue (fraction).
101    #[serde(alias = "capexToRevenueTTM")]
102    pub capex_to_revenue: Option<f64>,
103    /// Selling, general and administrative expense to revenue (fraction).
104    #[serde(alias = "salesGeneralAndAdministrativeToRevenueTTM")]
105    pub sales_general_and_administrative_to_revenue: Option<f64>,
106    /// Research and development expense to revenue (fraction).
107    // FMP misspells this key upstream ("Developement"); the alias is verbatim.
108    #[serde(alias = "researchAndDevelopementToRevenueTTM")]
109    pub research_and_development_to_revenue: Option<f64>,
110    /// Stock-based compensation to revenue (fraction).
111    #[serde(alias = "stockBasedCompensationToRevenueTTM")]
112    pub stock_based_compensation_to_revenue: Option<f64>,
113    /// Intangible assets to total assets (fraction).
114    #[serde(alias = "intangiblesToTotalAssetsTTM")]
115    pub intangibles_to_total_assets: Option<f64>,
116    /// Average receivables.
117    #[serde(alias = "averageReceivablesTTM")]
118    pub average_receivables: Option<f64>,
119    /// Average payables.
120    #[serde(alias = "averagePayablesTTM")]
121    pub average_payables: Option<f64>,
122    /// Average inventory.
123    #[serde(alias = "averageInventoryTTM")]
124    pub average_inventory: Option<f64>,
125    /// Days sales outstanding.
126    #[serde(alias = "daysOfSalesOutstandingTTM")]
127    pub days_of_sales_outstanding: Option<f64>,
128    /// Days payables outstanding.
129    #[serde(alias = "daysOfPayablesOutstandingTTM")]
130    pub days_of_payables_outstanding: Option<f64>,
131    /// Days inventory outstanding.
132    #[serde(alias = "daysOfInventoryOutstandingTTM")]
133    pub days_of_inventory_outstanding: Option<f64>,
134    /// Operating cycle in days.
135    #[serde(alias = "operatingCycleTTM")]
136    pub operating_cycle: Option<f64>,
137    /// Cash conversion cycle in days.
138    #[serde(alias = "cashConversionCycleTTM")]
139    pub cash_conversion_cycle: Option<f64>,
140    /// Free cash flow to equity.
141    #[serde(alias = "freeCashFlowToEquityTTM")]
142    pub free_cash_flow_to_equity: Option<f64>,
143    /// Free cash flow to the firm.
144    #[serde(alias = "freeCashFlowToFirmTTM")]
145    pub free_cash_flow_to_firm: Option<f64>,
146    /// Tangible asset value.
147    #[serde(alias = "tangibleAssetValueTTM")]
148    pub tangible_asset_value: Option<f64>,
149    /// Net current asset value.
150    #[serde(alias = "netCurrentAssetValueTTM")]
151    pub net_current_asset_value: Option<f64>,
152}
153
154/// Margin, turnover, liquidity, coverage, valuation, and per-share ratios over
155/// the trailing twelve months.
156#[derive(Debug, Clone, Default, Serialize, Deserialize)]
157#[non_exhaustive]
158pub struct FinancialRatiosTtm {
159    /// Ticker symbol.
160    pub symbol: Option<String>,
161    /// Gross profit margin (fraction).
162    #[serde(alias = "grossProfitMarginTTM")]
163    pub gross_profit_margin: Option<f64>,
164    /// EBIT margin (fraction).
165    #[serde(alias = "ebitMarginTTM")]
166    pub ebit_margin: Option<f64>,
167    /// EBITDA margin (fraction).
168    #[serde(alias = "ebitdaMarginTTM")]
169    pub ebitda_margin: Option<f64>,
170    /// Operating profit margin (fraction).
171    #[serde(alias = "operatingProfitMarginTTM")]
172    pub operating_profit_margin: Option<f64>,
173    /// Pre-tax profit margin (fraction).
174    #[serde(alias = "pretaxProfitMarginTTM")]
175    pub pretax_profit_margin: Option<f64>,
176    /// Continuing-operations profit margin (fraction).
177    #[serde(alias = "continuousOperationsProfitMarginTTM")]
178    pub continuous_operations_profit_margin: Option<f64>,
179    /// Net profit margin (fraction).
180    #[serde(alias = "netProfitMarginTTM")]
181    pub net_profit_margin: Option<f64>,
182    /// Bottom-line profit margin (fraction).
183    #[serde(alias = "bottomLineProfitMarginTTM")]
184    pub bottom_line_profit_margin: Option<f64>,
185    /// Receivables turnover.
186    #[serde(alias = "receivablesTurnoverTTM")]
187    pub receivables_turnover: Option<f64>,
188    /// Payables turnover.
189    #[serde(alias = "payablesTurnoverTTM")]
190    pub payables_turnover: Option<f64>,
191    /// Inventory turnover.
192    #[serde(alias = "inventoryTurnoverTTM")]
193    pub inventory_turnover: Option<f64>,
194    /// Fixed-asset turnover.
195    #[serde(alias = "fixedAssetTurnoverTTM")]
196    pub fixed_asset_turnover: Option<f64>,
197    /// Asset turnover.
198    #[serde(alias = "assetTurnoverTTM")]
199    pub asset_turnover: Option<f64>,
200    /// Current ratio.
201    #[serde(alias = "currentRatioTTM")]
202    pub current_ratio: Option<f64>,
203    /// Quick ratio.
204    #[serde(alias = "quickRatioTTM")]
205    pub quick_ratio: Option<f64>,
206    /// Solvency ratio.
207    #[serde(alias = "solvencyRatioTTM")]
208    pub solvency_ratio: Option<f64>,
209    /// Cash ratio.
210    #[serde(alias = "cashRatioTTM")]
211    pub cash_ratio: Option<f64>,
212    /// Price-to-earnings ratio.
213    #[serde(alias = "priceToEarningsRatioTTM")]
214    pub price_earnings_ratio: Option<f64>,
215    /// Price/earnings-to-growth ratio.
216    #[serde(alias = "priceToEarningsGrowthRatioTTM")]
217    pub peg_ratio: Option<f64>,
218    /// Forward price/earnings-to-growth ratio.
219    #[serde(alias = "forwardPriceToEarningsGrowthRatioTTM")]
220    pub forward_peg_ratio: Option<f64>,
221    /// Diluted price-to-earnings ratio.
222    #[serde(alias = "priceToEarningsDilutedRatioTTM")]
223    pub price_to_earnings_diluted_ratio: Option<f64>,
224    /// Diluted price/earnings-to-growth ratio.
225    #[serde(alias = "priceToEarningsDilutedGrowthRatioTTM")]
226    pub price_to_earnings_diluted_growth_ratio: Option<f64>,
227    /// Price-to-book ratio.
228    #[serde(alias = "priceToBookRatioTTM")]
229    pub price_to_book_ratio: Option<f64>,
230    /// Price-to-sales ratio.
231    #[serde(alias = "priceToSalesRatioTTM")]
232    pub price_to_sales_ratio: Option<f64>,
233    /// Price-to-free-cash-flow ratio.
234    #[serde(alias = "priceToFreeCashFlowRatioTTM")]
235    pub price_to_free_cash_flows_ratio: Option<f64>,
236    /// Price-to-operating-cash-flow ratio.
237    #[serde(alias = "priceToOperatingCashFlowRatioTTM")]
238    pub price_to_operating_cash_flow_ratio: Option<f64>,
239    /// Debt-to-assets ratio.
240    #[serde(alias = "debtToAssetsRatioTTM")]
241    pub debt_ratio: Option<f64>,
242    /// Debt-to-equity ratio.
243    #[serde(alias = "debtToEquityRatioTTM")]
244    pub debt_equity_ratio: Option<f64>,
245    /// Debt-to-capital ratio.
246    #[serde(alias = "debtToCapitalRatioTTM")]
247    pub debt_to_capital_ratio: Option<f64>,
248    /// Long-term-debt-to-capital ratio.
249    #[serde(alias = "longTermDebtToCapitalRatioTTM")]
250    pub long_term_debt_to_capital_ratio: Option<f64>,
251    /// Financial leverage ratio.
252    #[serde(alias = "financialLeverageRatioTTM")]
253    pub financial_leverage_ratio: Option<f64>,
254    /// Working-capital turnover ratio.
255    #[serde(alias = "workingCapitalTurnoverRatioTTM")]
256    pub working_capital_turnover_ratio: Option<f64>,
257    /// Operating cash flow to current liabilities.
258    #[serde(alias = "operatingCashFlowRatioTTM")]
259    pub operating_cash_flow_ratio: Option<f64>,
260    /// Operating cash flow to sales (fraction).
261    #[serde(alias = "operatingCashFlowSalesRatioTTM")]
262    pub operating_cash_flow_sales_ratio: Option<f64>,
263    /// Free cash flow to operating cash flow (fraction).
264    #[serde(alias = "freeCashFlowOperatingCashFlowRatioTTM")]
265    pub free_cash_flow_operating_cash_flow_ratio: Option<f64>,
266    /// Debt-service coverage ratio.
267    #[serde(alias = "debtServiceCoverageRatioTTM")]
268    pub debt_service_coverage_ratio: Option<f64>,
269    /// Interest coverage.
270    #[serde(alias = "interestCoverageRatioTTM")]
271    pub interest_coverage: Option<f64>,
272    /// Short-term operating cash flow coverage ratio.
273    #[serde(alias = "shortTermOperatingCashFlowCoverageRatioTTM")]
274    pub short_term_operating_cash_flow_coverage_ratio: Option<f64>,
275    /// Operating cash flow coverage ratio.
276    #[serde(alias = "operatingCashFlowCoverageRatioTTM")]
277    pub operating_cash_flow_coverage_ratio: Option<f64>,
278    /// Capital-expenditure coverage ratio.
279    #[serde(alias = "capitalExpenditureCoverageRatioTTM")]
280    pub capital_expenditure_coverage_ratio: Option<f64>,
281    /// Dividends-paid-and-capex coverage ratio.
282    #[serde(alias = "dividendPaidAndCapexCoverageRatioTTM")]
283    pub dividend_paid_and_capex_coverage_ratio: Option<f64>,
284    /// Payout ratio (fraction).
285    #[serde(alias = "dividendPayoutRatioTTM")]
286    pub payout_ratio: Option<f64>,
287    /// Dividend yield (fraction, not percent).
288    #[serde(alias = "dividendYielTTM", alias = "dividendYieldTTM")]
289    pub dividend_yield: Option<f64>,
290    /// Dividend per share.
291    #[serde(alias = "dividendPerShareTTM")]
292    pub dividend_per_share: Option<f64>,
293    /// Enterprise value.
294    #[serde(alias = "enterpriseValueTTM")]
295    pub enterprise_value: Option<f64>,
296    /// Enterprise value multiple (EV/EBITDA).
297    #[serde(alias = "enterpriseValueMultipleTTM")]
298    pub enterprise_value_multiple: Option<f64>,
299    /// Revenue per share.
300    #[serde(alias = "revenuePerShareTTM")]
301    pub revenue_per_share: Option<f64>,
302    /// Net income per share.
303    #[serde(alias = "netIncomePerShareTTM")]
304    pub net_income_per_share: Option<f64>,
305    /// Interest-bearing debt per share.
306    #[serde(alias = "interestDebtPerShareTTM")]
307    pub interest_debt_per_share: Option<f64>,
308    /// Cash per share.
309    #[serde(alias = "cashPerShareTTM")]
310    pub cash_per_share: Option<f64>,
311    /// Book value per share.
312    #[serde(alias = "bookValuePerShareTTM")]
313    pub book_value_per_share: Option<f64>,
314    /// Tangible book value per share.
315    #[serde(alias = "tangibleBookValuePerShareTTM")]
316    pub tangible_book_value_per_share: Option<f64>,
317    /// Shareholders' equity per share.
318    #[serde(alias = "shareholdersEquityPerShareTTM")]
319    pub shareholders_equity_per_share: Option<f64>,
320    /// Operating cash flow per share.
321    #[serde(alias = "operatingCashFlowPerShareTTM")]
322    pub operating_cash_flow_per_share: Option<f64>,
323    /// Capital expenditure per share.
324    #[serde(alias = "capexPerShareTTM")]
325    pub capex_per_share: Option<f64>,
326    /// Free cash flow per share.
327    #[serde(alias = "freeCashFlowPerShareTTM")]
328    pub free_cash_flow_per_share: Option<f64>,
329    /// Net income divided by pre-tax income (fraction).
330    #[serde(alias = "netIncomePerEBTTTM")]
331    pub net_income_per_ebt: Option<f64>,
332    /// Pre-tax income divided by EBIT (fraction).
333    #[serde(alias = "ebtPerEbitTTM")]
334    pub ebt_per_ebit: Option<f64>,
335    /// Price to fair value.
336    #[serde(alias = "priceToFairValueTTM")]
337    pub price_to_fair_value: Option<f64>,
338    /// Total debt to market capitalization (fraction).
339    #[serde(alias = "debtToMarketCapTTM")]
340    pub debt_to_market_cap: Option<f64>,
341    /// Effective tax rate (fraction).
342    #[serde(alias = "effectiveTaxRateTTM")]
343    pub effective_tax_rate: Option<f64>,
344}