Skip to main content

finance_query/models/corporate/
fund_performance.rs

1use serde::{Deserialize, Serialize};
2
3use crate::models::quote::FormattedValue;
4
5/// Fund performance data including returns, risk metrics, and historical performance
6#[derive(Default, Debug, Clone, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8#[non_exhaustive]
9pub struct FundPerformance {
10    /// Maximum age of the data in seconds
11    #[serde(default)]
12    pub max_age: Option<i64>,
13
14    /// Fund category name (e.g., "Large Blend")
15    #[serde(default)]
16    pub fund_category_name: Option<String>,
17
18    /// Performance overview for this fund
19    #[serde(default)]
20    pub performance_overview: Option<PerformanceOverview>,
21
22    /// Performance overview for the fund's category average
23    #[serde(default)]
24    pub performance_overview_cat: Option<PerformanceOverviewCat>,
25
26    /// Trailing returns (market price)
27    #[serde(default)]
28    pub trailing_returns: Option<TrailingReturns>,
29
30    /// Trailing returns (NAV - Net Asset Value)
31    #[serde(default)]
32    pub trailing_returns_nav: Option<TrailingReturnsNav>,
33
34    /// Trailing returns for the fund's category average
35    #[serde(default)]
36    pub trailing_returns_cat: Option<TrailingReturnsCat>,
37
38    /// Annual total returns by year
39    #[serde(default)]
40    pub annual_total_returns: Option<AnnualTotalReturns>,
41
42    /// Quarterly returns
43    #[serde(default)]
44    pub past_quarterly_returns: Option<PastQuarterlyReturns>,
45
46    /// Risk statistics (alpha, beta, sharpe ratio, etc.)
47    #[serde(default)]
48    pub risk_overview_statistics: Option<RiskOverviewStatistics>,
49
50    /// Risk statistics for the fund's category average
51    #[serde(default)]
52    pub risk_overview_statistics_cat: Option<RiskOverviewStatisticsCat>,
53}
54
55/// Performance overview with key return metrics
56#[derive(Debug, Clone, Serialize, Deserialize)]
57#[serde(rename_all = "camelCase")]
58pub struct PerformanceOverview {
59    /// As of date (Unix timestamp)
60    #[serde(default)]
61    pub as_of_date: Option<FormattedValue<i64>>,
62
63    /// Year-to-date return percentage
64    #[serde(default)]
65    pub ytd_return_pct: Option<FormattedValue<f64>>,
66
67    /// 5-year average return percentage
68    #[serde(default)]
69    pub five_yr_avg_return_pct: Option<FormattedValue<f64>>,
70
71    /// 1-year total return
72    #[serde(default)]
73    pub one_year_total_return: Option<FormattedValue<f64>>,
74
75    /// 3-year total return
76    #[serde(default)]
77    pub three_year_total_return: Option<FormattedValue<f64>>,
78}
79
80/// Category average performance overview
81#[derive(Debug, Clone, Serialize, Deserialize)]
82#[serde(rename_all = "camelCase")]
83pub struct PerformanceOverviewCat {
84    /// Year-to-date return percentage (category average)
85    #[serde(default)]
86    pub ytd_return_pct: Option<FormattedValue<f64>>,
87
88    /// 5-year average return percentage (category average)
89    #[serde(default)]
90    pub five_yr_avg_return_pct: Option<FormattedValue<f64>>,
91
92    /// 1-year total return (category average)
93    #[serde(default)]
94    pub one_year_total_return: Option<FormattedValue<f64>>,
95
96    /// 3-year total return (category average)
97    #[serde(default)]
98    pub three_year_total_return: Option<FormattedValue<f64>>,
99}
100
101/// Trailing returns at market price
102#[derive(Debug, Clone, Serialize, Deserialize)]
103#[serde(rename_all = "camelCase")]
104pub struct TrailingReturns {
105    /// As of date (Unix timestamp)
106    #[serde(default)]
107    pub as_of_date: Option<FormattedValue<i64>>,
108
109    /// Year-to-date return
110    #[serde(default)]
111    pub ytd: Option<FormattedValue<f64>>,
112
113    /// 1-month return
114    #[serde(default)]
115    pub one_month: Option<FormattedValue<f64>>,
116
117    /// 3-month return
118    #[serde(default)]
119    pub three_month: Option<FormattedValue<f64>>,
120
121    /// 1-year return
122    #[serde(default)]
123    pub one_year: Option<FormattedValue<f64>>,
124
125    /// 3-year return
126    #[serde(default)]
127    pub three_year: Option<FormattedValue<f64>>,
128
129    /// 5-year return
130    #[serde(default)]
131    pub five_year: Option<FormattedValue<f64>>,
132
133    /// 10-year return
134    #[serde(default)]
135    pub ten_year: Option<FormattedValue<f64>>,
136
137    /// Return during last bull market
138    #[serde(default)]
139    pub last_bull_mkt: Option<FormattedValue<f64>>,
140
141    /// Return during last bear market
142    #[serde(default)]
143    pub last_bear_mkt: Option<FormattedValue<f64>>,
144}
145
146/// Trailing returns at NAV (Net Asset Value)
147#[derive(Debug, Clone, Serialize, Deserialize)]
148#[serde(rename_all = "camelCase")]
149pub struct TrailingReturnsNav {
150    /// Year-to-date return
151    #[serde(default)]
152    pub ytd: Option<FormattedValue<f64>>,
153
154    /// 1-month return
155    #[serde(default)]
156    pub one_month: Option<FormattedValue<f64>>,
157
158    /// 3-month return
159    #[serde(default)]
160    pub three_month: Option<FormattedValue<f64>>,
161
162    /// 1-year return
163    #[serde(default)]
164    pub one_year: Option<FormattedValue<f64>>,
165
166    /// 3-year return
167    #[serde(default)]
168    pub three_year: Option<FormattedValue<f64>>,
169
170    /// 5-year return
171    #[serde(default)]
172    pub five_year: Option<FormattedValue<f64>>,
173
174    /// 10-year return
175    #[serde(default)]
176    pub ten_year: Option<FormattedValue<f64>>,
177}
178
179/// Category average trailing returns
180#[derive(Debug, Clone, Serialize, Deserialize)]
181#[serde(rename_all = "camelCase")]
182pub struct TrailingReturnsCat {
183    /// Year-to-date return (category average)
184    #[serde(default)]
185    pub ytd: Option<FormattedValue<f64>>,
186
187    /// 1-month return (category average)
188    #[serde(default)]
189    pub one_month: Option<FormattedValue<f64>>,
190
191    /// 3-month return (category average)
192    #[serde(default)]
193    pub three_month: Option<FormattedValue<f64>>,
194
195    /// 1-year return (category average)
196    #[serde(default)]
197    pub one_year: Option<FormattedValue<f64>>,
198
199    /// 3-year return (category average)
200    #[serde(default)]
201    pub three_year: Option<FormattedValue<f64>>,
202
203    /// 5-year return (category average)
204    #[serde(default)]
205    pub five_year: Option<FormattedValue<f64>>,
206
207    /// 10-year return (category average)
208    #[serde(default)]
209    pub ten_year: Option<FormattedValue<f64>>,
210
211    /// Return during last bull market (category average)
212    #[serde(default)]
213    pub last_bull_mkt: Option<FormattedValue<f64>>,
214
215    /// Return during last bear market (category average)
216    #[serde(default)]
217    pub last_bear_mkt: Option<FormattedValue<f64>>,
218}
219
220/// Annual total returns by year
221#[derive(Debug, Clone, Serialize, Deserialize)]
222#[serde(rename_all = "camelCase")]
223pub struct AnnualTotalReturns {
224    /// Annual returns for this fund
225    #[serde(default)]
226    pub returns: Option<Vec<AnnualReturn>>,
227
228    /// Annual returns for the category average
229    #[serde(default)]
230    pub returns_cat: Option<Vec<AnnualReturn>>,
231}
232
233/// Single year's return data
234#[derive(Debug, Clone, Serialize, Deserialize)]
235#[serde(rename_all = "camelCase")]
236pub struct AnnualReturn {
237    /// Year (e.g., "2024")
238    #[serde(default)]
239    pub year: Option<String>,
240
241    /// Annual return value
242    #[serde(default)]
243    pub annual_value: Option<FormattedValue<f64>>,
244}
245
246/// Past quarterly returns
247#[derive(Debug, Clone, Serialize, Deserialize)]
248#[serde(rename_all = "camelCase")]
249pub struct PastQuarterlyReturns {
250    /// Quarterly returns
251    #[serde(default)]
252    pub returns: Option<Vec<serde_json::Value>>,
253}
254
255/// Risk overview statistics
256#[derive(Debug, Clone, Serialize, Deserialize)]
257#[serde(rename_all = "camelCase")]
258pub struct RiskOverviewStatistics {
259    /// Risk statistics for various time periods
260    #[serde(default)]
261    pub risk_statistics: Option<Vec<RiskStatistic>>,
262}
263
264/// Category average risk overview statistics
265#[derive(Debug, Clone, Serialize, Deserialize)]
266#[serde(rename_all = "camelCase")]
267pub struct RiskOverviewStatisticsCat {
268    /// Category average risk statistics
269    #[serde(default)]
270    pub risk_statistics_cat: Option<Vec<RiskStatistic>>,
271}
272
273/// Risk statistics for a specific time period
274#[derive(Debug, Clone, Serialize, Deserialize)]
275#[serde(rename_all = "camelCase")]
276pub struct RiskStatistic {
277    /// Time period (e.g., "3y", "5y", "10y")
278    #[serde(default)]
279    pub year: Option<String>,
280
281    /// Alpha - excess return relative to benchmark
282    #[serde(default)]
283    pub alpha: Option<FormattedValue<f64>>,
284
285    /// Beta - volatility relative to benchmark
286    #[serde(default)]
287    pub beta: Option<FormattedValue<f64>>,
288
289    /// Mean annual return
290    #[serde(default)]
291    pub mean_annual_return: Option<FormattedValue<f64>>,
292
293    /// R-squared - correlation with benchmark (0-100)
294    #[serde(default)]
295    pub r_squared: Option<FormattedValue<f64>>,
296
297    /// Standard deviation (volatility)
298    #[serde(default)]
299    pub std_dev: Option<FormattedValue<f64>>,
300
301    /// Sharpe ratio - risk-adjusted return
302    #[serde(default)]
303    pub sharpe_ratio: Option<FormattedValue<f64>>,
304
305    /// Treynor ratio - return per unit of systematic risk
306    #[serde(default)]
307    pub treynor_ratio: Option<FormattedValue<f64>>,
308}