bullishpy 0.31.0__tar.gz → 0.32.0__tar.gz
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.
Potentially problematic release.
This version of bullishpy might be problematic. Click here for more details.
- {bullishpy-0.31.0 → bullishpy-0.32.0}/PKG-INFO +2 -2
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/analysis/filter.py +8 -8
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/analysis/predefined_filters.py +36 -20
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/jobs/tasks.py +1 -1
- {bullishpy-0.31.0 → bullishpy-0.32.0}/pyproject.toml +2 -2
- {bullishpy-0.31.0 → bullishpy-0.32.0}/README.md +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/__init__.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/analysis/__init__.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/analysis/analysis.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/analysis/backtest.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/analysis/constants.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/analysis/functions.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/analysis/indicators.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/analysis/industry_views.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/app/__init__.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/app/app.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/cli.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/__init__.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/README +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/alembic.ini +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/env.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/script.py.mako +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/037dbd721317_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/040b15fba458_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/08ac1116e055_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/11d35a452b40_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/12889a2cbd7d_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/17e51420e7ad_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/49c83f9eb5ac_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/4b0a2f40b7d3_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/5b10ee7604c1_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/6d252e23f543_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/73564b60fe24_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/79bc71ec6f9e_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/b76079e9845f_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/bf6b86dd5463_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/d0e58e050845_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/d663166c531d_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/ec25c8fa449f_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/ee5baabb35f8_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/fc191121f522_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/alembic/versions/ff0cc4ba40ec_.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/crud.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/schemas.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/scripts/create_revision.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/scripts/stamp.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/scripts/upgrade.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/database/settings.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/exceptions.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/figures/__init__.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/figures/figures.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/interface/__init__.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/interface/interface.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/jobs/__init__.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/jobs/app.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/jobs/models.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/utils/__init__.py +0 -0
- {bullishpy-0.31.0 → bullishpy-0.32.0}/bullish/utils/checks.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: bullishpy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.32.0
|
|
4
4
|
Summary:
|
|
5
5
|
Author: aan
|
|
6
6
|
Author-email: andoludovic.andriamamonjy@gmail.com
|
|
@@ -17,7 +17,7 @@ Requires-Dist: streamlit (>=1.45.1,<2.0.0)
|
|
|
17
17
|
Requires-Dist: streamlit-file-browser (>=3.2.22,<4.0.0)
|
|
18
18
|
Requires-Dist: streamlit-pydantic (>=v0.6.1-rc.3,<0.7.0)
|
|
19
19
|
Requires-Dist: ta-lib (>=0.6.4,<0.7.0)
|
|
20
|
-
Requires-Dist: tickermood (>=0.
|
|
20
|
+
Requires-Dist: tickermood (>=0.13.0,<0.14.0)
|
|
21
21
|
Requires-Dist: vectorbt (>=0.28.0,<0.29.0)
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
|
|
@@ -214,6 +214,12 @@ class FilterQuery(GeneralFilter, *TechnicalAnalysisFilters, *FundamentalAnalysis
|
|
|
214
214
|
order_by_asc = f"ORDER BY {value} ASC"
|
|
215
215
|
elif isinstance(value, str) and bool(value) and parameter == "limit":
|
|
216
216
|
limit = f" LIMIT {int(value)}"
|
|
217
|
+
elif (
|
|
218
|
+
isinstance(value, list)
|
|
219
|
+
and len(value) == SIZE_RANGE
|
|
220
|
+
and all(isinstance(item, (int, float)) for item in value)
|
|
221
|
+
):
|
|
222
|
+
query.append(f"{parameter} BETWEEN {value[0]} AND {value[1]}")
|
|
217
223
|
elif (
|
|
218
224
|
(
|
|
219
225
|
isinstance(value, list)
|
|
@@ -224,14 +230,8 @@ class FilterQuery(GeneralFilter, *TechnicalAnalysisFilters, *FundamentalAnalysis
|
|
|
224
230
|
or (
|
|
225
231
|
isinstance(value, list)
|
|
226
232
|
and len(value) == SIZE_RANGE
|
|
227
|
-
and all(isinstance(item,
|
|
233
|
+
and all(isinstance(item, date) for item in value)
|
|
228
234
|
)
|
|
229
|
-
):
|
|
230
|
-
query.append(f"{parameter} BETWEEN {value[0]} AND {value[1]}")
|
|
231
|
-
elif (
|
|
232
|
-
isinstance(value, list)
|
|
233
|
-
and len(value) == SIZE_RANGE
|
|
234
|
-
and all(isinstance(item, date) for item in value)
|
|
235
235
|
):
|
|
236
236
|
query.append(f"{parameter} BETWEEN '{value[0]}' AND '{value[1]}'")
|
|
237
237
|
elif (
|
|
@@ -242,7 +242,7 @@ class FilterQuery(GeneralFilter, *TechnicalAnalysisFilters, *FundamentalAnalysis
|
|
|
242
242
|
general_filters = [f"'{v}'" for v in value]
|
|
243
243
|
query.append(f"{parameter} IN ({', '.join(general_filters)})")
|
|
244
244
|
else:
|
|
245
|
-
raise NotImplementedError
|
|
245
|
+
raise NotImplementedError(f"with value {value}")
|
|
246
246
|
query_ = " AND ".join(query)
|
|
247
247
|
query__ = f"{query_} {order_by_desc.strip()} {order_by_asc.strip()}".strip()
|
|
248
248
|
if limit is not None:
|
|
@@ -108,7 +108,9 @@ class NamedFilterQuery(FilterQuery):
|
|
|
108
108
|
| {"name": f"{self.name} ({suffix})", "country": countries}
|
|
109
109
|
)
|
|
110
110
|
|
|
111
|
-
def
|
|
111
|
+
def update_indicator_filter(
|
|
112
|
+
self, suffix: str, rsi_parameter_name: str
|
|
113
|
+
) -> "NamedFilterQuery":
|
|
112
114
|
return NamedFilterQuery.model_validate(
|
|
113
115
|
self.model_dump()
|
|
114
116
|
| {"name": f"{self.name} ({suffix})", rsi_parameter_name: DATE_THRESHOLD}
|
|
@@ -118,24 +120,24 @@ class NamedFilterQuery(FilterQuery):
|
|
|
118
120
|
return [
|
|
119
121
|
self.country_variant("Europe", list(get_args(Europe))),
|
|
120
122
|
self.country_variant("Us", list(get_args(Us))),
|
|
121
|
-
self.country_variant("Europe", list(get_args(Europe)))
|
|
122
|
-
|
|
123
|
-
),
|
|
124
|
-
self.country_variant("Europe", list(get_args(Europe)))
|
|
125
|
-
|
|
126
|
-
),
|
|
127
|
-
self.country_variant("Europe", list(get_args(Europe)))
|
|
128
|
-
|
|
129
|
-
),
|
|
130
|
-
self.country_variant("Us", list(get_args(Us)))
|
|
131
|
-
|
|
132
|
-
),
|
|
133
|
-
self.country_variant("Us", list(get_args(Us)))
|
|
134
|
-
|
|
135
|
-
),
|
|
136
|
-
self.country_variant("Us", list(get_args(Us)))
|
|
137
|
-
|
|
138
|
-
),
|
|
123
|
+
self.country_variant("Europe", list(get_args(Europe)))
|
|
124
|
+
.update_indicator_filter("RSI 30", "rsi_bullish_crossover_30")
|
|
125
|
+
.update_indicator_filter("MACD", "macd_12_26_9_bullish_crossover"),
|
|
126
|
+
self.country_variant("Europe", list(get_args(Europe)))
|
|
127
|
+
.update_indicator_filter("RSI 40", "rsi_bullish_crossover_40")
|
|
128
|
+
.update_indicator_filter("MACD", "macd_12_26_9_bullish_crossover"),
|
|
129
|
+
self.country_variant("Europe", list(get_args(Europe)))
|
|
130
|
+
.update_indicator_filter("RSI Neutral", "rsi_neutral")
|
|
131
|
+
.update_indicator_filter("MACD", "macd_12_26_9_bullish_crossover"),
|
|
132
|
+
self.country_variant("Us", list(get_args(Us)))
|
|
133
|
+
.update_indicator_filter("RSI 30", "rsi_bullish_crossover_30")
|
|
134
|
+
.update_indicator_filter("MACD", "macd_12_26_9_bullish_crossover"),
|
|
135
|
+
self.country_variant("Us", list(get_args(Us)))
|
|
136
|
+
.update_indicator_filter("RSI 40", "rsi_bullish_crossover_40")
|
|
137
|
+
.update_indicator_filter("MACD", "macd_12_26_9_bullish_crossover"),
|
|
138
|
+
self.country_variant("Us", list(get_args(Us)))
|
|
139
|
+
.update_indicator_filter("RSI Neutral", "rsi_neutral")
|
|
140
|
+
.update_indicator_filter("MACD", "macd_12_26_9_bullish_crossover"),
|
|
139
141
|
]
|
|
140
142
|
|
|
141
143
|
|
|
@@ -150,6 +152,18 @@ SMALL_CAP = NamedFilterQuery(
|
|
|
150
152
|
|
|
151
153
|
TOP_PERFORMERS = NamedFilterQuery(
|
|
152
154
|
name="Top Performers",
|
|
155
|
+
volume_above_average=DATE_THRESHOLD,
|
|
156
|
+
sma_50_above_sma_200=[
|
|
157
|
+
datetime.date.today() - datetime.timedelta(days=5000),
|
|
158
|
+
datetime.date.today() - datetime.timedelta(days=10),
|
|
159
|
+
],
|
|
160
|
+
weekly_growth=[1, 100],
|
|
161
|
+
monthly_growth=[8, 100],
|
|
162
|
+
order_by_desc="market_capitalization",
|
|
163
|
+
).variants()
|
|
164
|
+
|
|
165
|
+
TOP_PERFORMERS_YEARLY = NamedFilterQuery(
|
|
166
|
+
name="Top Performers Yearly",
|
|
153
167
|
sma_50_above_sma_200=[
|
|
154
168
|
datetime.date.today() - datetime.timedelta(days=5000),
|
|
155
169
|
datetime.date.today() - datetime.timedelta(days=10),
|
|
@@ -161,6 +175,7 @@ TOP_PERFORMERS = NamedFilterQuery(
|
|
|
161
175
|
volume_above_average=DATE_THRESHOLD,
|
|
162
176
|
weekly_growth=[1, 100],
|
|
163
177
|
monthly_growth=[8, 100],
|
|
178
|
+
yearly_growth=[30, 100],
|
|
164
179
|
order_by_desc="market_capitalization",
|
|
165
180
|
).variants()
|
|
166
181
|
|
|
@@ -175,7 +190,7 @@ NEXT_EARNINGS_DATE = NamedFilterQuery(
|
|
|
175
190
|
order_by_desc="market_capitalization",
|
|
176
191
|
next_earnings_date=[
|
|
177
192
|
datetime.date.today(),
|
|
178
|
-
datetime.date.today() + timedelta(days=
|
|
193
|
+
datetime.date.today() + timedelta(days=10),
|
|
179
194
|
],
|
|
180
195
|
).variants()
|
|
181
196
|
|
|
@@ -184,6 +199,7 @@ def predefined_filters() -> list[NamedFilterQuery]:
|
|
|
184
199
|
return [
|
|
185
200
|
*SMALL_CAP,
|
|
186
201
|
*TOP_PERFORMERS,
|
|
202
|
+
*TOP_PERFORMERS_YEARLY,
|
|
187
203
|
*LARGE_CAPS,
|
|
188
204
|
*NEXT_EARNINGS_DATE,
|
|
189
205
|
]
|
|
@@ -111,4 +111,4 @@ def news(
|
|
|
111
111
|
task: Optional[Task] = None,
|
|
112
112
|
) -> None:
|
|
113
113
|
database_config = DatabaseConfig(database_path=database_path, no_migration=True)
|
|
114
|
-
get_news(symbols, database_config, headless=headless
|
|
114
|
+
get_news(symbols, database_config, headless=headless)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "bullishpy"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.32.0"
|
|
4
4
|
description = ""
|
|
5
5
|
authors = ["aan <andoludovic.andriamamonjy@gmail.com>"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -8,7 +8,7 @@ packages = [{ include = "bullish" }]
|
|
|
8
8
|
[tool.poetry.dependencies]
|
|
9
9
|
python = ">=3.12,<3.13"
|
|
10
10
|
bearishpy = "^0.26.0"
|
|
11
|
-
tickermood = "^0.
|
|
11
|
+
tickermood = "^0.13.0"
|
|
12
12
|
streamlit = "^1.45.1"
|
|
13
13
|
streamlit-pydantic = "^v0.6.1-rc.3"
|
|
14
14
|
streamlit-file-browser = "^3.2.22"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|