Commit Graph

122 Commits

Author SHA1 Message Date
Mark Aron Szulyovszky 567cd5e9f0 refactor(Evaluate): print out accuracy, f1, etc. for the final & meta predictions, separated out evaluation step (#228)
* refactor(Evaluate): print out accuracy, f1, etc. for the final & meta predictions, separated out evaluation step

* fix(Linter): ran

* fix(Tests): syntax change

* fix(Inference): runs now again

* fix(Linter): ran
2022-03-03 17:40:17 +01:00
Mark Aron Szulyovszky 75157c6285 feat(Labeling): purge overlapping events, sort dataframe at loading time (#226)
* feat(Labeling): purge overlapping events, sort dataframe at loading time

* fix(Linter): ran

* refactor(Labeling): moved purge_overlapping_events one abstraction level higher

* fix(Data): renamed class

* fix(Data): corrected parameter name

* fix(Config): parameters

* fix(Data): fixed path

* fix(Data): uncommented required code

* feat(EventFilters): use vol based CUSUM

* fix(Config): only retrain every 2000 samples

* fix(Config): filter out even more events

* fix(Inference): added remove_overlapping_events

* refactor(Types): simplified type hierarchy
2022-03-02 00:26:33 +01:00
Mark Aron Szulyovszky 10a0803c91 fix(Data): make sure we have data in chronological order 2022-02-20 18:01:01 +01:00
Mark Aron Szulyovszky c9f8ed1304 feat(Data): added script to download data from binance (#224)
* feat(Data): added script to download data from binance

* feat(Data): saving unified parquet file/loading

* fix(Config): tweak the cusum filter's threshold

* fix(Dependencies): added binance_historical_data
2022-02-20 12:30:53 +01:00
Mark Aron Szulyovszky 7a443d93e4 feat(Transformations): added robust scaler (#223)
* feat(Transformations): added robust scaler

* fix(Config): set back default scaler to MinMax
2022-02-20 00:41:46 +01:00
Mark Aron Szulyovszky 229f16c4b3 fix(Ensembling): stacking now works (although performance is poor) 2022-02-19 19:19:02 +01:00
Mark Aron Szulyovszky 7c08a87243 feat(Ensembling): added possiblity of stacking models 2022-02-19 18:55:17 +01:00
Mark Aron Szulyovszky cfb65c135e feat(Pipeline): added multi-asset pipeline, ensembling_method to config 2022-02-19 15:37:19 +01:00
Mark Aron Szulyovszky 7db1c4dc00 feat(Config): added flag to save models 2022-02-19 15:06:05 +01:00
Mark Aron Szulyovszky 77206a5d0a fix(Config): adjusted parameters to 5 minute timeframe 2022-02-19 14:58:34 +01:00
Mark Aron Szulyovszky 3b9d7f554a feature(Config): added transformation parameters to Config, removed expanding_window (it's ON now) 2022-02-19 14:44:49 +01:00
Mark Aron Szulyovszky 8dd2d88740 chore(Linter): reformatted code with black (#211)
* chore(Linter): reformatted code with black

* Create black.yaml
2022-02-17 19:22:17 +01:00
Mark Aron Szulyovszky f3fee4a4e1 fix(Codemod): restored original docstring replacement 2022-02-17 16:53:09 +01:00
Mark Aron Szulyovszky 9d47ee942d feat(Project): use SKLearn models directly, removed custom ensembling, use 5 minute data, batch inference, numba cusum filter (#192)
* feat(Project): use 5 minute data, running training in parallel, sped up cusum filter by 10x with numba

* fix(WalkForward): inference mini-batch parallelization

* fix(WalkForward): don't use the parallel version of any of the functions

* feat(CI): download the data required

* fix(Project): 5min_crypto folder added

* fix(Evaluate): make sure we have numerical stability in returns

* feat(Models): use SKLearn models directly to enable composability

* feat(Inference): batched inference now working, added forecasting_horizon

* fix(Inference): works again

* fix(Inference)

* chore(Models): remove unused Ensemble model

* fix(Labeller): don't just forward shift returns, also take the sum of the data happened until then

* Update test.yml
2022-02-17 16:36:35 +01:00
Mark Aron Szulyovszky 5c94af8b01 fix(CI): removed sphinx workflow from private repo 2022-02-14 23:09:56 +01:00
Mark Aron Szulyovszky 522757c282 fix(CI): push to the public repo without the private repo's history (#207)
* feat(CI): push to the public repo without the private repo's history

* fix(CI): workflow syntax

* fix(CI): use the destination ssh key

* fix(CI): wrong syntax

* fix(CI): taken out unnecessary step

* fix(CI): correct pipe syntax?

* fix(CI): create dictionary

* fix(CI): use global ssh config

* fix(CI): git config can be only called in a repo's dir

* fix(CI): clone the repo with ssh

* fix(CI): added ssh key when clonign

* fix(CI): don't build the docs on PRs

* fix(CI): use the correct ssh keys

* fix(CI): don't push to the local brunch

* fix(CI): missing chmod

* chore(CI): print out private key

* fix(CI): echo

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Create purge.yaml

* Update purge.yaml

* Update copy_repo.yml

* Update copy_repo.yml

* Delete purge.yaml
2022-02-08 01:07:16 +01:00
Mark Aron Szulyovszky 62686393f5 feat(Docs): prepare for sphinx-pages (#205)
* feat(Docs): prepare for sphinx-pages

* feat(CI): added sphinx workflow

* feat(Docs): added content

* fix(CI): use the patched GH action

* fix(CI): set source dir

* chore(Docs): reorder project structure

* chore(Docs): moved index.rst one level up?

* fix(Config): restore the config file, etc.

* fix(Docs): adjusted config
2022-02-02 17:56:25 +01:00
Daniel Szemerey 1f813f89e3 Create copy_repo.yml (#200)
* Create copy_repo.yml

* Create strip_action.yaml

* Create .libcst.codemod.yaml

* Create replace_functions.py

* Create __init__.py

* Update copy_repo.yml (#201)

* Update copy_repo.yml (#202)

* Update copy_repo.yml

* Update copy_repo.yml (#203)

* Update copy_repo.yml

* Update replace_functions.py

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Update copy_repo.yml

* Rename strip_action.yaml to environment-strip-action.yaml

* Update copy_repo.yml

* Update replace_functions.py (#206)
2022-02-02 17:23:16 +01:00
Daniel Szemerey d817605873 Create strip-action.yaml 2022-02-02 12:52:19 +01:00
Mark Aron Szulyovszky f85ee6bb9c fix(MetaLabeling): previously misinterpreted meta-labeling, now also multiplying base model's prediction with the meta model's prediction (#193)
* fix(MetaLabeling): previously misinterpreted meta-labeling, now also multiplying base model's prediction with the meta model's prediction

* fix(Evaluate): print results

* fix(Evaluate): make sure we have numerical stability in returns

* fix(Inference): only output and print stats in training mode

* fix(Evaluate): don't add miniscule amount to result
2022-02-01 13:09:00 +01:00
Mark Aron Szulyovszky 3eb3ea94e3 Refactor(Training): new outcome types, representative pipeline steps, bet-sizing (#187)
* refactor(Training): added InferenceResult & TrainedModel types

* refactor(Pipeline): introduced TrainingOutcome, BetSizingWithMetaOutcome, etc.

* fix(Pipeline): getting it to compile

* refactor(WalkForward): separate preprocessing step

* feat(Pipeline): separate out transformations processing step

* refactor(Pipeline): use the Directional model terminology, put bet_sizing into pipeline instead of hiding it in a step

* refactor(WalkForward): moved functions to separate folder

* fix(WalkForward): use sparse array to store models, process transformations in parallel (lot faster)

* fix(Tests): and evaluation

* fix(Tests): for realz

* fix(Inference): preloading everything now, renamed primary models to directional models

* fix(BetSizing): was running transformations on the wrong data, oops

* fix(BetSizing): concatenated on the wrong axis accidentally

* fix(Reporting): able to use the new Stats type

* fix(BetSizing): renamed int column names

* fix(Portfolio): name the column properly

* fix(Reporting): rename the correct Series, lol

* fix(Inference): walk_forwad_inference() can deal with models not being aligned with the starting index

* fix(WalkForward): accidentally using the wrong index

* fix(WalkForward): use the correct indicies to fetch last model/transformations

* fix(CI): changed the name of the results
2022-01-29 06:41:40 +01:00
Mark Aron Szulyovszky 42a1bc59cb feat(Events): added EventFilter, EventLabeller (#186) 2022-01-26 23:22:43 +01:00
Mark Aron Szulyovszky 1042c82333 Update README.md 2022-01-26 22:06:40 +01:00
Mark Aron Szulyovszky e6e2317fe0 refactor(Training): use date indexes instead of integers, need this to prepare for Events (#185) 2022-01-24 12:22:30 +01:00
Mark Aron Szulyovszky e80fffdb65 refactor(Config): use a Config object instead of dictionary of dictionaries! (#184)
* refactor(Config): use a Config object instead of dictionary of dictionaries!

* fix(Config): use default_ensemble_config

* fix(Portfolio): fixed portfolio construction
2022-01-23 18:37:43 +01:00
Mark Aron Szulyovszky 5c4a5b0cf1 refactor(Project): removed regression method (we can still use regression models, but we'll need map them to classification later) (#182)
* refactor(Project): removed regression method (we can still use regression models, but we'll need map them to classes later)

* fix(Training): removed mistakenly left in `method` parameter
2022-01-23 17:15:08 +01:00
Daniel Szemerey 516c8bcc87 feat(Inference): Inference now runs on the entire pipeline, only train/predict one asset, adjust trading costs (#173)
* fix, feat: Fixed inference processing data. Add transformation attribute.

* feat: Added transformations step, refractored the loop to make more sense (divided the train and inference loop).

* feat: Truncated models over time and transformations over time. Fixed some typing aswell.

* fix: Fixed a number of out of array problems.

* feat: Inference now works!

* fix(Steps): runtime error not checking for None

* fix(Steps): preloaded transformers are not optional anymore, sped up training by temporary increasing the retrain_every

* fix(CI): disable ray memory monitoring

* refactor(Inference): removed truncate_models and replaced it with filling X with NaN until inference should start

* feat(Inference): added index_from parameter

* fix(Tests): walk_forward test

* refactor(Pipeline): only predict one asset

* refactor(Inference): removed select_models step, inference code moved to run_inference.py so it matches convention (similar to run_pipeline.py)

* fix(Evaluation): adjust transaction costs

* fix(Config): adjusted retrain_every

Co-authored-by: Daniel Szemerey <szemereydaniel@gmail.com>
Co-authored-by: Mark Aron Szulyovszky <mark.szulyovszky@gmail.com>
2022-01-23 11:38:40 +01:00
Mark Aron Szulyovszky 6b26643ece feat(Transformations): replaced feature selection pre-processing step with online version (with cache) (#170)
* feat(Transformations): removed feature-selection pre-processing step completely

* fix(Core): removed unnecessary `original_X`

* fix(Transformations): use the X_expanding_window to transform subsequent data

* fix(RFE): should check for model correctly

* fix(Config): only re-train the model every 40 timestamp

* fix(MetaLabeling): pass in the correct X to meta-labeling step

* fix(Transformation): PCA should at least keep as many features as sliding_window_size

* feat(Transformations): cache transformations across the same asset

* fix(Tests): missing preloaded_transformations arg

* chore(Config): got rid of unnecessary 'classification_models' and 'regression_models' dictionary keys
2022-01-17 11:43:51 +01:00
Daniel Szemerey 31dc847be1 Feature(Speed): Python launches faster by conditionally importing models. (#169)
* feat: Added optional import of models.

* fix: Models weren't wrapped into abstract class, fixed it.

* chore: Deleted leftover comments.

* fix: Same merge commit as on remote.

* fix: System wasn't putting in RF because there was no differentiation between RF as regressor and RF as classificator.

* fix(Models): use the XGBoostModel wrapper

Co-authored-by: Daniel Szemerey <szemereydaniel@gmail.com>
Co-authored-by: Mark Aron Szulyovszky <mark.szulyovszky@gmail.com>
2022-01-14 14:29:24 +01:00
Mark Aron Szulyovszky 797d45d036 feat(Inference): pipeline wired up (#171)
* feat: Basic pipeline extended.

* feat: Added conversion of model list to existing structure (model_name, model_in_time). Fixed loading of previous models and dicts.

* fix: Had an unfinished function.

* fix: Inference wasn't getting model_over_time. Now transformations are not getting it either yet.

Co-authored-by: Daniel Szemerey <szemereydaniel@gmail.com>
2022-01-14 10:34:28 +01:00
Mark Aron Szulyovszky 4aefba33ea fix(Pipeline): remove PCA step that introduced clear lookahead bias (#164) 2022-01-13 12:11:38 +01:00
Mark Aron Szulyovszky 3c2a0d4247 refactor(Types): added nested types for Reporting (#162) 2022-01-13 09:21:07 +01:00
Mark Aron Szulyovszky 1856fcad22 feat(Transformations): added Transformations abstraction & handling in walk_forward_train() & inference() (#161)
* feat(Transformations): added Transformations abstraction & handling in walk_forward_train() & inference()

* fix(WalkForward): use Dataframes to call Transformation.fit_transform()

* feat(WalkForward): restored option for models to recieve unscaled data

* fix(Transformations): output DataFrame as expected

* fix(Tests): missing new property
2022-01-12 23:22:55 +01:00
Daniel Szemerey 3084f5e271 Refractor(Main Pipeline): Refractored the two main steps and the data processing. (#156)
* refr: Took out main primary and secondary loops and data processing.

* feat: Tidied the code up.

* feat: Saving models and results now works in a type safe way.

* fix: There was error in the saving function.

* chore: Took out some remaining comments.

* fix: Fixed the previous data checking process.

* feat: Fixed model selection method. I will continue the inference after we merged.

Co-authored-by: Daniel Szemerey <szemereydaniel@gmail.com>
2022-01-12 23:10:18 +01:00
Mark Aron Szulyovszky c611481eb6 refactor(WalkForward): separate train / test functions to help with inference later (#158)
* refactor(WalkForward): separate train / test functions (draft) to potentially help with inference later

* fix(Training): use the new separate train / test functions

* feat(Training): return and pass in scalers that are necessary for inference

* fix(Project): runtime errors

* fix(WalkForward): use the correct `train_from` value

* fix(Tests): for new walk_forward functions()

* refactor(WalkForward): rename `walk_forward_test()` to `walk_forward_inference()`
2022-01-12 14:42:16 +01:00
Mark Aron Szulyovszky 5db2a3b935 fix(Reporting): identify primary models correctly with the new column names 2022-01-11 19:44:01 +01:00
Daniel Szemerey 55f083638f feature(Inference): Created the inference process, added model saving. (#153)
* feat: Basic scaffolding up for inference process after training.

* feat: Saving and loading models works. Inference works nearly.

* feat: Added inference pipeline.

* feat: Saving model now accoring to date and time; loading models now selects from latest file. Fixed the creation of dictionary of models.

* feat: Added lightweight asset config, but full pipeline.

* feat: Added new naming for dictionary.

* fix: Fixed dictionary naming convention.

* fix: Fixed naming again, now the model structure is good

* fix: Changed the output path and the return values from run_pipeline.

* feat: Added function to make sure folder exists for output models.

Co-authored-by: Daniel Szemerey <szemereydaniel@gmail.com>
2022-01-11 19:15:58 +01:00
Mark Aron Szulyovszky 255910cb40 chore(Config): try to turn off PCA to see the results (#152) 2022-01-11 15:25:36 +01:00
Mark Aron Szulyovszky 580500a46a feat(Evaluation): adjusted transaction costs to be more realistic 0.3% (#150) 2022-01-11 12:41:02 +01:00
Mark Aron Szulyovszky 54ea59c0cf feat(Sweep): try to filter out some not great models (#144)
* feat(Sweep): try to filter out some not great models

* fix(Sweep): yaml

* fix(Sweep): yaml

* fix(Config): remove some models that do not perform well
2022-01-11 10:33:18 +01:00
Mark Aron Szulyovszky 2c03959315 feat(Reporting): added backtesting with vectorbt (#148)
* feat(Reporting): added vectorbt-based backtest

* fix(Reporting): added transaction costs

* feat(Reporting): added ability to rebalance only every n days

* feat(Dependencies): added pytorch

* fix(Dependencies): added pytorch-lightning

* feat(CI): added portfolio reporting step

* feat(Reporting): save weights as well

* fix(Reporting): start with less cash
2022-01-11 09:34:08 +01:00
Mark Aron Szulyovszky 18768c3925 fix(FeatureExtractor): use a rolling z-score instead of StandardScaler with unavoidable lookahead bias (#146)
* fix(FeatureExtractor): use a rolling z-score instead of StandardScaler with unavoidable lookahead bias

* chore(Archive): removed archived models

* fix(FeatureExtractors): syntax

* fix(FeatureExtractors): mistake with expanding window
2022-01-10 14:24:51 +01:00
Mark Aron Szulyovszky 73cfc67336 fix(Evaluation): correlation test should work on a per asset level, not per model level (#142)
* fix(Evaluation): correlation test should work on a per asset level, not per model level

* fix(Evaluation): correlations series initalized correctly

* fix(Reporting): don't name the run after the incorrectly supposed model_type

* fix(Reporting): put back send_report_to_wandb() into its original place

* fix(CI): sending reports again in comment
2022-01-10 14:17:06 +01:00
Mark Aron Szulyovszky ba2ab752d2 feat(Sweep): updated primary model sweep config (#140) 2022-01-09 20:06:35 +01:00
Mark Aron Szulyovszky f5bbc266a4 feat(Reporting): added robustness / correlation test (#138)
* feat(Evaluation): added robustness/correlation test

* feat(Reporting): saving correlations

* fix(Reporting): record correlations properly

* fix(Model): SVC's random seed

* feat(CI): store artifacts
2022-01-09 20:00:03 +01:00
Mark Aron Szulyovszky b1c04afb13 refactor(Naming): use new convention, added Ensemble model parameter back, support multiple Meta-Labeling models (#132)
* refactor(Naming): use `primary_models` & `meta_labeling_models`

* refactor(Naming): using primary * meta_labeling across config and in pipeline

* feat(Pipeline): added back Ensemble models

* fix(Pipeline): compiler error

* fix(Config): typo

* chore(Pipeline): removed unused averaging step

* revert the changes in discretizing

* chore(Pipeline): remove sharpe improvement logging

* fix(Pipeline): ensemble predictions should be a pd.Series instead of a DataFrame

* fix(Pipeline): discard unnecessary ensemble_probabilities

* fix(Pipeline): fixes regarding various meta-labeling ensemble bugs

* fix(Reporting): use the new naming convention

* fix(Reporting): use the right variable

* feat(Sweep): new sweep for ensemble models

* fix(Sweep): config reference

* fix(Config): simplified dev config

* fix(Models): use the faster LR model

* fix(Models): use LGBM in the meta-labeling model for speed

* fix(Selection): always use the first model for feature selection, commented out caching from select_features() as it's close to redundant in terms of speed
2022-01-09 17:21:06 +01:00
Mark Aron Szulyovszky 22b3167cb9 feat(Evaluate): increase transactions costs, to get a more realistic view on performance (#137) 2022-01-09 14:18:20 +01:00
Mark Aron Szulyovszky fc5eba4e2d feat(Models): added lightGBM, moved other models to separate files (#128)
* feat(Models): added lightGBM, moved other models to separate files

* feat(Models): added non-working statsmodel wrapper

* fix(Models): added work-in-progress comment to StatsModels
2022-01-08 12:02:42 +01:00
Mark Aron Szulyovszky 6982187872 feat(Sweep): new config to test dynamic features selection, number of features, etc. (#127) 2022-01-08 00:10:45 +01:00
Mark Aron Szulyovszky 81c217a401 feat(Portfolio): reporting MVP (#108)
* feat(DataLoader): added load_only_returns() method

* feat(Portfolio): load predictions

* feat(Portfolio): normalize weights

* feat(Portfolio): started integrating with portfoliobt

* feat(Portfolio): include fees in the portfolio construction

* feat(Portfolio): demo of pyportfolioopt

* feat(Portfolio): get efficient frontier calculation to work

* feat(Portfolio): add a few strategies to create weights

* chore(Dependencies): remove pyportfolioopt for now

* fix(Dependencies): try to install all dependencies with pip

* fix(Dependencies): indentation

* fix(Dependencies): corrected pytorch module name

* fix(Dependencies): try to have as many modules installed by conda for the sake of sanity?

* fix(Dependencies): put fracdiff into pip modules

* fix(Dependencies): revert to using pip almost exclusively

* feat(Portfolio): added alphalens

* fix(Portfolio): got limited weights working

* feat(Portfolio): trying to get alphalens to work

* feat(Portfolio): alphalens working

* fix(Dependencies): removed vectorbt

* fix(Dependencies): use alphalens-reloaded

* fix(Dependencies): added conda source for alphalens-reloaded

* refactor(Portfolio): removed traces of vectorbt

* feat(Reporting): factor reporting done

* feat(Portfolio): added pyfolio reporting (fails bc alphalens is not working properly lol)
2022-01-08 00:05:36 +01:00