bullishpy 0.4.0__py3-none-any.whl → 0.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bullish/analysis/analysis.py +22 -19
- bullish/analysis/filter.py +537 -77
- bullish/app/app.py +123 -53
- bullish/cli.py +3 -1
- bullish/database/alembic/versions/037dbd721317_.py +1 -0
- bullish/database/alembic/versions/11d35a452b40_.py +368 -0
- bullish/database/alembic/versions/4b0a2f40b7d3_.py +1 -0
- bullish/database/alembic/versions/73564b60fe24_.py +1 -0
- bullish/database/crud.py +9 -2
- bullish/interface/interface.py +13 -27
- {bullishpy-0.4.0.dist-info → bullishpy-0.5.0.dist-info}/METADATA +2 -2
- {bullishpy-0.4.0.dist-info → bullishpy-0.5.0.dist-info}/RECORD +14 -13
- {bullishpy-0.4.0.dist-info → bullishpy-0.5.0.dist-info}/WHEEL +0 -0
- {bullishpy-0.4.0.dist-info → bullishpy-0.5.0.dist-info}/entry_points.txt +0 -0
bullish/analysis/analysis.py
CHANGED
|
@@ -153,7 +153,9 @@ def _abs(data: pd.Series) -> pd.Series: # type: ignore
|
|
|
153
153
|
|
|
154
154
|
|
|
155
155
|
class TechnicalAnalysis(BaseModel):
|
|
156
|
-
rsi_last_value: Optional[float] =
|
|
156
|
+
rsi_last_value: Optional[float] = Field(
|
|
157
|
+
None, alias="RSI Last value", description="RSI last value", ge=0, le=100
|
|
158
|
+
)
|
|
157
159
|
macd_12_26_9_buy_date: Optional[date] = None
|
|
158
160
|
ma_50_200_buy_date: Optional[date] = None
|
|
159
161
|
slope_7: Optional[float] = None
|
|
@@ -332,26 +334,28 @@ class TechnicalAnalysis(BaseModel):
|
|
|
332
334
|
|
|
333
335
|
|
|
334
336
|
class BaseFundamentalAnalysis(BaseModel):
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
337
|
+
positive_debt_to_equity: Optional[bool] = None
|
|
338
|
+
positive_return_on_assets: Optional[bool] = None
|
|
339
|
+
positive_return_on_equity: Optional[bool] = None
|
|
340
|
+
positive_diluted_eps: Optional[bool] = None
|
|
341
|
+
positive_basic_eps: Optional[bool] = None
|
|
342
|
+
growing_basic_eps: Optional[bool] = None
|
|
343
|
+
growing_diluted_eps: Optional[bool] = None
|
|
344
|
+
positive_net_income: Optional[bool] = None
|
|
345
|
+
positive_operating_income: Optional[bool] = None
|
|
346
|
+
growing_net_income: Optional[bool] = None
|
|
347
|
+
growing_operating_income: Optional[bool] = None
|
|
348
|
+
positive_free_cash_flow: Optional[bool] = None
|
|
349
|
+
growing_operating_cash_flow: Optional[bool] = None
|
|
350
|
+
operating_cash_flow_is_higher_than_net_income: Optional[bool] = None
|
|
351
|
+
|
|
338
352
|
mean_capex_ratio: Optional[float] = None
|
|
339
353
|
max_capex_ratio: Optional[float] = None
|
|
340
354
|
min_capex_ratio: Optional[float] = None
|
|
341
355
|
mean_dividend_payout_ratio: Optional[float] = None
|
|
342
356
|
max_dividend_payout_ratio: Optional[float] = None
|
|
343
357
|
min_dividend_payout_ratio: Optional[float] = None
|
|
344
|
-
|
|
345
|
-
positive_operating_income: Optional[float] = None
|
|
346
|
-
growing_net_income: Optional[float] = None
|
|
347
|
-
growing_operating_income: Optional[float] = None
|
|
348
|
-
positive_diluted_eps: Optional[float] = None
|
|
349
|
-
positive_basic_eps: Optional[float] = None
|
|
350
|
-
growing_basic_eps: Optional[float] = None
|
|
351
|
-
growing_diluted_eps: Optional[float] = None
|
|
352
|
-
positive_debt_to_equity: Optional[float] = None
|
|
353
|
-
positive_return_on_assets: Optional[float] = None
|
|
354
|
-
positive_return_on_equity: Optional[float] = None
|
|
358
|
+
|
|
355
359
|
earning_per_share: Optional[float] = None
|
|
356
360
|
|
|
357
361
|
def is_empty(self) -> bool:
|
|
@@ -481,13 +485,12 @@ class BaseFundamentalAnalysis(BaseModel):
|
|
|
481
485
|
return cls()
|
|
482
486
|
|
|
483
487
|
|
|
484
|
-
class YearlyFundamentalAnalysis(BaseFundamentalAnalysis):
|
|
485
|
-
...
|
|
488
|
+
class YearlyFundamentalAnalysis(BaseFundamentalAnalysis): ...
|
|
486
489
|
|
|
487
490
|
|
|
488
491
|
fields_with_prefix = {
|
|
489
|
-
f"{QUARTERLY}_{name}": (
|
|
490
|
-
for name in BaseFundamentalAnalysis.model_fields
|
|
492
|
+
f"{QUARTERLY}_{name}": (field_info.annotation, Field(default=None))
|
|
493
|
+
for name, field_info in BaseFundamentalAnalysis.model_fields.items()
|
|
491
494
|
}
|
|
492
495
|
|
|
493
496
|
# Create the new model
|