Skip to content

Commit 0720b46

Browse files
committed
Add analyst estimates endpoint
1 parent 42e965c commit 0720b46

File tree

9 files changed

+230
-1
lines changed

9 files changed

+230
-1
lines changed

FinancialModelingPrepApi/Abstractions/IFinancialModelingPrepApiClient.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using MatthiWare.FinancialModelingPrep.Abstractions.CompanyValuation;
44
using MatthiWare.FinancialModelingPrep.Abstractions.InstitutionalFund;
55
using MatthiWare.FinancialModelingPrep.Abstractions.MarketIndexes;
6+
using MatthiWare.FinancialModelingPrep.Abstractions.Statistics;
67
using MatthiWare.FinancialModelingPrep.Abstractions.StockMarket;
78
using MatthiWare.FinancialModelingPrep.Abstractions.StockTimeSeries;
89

@@ -48,5 +49,10 @@ public interface IFinancialModelingPrepApiClient
4849
/// All Stock Market Related Endpoints are grouped here (Most Active, Gainers, Losers)
4950
/// </summary>
5051
IStockMarketProvider StockMarket { get; }
52+
53+
/// <summary>
54+
/// Statistic Related Endpoint are grouped here (Estimates)
55+
/// </summary>
56+
IStockStatisticsProvider StockStatistics { get; }
5157
}
5258
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using MatthiWare.FinancialModelingPrep.Model;
2+
using MatthiWare.FinancialModelingPrep.Model.Statistics;
3+
using System.Collections.Generic;
4+
using System.Threading.Tasks;
5+
6+
namespace MatthiWare.FinancialModelingPrep.Abstractions.Statistics
7+
{
8+
/// <summary>
9+
/// Stock related statistics
10+
/// </summary>
11+
public interface IStockStatisticsProvider
12+
{
13+
/// <summary>
14+
/// Get analyst estimates
15+
/// </summary>
16+
/// <param name="symbol">Stock symbol</param>
17+
/// <param name="period">Period (Annual or Quarterly)</param>
18+
/// <param name="limit">Limts the amount of results</param>
19+
/// <returns></returns>
20+
public Task<ApiResponse<List<AnalystEstimateItem>>> GetAnalystEstimatesAsync(string symbol, Period period = Period.Annual, int? limit = 30);
21+
}
22+
}

FinancialModelingPrepApi/Core/FinancialModelingPrepApiClient.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using MatthiWare.FinancialModelingPrep.Abstractions.CompanyValuation;
44
using MatthiWare.FinancialModelingPrep.Abstractions.InstitutionalFund;
55
using MatthiWare.FinancialModelingPrep.Abstractions.MarketIndexes;
6+
using MatthiWare.FinancialModelingPrep.Abstractions.Statistics;
67
using MatthiWare.FinancialModelingPrep.Abstractions.StockMarket;
78
using MatthiWare.FinancialModelingPrep.Abstractions.StockTimeSeries;
89

@@ -32,13 +33,17 @@ public class FinancialModelingPrepApiClient : IFinancialModelingPrepApiClient
3233
/// <inheritdoc/>
3334
public IStockMarketProvider StockMarket { get; }
3435

36+
public IStockStatisticsProvider StockStatistics { get; }
37+
38+
/// <inheritdoc/>
3539
public FinancialModelingPrepApiClient(ICompanyValuationProvider companyValuation,
3640
IMarketIndexesProvider marketIndexes,
3741
IAdvancedDataProvider advancedData,
3842
ICalendarsProvider calendars,
3943
IInstitutionalFundProvider institutionalFund,
4044
IStockTimeSeriesProvider stockTimeSeries,
41-
IStockMarketProvider stockMarket)
45+
IStockMarketProvider stockMarket,
46+
IStockStatisticsProvider stockStatistics)
4247
{
4348
CompanyValuation = companyValuation;
4449
MarketIndexes = marketIndexes;
@@ -47,6 +52,7 @@ public FinancialModelingPrepApiClient(ICompanyValuationProvider companyValuation
4752
InstitutionalFund = institutionalFund;
4853
StockTimeSeries = stockTimeSeries;
4954
StockMarket = stockMarket;
55+
StockStatistics = stockStatistics;
5056
}
5157
}
5258
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using MatthiWare.FinancialModelingPrep.Abstractions.Statistics;
2+
using MatthiWare.FinancialModelingPrep.Core.Http;
3+
using MatthiWare.FinancialModelingPrep.Model;
4+
using MatthiWare.FinancialModelingPrep.Model.Statistics;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Collections.Specialized;
8+
using System.Threading.Tasks;
9+
10+
namespace MatthiWare.FinancialModelingPrep.Core.Statistics
11+
{
12+
/// <inheritdoc/>
13+
public class StockStatisticsProvider : IStockStatisticsProvider
14+
{
15+
private readonly FinancialModelingPrepHttpClient client;
16+
17+
public StockStatisticsProvider(FinancialModelingPrepHttpClient client)
18+
{
19+
this.client = client ?? throw new ArgumentNullException(nameof(client));
20+
}
21+
22+
/// <inheritdoc/>
23+
public Task<ApiResponse<List<AnalystEstimateItem>>> GetAnalystEstimatesAsync(string symbol, Period period = Period.Annual, int? limit = 30)
24+
{
25+
const string url = "[version]/analyst-estimates/[symbol]";
26+
27+
var pathParams = new NameValueCollection()
28+
{
29+
{ "version", ApiVersion.v3.ToString() },
30+
{ "symbol", symbol },
31+
};
32+
33+
var queryString = new QueryStringBuilder();
34+
35+
queryString.Add("period", period);
36+
37+
if (limit != null)
38+
{
39+
queryString.Add("limit", limit);
40+
}
41+
42+
return client.GetJsonAsync<List<AnalystEstimateItem>>(url, pathParams, queryString);
43+
}
44+
45+
}
46+
}

FinancialModelingPrepApi/DependencyInjectionExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using MatthiWare.FinancialModelingPrep.Abstractions.Http;
55
using MatthiWare.FinancialModelingPrep.Abstractions.InstitutionalFund;
66
using MatthiWare.FinancialModelingPrep.Abstractions.MarketIndexes;
7+
using MatthiWare.FinancialModelingPrep.Abstractions.Statistics;
78
using MatthiWare.FinancialModelingPrep.Abstractions.StockMarket;
89
using MatthiWare.FinancialModelingPrep.Abstractions.StockTimeSeries;
910
using MatthiWare.FinancialModelingPrep.Core;
@@ -13,6 +14,7 @@
1314
using MatthiWare.FinancialModelingPrep.Core.Http;
1415
using MatthiWare.FinancialModelingPrep.Core.InstitutionalFund;
1516
using MatthiWare.FinancialModelingPrep.Core.MarketIndexes;
17+
using MatthiWare.FinancialModelingPrep.Core.Statistics;
1618
using MatthiWare.FinancialModelingPrep.Core.StockMarket;
1719
using MatthiWare.FinancialModelingPrep.Core.StockTimeSeries;
1820
using Microsoft.Extensions.DependencyInjection;
@@ -47,6 +49,7 @@ public static void AddFinancialModelingPrepApiClient(this IServiceCollection ser
4749
services.TryAddTransient<IInstitutionalFundProvider, InstitutionalFundProvider>();
4850
services.TryAddTransient<IStockTimeSeriesProvider, StockTimeSeriesProvider>();
4951
services.TryAddTransient<IStockMarketProvider, StockMarketProvider>();
52+
services.TryAddTransient<IStockStatisticsProvider, StockStatisticsProvider>();
5053
}
5154
}
5255
}

FinancialModelingPrepApi/FinancialModelingPrepApi.xml

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace MatthiWare.FinancialModelingPrep.Model.Statistics
4+
{
5+
public class AnalystEstimateItem
6+
{
7+
[JsonPropertyName("symbol")]
8+
public string Symbol { get; set; }
9+
10+
[JsonPropertyName("date")]
11+
public string Date { get; set; }
12+
13+
[JsonPropertyName("estimatedRevenueLow")]
14+
public double EstimatedRevenueLow { get; set; }
15+
16+
[JsonPropertyName("estimatedRevenueHigh")]
17+
public double EstimatedRevenueHigh { get; set; }
18+
19+
[JsonPropertyName("estimatedRevenueAvg")]
20+
public double EstimatedRevenueAvg { get; set; }
21+
22+
[JsonPropertyName("estimatedEbitdaLow")]
23+
public double EstimatedEbitdaLow { get; set; }
24+
25+
[JsonPropertyName("estimatedEbitdaHigh")]
26+
public double EstimatedEbitdaHigh { get; set; }
27+
28+
[JsonPropertyName("estimatedEbitdaAvg")]
29+
public double EstimatedEbitdaAvg { get; set; }
30+
31+
[JsonPropertyName("estimatedEbitLow")]
32+
public double EstimatedEbitLow { get; set; }
33+
34+
[JsonPropertyName("estimatedEbitHigh")]
35+
public double EstimatedEbitHigh { get; set; }
36+
37+
[JsonPropertyName("estimatedEbitAvg")]
38+
public double EstimatedEbitAvg { get; set; }
39+
40+
[JsonPropertyName("estimatedNetIncomeLow")]
41+
public double EstimatedNetIncomeLow { get; set; }
42+
43+
[JsonPropertyName("estimatedNetIncomeHigh")]
44+
public double EstimatedNetIncomeHigh { get; set; }
45+
46+
[JsonPropertyName("estimatedNetIncomeAvg")]
47+
public double EstimatedNetIncomeAvg { get; set; }
48+
49+
[JsonPropertyName("estimatedSgaExpenseLow")]
50+
public double EstimatedSgaExpenseLow { get; set; }
51+
52+
[JsonPropertyName("estimatedSgaExpenseHigh")]
53+
public double EstimatedSgaExpenseHigh { get; set; }
54+
55+
[JsonPropertyName("estimatedSgaExpenseAvg")]
56+
public double EstimatedSgaExpenseAvg { get; set; }
57+
58+
[JsonPropertyName("estimatedEpsAvg")]
59+
public double EstimatedEpsAvg { get; set; }
60+
61+
[JsonPropertyName("estimatedEpsHigh")]
62+
public double EstimatedEpsHigh { get; set; }
63+
64+
[JsonPropertyName("estimatedEpsLow")]
65+
public double EstimatedEpsLow { get; set; }
66+
67+
[JsonPropertyName("numberAnalystEstimatedRevenue")]
68+
public int NumberAnalystEstimatedRevenue { get; set; }
69+
70+
[JsonPropertyName("numberAnalystsEstimatedEps")]
71+
public int NumberAnalystsEstimatedEps { get; set; }
72+
}
73+
}

Tests/ResolveApiTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,13 @@ public void API_Contains_StockMarket_Provider()
6666

6767
Assert.NotNull(api.StockMarket);
6868
}
69+
70+
[Fact]
71+
public void API_Contains_StockStatistics_Provider()
72+
{
73+
var api = ServiceProvider.GetRequiredService<IFinancialModelingPrepApiClient>();
74+
75+
Assert.NotNull(api.StockStatistics);
76+
}
6977
}
7078
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using MatthiWare.FinancialModelingPrep.Abstractions.Statistics;
2+
using MatthiWare.FinancialModelingPrep.Model;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using System.Threading.Tasks;
5+
using Xunit;
6+
using Xunit.Abstractions;
7+
8+
namespace Tests.Statistics
9+
{
10+
public class StockStatisticsTests : TestingBase
11+
{
12+
private readonly IStockStatisticsProvider api;
13+
14+
public StockStatisticsTests(ITestOutputHelper testOutput) : base(testOutput)
15+
{
16+
api = ServiceProvider.GetRequiredService<IStockStatisticsProvider>();
17+
}
18+
19+
[Fact]
20+
public async Task GetAnalystEstimatesAsyncAnnualy()
21+
{
22+
var result = await api.GetAnalystEstimatesAsync("AAPL", Period.Annual, limit: 1);
23+
24+
result.AssertNoErrors();
25+
Assert.NotEmpty(result.Data);
26+
}
27+
28+
[Fact]
29+
public async Task GetAnalystEstimatesAsyncQuarterly()
30+
{
31+
var result = await api.GetAnalystEstimatesAsync("AAPL", Period.Quarter, limit: 1);
32+
33+
result.AssertNoErrors();
34+
Assert.NotEmpty(result.Data);
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)