summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanglewood <85772166+deeleeramone@users.noreply.github.com>2024-06-10 19:48:11 -0700
committerDanglewood <85772166+deeleeramone@users.noreply.github.com>2024-06-10 19:48:11 -0700
commita335fe237ae55380a566e401c4f7e8913e145f3c (patch)
treefa1007dc96c333308bf898f276de2c1370cb9dbe
parent8fca1ba3d5c743c54b4d37dffb326ab936d7201d (diff)
add federal reserve to obfr
-rw-r--r--openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py7
-rw-r--r--openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py7
-rw-r--r--openbb_platform/openbb/assets/reference.json17
-rw-r--r--openbb_platform/openbb/package/fixedincome_rate.py14
-rw-r--r--openbb_platform/providers/federal_reserve/openbb_federal_reserve/__init__.py4
-rw-r--r--openbb_platform/providers/federal_reserve/openbb_federal_reserve/models/overnight_bank_funding_rate.py119
-rw-r--r--openbb_platform/providers/federal_reserve/tests/record/http/test_federal_reserve_fetchers/test_federal_reserve_overnight_bank_funding_rate_fetcher.yaml63
-rw-r--r--openbb_platform/providers/federal_reserve/tests/test_federal_reserve_fetchers.py15
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