pkscreener 0.46.20250219.724__tar.gz → 0.46.20250220.726__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.
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/PKG-INFO +9 -9
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/README.md +6 -6
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/README.txt +6 -6
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/AssetsManager.py +9 -7
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Fetcher.py +38 -8
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ScreeningStatistics.py +12 -2
- pkscreener-0.46.20250220.726/pkscreener/classes/__init__.py +1 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/pkscreenercli.py +0 -1
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/requirements.txt +1 -1
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/PKG-INFO +9 -9
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/requires.txt +1 -1
- pkscreener-0.46.20250219.724/pkscreener/classes/__init__.py +0 -1
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/LICENSE +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/Disclaimer.txt +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/LICENSE-Others.txt +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/LICENSE.txt +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/LogoWM.txt +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/__init__.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ArtTexts.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Backtest.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Barometer.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/BaseScreeningStatistics.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/CandlePatterns.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Changelog.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ConfigManager.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ConsoleMenuUtility.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ConsoleUtility.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/GlobalStore.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ImageUtility.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/MarketMonitor.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/MarketStatus.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/MenuOptions.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Messenger.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/OtaUpdater.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKAnalytics.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKDataService.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKDemoHandler.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKMarketOpenCloseAnalyser.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKPremiumHandler.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKScanRunner.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKScheduler.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKSpreadsheets.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKTask.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKUserRegistration.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Pktalib.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Portfolio.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PortfolioXRay.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/StockScreener.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/StockSentiment.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Utility.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/WorkflowManager.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/keys.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/courbd.ttf +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/globals.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/pkscreener.ini +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/pkscreenerbot.py +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/SOURCES.txt +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/dependency_links.txt +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/entry_points.txt +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/not-zip-safe +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/top_level.txt +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/setup.cfg +0 -0
- {pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/setup.py +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: pkscreener
|
3
|
-
Version: 0.46.
|
3
|
+
Version: 0.46.20250220.726
|
4
4
|
Summary: A Python-based stock screener for NSE, India with alerts to Telegram Channel (pkscreener)
|
5
5
|
Home-page: https://github.com/pkjmesra/pkscreener
|
6
|
-
Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.
|
6
|
+
Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250220.726.zip
|
7
7
|
Author: pkjmesra
|
8
8
|
Author-email: pkjmesra@gmail.com
|
9
9
|
License: OSI Approved (MIT)
|
@@ -48,7 +48,7 @@ Requires-Dist: tensorflow==2.16.1
|
|
48
48
|
Requires-Dist: urllib3
|
49
49
|
Requires-Dist: vectorbt
|
50
50
|
Requires-Dist: xlsxwriter
|
51
|
-
Requires-Dist: yfinance==0.2.
|
51
|
+
Requires-Dist: yfinance==0.2.54
|
52
52
|
Requires-Dist: advanced_ta
|
53
53
|
Dynamic: author
|
54
54
|
Dynamic: author-email
|
@@ -69,7 +69,7 @@ Dynamic: summary
|
|
69
69
|
| :-------------: | :-----------------: | :-----------------: | :-----------------: | :-----------------: |
|
70
70
|
| Platforms | [![Windows][Windows-badge]][Windows] | [![Linux(x64)][Linux-badge_x64]][Linux_x64] [![Linux(arm64)][Linux-badge_arm64]][Linux_arm64] | [![Mac OS(x64)][Mac OS-badge_x64]][Mac OS_x64] [![Mac OS(arm64)][Mac OS-badge_arm64]][Mac OS_arm64] | [![Docker Status][Docker Status-badge]][Docker Status] |
|
71
71
|
| Package / Docs | [![Documentation][Documentation-badge]][Documentation] [![OpenSSF Best Practices][OpenSSF-Badge]][OpenSSF-pkscreener] | [![PyPI][pypi-badge]][pypi] | [![is wheel][wheel-badge]][pypi] | ![github license][github-license] |
|
72
|
-
| Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] |
|
72
|
+
| Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] | <a href="https://coveralls.io/github/pkjmesra/PKScreener?branch=main"><img src="https://coveralls.io/repos/github/pkjmesra/PKScreener/badge.svg?branch=main"></a> | [![codecov][codecov-badge]][codecov] | [![After Market][After Market-badge]][After Market] |
|
73
73
|
|
74
74
|
## What is PKScreener?
|
75
75
|
| Telegram Alerts | Nifty AI Prediction | Scheduling Cron Jobs | On-Demand Telegram Bot | Backtesting / Growth of 10k|
|
@@ -392,15 +392,15 @@ After you have finished the run, go to that copied path, zip the contents of the
|
|
392
392
|
[MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
|
393
393
|
[MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
|
394
394
|
[Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
|
395
|
-
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
395
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli.exe
|
396
396
|
[Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
|
397
|
-
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
397
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.bin
|
398
398
|
[Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
|
399
|
-
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
399
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.bin
|
400
400
|
[Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
|
401
|
-
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
401
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.run
|
402
402
|
[Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
|
403
|
-
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
403
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.run
|
404
404
|
[GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
|
405
405
|
[GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
|
406
406
|
[pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
|
@@ -5,7 +5,7 @@
|
|
5
5
|
| :-------------: | :-----------------: | :-----------------: | :-----------------: | :-----------------: |
|
6
6
|
| Platforms | [![Windows][Windows-badge]][Windows] | [![Linux(x64)][Linux-badge_x64]][Linux_x64] [![Linux(arm64)][Linux-badge_arm64]][Linux_arm64] | [![Mac OS(x64)][Mac OS-badge_x64]][Mac OS_x64] [![Mac OS(arm64)][Mac OS-badge_arm64]][Mac OS_arm64] | [![Docker Status][Docker Status-badge]][Docker Status] |
|
7
7
|
| Package / Docs | [![Documentation][Documentation-badge]][Documentation] [![OpenSSF Best Practices][OpenSSF-Badge]][OpenSSF-pkscreener] | [![PyPI][pypi-badge]][pypi] | [![is wheel][wheel-badge]][pypi] | ![github license][github-license] |
|
8
|
-
| Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] |
|
8
|
+
| Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] | <a href="https://coveralls.io/github/pkjmesra/PKScreener?branch=main"><img src="https://coveralls.io/repos/github/pkjmesra/PKScreener/badge.svg?branch=main"></a> | [![codecov][codecov-badge]][codecov] | [![After Market][After Market-badge]][After Market] |
|
9
9
|
|
10
10
|
## What is PKScreener?
|
11
11
|
| Telegram Alerts | Nifty AI Prediction | Scheduling Cron Jobs | On-Demand Telegram Bot | Backtesting / Growth of 10k|
|
@@ -328,15 +328,15 @@ After you have finished the run, go to that copied path, zip the contents of the
|
|
328
328
|
[MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
|
329
329
|
[MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
|
330
330
|
[Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
|
331
|
-
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
331
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli.exe
|
332
332
|
[Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
|
333
|
-
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
333
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.bin
|
334
334
|
[Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
|
335
|
-
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
335
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.bin
|
336
336
|
[Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
|
337
|
-
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
337
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.run
|
338
338
|
[Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
|
339
|
-
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
339
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.run
|
340
340
|
[GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
|
341
341
|
[GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
|
342
342
|
[pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
|
@@ -5,7 +5,7 @@
|
|
5
5
|
| :-------------: | :-----------------: | :-----------------: | :-----------------: | :-----------------: |
|
6
6
|
| Platforms | [![Windows][Windows-badge]][Windows] | [![Linux(x64)][Linux-badge_x64]][Linux_x64] [![Linux(arm64)][Linux-badge_arm64]][Linux_arm64] | [![Mac OS(x64)][Mac OS-badge_x64]][Mac OS_x64] [![Mac OS(arm64)][Mac OS-badge_arm64]][Mac OS_arm64] | [![Docker Status][Docker Status-badge]][Docker Status] |
|
7
7
|
| Package / Docs | [![Documentation][Documentation-badge]][Documentation] [![OpenSSF Best Practices][OpenSSF-Badge]][OpenSSF-pkscreener] | [![PyPI][pypi-badge]][pypi] | [![is wheel][wheel-badge]][pypi] | ![github license][github-license] |
|
8
|
-
| Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] |
|
8
|
+
| Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] | <a href="https://coveralls.io/github/pkjmesra/PKScreener?branch=main"><img src="https://coveralls.io/repos/github/pkjmesra/PKScreener/badge.svg?branch=main"></a> | [![codecov][codecov-badge]][codecov] | [![After Market][After Market-badge]][After Market] |
|
9
9
|
|
10
10
|
## What is PKScreener?
|
11
11
|
| Telegram Alerts | Nifty AI Prediction | Scheduling Cron Jobs | On-Demand Telegram Bot | Backtesting / Growth of 10k|
|
@@ -328,15 +328,15 @@ After you have finished the run, go to that copied path, zip the contents of the
|
|
328
328
|
[MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
|
329
329
|
[MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
|
330
330
|
[Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
|
331
|
-
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
331
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli.exe
|
332
332
|
[Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
|
333
|
-
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
333
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.bin
|
334
334
|
[Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
|
335
|
-
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
335
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.bin
|
336
336
|
[Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
|
337
|
-
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
337
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.run
|
338
338
|
[Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
|
339
|
-
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
339
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.run
|
340
340
|
[GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
|
341
341
|
[GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
|
342
342
|
[pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/AssetsManager.py
RENAMED
@@ -265,8 +265,10 @@ class PKAssetsManager:
|
|
265
265
|
return cache_file
|
266
266
|
|
267
267
|
@Halo(text=' [+] Downloading fresh data from Data Providers...', spinner='dots')
|
268
|
-
def downloadLatestData(stockDict,configManager,stockCodes=[],exchangeSuffix=".NS",downloadOnly=False):
|
269
|
-
|
268
|
+
def downloadLatestData(stockDict,configManager,stockCodes=[],exchangeSuffix=".NS",downloadOnly=False,numStocksPerIteration=0):
|
269
|
+
# if numStocksPerIteration == 0:
|
270
|
+
maxParallelProcesses = 17
|
271
|
+
numStocksPerIteration = (int(len(stockCodes)/int(len(stockCodes)/maxParallelProcesses)) if len(stockCodes) >= maxParallelProcesses else len(stockCodes)) + 1
|
270
272
|
queueCounter = 0
|
271
273
|
iterations = int(len(stockCodes)/numStocksPerIteration) + 1
|
272
274
|
tasksList = []
|
@@ -293,10 +295,10 @@ class PKAssetsManager:
|
|
293
295
|
minAcceptableCompletionPercentage=(100 if downloadOnly else 100),
|
294
296
|
showProgressBars=configManager.logsEnabled)
|
295
297
|
for task in tasksList:
|
296
|
-
if task.result is not None:
|
298
|
+
if task.result is not None and isinstance(task.result,pd.DataFrame) and not task.result.empty:
|
297
299
|
for stock in task.userData:
|
298
300
|
taskResult = task.result.get(f"{stock}{exchangeSuffix}")
|
299
|
-
if taskResult is not None:
|
301
|
+
if taskResult is not None and isinstance(taskResult,pd.DataFrame) and not taskResult.empty:
|
300
302
|
stockDict[stock] = taskResult.to_dict("split")
|
301
303
|
processedStocks.append(stock)
|
302
304
|
leftOutStocks = list(set(stockCodes)-set(processedStocks))
|
@@ -332,10 +334,10 @@ class PKAssetsManager:
|
|
332
334
|
# stockCodes is not None mandates that we start our work based on the downloaded data from yesterday
|
333
335
|
if (stockCodes is not None and len(stockCodes) > 0) and (isTrading or downloadOnly):
|
334
336
|
recentDownloadFromOriginAttempted = True
|
335
|
-
stockDict, leftOutStocks = PKAssetsManager.downloadLatestData(stockDict,configManager,stockCodes,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly)
|
337
|
+
stockDict, leftOutStocks = PKAssetsManager.downloadLatestData(stockDict,configManager,stockCodes,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly,numStocksPerIteration=len(stockCodes) if stockCodes is not None else 0)
|
336
338
|
if len(leftOutStocks) > int(len(stockCodes)*0.05):
|
337
339
|
# More than 5 % of stocks are still remaining
|
338
|
-
stockDict, _ = PKAssetsManager.downloadLatestData(stockDict,configManager,leftOutStocks,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly)
|
340
|
+
stockDict, _ = PKAssetsManager.downloadLatestData(stockDict,configManager,leftOutStocks,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly,numStocksPerIteration=len(leftOutStocks) if leftOutStocks is not None else 0)
|
339
341
|
# return stockDict
|
340
342
|
if downloadOnly or isTrading:
|
341
343
|
# We don't want to download from local stale pkl file or stale file at server
|
@@ -366,7 +368,7 @@ class PKAssetsManager:
|
|
366
368
|
+ colorText.END
|
367
369
|
)
|
368
370
|
if not stockDataLoaded and not recentDownloadFromOriginAttempted:
|
369
|
-
stockDict, _ = PKAssetsManager.downloadLatestData(stockDict,configManager,stockCodes,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly)
|
371
|
+
stockDict, _ = PKAssetsManager.downloadLatestData(stockDict,configManager,stockCodes,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly,numStocksPerIteration=len(stockCodes) if stockCodes is not None else 0)
|
370
372
|
# See if we need to save stock data
|
371
373
|
stockDataLoaded = stockDataLoaded or (len(stockDict) > 0 and (len(stockDict) != initialLoadCount))
|
372
374
|
if stockDataLoaded:
|
@@ -27,16 +27,21 @@ import os
|
|
27
27
|
import sys
|
28
28
|
import warnings
|
29
29
|
|
30
|
+
from time import sleep
|
30
31
|
warnings.simplefilter("ignore", DeprecationWarning)
|
31
32
|
warnings.simplefilter("ignore", FutureWarning)
|
32
33
|
import pandas as pd
|
33
34
|
import yfinance as yf
|
34
35
|
from yfinance import shared
|
35
|
-
# from yfinance.
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
# from yfinance.const import USER_AGENTS
|
37
|
+
from PKDevTools.classes.Utils import USER_AGENTS
|
38
|
+
from yfinance.data import YfData
|
39
|
+
import random
|
40
|
+
from yfinance.exceptions import YFPricesMissingError, YFInvalidPeriodError, YFRateLimitError
|
41
|
+
# class YFPricesMissingError(Exception):
|
42
|
+
# pass
|
43
|
+
# class YFInvalidPeriodError(Exception):
|
44
|
+
# pass
|
40
45
|
from concurrent.futures import ThreadPoolExecutor
|
41
46
|
from PKDevTools.classes.PKDateUtilities import PKDateUtilities
|
42
47
|
from PKDevTools.classes.ColorText import colorText
|
@@ -94,7 +99,8 @@ class screenerStockDataFetcher(nseStockDataFetcher):
|
|
94
99
|
printCounter=False,
|
95
100
|
start=None,
|
96
101
|
end=None,
|
97
|
-
exchangeSuffix=".NS"
|
102
|
+
exchangeSuffix=".NS",
|
103
|
+
attempt = 0
|
98
104
|
):
|
99
105
|
if isinstance(stockCode,list):
|
100
106
|
if len(exchangeSuffix) > 0:
|
@@ -117,6 +123,8 @@ class screenerStockDataFetcher(nseStockDataFetcher):
|
|
117
123
|
data = None
|
118
124
|
with SuppressOutput(suppress_stdout=(not printCounter), suppress_stderr=(not printCounter)):
|
119
125
|
try:
|
126
|
+
# YfData.user_agent_headers = {
|
127
|
+
# 'User-Agent': random.choice(USER_AGENTS)}
|
120
128
|
data = yf.download(
|
121
129
|
tickers=stockCode,
|
122
130
|
period=period,
|
@@ -127,7 +135,8 @@ class screenerStockDataFetcher(nseStockDataFetcher):
|
|
127
135
|
group_by='ticker',
|
128
136
|
timeout=self.configManager.generalTimeout/4,
|
129
137
|
start=start,
|
130
|
-
end=end
|
138
|
+
end=end,
|
139
|
+
auto_adjust=True
|
131
140
|
)
|
132
141
|
if isinstance(stockCode,str):
|
133
142
|
if (data is None or data.empty):
|
@@ -142,8 +151,13 @@ class screenerStockDataFetcher(nseStockDataFetcher):
|
|
142
151
|
recommendedPeriod = str(err).split("[")[1].split("]")[0].split(",")[-1].strip()
|
143
152
|
recommendedPeriod = recommendedPeriod.replace("'","").replace("\"","")
|
144
153
|
# default_logger().debug(f"Sending request again for {ticker} with period:{recommendedPeriod}")
|
145
|
-
data = self.fetchStockData(stockCode=ticker,period=
|
154
|
+
data = self.fetchStockData(stockCode=ticker,period=period,duration=duration,printCounter=printCounter, start=start,end=end,proxyServer=proxyServer,)
|
146
155
|
return data
|
156
|
+
elif "YFRateLimitError" in err:
|
157
|
+
if attempt <= 2:
|
158
|
+
default_logger().debug(f"YFRateLimitError Hit! Going for attempt : {attempt+1}")
|
159
|
+
# sleep(attempt*1) # Exponential backoff
|
160
|
+
# return self.fetchStockData(stockCode=stockCode,period=period,duration=duration,printCounter=printCounter, start=start,end=end,screenResultsCounter=screenResultsCounter,screenCounter=screenCounter,totalSymbols=totalSymbols,exchangeSuffix=exchangeSuffix,attempt=attempt+1)
|
147
161
|
else:
|
148
162
|
multiIndex = data.keys()
|
149
163
|
if isinstance(multiIndex, pd.MultiIndex):
|
@@ -151,9 +165,25 @@ class screenerStockDataFetcher(nseStockDataFetcher):
|
|
151
165
|
# we'd have received a multiindex dataframe
|
152
166
|
listStockCodes = multiIndex.get_level_values(0)
|
153
167
|
data = data.get(listStockCodes[0])
|
168
|
+
else:
|
169
|
+
if (data is None or data.empty):
|
170
|
+
if len(shared._ERRORS) > 0:
|
171
|
+
default_logger().debug(shared._ERRORS)
|
172
|
+
for ticker in shared._ERRORS:
|
173
|
+
err = shared._ERRORS.get(ticker)
|
174
|
+
if "YFRateLimitError" in err:
|
175
|
+
if attempt <= 2:
|
176
|
+
default_logger().debug(f"YFRateLimitError Hit! Going for attempt : {attempt+1}")
|
177
|
+
# sleep(attempt*2) # Exponential backoff
|
178
|
+
# return self.fetchStockData(stockCode=stockCode,period=period,duration=duration,printCounter=printCounter, start=start,end=end,screenResultsCounter=screenResultsCounter,screenCounter=screenCounter,totalSymbols=totalSymbols,exchangeSuffix=exchangeSuffix,attempt=attempt+1)
|
154
179
|
except (KeyError,YFPricesMissingError) as e: # pragma: no cover
|
155
180
|
default_logger().debug(e,exc_info=True)
|
156
181
|
pass
|
182
|
+
except YFRateLimitError as e:
|
183
|
+
if attempt <= 2:
|
184
|
+
default_logger().debug(f"YFRateLimitError Hit! Going for attempt : {attempt+1}")
|
185
|
+
# sleep(attempt*2) # Exponential backoff
|
186
|
+
# return self.fetchStockData(stockCode=stockCode,period=period,duration=duration,printCounter=printCounter, start=start,end=end,screenResultsCounter=screenResultsCounter,screenCounter=screenCounter,totalSymbols=totalSymbols,exchangeSuffix=exchangeSuffix,attempt=attempt+1)
|
157
187
|
except (YFInvalidPeriodError,Exception) as e: # pragma: no cover
|
158
188
|
default_logger().debug(e,exc_info=True)
|
159
189
|
if printCounter and type(screenCounter) != int:
|
@@ -114,6 +114,8 @@ class ScreeningStatistics:
|
|
114
114
|
#Calculating signals
|
115
115
|
def computeBuySellSignals(self,df,ema_period=200,retry=True):
|
116
116
|
try:
|
117
|
+
df["Above"] = False
|
118
|
+
df["Below"] = False
|
117
119
|
if Imports["vectorbt"]:
|
118
120
|
from vectorbt.indicators import MA as vbt
|
119
121
|
if df is not None:
|
@@ -127,7 +129,11 @@ class ScreeningStatistics:
|
|
127
129
|
df["Above"] = ema > df["ATRTrailingStop"]
|
128
130
|
df["Below"] = ema < df["ATRTrailingStop"]
|
129
131
|
except (OSError,FileNotFoundError) as e: # pragma: no cover
|
130
|
-
|
132
|
+
msg = f"{colorText.FAIL}Some dependencies are missing. Try and run this option again.{colorText.END}"
|
133
|
+
if 'unittest' in sys.modules or any("pytest" in arg for arg in sys.argv):
|
134
|
+
print(msg)
|
135
|
+
else:
|
136
|
+
OutputControls().printOutput(msg)
|
131
137
|
# OSError:RALLIS: [Errno 2] No such file or directory: '/tmp/_MEIzoTV6A/vectorbt/templates/light.json'
|
132
138
|
# if "No such file or directory" in str(e):
|
133
139
|
try:
|
@@ -148,7 +154,11 @@ class ScreeningStatistics:
|
|
148
154
|
return self.computeBuySellSignals(df,ema_period=ema_period,retry=False)
|
149
155
|
return None
|
150
156
|
except ImportError as e: # pragma: no cover
|
151
|
-
|
157
|
+
msg = f"{colorText.FAIL}The main module needed for best Buy/Sell result calculation is missing. Falling back on an alternative, but it is not very reliable.{colorText.END}"
|
158
|
+
if 'unittest' in sys.modules or any("pytest" in arg for arg in sys.argv):
|
159
|
+
print(msg)
|
160
|
+
else:
|
161
|
+
OutputControls().printOutput(msg)
|
152
162
|
if df is not None:
|
153
163
|
ema = pktalib.EMA(df["Close"], ema_period) if ema_period > 1 else df["Close"]#short_name='EMA', ewm=True)
|
154
164
|
df["Above"] = ema > df["ATRTrailingStop"]
|
@@ -0,0 +1 @@
|
|
1
|
+
VERSION='0.46.20250220.726'
|
@@ -37,7 +37,7 @@ tensorflow==2.16.1 # https://github.com/tensorflow/tensorflow/issues/62075
|
|
37
37
|
urllib3 #>=1.26.20
|
38
38
|
vectorbt #>=0.26.2
|
39
39
|
xlsxwriter #>=3.2.0
|
40
|
-
yfinance==0.2.
|
40
|
+
yfinance==0.2.54 #>=0.2.44 #==0.1.87
|
41
41
|
# windows-curses; "windows" in sys.platform
|
42
42
|
# https://github.com/pkjmesra/PKScreener/blob/main/.github/dependencies/TA_Lib-0.4.28-cp311-cp311-win_amd64.whl; "windows" in sys.platform
|
43
43
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: pkscreener
|
3
|
-
Version: 0.46.
|
3
|
+
Version: 0.46.20250220.726
|
4
4
|
Summary: A Python-based stock screener for NSE, India with alerts to Telegram Channel (pkscreener)
|
5
5
|
Home-page: https://github.com/pkjmesra/pkscreener
|
6
|
-
Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.
|
6
|
+
Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250220.726.zip
|
7
7
|
Author: pkjmesra
|
8
8
|
Author-email: pkjmesra@gmail.com
|
9
9
|
License: OSI Approved (MIT)
|
@@ -48,7 +48,7 @@ Requires-Dist: tensorflow==2.16.1
|
|
48
48
|
Requires-Dist: urllib3
|
49
49
|
Requires-Dist: vectorbt
|
50
50
|
Requires-Dist: xlsxwriter
|
51
|
-
Requires-Dist: yfinance==0.2.
|
51
|
+
Requires-Dist: yfinance==0.2.54
|
52
52
|
Requires-Dist: advanced_ta
|
53
53
|
Dynamic: author
|
54
54
|
Dynamic: author-email
|
@@ -69,7 +69,7 @@ Dynamic: summary
|
|
69
69
|
| :-------------: | :-----------------: | :-----------------: | :-----------------: | :-----------------: |
|
70
70
|
| Platforms | [![Windows][Windows-badge]][Windows] | [![Linux(x64)][Linux-badge_x64]][Linux_x64] [![Linux(arm64)][Linux-badge_arm64]][Linux_arm64] | [![Mac OS(x64)][Mac OS-badge_x64]][Mac OS_x64] [![Mac OS(arm64)][Mac OS-badge_arm64]][Mac OS_arm64] | [![Docker Status][Docker Status-badge]][Docker Status] |
|
71
71
|
| Package / Docs | [![Documentation][Documentation-badge]][Documentation] [![OpenSSF Best Practices][OpenSSF-Badge]][OpenSSF-pkscreener] | [![PyPI][pypi-badge]][pypi] | [![is wheel][wheel-badge]][pypi] | ![github license][github-license] |
|
72
|
-
| Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] |
|
72
|
+
| Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] | <a href="https://coveralls.io/github/pkjmesra/PKScreener?branch=main"><img src="https://coveralls.io/repos/github/pkjmesra/PKScreener/badge.svg?branch=main"></a> | [![codecov][codecov-badge]][codecov] | [![After Market][After Market-badge]][After Market] |
|
73
73
|
|
74
74
|
## What is PKScreener?
|
75
75
|
| Telegram Alerts | Nifty AI Prediction | Scheduling Cron Jobs | On-Demand Telegram Bot | Backtesting / Growth of 10k|
|
@@ -392,15 +392,15 @@ After you have finished the run, go to that copied path, zip the contents of the
|
|
392
392
|
[MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
|
393
393
|
[MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
|
394
394
|
[Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
|
395
|
-
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
395
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli.exe
|
396
396
|
[Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
|
397
|
-
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
397
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.bin
|
398
398
|
[Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
|
399
|
-
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
399
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.bin
|
400
400
|
[Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
|
401
|
-
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
401
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.run
|
402
402
|
[Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
|
403
|
-
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.
|
403
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.run
|
404
404
|
[GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
|
405
405
|
[GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
|
406
406
|
[pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
|
@@ -1 +0,0 @@
|
|
1
|
-
VERSION='0.46.20250219.724'
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ArtTexts.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Backtest.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Barometer.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/CandlePatterns.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Changelog.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ConfigManager.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ConsoleUtility.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/GlobalStore.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/ImageUtility.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/MarketMonitor.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/MarketStatus.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/MenuOptions.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Messenger.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/OtaUpdater.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKAnalytics.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKDataService.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKDemoHandler.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKPremiumHandler.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKScanRunner.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKScheduler.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PKSpreadsheets.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/Portfolio.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/PortfolioXRay.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/StockScreener.py
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/StockSentiment.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener/classes/WorkflowManager.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/entry_points.txt
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/not-zip-safe
RENAMED
File without changes
|
{pkscreener-0.46.20250219.724 → pkscreener-0.46.20250220.726}/pkscreener.egg-info/top_level.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|