Skip to content

Commit 2de3536

Browse files
authored
Add economic indicators (#70)
1 parent 6242453 commit 2de3536

11 files changed

+283
-12
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using MatthiWare.FinancialModelingPrep.Model;
2+
using MatthiWare.FinancialModelingPrep.Model.Economics;
3+
using System.Collections.Generic;
4+
using System.Threading.Tasks;
5+
6+
namespace MatthiWare.FinancialModelingPrep.Abstractions.Economics
7+
{
8+
public interface IEconomicsProvider
9+
{
10+
/// <summary>
11+
/// Gets the economic indicator result for a given timeframe
12+
/// </summary>
13+
/// <param name="indicator">Economic indicator to use</param>
14+
/// <param name="from">Format YYYY-MM-DD</param>
15+
/// <param name="to">Format YYYY-MM-DD</param>
16+
/// <returns><see cref="EconomicIndicatorResponse"/></returns>
17+
public Task<ApiResponse<List<EconomicIndicatorResponse>>> GetEconomicIndicatorAsync(EconomicIndicator indicator, string from, string to);
18+
}
19+
}

FinancialModelingPrepApi/Abstractions/IFinancialModelingPrepApiClient.cs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using MatthiWare.FinancialModelingPrep.Abstractions.AdvancedData;
22
using MatthiWare.FinancialModelingPrep.Abstractions.Calendars;
33
using MatthiWare.FinancialModelingPrep.Abstractions.CompanyValuation;
4+
using MatthiWare.FinancialModelingPrep.Abstractions.Economics;
45
using MatthiWare.FinancialModelingPrep.Abstractions.Fund;
56
using MatthiWare.FinancialModelingPrep.Abstractions.InstitutionalFund;
67
using MatthiWare.FinancialModelingPrep.Abstractions.MarketIndexes;
@@ -19,51 +20,60 @@ public interface IFinancialModelingPrepApiClient
1920
/// Advanced Data Endpoints are grouped here
2021
/// Note: most of these endpoints require a premium API Key
2122
/// </summary>
22-
IAdvancedDataProvider AdvancedData { get; }
23+
public IAdvancedDataProvider AdvancedData { get; }
2324

2425
/// <summary>
2526
/// All Company Valuation Endpoints are grouped here
2627
/// </summary>
27-
ICompanyValuationProvider CompanyValuation { get; }
28+
public ICompanyValuationProvider CompanyValuation { get; }
2829

2930
/// <summary>
3031
/// All Market Index Endpoints are grouped here
3132
/// </summary>
32-
IMarketIndexesProvider MarketIndexes { get; }
33+
public IMarketIndexesProvider MarketIndexes { get; }
3334

3435
/// <summary>
3536
/// All Calendar related Endpoints are grouped here (Earnings, IPO, stock splits, Dividends, Economic)
3637
/// </summary>
37-
ICalendarsProvider Calendars { get; }
38+
public ICalendarsProvider Calendars { get; }
3839

3940
/// <summary>
4041
/// All Instituational Fund Endpoints are grouped here
4142
/// </summary>
42-
IInstitutionalFundProvider InstitutionalFund { get; }
43+
public IInstitutionalFundProvider InstitutionalFund { get; }
4344

4445
/// <summary>
4546
/// All Stock Time Series Endpoints are grouped here
4647
/// </summary>
47-
IStockTimeSeriesProvider StockTimeSeries { get; }
48+
public IStockTimeSeriesProvider StockTimeSeries { get; }
4849

4950
/// <summary>
5051
/// All Stock Market Related Endpoints are grouped here (Most Active, Gainers, Losers)
5152
/// </summary>
52-
IStockMarketProvider StockMarket { get; }
53+
public IStockMarketProvider StockMarket { get; }
5354

5455
/// <summary>
5556
/// Statistic Related Endpoint are grouped here (Estimates)
5657
/// </summary>
57-
IStockStatisticsProvider StockStatistics { get; }
58+
public IStockStatisticsProvider StockStatistics { get; }
5859

5960
/// <summary>
6061
/// Cryptomarket related enpoints
6162
/// </summary>
62-
ICryptoMarketProvider Crypto { get; }
63+
public ICryptoMarketProvider Crypto { get; }
6364

6465
/// <summary>
6566
/// ETF/Mutual Fund related enpoints
6667
/// </summary>
67-
IFundProvider Fund { get; }
68+
public IFundProvider Fund { get; }
69+
70+
71+
/// <summary>
72+
/// Economics related endpoints
73+
/// - Market risk premium
74+
/// - Treasury rates
75+
/// - Economic indicators
76+
/// </summary>
77+
public IEconomicsProvider Economics { get; }
6878
}
6979
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using MatthiWare.FinancialModelingPrep.Abstractions.Economics;
2+
using MatthiWare.FinancialModelingPrep.Core.Http;
3+
using MatthiWare.FinancialModelingPrep.Model;
4+
using MatthiWare.FinancialModelingPrep.Model.Economics;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Collections.Specialized;
8+
using System.Threading.Tasks;
9+
10+
namespace MatthiWare.FinancialModelingPrep.Core.Economics
11+
{
12+
public class EconomicsProvider : IEconomicsProvider
13+
{
14+
private readonly FinancialModelingPrepHttpClient client;
15+
16+
public EconomicsProvider(FinancialModelingPrepHttpClient client)
17+
{
18+
this.client = client ?? throw new System.ArgumentNullException(nameof(client));
19+
}
20+
21+
/// <inheritdoc/>
22+
public Task<ApiResponse<List<EconomicIndicatorResponse>>> GetEconomicIndicatorAsync(EconomicIndicator indicator, string from, string to)
23+
{
24+
const string url = "[version]/economic";
25+
26+
var pathParams = new NameValueCollection()
27+
{
28+
{ "version", ApiVersion.v4.ToString() },
29+
};
30+
31+
var queryString = new QueryStringBuilder();
32+
33+
queryString.Add("name", indicator.ToFMP());
34+
queryString.Add("from", from);
35+
queryString.Add("to", to);
36+
37+
return client.GetJsonAsync<List<EconomicIndicatorResponse>>(url, pathParams, queryString);
38+
}
39+
}
40+
}

FinancialModelingPrepApi/Core/FinancialModelingPrepApiClient.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using MatthiWare.FinancialModelingPrep.Abstractions.AdvancedData;
22
using MatthiWare.FinancialModelingPrep.Abstractions.Calendars;
33
using MatthiWare.FinancialModelingPrep.Abstractions.CompanyValuation;
4+
using MatthiWare.FinancialModelingPrep.Abstractions.Economics;
45
using MatthiWare.FinancialModelingPrep.Abstractions.Fund;
56
using MatthiWare.FinancialModelingPrep.Abstractions.InstitutionalFund;
67
using MatthiWare.FinancialModelingPrep.Abstractions.MarketIndexes;
@@ -43,6 +44,9 @@ public class FinancialModelingPrepApiClient : IFinancialModelingPrepApiClient
4344
/// <inheritdoc/>
4445
public IFundProvider Fund { get; }
4546

47+
/// <inheritdoc/>
48+
public IEconomicsProvider Economics { get; }
49+
4650
/// <inheritdoc/>
4751
public FinancialModelingPrepApiClient(ICompanyValuationProvider companyValuation,
4852
IMarketIndexesProvider marketIndexes,
@@ -53,7 +57,8 @@ public FinancialModelingPrepApiClient(ICompanyValuationProvider companyValuation
5357
IStockMarketProvider stockMarket,
5458
IStockStatisticsProvider stockStatistics,
5559
ICryptoMarketProvider cryptoMarket,
56-
IFundProvider fund)
60+
IFundProvider fund,
61+
IEconomicsProvider economics)
5762
{
5863
CompanyValuation = companyValuation;
5964
MarketIndexes = marketIndexes;
@@ -65,6 +70,7 @@ public FinancialModelingPrepApiClient(ICompanyValuationProvider companyValuation
6570
StockStatistics = stockStatistics;
6671
Crypto = cryptoMarket;
6772
Fund = fund;
73+
Economics = economics;
6874
}
6975
}
7076
}

FinancialModelingPrepApi/DependencyInjectionExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using MatthiWare.FinancialModelingPrep.Abstractions.AdvancedData;
22
using MatthiWare.FinancialModelingPrep.Abstractions.Calendars;
33
using MatthiWare.FinancialModelingPrep.Abstractions.CompanyValuation;
4+
using MatthiWare.FinancialModelingPrep.Abstractions.Economics;
45
using MatthiWare.FinancialModelingPrep.Abstractions.Fund;
56
using MatthiWare.FinancialModelingPrep.Abstractions.Http;
67
using MatthiWare.FinancialModelingPrep.Abstractions.InstitutionalFund;
@@ -12,6 +13,7 @@
1213
using MatthiWare.FinancialModelingPrep.Core.AdvancedData;
1314
using MatthiWare.FinancialModelingPrep.Core.Calendars;
1415
using MatthiWare.FinancialModelingPrep.Core.CompanyValuation;
16+
using MatthiWare.FinancialModelingPrep.Core.Economics;
1517
using MatthiWare.FinancialModelingPrep.Core.Fund;
1618
using MatthiWare.FinancialModelingPrep.Core.Http;
1719
using MatthiWare.FinancialModelingPrep.Core.InstitutionalFund;
@@ -54,6 +56,7 @@ public static void AddFinancialModelingPrepApiClient(this IServiceCollection ser
5456
services.TryAddTransient<ICryptoMarketProvider, CryptoMarketProvider>();
5557
services.TryAddTransient<IStockStatisticsProvider, StockStatisticsProvider>();
5658
services.TryAddTransient<IFundProvider, FundProvider>();
59+
services.TryAddTransient<IEconomicsProvider, EconomicsProvider>();
5760
}
5861
}
5962
}

FinancialModelingPrepApi/FinancialModelingPrepApi.xml

Lines changed: 43 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
3+
namespace MatthiWare.FinancialModelingPrep.Model.Economics
4+
{
5+
public enum EconomicIndicator
6+
{
7+
GDP,
8+
RealGDP,
9+
NominalPotentialGDP,
10+
RealGDPPerCapita,
11+
FederalFunds,
12+
CPI,
13+
InflationRate,
14+
Inflation,
15+
RetailSales,
16+
ConsumerSentiment,
17+
DurableGoods,
18+
UnemploymentRate,
19+
TotalNonfarmPayroll,
20+
InitialClaims,
21+
IndustrialProductionTotalIndex,
22+
NewPrivatelyOwnedHousingUnitsStartedTotalUnits,
23+
TotalVehicleSales,
24+
RetailMoneyFunds,
25+
SmoothedUSRecessionProbabilities,
26+
CertificatesOfDeposit3MonthOr90DayRatesAndYields,
27+
CommercialBankInterestRateOnCreditCardPlansAllAccounts,
28+
FixedRateMortgageAverage30Year,
29+
FixedRateMortgageAverage15Year,
30+
}
31+
32+
public static class EconomicIndicatorExtensions
33+
{
34+
public static string ToFMP(this EconomicIndicator indicator)
35+
{
36+
return indicator switch
37+
{
38+
EconomicIndicator.GDP => "GDP",
39+
EconomicIndicator.RealGDP => "realGDP",
40+
EconomicIndicator.NominalPotentialGDP => "nominalPotentialGDP",
41+
EconomicIndicator.RealGDPPerCapita => "realGDPPerCapita",
42+
EconomicIndicator.FederalFunds => "federalFunds",
43+
EconomicIndicator.CPI => "CPI",
44+
EconomicIndicator.InflationRate => "inflationRate",
45+
EconomicIndicator.Inflation => "inflation",
46+
EconomicIndicator.RetailSales => "retailSales",
47+
EconomicIndicator.ConsumerSentiment => "consumerSentiment",
48+
EconomicIndicator.DurableGoods => "durableGoods",
49+
EconomicIndicator.UnemploymentRate => "unemploymentRate",
50+
EconomicIndicator.TotalNonfarmPayroll => "totalNonfarmPayroll",
51+
EconomicIndicator.InitialClaims => "initialClaims",
52+
EconomicIndicator.IndustrialProductionTotalIndex => "industrialProductionTotalIndex",
53+
EconomicIndicator.NewPrivatelyOwnedHousingUnitsStartedTotalUnits => "newPrivatelyOwnedHousingUnitsStartedTotalUnits",
54+
EconomicIndicator.TotalVehicleSales => "totalVehicleSales",
55+
EconomicIndicator.RetailMoneyFunds => "retailMoneyFunds",
56+
EconomicIndicator.SmoothedUSRecessionProbabilities => "smoothedUSRecessionProbabilities",
57+
EconomicIndicator.CertificatesOfDeposit3MonthOr90DayRatesAndYields => "3MonthOr90DayRatesAndYieldsCertificatesOfDeposit",
58+
EconomicIndicator.CommercialBankInterestRateOnCreditCardPlansAllAccounts => "commercialBankInterestRateOnCreditCardPlansAllAccounts",
59+
EconomicIndicator.FixedRateMortgageAverage15Year => "15YearFixedRateMortgageAverage",
60+
EconomicIndicator.FixedRateMortgageAverage30Year => "30YearFixedRateMortgageAverage",
61+
_ => throw new NotImplementedException(),
62+
};
63+
}
64+
}
65+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace MatthiWare.FinancialModelingPrep.Model.Economics
4+
{
5+
public class EconomicIndicatorResponse
6+
{
7+
[JsonPropertyName("date")]
8+
public string Date { get; set; }
9+
10+
[JsonPropertyName("value")]
11+
public double Value { get; set; }
12+
}
13+
}

Tests/ClientFactoryTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,11 @@ public void API_Contains_Fund_Provider()
6565
{
6666
Assert.NotNull(api.Fund);
6767
}
68+
69+
[Fact]
70+
public void API_Contains_Economics_Provider()
71+
{
72+
Assert.NotNull(api.Economics);
73+
}
6874
}
6975
}

0 commit comments

Comments
 (0)