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
This script books automatically a slot on Doctolib in one of the public vaccination centers in Berlin.

BOOKING IN BERLINS VACCINATION CENTERS This python script books automatically a slot on Doctolib in one of the public vaccination centers in Berlin. T

17 Jan 13, 2022
A solution designed to extract, transform and load Chicago crime data from an RDS instance to other services in AWS.

This project is intended to implement a solution designed to extract, transform and load Chicago crime data from an RDS instance to other services in AWS.

Yesaswi Avula 1 Feb 04, 2022
We propose the adversarial blur attack (ABA) against visual object tracking.

ABA We propose the adversarial blur attack (ABA) against visual object tracking. The ICCV link: https://arxiv.org/abs/2107.12085 and, https://openacce

Qing Guo 13 Dec 01, 2022
Instagram bot for promoting ROKA trainee soldier(just like me)'s consolation letters.

Instagram_bot (ν•„μžλ₯Ό ν¬ν•¨ν•œ) λͺ¨λ“  λŒ€ν•œλ―Όκ΅­ ν›ˆλ ¨λ³‘λ“€μ„ μœ„ν•œ μΈμŠ€νƒ€κ·Έλž¨ μΈνŽΈμ§€κΈ°μž…λ‹ˆλ‹€. Instagram bot for promoting ROKA trainee soldier(just like me)'s consolation letters. λ“€μ–΄κ°€κΈ° (Ge

Lee, Jongjun 2 Nov 21, 2021
An inline Telegram bot to keep your private messages hidden from prying eyes.

Hide This Bot Hide This Bot is an inline Telegram bot to keep your private messages hidden from prying eyes. β€ˆ β€ˆ How do I host it? Here is a brief gui

41 Dec 02, 2022
fhempy is a FHEM binding to write modules in Python language

fhempy (BETA) fhempy allows the usage of Python 3 (NOT 2!) language to write FHEM modules. Python 3.7 or higher is required, therefore I recommend usi

Dominik 27 Dec 14, 2022
A taskbar clock for secondary taskbars on Windows 11

ElevenClock A taskbar clock for secondary taskbars on Windows 11. When microsoft's engineers were creating Windows 11, they forgot to add a clock on t

MartΓ­ Climent 1.7k Jan 07, 2023
A Pancakeswap v2 trading client (and bot) with limit orders, stop-loss, custom gas strategies, a GUI and much more.

Pancakeswap v2 trading client A Pancakeswap trading client (and bot) with limit orders, stop-loss, custom gas strategies, a GUI and much more. If you

571 Mar 15, 2022
An API wrapper around Discord API written in Python

Diskord This library is a maintained fork of now archived library, discord.py. A modern and easy to use API wrapper around Discord API written in Pyth

Diskord 36 Aug 22, 2022
A Python library for the Buildkite API

PyBuildkite A Python library and client for the Buildkite API. Usage To get the package, execute: pip install pybuildkite Then set up an instance of

Peter Yasi 29 Nov 30, 2022
Web3 Ethereum DeFi toolkit for smart contracts, Uniswap and PancakeSwap trades, Ethereum JSON-RPC utilities, wallets and automated test suites.

Web3 Ethereum Defi This project contains common Ethereum smart contracts and utilities, for trading, wallets,automated test suites and backend integra

Trading Strategy 222 Jan 04, 2023
SEP Finder Bot

SEP Finder Bot This is a Telegram bot that will help you find the correct SEP and Baseband files to use for your device with futurerestore. Usage A ho

6 Dec 03, 2022
A repository of publicly verifiable token Sale contracts

Token-Sale-Plutus-Contract A repository of publicly verifiable token sale and royalty contracts. This will be the storage solution since it is easily

Logical Mechanism 29 Aug 18, 2022
Set up recurring buys in Gemini

Overview Set up recurring buys in Gemini. Given some keys (Create API Keys), allows you to configure a recurring buy using the reduced API maker and t

Ahmad Abuomar 3 Jan 06, 2022
Provide discord buttons feature for discord.py

dpy_buttons wrapper library for discord.py, providing discord buttons feature. Future of the library Will be merged into discord interaction api libra

Minjun Kim (Lapis0875) 17 Feb 02, 2022
The Simple Google Colab Notebook to Download Files from Direct Link to Google Drive with custom name and bulk link support.

Direct Link to Google Drive (Advanced! πŸ”₯ ) The Most Advanced yet Simple Google Colab Notebook to Download Files from Direct Link to Google Drive. πŸ†•

Dr.Caduceus 14 Jul 26, 2022
The Best Telegram UserBot Made With Pyrogram [Python]

Asterix UserBot A Powerful Telegram userbot based on Pyrogram. How To Deploy Asterix Heroku Railway Qovery Termux Tutorial Railway Deploy Comming Soon

TeamAsterix 9 Oct 17, 2022
Simple Similarities Service

simsity Simsity is a Super Simple Similarities Service[tm]. It's all about building a neighborhood. Literally! This repository contains simple tools t

vincent d warmerdam 95 Dec 25, 2022
Complete portable pipeline for masking of Aadhaar Number adhering to Govt. Privacy Guidelines.

Aadhaar Number Masking Pipeline Implementation of a complete pipeline that masks the Aadhaar Number in given images to adhere to Govt. of India's Priv

1 Nov 06, 2021
RDMAss - A Python Discord bot creating an interaction with RDM API

RDMAss A Python Discord bot creating an interaction with RDM API. Features Assig

5 Sep 21, 2022