diff options
author | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-06-10 19:48:11 -0700 |
---|---|---|
committer | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-06-10 19:48:11 -0700 |
commit | a335fe237ae55380a566e401c4f7e8913e145f3c (patch) | |
tree | fa1007dc96c333308bf898f276de2c1370cb9dbe | |
parent | 8fca1ba3d5c743c54b4d37dffb326ab936d7201d (diff) |
add federal reserve to obfr
8 files changed, 237 insertions, 9 deletions
diff --git a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py index 89819f95093..46253351646 100644 --- a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py +++ b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py @@ -758,6 +758,13 @@ def test_fixedincome_bond_indices(params, headers): "provider": "fred", } ), + ( + { + "start_date": "2023-01-01", + "end_date": "2023-06-06", + "provider": "federal_reserve", + } + ), ], ) @pytest.mark.integration diff --git a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py index 9a3b01721ff..3757ff084dc 100644 --- a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py +++ b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py @@ -708,6 +708,13 @@ def test_fixedincome_bond_indices(params, obb): "provider": "fred", } ), + ( + { + "start_date": "2023-01-01", + "end_date": "2023-06-06", + "provider": "federal_reserve", + } + ), ], ) @pytest.mark.integration diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json index 87258a2a9dc..1d954de432f 100644 --- a/openbb_platform/openbb/assets/reference.json +++ b/openbb_platform/openbb/assets/reference.json @@ -31128,12 +31128,13 @@ }, { "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: f, r, e, d.", + "type": "Literal['federal_reserve', 'fred']", + "description": "The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: f, e, d, e, r, a, l, _, r, e, s, e, r, v, e.", "default": null, "optional": true } ], + "federal_reserve": [], "fred": [ { "name": "frequency", @@ -31197,7 +31198,7 @@ }, { "name": "provider", - "type": "Optional[Literal['fred']]", + "type": "Optional[Literal['federal_reserve', 'fred']]", "description": "Provider name." }, { @@ -31276,6 +31277,16 @@ "choices": null } ], + "federal_reserve": [ + { + "name": "revision_indicator", + "type": "str", + "description": "Indicates a revision of the data for that date.", + "default": null, + "optional": true, + "choices": null + } + ], "fred": [] }, "model": "OvernightBankFundingRate" diff --git a/openbb_platform/openbb/package/fixedincome_rate.py b/openbb_platform/openbb/package/fixedincome_rate.py index e53f135de18..4fbd7761c0a 100644 --- a/openbb_platform/openbb/package/fixedincome_rate.py +++ b/openbb_platform/openbb/package/fixedincome_rate.py @@ -737,9 +737,9 @@ class ROUTER_fixedincome_rate(Container): OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ - Optional[Literal["fred"]], + Optional[Literal["federal_reserve", "fred"]], OpenBBField( - description="The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: fred." + description="The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: federal_reserve, fred." ), ] = None, **kwargs @@ -757,8 +757,8 @@ class ROUTER_fixedincome_rate(Container): Start date of the data, in YYYY-MM-DD format. end_date : Union[datetime.date, None, str] End date of the data, in YYYY-MM-DD format. - provider : Optional[Literal['fred']] - The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: fred. + provider : Optional[Literal['federal_reserve', 'fred']] + The provider to use, by default None. If None, the priority list configured in the settings is used. Default priority: federal_reserve, fred. frequency : Optional[Literal['a', 'q', 'm', 'w', 'wef', 'weth', 'wew', 'wetu', 'wem', 'wesu', 'wesa', 'bwew', 'bwem']] Frequency aggregation to convert daily data to lower frequency. @@ -802,7 +802,7 @@ class ROUTER_fixedincome_rate(Container): OBBject results : List[OvernightBankFundingRate] Serializable results. - provider : Optional[Literal['fred']] + provider : Optional[Literal['federal_reserve', 'fred']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -827,6 +827,8 @@ class ROUTER_fixedincome_rate(Container): 99th percentile of the distribution. volume : Optional[float] The trading volume.The notional volume of transactions (Billions of $). + revision_indicator : Optional[str] + Indicates a revision of the data for that date. (provider: federal_reserve) Examples -------- @@ -841,7 +843,7 @@ class ROUTER_fixedincome_rate(Container): "provider": self._get_provider( provider, "fixedincome.rate.overnight_bank_funding", - ("fred",), + ("federal_reserve", "fred"), ) }, standard_params={ diff --git a/openbb_platform/providers/federal_reserve/openbb_federal_reserve/__init__.py b/openbb_platform/providers/federal_reserve/openbb_federal_reserve/__init__.py index 093bd8eb9b2..cc04050917d 100644 --- a/openbb_platform/providers/federal_reserve/openbb_federal_reserve/__init__.py +++ b/openbb_platform/providers/federal_reserve/openbb_federal_reserve/__init__.py @@ -10,6 +10,9 @@ from openbb_federal_reserve.models.federal_funds_rate import ( from openbb_federal_reserve.models.money_measures import ( FederalReserveMoneyMeasuresFetcher, ) +from openbb_federal_reserve.models.overnight_bank_funding_rate import ( + FederalReserveOvernightBankFundingRateFetcher, +) from openbb_federal_reserve.models.sofr import FederalReserveSOFRFetcher from openbb_federal_reserve.models.treasury_rates import ( FederalReserveTreasuryRatesFetcher, @@ -24,6 +27,7 @@ federal_reserve_provider = Provider( "CentralBankHoldings": FederalReserveCentralBankHoldingsFetcher, "TreasuryRates": FederalReserveTreasuryRatesFetcher, "MoneyMeasures": FederalReserveMoneyMeasuresFetcher, + "OvernightBankFundingRate": FederalReserveOvernightBankFundingRateFetcher, "FederalFundsRate": FederalReserveFederalFundsRateFetcher, "SOFR": FederalReserveSOFRFetcher, "YieldCurve": FederalReserveYieldCurveFetcher, diff --git a/openbb_platform/providers/federal_reserve/openbb_federal_reserve/models/overnight_bank_funding_rate.py b/openbb_platform/providers/federal_reserve/openbb_federal_reserve/models/overnight_bank_funding_rate.py new file mode 100644 index 00000000000..e2ac0e3067d --- /dev/null +++ b/openbb_platform/providers/federal_reserve/openbb_federal_reserve/models/overnight_bank_funding_rate.py @@ -0,0 +1,119 @@ +"""Federal Reserve Federal Funds Rate Model.""" + +# pylint: disable=unused-argument + +from datetime import datetime +from typing import Any, Dict, List, Optional + +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.overnight_bank_funding_rate import ( + OvernightBankFundingRateData, + OvernightBankFundingRateQueryParams, +) +from openbb_core.provider.utils.errors import EmptyDataError +from openbb_core.provider.utils.helpers import amake_request +from pydantic import Field, field_validator + + +class FederalReserveOvernightBankFundingRateQueryParams( + OvernightBankFundingRateQueryParams +): + """FederalReserve Overnight Bank Funding Rate Query.""" + + +class FederalReserveOvernightBankFundingRateData(OvernightBankFundingRateData): + """FederalReserve Overnight Bank Funding Rate Data.""" + + __alias_dict__ = { + "date": "effectiveDate", + "rate": "percentRate", + "percentile_1": "percentPercentile1", + "percentile_25": "percentPercentile25", + "percentile_75": "percentPercentile75", + "percentile_99": "percentPercentile99", + "volume": "volumeInBillions", + } + + revision_indicator: Optional[str] = Field( + default=None, + description="Indicates a revision of the data for that date.", + ) + + @field_validator("revision_indicator", mode="before", check_fields=False) + @classmethod + def validate_revision_indicator(cls, v): + """Validate revision indicator.""" + return None if v in ("", "''") else v + + @field_validator( + "rate", + "percentile_1", + "percentile_25", + "percentile_75", + "percentile_99", + mode="before", + check_fields=False, + ) + @classmethod + def normalize_percent(cls, v): + """Normalize percent.""" + if v is not None: + return v / 100 if v != 0 else 0 + return None + + +class FederalReserveOvernightBankFundingRateFetcher( + Fetcher[ + FederalReserveOvernightBankFundingRateQueryParams, + List[FederalReserveOvernightBankFundingRateData], + ] +): + """Federal Reserve Federal Funds Fetcher.""" + + @staticmethod + def transform_query( + params: Dict[str, Any] + ) -> FederalReserveOvernightBankFundingRateQueryParams: + """Transform query.""" + transformed_params = params.copy() + now = datetime.now().date() + if params.get("start_date") is None: + transformed_params["start_date"] = datetime(2016, 3, 1).date() + if params.get("end_date") is None: + transformed_params["end_date"] = now + + return FederalReserveOvernightBankFundingRateQueryParams(**transformed_params) + + @staticmethod + async def aextract_data( + query: FederalReserveOvernightBankFundingRateQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> List[Dict]: + """Extract the raw data.""" + url = ( + "https://markets.newyorkfed.org/api/rates/unsecured/obfr/search.json?" + + f"startDate={query.start_date}&endDate={query.end_date}" + ) + results: List[Dict] = [] + response = await amake_request(url, **kwargs) + if response.get("refRates"): + results = response["refRates"] + if not results: + raise EmptyDataError() + return results + + @staticmethod + def transform_data( + query: FederalReserveOvernightBankFundingRateQueryParams, + data: List[Dict], + **kwargs: Any, + ) -> List[FederalReserveOvernightBankFundingRateData]: + """Transform data.""" + results: List[FederalReserveOvernightBankFundingRateData] = [] + for d in data.copy(): + _ = d.pop("type", None) + _ = d.pop("revisionIndicator", None) + results.append(FederalReserveOvernightBankFundingRateData.model_validate(d)) + + return results diff --git a/openbb_platform/providers/federal_reserve/tests/record/http/test_federal_reserve_fetchers/test_federal_reserve_overnight_bank_funding_rate_fetcher.yaml b/openbb_platform/providers/federal_reserve/tests/record/http/test_federal_reserve_fetchers/test_federal_reserve_overnight_bank_funding_rate_fetcher.yaml new file mode 100644 index 00000000000..d226109becf --- /dev/null +++ b/openbb_platform/providers/federal_reserve/tests/record/http/test_federal_reserve_fetchers/test_federal_reserve_overnight_bank_funding_rate_fetcher.yaml @@ -0,0 +1,63 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://markets.newyorkfed.org/api/rates/unsecured/obfr/search.json?startDate=2024-06-01&endDate=2024-06-06 + response: + body: + string: !!binary | + H4sIAAAAAAAEA6pWUCpKTQtKLEktVrJSiFaoVlBKTUtLTS7JLEt1SSxJVbJSUDIyMDLRNTDTNTBT + 0lFQKqksAIv6O7kFKSnoKBWkFiWn5pWAjFCyUjDVMzZCCAZA5DJzUg3Bckam2OSMTMGSxobYJM2h + ksbYJC0tITotFXSUyvJzSnNTPfOcMnNyMvPzQN4xsgDZV5RallmcmZ/nmZeSmZxYkl8E8pOSQq0O + fs+aDlbPWuDwrDlIgkzPmgw1z1oYKOgokelZ46HmWXN8yRgwhViFWgD5Rz99xgMAAA== + headers: + Access-Control-Allow-Headers: + - Content-Type,Content-Disposition + Access-Control-Allow-Methods: + - OPTIONS,GET + Access-Control-Allow-Origin: + - '*' + Access-Control-Expose-Headers: + - Content-Disposition + Cache-Control: + - no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '220' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 11 Jun 2024 02:34:03 GMT + Pragma: + - no-cache + Set-Cookie: + - cookiesession1=678A3E0EE607407E823ED4EA4F0C28B9;Expires=Wed, 11 Jun 2025 02:34:03 + GMT;Path=/;Secure;HttpOnly + Vary: + - Accept-Encoding + strict-transport-security: + - max-age=31536000; includeSubDomains + x-amz-apigw-id: + - ZLmgUG4BCYcFe8Q= + x-amzn-requestid: + - b77d47db-cd3e-492d-a63f-1ab9a17c16f8 + x-amzn-trace-id: + - Root=1-6667b79b-358f5ab1a50c2313c1e18089;Parent=15119c60494acd17;Sampled=0;lineage=e7c0e2ee:0 + x-frame-options: + - SAMEORIGIN + x-xss-protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/federal_reserve/tests/test_federal_reserve_fetchers.py b/openbb_platform/providers/federal_reserve/tests/test_federal_reserve_fetchers.py index 1e03e8973d6..839e20414ed 100644 --- a/openbb_platform/providers/federal_reserve/tests/test_federal_reserve_fetchers.py +++ b/openbb_platform/providers/federal_reserve/tests/test_federal_reserve_fetchers.py @@ -13,6 +13,9 @@ from openbb_federal_reserve.models.federal_funds_rate import ( from openbb_federal_reserve.models.money_measures import ( FederalReserveMoneyMeasuresFetcher, ) +from openbb_federal_reserve.models.overnight_bank_funding_rate import ( + FederalReserveOvernightBankFundingRateFetcher, +) from openbb_federal_reserve.models.sofr import FederalReserveSOFRFetcher from openbb_federal_reserve.models.treasury_rates import ( FederalReserveTreasuryRatesFetcher, @@ -91,3 +94,15 @@ def test_federal_reserve_sofr_fetcher(credentials=test_credentials): fetcher = FederalReserveSOFRFetcher() result = fetcher.test(params, credentials) assert result is None + + +@pytest.mark.record_http +def test_federal_reserve_overnight_bank_funding_rate_fetcher( + credentials=test_credentials, +): + """Test the Federal Reserve Overnight Bank Funding Rate Fetcher.""" + params = {"start_date": date(2024, 6, 1), "end_date": date(2024, 6, 6)} + + fetcher = FederalReserveOvernightBankFundingRateFetcher() + result = fetcher.test(params, credentials) + assert result is None |