diff --git a/massive/rest/financials.py b/massive/rest/financials.py index 28ef5269..6138258a 100644 --- a/massive/rest/financials.py +++ b/massive/rest/financials.py @@ -9,6 +9,7 @@ FinancialCashFlowStatement, FinancialIncomeStatement, FinancialRatio, + FinancialFloat, ) from .models.common import Sort from .models.request import RequestOptionBuilder @@ -318,3 +319,34 @@ def list_financials_ratios( deserializer=FinancialRatio.from_dict, options=options, ) + + def list_stocks_floats( + self, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + free_float_percent: Optional[float] = None, + free_float_percent_gt: Optional[float] = None, + free_float_percent_gte: Optional[float] = None, + free_float_percent_lt: Optional[float] = None, + free_float_percent_lte: Optional[float] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[FinancialFloat], HTTPResponse]: + """ + Endpoint: GET /stocks/vX/float + """ + url = "/stocks/vX/float" + return self._paginate( + path=url, + params=self._get_params(self.list_stocks_floats, locals()), + raw=raw, + deserializer=FinancialFloat.from_dict, + options=options, + ) diff --git a/massive/rest/models/dividends.py b/massive/rest/models/dividends.py index 68db98a9..3725daaa 100644 --- a/massive/rest/models/dividends.py +++ b/massive/rest/models/dividends.py @@ -19,3 +19,36 @@ class Dividend: @staticmethod def from_dict(d): return Dividend(**d) + + +@modelclass +class StockDividend: + cash_amount: Optional[float] = None + currency: Optional[str] = None + declaration_date: Optional[str] = None + distribution_type: Optional[str] = None + ex_dividend_date: Optional[str] = None + frequency: Optional[int] = None + historical_adjustment_factor: Optional[float] = None + id: Optional[str] = None + pay_date: Optional[str] = None + record_date: Optional[str] = None + split_adjusted_cash_amount: Optional[float] = None + ticker: Optional[str] = None + + @staticmethod + def from_dict(d): + return StockDividend( + cash_amount=d.get("cash_amount"), + currency=d.get("currency"), + declaration_date=d.get("declaration_date"), + distribution_type=d.get("distribution_type"), + ex_dividend_date=d.get("ex_dividend_date"), + frequency=d.get("frequency"), + historical_adjustment_factor=d.get("historical_adjustment_factor"), + id=d.get("id"), + pay_date=d.get("pay_date"), + record_date=d.get("record_date"), + split_adjusted_cash_amount=d.get("split_adjusted_cash_amount"), + ticker=d.get("ticker"), + ) diff --git a/massive/rest/models/financials.py b/massive/rest/models/financials.py index 99fb04b9..2e97eeba 100644 --- a/massive/rest/models/financials.py +++ b/massive/rest/models/financials.py @@ -861,3 +861,62 @@ def from_dict(d): return_on_equity=d.get("return_on_equity"), ticker=d.get("ticker"), ) + + +@modelclass +class FinancialFloat: + effective_date: Optional[str] = None + free_float: Optional[int] = None + free_float_percent: Optional[float] = None + ticker: Optional[str] = None + + @staticmethod + def from_dict(d): + return FinancialFloat( + effective_date=d.get("effective_date"), + free_float=d.get("free_float"), + free_float_percent=d.get("free_float_percent"), + ticker=d.get("ticker"), + ) + + +@modelclass +class RiskFactor: + cik: Optional[str] = None + filing_date: Optional[str] = None + primary_category: Optional[str] = None + secondary_category: Optional[str] = None + supporting_text: Optional[str] = None + tertiary_category: Optional[str] = None + ticker: Optional[str] = None + + @staticmethod + def from_dict(d): + return RiskFactor( + cik=d.get("cik"), + filing_date=d.get("filing_date"), + primary_category=d.get("primary_category"), + secondary_category=d.get("secondary_category"), + supporting_text=d.get("supporting_text"), + tertiary_category=d.get("tertiary_category"), + ticker=d.get("ticker"), + ) + + +@modelclass +class RiskFactorTaxonomy: + description: Optional[str] = None + primary_category: Optional[str] = None + secondary_category: Optional[str] = None + taxonomy: Optional[float] = None + tertiary_category: Optional[str] = None + + @staticmethod + def from_dict(d): + return RiskFactorTaxonomy( + description=d.get("description"), + primary_category=d.get("primary_category"), + secondary_category=d.get("secondary_category"), + taxonomy=d.get("taxonomy"), + tertiary_category=d.get("tertiary_category"), + ) diff --git a/massive/rest/models/splits.py b/massive/rest/models/splits.py index 5fb27129..79482928 100644 --- a/massive/rest/models/splits.py +++ b/massive/rest/models/splits.py @@ -14,3 +14,26 @@ class Split: @staticmethod def from_dict(d): return Split(**d) + + +@modelclass +class StockSplit: + adjustment_type: Optional[str] = None + execution_date: Optional[str] = None + historical_adjustment_factor: Optional[float] = None + id: Optional[str] = None + split_from: Optional[float] = None + split_to: Optional[float] = None + ticker: Optional[str] = None + + @staticmethod + def from_dict(d): + return StockSplit( + adjustment_type=d.get("adjustment_type"), + execution_date=d.get("execution_date"), + historical_adjustment_factor=d.get("historical_adjustment_factor"), + id=d.get("id"), + split_from=d.get("split_from"), + split_to=d.get("split_to"), + ticker=d.get("ticker"), + ) diff --git a/massive/rest/reference.py b/massive/rest/reference.py index b7a91c31..446d9f13 100644 --- a/massive/rest/reference.py +++ b/massive/rest/reference.py @@ -14,7 +14,9 @@ AssetClass, Locale, Split, + StockSplit, Dividend, + StockDividend, DividendType, Frequency, Condition, @@ -24,6 +26,8 @@ OptionsContract, ShortInterest, ShortVolume, + RiskFactor, + RiskFactorTaxonomy, ) from urllib3 import HTTPResponse from datetime import date @@ -695,3 +699,157 @@ def list_short_volume( result_key="results", options=options, ) + + # Add these functions to financials.py in the FinancialsClient class + + def list_stocks_splits( + self, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + execution_date: Optional[Union[str, date]] = None, + execution_date_gt: Optional[Union[str, date]] = None, + execution_date_gte: Optional[Union[str, date]] = None, + execution_date_lt: Optional[Union[str, date]] = None, + execution_date_lte: Optional[Union[str, date]] = None, + adjustment_type: Optional[str] = None, + adjustment_type_any_of: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[StockSplit], HTTPResponse]: + """ + Endpoint: GET /stocks/v1/splits + """ + url = "/stocks/v1/splits" + return self._paginate( + path=url, + params=self._get_params(self.list_stocks_splits, locals()), + raw=raw, + deserializer=StockSplit.from_dict, + options=options, + ) + + def list_stocks_dividends( + self, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + ex_dividend_date: Optional[Union[str, date]] = None, + ex_dividend_date_gt: Optional[Union[str, date]] = None, + ex_dividend_date_gte: Optional[Union[str, date]] = None, + ex_dividend_date_lt: Optional[Union[str, date]] = None, + ex_dividend_date_lte: Optional[Union[str, date]] = None, + frequency: Optional[int] = None, + frequency_gt: Optional[int] = None, + frequency_gte: Optional[int] = None, + frequency_lt: Optional[int] = None, + frequency_lte: Optional[int] = None, + distribution_type: Optional[str] = None, + distribution_type_any_of: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[StockDividend], HTTPResponse]: + """ + Endpoint: GET /stocks/v1/dividends + """ + url = "/stocks/v1/dividends" + return self._paginate( + path=url, + params=self._get_params(self.list_stocks_dividends, locals()), + raw=raw, + deserializer=StockDividend.from_dict, + options=options, + ) + + def list_stocks_filings_risk_factors( + self, + filing_date: Optional[Union[str, date]] = None, + filing_date_any_of: Optional[str] = None, + filing_date_gt: Optional[Union[str, date]] = None, + filing_date_gte: Optional[Union[str, date]] = None, + filing_date_lt: Optional[Union[str, date]] = None, + filing_date_lte: Optional[Union[str, date]] = None, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + cik: Optional[str] = None, + cik_any_of: Optional[str] = None, + cik_gt: Optional[str] = None, + cik_gte: Optional[str] = None, + cik_lt: Optional[str] = None, + cik_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[RiskFactor], HTTPResponse]: + """ + Endpoint: GET /stocks/filings/vX/risk-factors + """ + url = "/stocks/filings/vX/risk-factors" + return self._paginate( + path=url, + params=self._get_params(self.list_stocks_filings_risk_factors, locals()), + raw=raw, + deserializer=RiskFactor.from_dict, + options=options, + ) + + def list_stocks_taxonomies_risk_factors( + self, + taxonomy: Optional[float] = None, + taxonomy_gt: Optional[float] = None, + taxonomy_gte: Optional[float] = None, + taxonomy_lt: Optional[float] = None, + taxonomy_lte: Optional[float] = None, + primary_category: Optional[str] = None, + primary_category_any_of: Optional[str] = None, + primary_category_gt: Optional[str] = None, + primary_category_gte: Optional[str] = None, + primary_category_lt: Optional[str] = None, + primary_category_lte: Optional[str] = None, + secondary_category: Optional[str] = None, + secondary_category_any_of: Optional[str] = None, + secondary_category_gt: Optional[str] = None, + secondary_category_gte: Optional[str] = None, + secondary_category_lt: Optional[str] = None, + secondary_category_lte: Optional[str] = None, + tertiary_category: Optional[str] = None, + tertiary_category_any_of: Optional[str] = None, + tertiary_category_gt: Optional[str] = None, + tertiary_category_gte: Optional[str] = None, + tertiary_category_lt: Optional[str] = None, + tertiary_category_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[RiskFactorTaxonomy], HTTPResponse]: + """ + Endpoint: GET /stocks/taxonomies/vX/risk-factors + """ + url = "/stocks/taxonomies/vX/risk-factors" + return self._paginate( + path=url, + params=self._get_params(self.list_stocks_taxonomies_risk_factors, locals()), + raw=raw, + deserializer=RiskFactorTaxonomy.from_dict, + options=options, + )