Fixed forex.load for FMP, Polygon compatibility

This commit is contained in:
Pratyush Shukla
2023-07-14 01:33:50 +05:30
parent 156ad59808
commit d5540760be
3 changed files with 42 additions and 64 deletions

View File

@@ -1,17 +1,18 @@
"""FMP Forex end of day fetcher."""
# IMPORT STANDARD
from datetime import date, datetime
from typing import Dict, List, Literal, Optional
from datetime import datetime
from typing import Dict, List, Optional
# IMPORT INTERNAL
from openbb_provider.model.abstract.data import Data, QueryParams
from openbb_provider.model.data.base import BaseSymbol
from openbb_provider.model.data.forex_eod import ForexEODData, ForexEODQueryParams
from openbb_provider.provider.abstract.fetcher import Fetcher
from openbb_provider.provider.provider_helpers import data_transformer, get_querystring
from openbb_provider.provider.provider_helpers import data_transformer
# IMPORT THIRD-PARTY
from pydantic import Field, NonNegativeInt, validator
from pydantic import Field, validator
from .helpers import get_data_many
@@ -25,21 +26,9 @@ class FMPForexEODQueryParams(QueryParams):
---------
symbol : str
The symbol of the company.
start_date : date
The start date of the stock data from which to retrieve the data.
end_date : date
The end date of the stock data up to which to retrieve the data.
timeseries : Optional[int]
The number of days to look back.
series_type : Optional[Literal["line"]]
The type of the series. Only "line" is supported.
"""
symbol: str = Field(min_length=1)
series_type: Optional[Literal["line"]] = None
start_date: date
end_date: date
timeseries: Optional[NonNegativeInt] = None # Number of days to looks back
class FMPForexEODData(Data):
@@ -53,7 +42,7 @@ class FMPForexEODData(Data):
unadjustedVolume: float
change: float
changePercent: float
vwap: float
vwap: Optional[float]
label: str
changeOverTime: float
@@ -72,26 +61,19 @@ class FMPForexEODFetcher(
):
@staticmethod
def transform_query(
query: ForexEODQueryParams,
extra_params: Optional[Dict] = None, # pylint: disable=W0613
query: ForexEODQueryParams, extra_params: Optional[Dict] = None
) -> FMPForexEODQueryParams:
now = datetime.now()
start_date = query.start_date if query.start_date else now
end_date = query.end_date if query.end_date else now
return FMPForexEODQueryParams(
symbol=query.symbol,
start_date=start_date,
end_date=end_date,
**extra_params or {},
)
@staticmethod
def extract_data(
query: FMPForexEODQueryParams, api_key: str
) -> List[FMPForexEODData]:
base_url = "https://financialmodelingprep.com/api/v3/"
query_str = get_querystring(query.dict(), ["symbol"])
query_str = query_str.replace("start_date", "from").replace("end_date", "to")
url = f"{base_url}historical-price-full/{query.symbol}?{query_str}&apikey={api_key}"
base_url = "https://financialmodelingprep.com/api/v3"
url = f"{base_url}/historical-price-full/forex/{query.symbol}?&apikey={api_key}"
return get_data_many(url, FMPForexEODData, "historical")
@staticmethod

View File

@@ -1,22 +1,24 @@
"""Polygon forex end of day fetcher."""
# IMPORT STANDARD
from datetime import datetime, timedelta
from typing import Dict, List, Optional
from datetime import date, datetime, timedelta
from typing import Dict, List, Optional, Union, Literal
# IMPORT INTERNAL
from openbb_provider.model.abstract.data import QueryParams
from openbb_provider.model.data.forex_eod import ForexEODData, ForexEODQueryParams
from openbb_provider.provider.abstract.fetcher import Fetcher
from openbb_provider.provider.provider_helpers import data_transformer
from openbb_polygon.types import Timespan
# IMPORT THIRD-PARTY
from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt
from openbb_polygon.helpers import get_data
from openbb_polygon.types import BaseStockData, BaseStockQueryParams
from openbb_polygon.types import BaseStockData
class PolygonForexEODQueryParams(BaseStockQueryParams):
class PolygonForexEODQueryParams(QueryParams):
"""Polygon forex end of day query.
Source: https://polygon.io/docs/forex/get_v2_aggs_ticker__forexticker__range__multiplier___timespan___from___to
@@ -25,9 +27,9 @@ class PolygonForexEODQueryParams(BaseStockQueryParams):
----------
stocksTicker : str
The ticker symbol of the stocks to fetch.
start_date : Union[date, datetime]
start_date : Union[date, datetime], optional
The start date of the query.
end_date : Union[date, datetime]
end_date : Union[date, datetime], optional
The end date of the query.
timespan : Timespan, optional
The timespan of the query, by default Timespan.day
@@ -41,6 +43,15 @@ class PolygonForexEODQueryParams(BaseStockQueryParams):
The multiplier of the query, by default 1
"""
stocksTicker: str = Field(alias="symbol")
start_date: Optional[Union[date, datetime]]
end_date: Optional[Union[date, datetime]]
timespan: Optional[Timespan] = Field(default=Timespan.day)
sort: Optional[Literal["asc", "desc"]] = Field(default="desc")
limit: Optional[PositiveInt] = Field(default=49999)
adjusted: Optional[bool] = Field(default=True)
multiplier: Optional[PositiveInt] = Field(default=1)
class PolygonForexEODData(BaseStockData):
v: NonNegativeFloat = Field(alias="volume")
@@ -60,24 +71,22 @@ class PolygonForexEODFetcher(
def transform_query(
query: ForexEODQueryParams, extra_params: Optional[Dict] = None
) -> PolygonForexEODQueryParams:
now = datetime.now()
start_date = query.start_date if query.start_date else now - timedelta(days=1)
end_date = query.end_date if query.end_date else now
return PolygonForexEODQueryParams(
symbol=query.symbol,
start_date=start_date,
end_date=end_date,
**extra_params if extra_params else {},
**extra_params or {},
)
@staticmethod
def extract_data(
query: PolygonForexEODQueryParams, api_key: str
) -> List[PolygonForexEODData]:
now = datetime.now()
start_date = query.start_date or (now - timedelta(days=7)).date()
end_date = query.end_date or now.date()
request_url = (
f"https://api.polygon.io/v2/aggs/ticker/"
f"C:{query.stocksTicker.upper()}/range/1/{query.timespan}/"
f"{query.start_date}/{query.end_date}?adjusted={query.adjusted}"
f"C:{query.stocksTicker.upper()}/range/1/{query.timespan.value}/"
f"{start_date}/{end_date}?adjusted={query.adjusted}"
f"&sort={query.sort}&limit={query.limit}&multiplier={query.multiplier}"
f"&apiKey={api_key}"
)

View File

@@ -1,12 +1,11 @@
"""Forex aggregate end of day price data model."""
from datetime import date, datetime
from datetime import datetime
from typing import Optional
from pydantic import Field, NonNegativeFloat, PositiveFloat
from pydantic import NonNegativeFloat, PositiveFloat
from openbb_provider.metadata import DESCRIPTIONS
from openbb_provider.model.abstract.data import Data, QueryParams
from openbb_provider.model.data.base import BaseSymbol
@@ -17,19 +16,9 @@ class ForexEODQueryParams(QueryParams, BaseSymbol):
Parameter
---------
symbol : str
The symbol of the company.
start_date : Optional[date]
The start date of the stock data from which to retrieve the data.
end_date : Optional[date]
The end date of the stock data up to which to retrieve the data.
The symbol of the forex currency pair.
"""
start_date: date = Field(
description=DESCRIPTIONS.get("start_date", ""),
default=None,
)
end_date: date = Field(description=DESCRIPTIONS.get("end_date", ""), default=None)
class ForexEODData(Data):
"""Forex end of day price data.
@@ -37,19 +26,17 @@ class ForexEODData(Data):
Returns
-------
date : datetime
The date of the stock.
The date of the forex currency pair.
open : PositiveFloat
The open price of the stock.
The open price of the forex currency pair.
high : PositiveFloat
The high price of the stock.
The high price of the forex currency pair.
low : PositiveFloat
The low price of the stock.
The low price of the forex currency pair.
close : PositiveFloat
The close price of the stock.
The close price of the forex currency pair.
adj_close : Optional[PositiveFloat]
The adjusted close price of the stock.
volume : PositiveFloat
The volume of the stock.
The adjusted close price of the forex currency pair.
"""
date: datetime