refactored KeyMetrics for stocks.fa.metrics

This commit is contained in:
Pratyush Shukla
2023-08-02 03:53:40 +05:30
parent 54706c1926
commit 74f1a470a8
2 changed files with 191 additions and 285 deletions

View File

@@ -1,103 +1,89 @@
"""Key Metrics fetcher."""
from datetime import date as dateType
from typing import Any, Dict, List, Literal, Optional
from datetime import datetime
from typing import Any, Dict, List, Optional
from openbb_provider.abstract.data import Data
from openbb_provider.abstract.fetcher import Fetcher
from openbb_provider.abstract.query_params import QueryParams
from openbb_provider.models.key_metrics import KeyMetricsData, KeyMetricsQueryParams
from pydantic import Field
from openbb_fmp.utils.helpers import create_url, get_data_many
from pydantic import validator
class FMPKeyMetricsQueryParams(QueryParams):
"""FMP Key Metrics QueryParams.
class FMPKeyMetricsQueryParams(KeyMetricsQueryParams):
"""FMP Key Metrics Query.
Source: https://site.financialmodelingprep.com/developer/docs/company-key-metrics-api/
Parameter
---------
symbol : str
The symbol of the company.
period : Literal["quarter", "annual"]
The period of the key metrics. Default is "annual".
limit : Optional[int]
The limit of the key metrics to be returned.
"""
symbol: str
period: Literal["quarter", "annual"] = "annual"
limit: Optional[int] = None
class FMPKeyMetricsData(KeyMetricsData):
"""FMP Key Metrics Data."""
class FMPKeyMetricsData(Data):
symbol: str
date: dateType
period: str
revenuePerShare: float
netIncomePerShare: float
operatingCashFlowPerShare: Optional[float]
freeCashFlowPerShare: Optional[float]
cashPerShare: Optional[float]
bookValuePerShare: Optional[float]
tangibleBookValuePerShare: Optional[float]
shareholdersEquityPerShare: Optional[float]
interestDebtPerShare: Optional[float]
marketCap: Optional[float]
enterpriseValue: Optional[float]
peRatio: Optional[float]
priceToSalesRatio: Optional[float]
pocfratio: Optional[float] = Field(alias="pocf_ratio")
pfcfRatio: Optional[float]
pbRatio: Optional[float]
ptbRatio: Optional[float]
evToSales: Optional[float]
enterpriseValueOverEBITDA: Optional[float] = Field(
alias="enterprise_value_over_ebitda"
)
evToOperatingCashFlow: Optional[float]
evToFreeCashFlow: Optional[float]
earningsYield: Optional[float]
freeCashFlowYield: Optional[Optional[float]]
debtToEquity: Optional[float]
debtToAssets: Optional[float]
netDebtToEBITDA: Optional[float] = Field(alias="net_debt_to_ebitda")
currentRatio: Optional[float]
interestCoverage: Optional[float]
incomeQuality: Optional[float]
dividendYield: Optional[Optional[float]]
payoutRatio: Optional[Optional[float]]
salesGeneralAndAdministrativeToRevenue: Optional[float]
researchAndDdevelopementToRevenue: Optional[float] = Field(
alias="research_and_developement_to_revenue"
)
intangiblesToTotalAssets: Optional[float]
capexToOperatingCashFlow: Optional[float]
capexToRevenue: Optional[float]
capexToDepreciation: Optional[float]
stockBasedCompensationToRevenue: Optional[float]
grahamNumber: Optional[float]
roic: Optional[float]
returnOnTangibleAssets: Optional[float]
grahamNetNet: Optional[float]
workingCapital: Optional[float]
tangibleAssetValue: Optional[float]
netCurrentAssetValue: Optional[float]
investedCapital: Optional[float]
averageReceivables: Optional[float]
averagePayables: Optional[float]
averageInventory: Optional[float]
daysSalesOutstanding: Optional[float]
daysPayablesOutstanding: Optional[float]
daysOfInventoryOnHand: Optional[float]
receivablesTurnover: Optional[float]
payablesTurnover: Optional[float]
inventoryTurnover: Optional[float]
roe: Optional[float]
capexPerShare: Optional[float]
class Config:
fields = {
"revenue_per_share": "revenuePerShare",
"net_income_per_share": "netIncomePerShare",
"operating_cash_flow_per_share": "operatingCashFlowPerShare",
"free_cash_flow_per_share": "freeCashFlowPerShare",
"cash_per_share": "cashPerShare",
"book_value_per_share": "bookValuePerShare",
"tangible_book_value_per_share": "tangibleBookValuePerShare",
"shareholders_equity_per_share": "shareholdersEquityPerShare",
"interest_debt_per_share": "interestDebtPerShare",
"market_cap": "marketCap",
"enterprise_value": "enterpriseValue",
"pe_ratio": "peRatio",
"price_to_sales_ratio": "priceToSalesRatio",
"pocf_ratio": "pocfratio",
"pfcf_ratio": "pfcfRatio",
"pb_ratio": "pbRatio",
"ptb_ratio": "ptbRatio",
"ev_to_sales": "evToSales",
"enterprise_value_over_ebitda": "enterpriseValueOverEBITDA",
"ev_to_operating_cash_flow": "evToOperatingCashFlow",
"ev_to_free_cash_flow": "evToFreeCashFlow",
"earnings_yield": "earningsYield",
"free_cash_flow_yield": "freeCashFlowYield",
"debt_to_equity": "debtToEquity",
"debt_to_assets": "debtToAssets",
"net_debt_to_ebitda": "netDebtToEBITDA",
"current_ratio": "currentRatio",
"interest_coverage": "interestCoverage",
"income_quality": "incomeQuality",
"dividend_yield": "dividendYield",
"payout_ratio": "payoutRatio",
"sales_general_and_administrative_to_revenue": "salesGeneralAndAdministrativeToRevenue",
"research_and_development_to_revenue": "researchAndDdevelopementToRevenue",
"intangibles_to_total_assets": "intangiblesToTotalAssets",
"capex_to_operating_cash_flow": "capexToOperatingCashFlow",
"capex_to_revenue": "capexToRevenue",
"capex_to_depreciation": "capexToDepreciation",
"stock_based_compensation_to_revenue": "stockBasedCompensationToRevenue",
"graham_number": "grahamNumber",
"return_on_tangible_assets": "returnOnTangibleAssets",
"graham_net_net": "grahamNetNet",
"working_capital": "workingCapital",
"tangible_asset_value": "tangibleAssetValue",
"net_current_asset_value": "netCurrentAssetValue",
"invested_capital": "investedCapital",
"average_receivables": "averageReceivables",
"average_payables": "averagePayables",
"average_inventory": "averageInventory",
"days_sales_outstanding": "daysSalesOutstanding",
"days_payables_outstanding": "daysPayablesOutstanding",
"days_of_inventory_on_hand": "daysOfInventoryOnHand",
"receivables_turnover": "receivablesTurnover",
"payables_turnover": "payablesTurnover",
"inventory_turnover": "inventoryTurnover",
"capex_per_share": "capexPerShare",
}
@validator("date", pre=True, check_fields=False)
def date_validate(cls, v): # pylint: disable=no-self-argument
return datetime.strptime(v, "%Y-%m-%d")
class FMPKeyMetricsFetcher(
@@ -110,11 +96,7 @@ class FMPKeyMetricsFetcher(
):
@staticmethod
def transform_query(params: Dict[str, Any]) -> FMPKeyMetricsQueryParams:
transformed_params = params
transformed_params["period"] = (
"annual" if params.get("period", "") == "annually" else "quarter"
)
return FMPKeyMetricsQueryParams(**transformed_params)
return FMPKeyMetricsQueryParams(**params)
@staticmethod
def extract_data(
@@ -122,6 +104,8 @@ class FMPKeyMetricsFetcher(
) -> List[FMPKeyMetricsData]:
api_key = credentials.get("fmp_api_key") if credentials else ""
query.period = "annual" if query.period == "annually" else "quarter"
url = create_url(
3, f"key-metrics/{query.symbol}", api_key, query, exclude=["symbol"]
)

View File

@@ -1,211 +1,133 @@
"""Key Metrics Data Model."""
from datetime import date as DateType
from datetime import date as dateType
from typing import Literal, Optional
from openbb_provider.abstract.data import Data
from openbb_provider.abstract.query_params import QueryParams
from openbb_provider.models.base import BaseSymbol
from openbb_provider.descriptions import QUERY_DESCRIPTIONS, DATA_DESCRIPTIONS
from pydantic import Field
class KeyMetricsQueryParams(QueryParams, BaseSymbol):
"""Key Metrics query model.
"""Key Metrics Query."""
Parameter
---------
symbol : str
The symbol of the company.
"""
period: Literal["annually", "quarterly"] = "annually"
limit: Optional[int] = None
period: Literal["annually", "quarterly"] = Field(
default="annually", description=QUERY_DESCRIPTIONS.get("period", "")
)
limit: Optional[int] = Field(
default=100, description=QUERY_DESCRIPTIONS.get("limit", "")
)
class KeyMetricsData(Data):
"""Return Key Metrics Data.
class KeyMetricsData(Data, BaseSymbol):
"""Key Metrics Data."""
Returns
-------
symbol : str
The symbol of the stock.
date : DateType
The date of the key metrics.
period : str
The period of the key metrics.
revenue_per_share : float
The revenue per share of the stock.
net_income_per_share : float
The net income per share of the stock.
operating_cash_flow_per_share : float
The operating cash flow per share of the stock.
free_cash_flow_per_share : float
The free cash flow per share of the stock.
cash_per_share : float
The cash per share of the stock.
book_value_per_share : float
The book value per share of the stock.
tangible_book_value_per_share : float
The tangible book value per share of the stock.
shareholders_equity_per_share : float
The shareholders equity per share of the stock.
interest_debt_per_share : float
The interest debt per share of the stock.
market_cap : float
The market cap of the stock.
enterprise_value : float
The enterprise value of the stock.
pe_ratio : float
The PE ratio of the stock.
price_to_sales_ratio : float
The price to sales ratio of the stock.
pocf_ratio : float
The POCF ratio of the stock.
pfcf_ratio : float
The PFCF ratio of the stock.
pb_ratio : float
The PB ratio of the stock.
ptb_ratio : float
The PTB ratio of the stock.
ev_to_sales : float
The EV to sales of the stock.
enterprise_value_over_ebitda : float
The enterprise value over EBITDA of the stock.
ev_to_operating_cash_flow : float
The EV to operating cash flow of the stock.
ev_to_free_cash_flow : float
The EV to free cash flow of the stock.
earnings_yield : float
The earnings yield of the stock.
free_cash_flow_yield : float
The free cash flow yield of the stock.
debt_to_equity : float
The debt to equity of the stock.
debt_to_assets : float
The debt to assets of the stock.
net_debt_to_ebitda : float
The net debt to EBITDA of the stock.
current_ratio : float
The current ratio of the stock.
interest_coverage : float
The interest coverage of the stock.
income_quality : float
The income quality of the stock.
dividend_yield : float
The dividend yield of the stock.
payout_ratio : float
The payout ratio of the stock.
sales_general_and_administrative_to_revenue : float
The sales general and administrative to revenue of the stock.
research_and_developement_to_revenue : float
The research and development to revenue of the stock.
intangibles_to_total_assets : float
The intangibles to total assets of the stock.
capex_to_operating_cash_flow : float
The capex to operating cash flow of the stock.
capex_to_revenue : float
The capex to revenue of the stock.
capex_to_depreciation : float
The capex to depreciation of the stock.
stock_based_compensation_to_revenue : float
The stock based compensation to revenue of the stock.
graham_number : float
The graham number of the stock.
roic : float
The ROIC of the stock.
return_on_tangible_assets : float
The return on tangible assets of the stock.
graham_net_net : float
The graham net net of the stock.
working_capital : float
The working capital of the stock.
tangible_asset_value : float
The tangible asset value of the stock.
net_current_asset_value : float
The net current asset value of the stock.
invested_capital : float
The invested capital of the stock.
average_receivables : float
The average receivables of the stock.
average_payables : float
The average payables of the stock.
average_inventory : float
The average inventory of the stock.
days_sales_outstanding : float
The days sales outstanding of the stock.
days_payables_outstanding : float
The days payables outstanding of the stock.
days_of_inventory_on_hand : float
The days of inventory on hand of the stock.
receivables_turnover : float
The receivables turnover of the stock.
payables_turnover : float
The payables turnover of the stock.
inventory_turnover : float
The inventory turnover of the stock.
roe : float
The ROE of the stock.
capex_per_share : float
The capex per share of the stock.
"""
symbol: str
date: DateType
period: str
revenue_per_share: Optional[float]
net_income_per_share: Optional[float]
operating_cash_flow_per_share: Optional[float]
free_cash_flow_per_share: Optional[float]
cash_per_share: Optional[float]
book_value_per_share: Optional[float]
tangible_book_value_per_share: Optional[float]
shareholders_equity_per_share: Optional[float]
interest_debt_per_share: Optional[float]
market_cap: Optional[float]
enterprise_value: Optional[float]
pe_ratio: Optional[float]
price_to_sales_ratio: Optional[float]
pocf_ratio: Optional[float]
pfcf_ratio: Optional[float]
pb_ratio: Optional[float]
ptb_ratio: Optional[float]
ev_to_sales: Optional[float]
enterprise_value_over_ebitda: Optional[float]
ev_to_operating_cash_flow: Optional[float]
ev_to_free_cash_flow: Optional[float]
earnings_yield: Optional[float]
free_cash_flow_yield: Optional[float]
debt_to_equity: Optional[float]
debt_to_assets: Optional[float]
net_debt_to_ebitda: Optional[float]
current_ratio: Optional[float]
interest_coverage: Optional[float]
income_quality: Optional[float]
dividend_yield: Optional[float]
payout_ratio: Optional[float]
sales_general_and_administrative_to_revenue: Optional[float]
research_and_development_to_revenue: Optional[float]
intangibles_to_total_assets: Optional[float]
capex_to_operating_cash_flow: Optional[float]
capex_to_revenue: Optional[float]
capex_to_depreciation: Optional[float]
stock_based_compensation_to_revenue: Optional[float]
graham_number: Optional[float]
roic: Optional[float]
return_on_tangible_assets: Optional[float]
graham_net_net: Optional[float]
working_capital: Optional[float]
tangible_asset_value: Optional[float]
net_current_asset_value: Optional[float]
invested_capital: Optional[float]
average_receivables: Optional[float]
average_payables: Optional[float]
average_inventory: Optional[float]
days_sales_outstanding: Optional[float]
days_payables_outstanding: Optional[float]
days_of_inventory_on_hand: Optional[float]
receivables_turnover: Optional[float]
payables_turnover: Optional[float]
inventory_turnover: Optional[float]
roe: Optional[float]
capex_per_share: Optional[float]
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
period: str = Field(description="The period of the data.")
revenue_per_share: Optional[float] = Field(description="Revenue per share")
net_income_per_share: Optional[float] = Field(description="Net income per share")
operating_cash_flow_per_share: Optional[float] = Field(
description="Operating cash flow per share"
)
free_cash_flow_per_share: Optional[float] = Field(
description="Free cash flow per share"
)
cash_per_share: Optional[float] = Field(description="Cash per share")
book_value_per_share: Optional[float] = Field(description="Book value per share")
tangible_book_value_per_share: Optional[float] = Field(
description="Tangible book value per share"
)
shareholders_equity_per_share: Optional[float] = Field(
description="Shareholders equity per share"
)
interest_debt_per_share: Optional[float] = Field(
description="Interest debt per share"
)
market_cap: Optional[float] = Field(description="Market capitalization")
enterprise_value: Optional[float] = Field(description="Enterprise value")
pe_ratio: Optional[float] = Field(description="Price-to-earnings ratio (P/E ratio)")
price_to_sales_ratio: Optional[float] = Field(description="Price-to-sales ratio")
pocf_ratio: Optional[float] = Field(
description="Price-to-operating cash flow ratio"
)
pfcf_ratio: Optional[float] = Field(description="Price-to-free cash flow ratio")
pb_ratio: Optional[float] = Field(description="Price-to-book ratio")
ptb_ratio: Optional[float] = Field(description="Price-to-tangible book ratio")
ev_to_sales: Optional[float] = Field(description="Enterprise value-to-sales ratio")
enterprise_value_over_ebitda: Optional[float] = Field(
description="Enterprise value-to-EBITDA ratio"
)
ev_to_operating_cash_flow: Optional[float] = Field(
description="Enterprise value-to-operating cash flow ratio"
)
ev_to_free_cash_flow: Optional[float] = Field(
description="Enterprise value-to-free cash flow ratio"
)
earnings_yield: Optional[float] = Field(description="Earnings yield")
free_cash_flow_yield: Optional[float] = Field(description="Free cash flow yield")
debt_to_equity: Optional[float] = Field(description="Debt-to-equity ratio")
debt_to_assets: Optional[float] = Field(description="Debt-to-assets ratio")
net_debt_to_ebitda: Optional[float] = Field(description="Net debt-to-EBITDA ratio")
current_ratio: Optional[float] = Field(description="Current ratio")
interest_coverage: Optional[float] = Field(description="Interest coverage")
income_quality: Optional[float] = Field(description="Income quality")
dividend_yield: Optional[float] = Field(description="Dividend yield")
payout_ratio: Optional[float] = Field(description="Payout ratio")
sales_general_and_administrative_to_revenue: Optional[float] = Field(
description="Sales general and administrative expenses-to-revenue ratio"
)
research_and_development_to_revenue: Optional[float] = Field(
description="Research and development expenses-to-revenue ratio"
)
intangibles_to_total_assets: Optional[float] = Field(
description="Intangibles-to-total assets ratio"
)
capex_to_operating_cash_flow: Optional[float] = Field(
description="Capital expenditures-to-operating cash flow ratio"
)
capex_to_revenue: Optional[float] = Field(
description="Capital expenditures-to-revenue ratio"
)
capex_to_depreciation: Optional[float] = Field(
description="Capital expenditures-to-depreciation ratio"
)
stock_based_compensation_to_revenue: Optional[float] = Field(
description="Stock-based compensation-to-revenue ratio"
)
graham_number: Optional[float] = Field(description="Graham number")
roic: Optional[float] = Field(description="Return on invested capital")
return_on_tangible_assets: Optional[float] = Field(
description="Return on tangible assets"
)
graham_net_net: Optional[float] = Field(
description="Graham net-net working capital"
)
working_capital: Optional[float] = Field(description="Working capital")
tangible_asset_value: Optional[float] = Field(description="Tangible asset value")
net_current_asset_value: Optional[float] = Field(
description="Net current asset value"
)
invested_capital: Optional[float] = Field(description="Invested capital")
average_receivables: Optional[float] = Field(description="Average receivables")
average_payables: Optional[float] = Field(description="Average payables")
average_inventory: Optional[float] = Field(description="Average inventory")
days_sales_outstanding: Optional[float] = Field(
description="Days sales outstanding"
)
days_payables_outstanding: Optional[float] = Field(
description="Days payables outstanding"
)
days_of_inventory_on_hand: Optional[float] = Field(
description="Days of inventory on hand"
)
receivables_turnover: Optional[float] = Field(description="Receivables turnover")
payables_turnover: Optional[float] = Field(description="Payables turnover")
inventory_turnover: Optional[float] = Field(description="Inventory turnover")
roe: Optional[float] = Field(description="Return on equity")
capex_per_share: Optional[float] = Field(
description="Capital expenditures per share"
)