A Simple modular tool to fetch and parse data related to the stock market.

Overview

πŸ’ stonks-o-fetcher

A Simple modular tool to fetch and parse data related to the stock market.

Build Status codecov

Getting started

For the moment the only source is this repository, so to get the program you have to clone it locally.

Requirements

Python >3.6

The program is tested only on a linux environment (WSL 1 and debian) but should technically work on windows too I think.

Installation

After cloning and entering the root of the project

pip install .

If you are not on python 3

python3 -m pip install .

This will make the program available on your system with the command

stonks-cli

First steps

On first startup you'll have to setup your settings, especially the output path.

There is some validation for fields, so if something is missing you'll see it.

You can use the default ~ to point the path to your home folder, so you can set the path to something like ~/stonks/ or whatever you like.

If you define a filename in your path, meaning that it ends with either .csv or .txt that's the filename it will use to output the data, otherwise the filename will be generated automatically from the settings.

⚠️ File checking

There is not check on existing files yet, and that's on purpose, so if you specify a custom file name it will be overwritten at every execution.

It is recommended to not specify a filename and let the program do its thing. It is also strongly suggested to actually change te path to something familiar.

Controls

The important things are esplained in the program itself, and are mostly out of my control due dependecies, but:

  • Menu navigation: arrow keys and vim bindings
  • Confirm a value: Enter
  • Multiselect when available Space - also enter will add the currently highlighted entry
  • Exit from an input field with no defaults: type an empty space then enter
  • With default values you can press enter to confirm it.

⚠️ Saving your settings

Exiting the application with ESC will NOT save your settings. you have to use the main menu option to do so.

CLI and automation

As of version 0.6.0 the only way to use this program is through the interactive cli menus, but i'm planning on adding the option to launch it with arguments to automate the execution of the process, specify all the required paramenters through arguments and handle different settings files to easily automate the execution through multiple settings.

Contributing

A proper documentation will come later, but here's the gist if you want to contribute on new features.

Components

The project is meant to be easily expandable and flexible. There are two main type of components to consider:

  • Source components
    • Fetchers
    • Parsers
  • Writer components

The name are pretty self explanatory I think.

The whole system is already setup to be almost completely automated Each source handler is included in its own module (folder). The module, through the __init__.py has to export some values:

  • Fetcher - your fetcher class, inheriting from FetcherBase
  • Parser - your parser class, inheriting from ParserBase
  • source - string. Unique value identifying the source handled, can be everyhing
  • friendly_name - string. The text that appears on the CLI
  • description - string a brief description of the source. appears in the cli.

Writers are similar, but instead of Fetcher and Parser and source they must have:

  • Writer - your writer class, inheriting from WriterBase
  • output_type - string unique identifier for the class.

The rest of the attributes remain the same.

ℹ️ You can look at the existing modules inside stonks/components to better understand

There's a manager component that is already set up to import all the valid modules from the components/handlers and components/writers folders, so when your module is ready it should work. Loading is done in the cli module, so that the app is actually empty by itself.

For a module to be valid it has to have the required classes and at least the source/output_type

Custom formatting

If you take a look at the existing components description you'll notice some strange formatting.

The CLI has a custom formatter - because i like colored crayons - to ease highlighing important words. Instead of the standard string.format that replaces the values, here we wrap the words into {} to specify formatting.

#  {word:color}
#  {word:style}
#  {word:color|style}
text = 'This {word:blue} is blue!'
# > this word is blue! - with `word` in blue.

Formatting is done through termcolor, so valid values are the ones in their documentation.

As before, check existing modules to better understand.

⚠️ String content For the moment there are a few issues with the default implementation of string.format that catches various character, specifically the . and : that is used as our delimiter, for now Inserting these character in a block to format will cause problems.

As a rule of thumb, if you write your description and when testing the cli the page doesn't load, it means that there's probably something wrong with the text there.

Testing

Testing is done with pytest and coverage.

You can start a full run with

coverage run -m pytest -v && coverare report -m

Or use whatever integration you like - I'm using vscode and its integrations.

There is an utils file with a bunch of function and a decorator class, used mainly as container for the functions. Most of the tests require at least one decorator if they are not testing for failures.

Pull Requests

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. I'm trying to follow git flow specs to some degree, so eventually the PR toward develop please.

⚠️ Please make sure to update tests as appropriate.

License

MIT

Comments
  • add nasdaq historical data for quotes

    add nasdaq historical data for quotes

    Data is available from https://www.nasdaq.com/market-activity/stocks/gme/historical officially, BUT:

    • the filename itself don't look consistent to me with the data available
    • date ranges cannot be predetermined (as far as I can see)

    See this comment for a working update

    enhancement help wanted 
    opened by dinghino 5
  • Reorganize components and remove validation on constants

    Reorganize components and remove validation on constants

    In order to actually allow custom components to be added we need to remove the validation performed on the scraper.settings.constants.

    Those can be kept for internal reference, for now at least, but it would be better to rethink on how that works, maybe even reorganizing the code.

    The validation itself is technically not needed anymore, I think, since every component passes through the manager to be handled, so the names can actually be anything now.

    It would also be a good idea to actually define naming and import schemes to follow.

    Also, to improve code navigation and import we could change the packages structure to something like

    β”œβ”€β”€ components/
    β”‚   β”‚   # should import, like it does now, `fetchers` and `writers`,
    β”‚   β”‚   # at least for now and include `constants`
    β”‚   β”œβ”€β”€ __init__.py
    β”‚   β”œβ”€β”€ component_base.py
    β”‚   β”œβ”€β”€ base_fetcher.py
    β”‚   β”œβ”€β”€ base_parser.py
    β”‚   β”œβ”€β”€ base_parser.py
    β”‚   β”‚
    β”‚   β”‚   # one folder for each source to handle
    β”‚   β”œβ”€β”€ <source_name>
    β”‚   β”‚   β”‚   # imports classes and constants, especially the source_name
    β”‚   β”‚   β”œβ”€β”€ __init__.py
    β”‚   β”‚   β”œβ”€β”€ <source_name>_fetcher.py
    β”‚   β”‚   β”œβ”€β”€ <source_name>_parser.py
    β”‚   β”‚   β”‚   # local constants and a SOURCE_NAME for matching
    β”‚   β”‚   └── constants.py
    β”‚   β”‚
    β”‚   β”‚   # one folder for each output type/writer
    β”‚   β”œβ”€β”€ <output_type>/
    β”‚   β”‚   β”œβ”€β”€ __init__.py
    β”‚   β”‚   β”œβ”€β”€<writer_name>.py
    β”‚   β”‚   β”‚   # local constants and OUTPUT_TYPE for matching
    β”‚   β”‚   └──constants.py
    

    This could allow anybody to create a new set of handlers for a source/output type, like for example

    β”œβ”€β”€ <my_source>/
    β”‚   β”œβ”€β”€ __init__.py
    β”‚   β”œβ”€β”€ <my_source>_fetcher.py
    β”‚   β”œβ”€β”€ <my_source>_parser.py
    β”‚   └── constants.py
    
    # classes creation
    from scraper.components import Fetcher  # base class
    
    class MyFetcher(Fetcher):
      pass
    
    from scraper.components import manager
    from my_source import MyParser, MyFetcher, SOURCE_NAME
    
    # Add them to the manager so that both the app and the cli can use them
    manager.register_handler(SOURCE_NAME, MyFetcher, MyParser)
    

    since the interface will be the same regardless and matching is now done through the manager, working this way it's simpler to set up new set of components and organize them.

    enhancement 
    opened by dinghino 4
  • No validation on whole settings

    No validation on whole settings

    we are currently missing a method to actually validate that the settings are there.

    on the cli this is currently done through cli.utils.validate_settings but this should be one directly by the Settings object (ideally in App before starting the actual loop) and the errors should be available somewhere to give feedback.

    This is also needed to complete #67 properly, providing the option to change the dates

    bug high priority internals 
    opened by dinghino 2
  • Unit testing & Major Refactor

    Unit testing & Major Refactor

    As per title. Needed because yes.

    I'm planning on using pytest but we'll see.

    to simulate responses for requests we could use responses, that should do the trick.

    enhancement 
    opened by dinghino 2
  • Update readme for develop branch

    Update readme for develop branch

    A bunch of things changed, for contributors, developers wanting to implement this as a library and even for end users. Update the readme before develop->master

    documentation high priority 
    opened by dinghino 1
  • List of available sources

    List of available sources

    Here is an updated (as much as possible) list of available data that can be scraped through the app.

    A note about NASDAQ DATA

    I've already started working on it, before finding out about the pay wall. They have A BUNCH of data, like all the things but due to the paywall for now ALL THINGS RELATED TO NASDAQ are on halt

    Already available

    List of already available sources implemented. feel free to open issues on bugs/changes you wanna see implemented

    • [x] Historical short volume
      • [x] FINRA
        • direct file access (csv)
        • no authentication needed
        • reported daily
    • [x] Historical fail to deliver
      • [x] SEC
        • direct file access (zip file with csv in .txt format)
        • no authentication needed
        • reported twice a month, reports contain daily data

    Working on

    List of approved suggestions that are work in progress

    • [ ] Historical quotes
      • [ ] NASDAQ
        • REST API
        • requires authentication
        • behind pay wall if not requested through browser
      • [ ] YAHOO
        • REST API
        • requires authentication with optional paywall
        • has free tier with 500 requests/month

    Suggested

    List of noted suggestions

    Rejected

    List of suggestions rejected with some reason

    help wanted good first issue source suggestion 
    opened by dinghino 1
  • Documentation

    Documentation

    It may be time to start writing up some proper documentation, at least for the major parts of the package and some example on how to implement new stuff.

    documentation enhancement 
    opened by dinghino 1
  • launch with arguments

    launch with arguments

    implement argparse or something similar to launch directly bypassing the cli. Useful for automated systems and to just relaunch quickly with options

    • [x] Implement core command structure with click
    • [x] create commands to launch with arguments
    • [x] add option to launch the CLI app
    • [x] Should allow specifying a custom path for a settings file, to allow for separate configurations for eventual automations
    enhancement 
    opened by dinghino 1
  • dynamic descriptions on options in cli

    dynamic descriptions on options in cli

    modular components are functioning cli correctly parses the registered modules

    the description obviously is not updated. I was thinking about using the preview command of the menu creator which - while it adds the not needed preview box, might just do the trick perfectly.

    Working on implementing the preview function to read the description from the module and add custom formatting to allow highlighting and other things, which may be nice.

    enhancement 
    opened by dinghino 1
  • Feature/remove constants validation

    Feature/remove constants validation

    Remove all the CONSTANT classes and related validation.

    Validation will be done using components modules and manager singleton instead, so it should be completely dynamic

    • [x] add constant values to each component module ('handlers' and 'writers')
    • [x] remove current validation method and replace with manager's generated lists
      • [x] (optional) Add validation functions to manager so it's more compact and friendly to use
    • [x] pass test
    • [x] implement new handling in cli
    • [x] update tests to pass correctly

    Finally closes #44 when merged..?

    enhancement 
    opened by dinghino 1
  • 23 improve manager

    23 improve manager

    Major changes

    • Added base classes for all components and manager Handlers
    • Added validation on manager components registration
    • Added manager handling for writers
    • Refactored some code in app and tests to handle the changes
    • Moved components registration in cli app for cleaner package code
    opened by dinghino 1
  • specify output path/template in stonks run

    specify output path/template in stonks run

    Give the ability the option to specify the path to output the data and/or the template when running the run command

    • -o | --output for the output path
    • -p | --pattern for the filename pattern generator
    enhancement outputs cli 
    opened by dinghino 0
  • custom output filename template

    custom output filename template

    some things are already set for this to work but the gist is to have the user be able to specify a format using python formatting your {variable} so that it can know in advance what the file name would be.

    options for this could/should be:

    • start date - with optional formatting
    • end date - with optional formatting
    • source
    • tickers

    The template should be set per writer, when possibile, but for now a global template would be ok. The template should be validated when added (i.e. for missing parenthesis or unknown variables requested

    enhancement outputs 
    opened by dinghino 0
  • Internal error handling and logging

    Internal error handling and logging

    Currently there's some kind of validation of settings in place but it's not how it should be ( #70 ). Also there is no proper logging, with levels and everything, to debug what's happening.

    The idea as it comes to mind is to have something like the manager (or even inside the manager!) to register some error messages with some additional info to be used either as level and as some kind of traceback.

    Errors could have a basic shape of { level: <logging.level>, message: <error-message>} so that they can be outputted with the logging module or better yet loguru which looks awesome and easy to use and wouldn't require much fuss.

    enhancement 
    opened by dinghino 0
  • Customized settings for modules

    Customized settings for modules

    The idea is to expand the settings object and give each component/module its own set of settings, while keeping some as global. Reason being that for example if we implement a MYSQL writer there is not need to have a path to output the data but there is need to configure the mysql connection.

    Same goes with sources: some require keys ( see #65 ) that can either be stored in a separate file or in the settings.

    This would require some refactor of the setting class, maybe creating some base class for basic functionalities and a way to pass around the settings data to each component

    enhancement internals 
    opened by dinghino 1
  • Ability to save settings to a different path

    Ability to save settings to a different path

    This comes in tandem with #67 since I've been requested to be able to launch with arguments, specifying a settings file and the ability to saveload the settings to/from a custom path.

    • Give the user the ability to save the settings on a different path
    • Give the user the ability to load the settings from a file
      • arguments
      • from cli, typing the path
      • from cli, through a navigator
    • Give the user the ability to set a default settings path.

    The app itself should already be capable of most of the work since the instance can be created providing a path to use for the settings file, already has a default one (albeit static for now) and both the to_file and from_file methods accept a path to use.

    Also we already have proper handling for missing or wrongly formatted settings file.

    • [x] refactor CLI to allow saving the settings to another path
    • [ ] refactor CLI to change a default settings path
    • [x] refactor Settings to be able to have a safe fallback and handle a default path
    • [ ] (optional?) store the settings path on a simple file in the project folder so that the app knows where to look for it.
    enhancement 
    opened by dinghino 0
Releases(v0.6.0)
  • v0.6.0(May 4, 2021)

    While still in pre-release status and sub v1, this is the first actual working version of the project.

    User side

    Not much changed from the previous release on the end-user side but improved feedback and navigation.

    • Sources and output type settings now offer a description about what they do and how they work
    • User can properly select a folder to output, using any path they like including ~ to point to their $HOME directory
    • Ability to start anew after completing a run without having to relaunch the program

    ##Dev side This is where most of the work has been done. (see README for an introduction)

    • Major restructuring of the project with a meaningful tree
    • Added custom formatting for the cli to allow easy highlight of important text
    • Automatic and modular sources and writers implementation, allowing to easily write the handlers for a source or a new output class (writer)
    • started working on some kind of documentation/commenting on what the functions do, but will improve later on
    Source code(tar.gz)
    Source code(zip)
  • v0.5.2-alpha(Apr 30, 2021)

  • v0.5.1-alpha(Apr 30, 2021)

Owner
Daniele
Daniele
Automatically changes your discord status

Automatically changes your discord status, Be careful as this may get you rate limited and banned

octo 5 Sep 20, 2022
If you are in allot of groups or channel and you would like to leave them at once use this

Telegram-auto-leave-groups If you are in allot of groups or channel and you would like to leave them at once use this USER GUIDE πŸ‘£ Insert your telegr

Julius Njoroge 4 Jan 03, 2023
The Sue Gray Alert System was a 5 minute project that just beeps every time a new article is updated or published on Gov.UK's news pages.

The Sue Gray Alert System was a 5 minute project that just beeps every time a new article is updated or published on Gov.UK's news pages.

Dafydd 1 Jan 31, 2022
This is Pdisk Upload Bot made using Python with Pyrogram Framework. Its capable of uploading direct download link with thumbnail or without thumbnail & with Title Support.

Pdisk-Upload-Bot Introduction This Is PDisk Upload Bot Used To Upload Direct Link To Pdisk With Thumb Support Deploy Heroku Deploy Local Deploy pip in

HEIMAN PICTURES 32 Oct 21, 2022
A youtube videos or channels tag finder python module

A youtube videos or channels tag finder python module

Fayas Noushad 4 Dec 03, 2021
PyMed is a Python library that provides access to PubMed.

IMPORTANT NOTE: I don't have time to maintain this library (as some of you might have noticed). The PubMed API is a little chaotic, without a clear do

Gijs Wobben 143 Dec 21, 2022
UP It is a script to notify of a new update of your project, done in python and using GitHub, to modify the versions to notify users.

UP-Updater UP It is a script to notify of a new update of your project, done in python and using GitHub, to modify the versions to notify users. Requi

Made in 4 Oct 28, 2021
A Telegram Music Tag Editor Bot that can remove almost all usernames in the music tags and add own username instead.

Music Tag Editor Bot A Telegram Music Tag Editor Bot that can remove almost all usernames in the music tags and add own username instead. It can also

14 Oct 21, 2022
AWS SDK for Python

Boto3 - The AWS SDK for Python Boto3 is the Amazon Web Services (AWS) Software Development Kit (SDK) for Python, which allows Python developers to wri

the boto project 7.8k Jan 08, 2023
Discord bot for Shran development

shranbot A discord bot named Herbert West that will monitor the Shran development discord server. Using dotenv shranbot uses a .env file to load secre

Matt Williams 1 Jul 29, 2022
Baby Villager Bot

This script scrapes and stores the availability of timeslots for Car Driving Test at all RTA Serivce NSW centres in the state. Dependencies Account wi

Milo Weinberg 3 Dec 16, 2021
Minimal Python client for the Iris API, built on top of Authlib and httpx.

πŸ•ΈοΈ Iris Python Client Minimal Python client for the Iris API, built on top of Authlib and httpx. Installation pip install dioptra-iris-client Usage f

Dioptra 1 Jan 28, 2022
A Discord bot written in Python that can be used to control event management on a server.

Event Management Discord Bot A Discord bot written in Python that can be used to control event management on a Discord server. Made originally for GDS

Suvaditya Mukherjee 2 Dec 07, 2021
Discord bot for playing blindfold chess.

Albin Discord bot for playing blindfold chess written in Python. Albin takes the moves from chat and pushes them on the board without showing it. TODO

8 Oct 14, 2022
The aim is to contain multiple models for materials discovery under a common interface

Aviary The aviary contains: - roost, - wren, cgcnn. The aim is to contain multiple models for materials discovery under a common interface Environment

Rhys Goodall 20 Jan 06, 2023
Pluggable Telethon - Telegram UserBot

A stable pluggable Telegram userbot, based on Telethon.

Team Ultroid 2.3k Dec 30, 2022
Upvotes and karma for Discord: Heart πŸ’— or Crush πŸ’” a comment to give points to an user, or Star ⭐ it to add it to the Best Of!

πŸ€– Reto Reto is a community-oriented Discord bot, featuring a karma system, a way to reward the best comments, leaderboards, and so much more! React t

Erik Bianco Vera 3 May 07, 2022
An Advanced Telegram Bot to Play Radio & Music in Voice Chat. This is Also The Source Code of The Bot Which is Being Used For Playing Radio in @AsmSafone Channel ❀️

Telegram Radio Player V3 An Advanced Telegram Bot to Play Nonstop Radio/Music/YouTube Live in Channel or Group Voice Chats. This is also the source co

SAF ONE 421 Jan 05, 2023
Scripts to help you win the Pizza Express

Slice of the Prizes Slice of the Prizes is a Python Script designed to enter the "Slice of the Action" competition hosted by Pizza Express the competi

Luke Bendall 1 Nov 04, 2021
FUD Keylogger That Reports To Discord

This python script will capture all of the keystrokes within a given time frame and report them to a Discord Server using Webhooks. Instead of the traditional

●┼Waseem Akramβ€’β€’βœ“β© 16 Dec 08, 2022