FinOL
represents a pioneering open database for facilitating data-driven OLPS research. As an
ambitious project, it collects and organizes extensive assets from global markets over half a century,
it provides a long-awaited unified platform to advance data-driven OLPS research.
Update | Status | Label |
---|---|---|
New release! FinOL is going to release the official website |
Coming soon...... | Release |
New metric! FinOL is going to support the t-test metric |
Coming soon...... | Enhancement |
New model! FinOL is going to support the AlphaStock model |
Coming soon...... | Enhancement |
New release! FinOL now releases the official docs |
Released on 22 July 2024 | Release |
New feature! FinOL now supports the Auto Hyperparameter Tuning feature |
Supported since 22 July 2024 | Enhancement |
New feature! FinOL now supports the Radar Chart evaluation |
Supported since 10 June 2024 | Enhancement |
New model! FinOL now supports the AlphaPortfolio model |
Supported since 06 June 2024 | Enhancement |
New feature! FinOL now supports the Economic Distillation feature |
Supported since 15 May 2024 | Enhancement |
New feature! FinOL now supports the Interpretability Analysis feature |
Supported since 16 April 2024 | Enhancement |
New feature! FinOL now supports the Winner Assets Selection feature |
Supported since 14 April 2024 | Enhancement |
Release FinOL tutorials |
Released on 22 March 2024 | Release |
Release FinOL v0.0.1 |
Released on 21 March 2024 | Release |
Online portfolio selection (OLPS) is an important issue in operations research community that studies how to dynamically
adjust portfolios according to market changes. In the past, OLPS research relied on a general database called OLPS
containing price relatives data of financial assets across different markets. However, with the widespread adoption of
data-driven technologies like machine learning in finance, OLPS
can no longer meet the needs of OLPS research due
to the lack of support for high-dimensional feature spaces. To solve
this problem, we propose FinOL
, an open financial platform for advancing research in data-driven OLPS. FinOL
expands
and enriches the previous OLPS
database, containing 9 benchmark financial datasets from 1962 to present across global
markets. To promote fair comparisons, we evaluate a large number of past classic OLPS methods on FinOL
, providing
reusable benchmark results for future FinOL
users and effectively supporting OLPS research. More importantly, to
lower the barriers to research, FinOL
provides a complete data-training-testing suite with just three lines of
command. We are also committed to regularly updating FinOL
with new data and benchmark results reflecting the latest
developments and trends in the field. This ensures FinOL
remains a valuable resource as data-driven OLPS methods
continue evolving.
FinOL
contributes comprehensive datasets spanning diverse market conditions and asset classes to enable large-scale empirical validation;FinOL
contributes the most extensive benchmark results to date for portfolio selection methods, providing the academic community an unbiased performance assessment;FinOL
contributes a user-friendly Python library for data-driven OLPS research, providing a comprehensive toolkit for academics to develop, test, and validate new OLPS methods.
FinOL
is available on PyPI, we recommend to install FinOL
via pip:
> pip install --upgrade finol
You can also install the development version of FinOL
from master branch of Git repository:
> pip install git+https://github.com/jiahaoli57/finol.git
You can find useful tutorials on how to use FinOL
in the tutorials folder.
Here we show a simple application (taken from tutorial_2): we transform asset "AA" into a richer representation.
Visualization of Train Normalization Data for Asset "AA"
To lower the barriers for the research community, FinOL
provides a complete data-training-testing suite with just
three lines of command.
from finol.data_layer.dataset_loader import DatasetLoader
from finol.optimization_layer.model_trainer import ModelTrainer
from finol.evaluation_layer.model_evaluator import ModelEvaluator
load_dataset_output = DatasetLoader().load_dataset()
train_model_output = ModelTrainer(load_dataset_output).train_model()
evaluate_model_output = ModelEvaluator(load_dataset_output, train_model_output).evaluate_model()
Name | Market | Country/Region | Data Frequency | # of Assets | Data Range | # of Periods |
---|---|---|---|---|---|---|
NYSE(O) | Stock | United States | Daily | 26 | 03/July./1962 - 31/Dec./1984 |
5,651: 3,390/1,130/1,131 |
NYSE(N) | Stock | United States | Daily | 403 | 02/Jan./1985 - 30/June./2010 |
6,430: 3,858/1,286/1,286 |
DJIA | Stock | United States | Daily | 28 | 14/Jan./2001 - 14/Jan./2003 |
500: 300/100/100 |
SP500 | Stock | United States | Daily | 339 | 02/Jan./1998 - 31/Jan./2003 |
1,268: 756/256/256 |
TSE | Stock | Canada | Daily | 48 | 12/Jan./1995 - 31/Dec./1998 |
1,001: 600/200/200 |
SSE | Stock | China | Weekly | 30 | 05/July./2010 - 26/June./2023 |
678: 406/136/136 |
HSI | Stock | Hong Kong, China | Weekly | 53 | 05/July./2010 - 26/June./2023 |
678: 406/136/136 |
CMEG | Futures | United States | Weekly | 25 | 05/July./2010 - 26/June./2023 |
678: 406/136/136 |
CRYPTO | Cryptocurrency | World | Daily | 43 | 09/Nov./2017 - 01/Mar./2024 |
2,305: 1,421/442/442 |
Name | Category | Source | Journal/Conference |
---|---|---|---|
Market | Classic OLPS: Benchmark baseline | -- | -- |
Best | Classic OLPS: Benchmark baseline | -- | -- |
UCRP | Classic OLPS: Benchmark baseline | Kelly 1956; Cover 1991 | The Bell System Technical Journal; Mathematical Finance |
BCRP | Classic OLPS: Benchmark baseline | Cover 1991 | Mathematical Finance |
UP | Classic OLPS: Follow-the-winner | Cover 1991 | Mathematical Finance |
EG | Classic OLPS: Follow-the-winner | Helmbold et al. 1998 | Mathematical Finance |
SCRP | Classic OLPS: Follow-the-winner | Gaivoronski and Stella 2000 | Annals of Operations Research |
PPT | Classic OLPS: Follow-the-winner | Lai et al. 2018 | IEEE Transactions on Neural Networks and Learning Systems |
SSPO | Classic OLPS: Follow-the-winner | Lai et al. 2018 | The Journal of Machine Learning Research |
ANTI1 | Classic OLPS: Follow-the-loser | Borodin et al. 2004 | Advances in Neural Information Processing Systems |
ANTI2 | Classic OLPS: Follow-the-loser | Borodin et al. 2004 | Advances in Neural Information Processing Systems |
PAMR | Classic OLPS: Follow-the-loser | Li et al. 2012 | Machine Learning |
CWMR-Var | Classic OLPS: Follow-the-loser | Li et al. 2013 | ACM Transactions on Knowledge Discovery from Data |
CWMR-Stdev | Classic OLPS: Follow-the-loser | Li et al. 2013 | ACM Transactions on Knowledge Discovery from Data |
OLMAR-S | Classic OLPS: Follow-the-loser | Li et al. 2015 | Artificial Intelligence |
OLMAR-E | Classic OLPS: Follow-the-loser | Li et al. 2015 | Artificial Intelligence |
RMR | Classic OLPS: Follow-the-loser | Huang et al. 2016 | IEEE Transactions on Knowledge and Data Engineering |
RPRT | Classic OLPS: Follow-the-loser | Lai et al. 2020 | IEEE Transactions on Systems, Man, and Cybernetics: Systems |
AICTR | Classic OLPS: Pattern-matching | Lai et al. 2018 | IEEE Transactions on Neural Networks and Learning Systems |
KTPT | Classic OLPS: Pattern-matching | Lai et al. 2018 | Data Mining and Knowledge Discovery |
SP | Classic OLPS: Meta-learning | Singer 1997 | International Journal of Neural Systems |
ONS | Classic OLPS: Meta-learning | Agarwal et al. 2006 | International Conference on Machine Learning |
GRW | Classic OLPS: Meta-learning | Levina and Shafer 2008 | International Journal of Uncertainty, Fuzziness and Knowledge-Based Systems |
WAAS | Classic OLPS: Meta-learning | Zhang and Yang 2017 | Computational Economics |
CW-OGD | Classic OLPS: Meta-learning | Zhang et al. 2021 | Knowledge-Based Systems |
Name | Abbreviation | Category |
---|---|---|
Cumulative Wealth | CW | Profit Metric |
Annualized Percentage Yield | APY | Profit Metric |
Sharpe Ratio | SR | Profit Metric |
Volatility Risk | VR | Risk Metric |
Maximum DrawDown | MDD | Risk Metric |
Average Turnover | ATO | Practical Metric |
Transaction Costs-Adjusted Cumulative Wealth | TCW | Practical Metric |
Running Time | RT | Practical Metric |
The FInOL project provides a suite of visualization tools to facilitate a comprehensive evaluation of data-driven OLPS research. Here are some examples:
- Dynamic Training/Validation Loss Visualization
- Daily Cumulative Wealth Visualization
- Daily DrawDown
- Transaction Cost-Adjusted Cumulative Wealth
- Comprehensive Radar Chart
FinOL
├─ LICENSE
├─ MANIFEST.in
├─ README.md
├─ TA_Lib-0.4.24-cp39-cp39-win_amd64.whl
├─ figure
│ ├─ FinOL.png
│ ├─ logo.png
│ └─ tutorial_2.png
├─ finol
│ ├─ __init__.py
│ ├─ config.py
│ ├─ data
│ │ ├─ benchmark_results
│ │ │ ├─ __init__.py
│ │ │ ├─ other
│ │ │ │ └─ price_relative
│ │ │ │ ├─ price_relative_CMEG.mat
│ │ │ │ ├─ price_relative_CRYPTO.mat
│ │ │ │ ├─ price_relative_DJIA.mat
│ │ │ │ ├─ price_relative_HSI.mat
│ │ │ │ ├─ price_relative_NYSE(N).mat
│ │ │ │ ├─ price_relative_NYSE(O).mat
│ │ │ │ ├─ price_relative_SP500.mat
│ │ │ │ ├─ price_relative_SSE.mat
│ │ │ │ └─ price_relative_TSE.mat
│ │ │ ├─ practical_metrics
│ │ │ │ ├─ CMEG
│ │ │ │ │ ├─ final_practical_result.xlsx
│ │ │ │ │ └─ transaction_costs_adjusted_cumulative_wealth.xlsx
│ │ │ │ ├─ CRYPTO
│ │ │ │ │ ├─ final_practical_result.xlsx
│ │ │ │ │ └─ transaction_costs_adjusted_cumulative_wealth.xlsx
│ │ │ │ ├─ DJIA
│ │ │ │ │ ├─ final_practical_result.xlsx
│ │ │ │ │ └─ transaction_costs_adjusted_cumulative_wealth.xlsx
│ │ │ │ ├─ HSI
│ │ │ │ │ ├─ final_practical_result.xlsx
│ │ │ │ │ └─ transaction_costs_adjusted_cumulative_wealth.xlsx
│ │ │ │ ├─ NYSE(N)
│ │ │ │ │ ├─ final_practical_result.xlsx
│ │ │ │ │ └─ transaction_costs_adjusted_cumulative_wealth.xlsx
│ │ │ │ ├─ NYSE(O)
│ │ │ │ │ ├─ final_practical_result.xlsx
│ │ │ │ │ └─ transaction_costs_adjusted_cumulative_wealth.xlsx
│ │ │ │ ├─ SP500
│ │ │ │ │ ├─ final_practical_result.xlsx
│ │ │ │ │ └─ transaction_costs_adjusted_cumulative_wealth.xlsx
│ │ │ │ ├─ SSE
│ │ │ │ │ ├─ final_practical_result.xlsx
│ │ │ │ │ └─ transaction_costs_adjusted_cumulative_wealth.xlsx
│ │ │ │ └─ TSE
│ │ │ │ ├─ final_practical_result.xlsx
│ │ │ │ └─ transaction_costs_adjusted_cumulative_wealth.xlsx
│ │ │ ├─ profit_metrics
│ │ │ │ ├─ CMEG
│ │ │ │ │ ├─ daily_cumulative_wealth.xlsx
│ │ │ │ │ ├─ daily_return.xlsx
│ │ │ │ │ └─ final_profit_result.xlsx
│ │ │ │ ├─ CRYPTO
│ │ │ │ │ ├─ daily_cumulative_wealth.xlsx
│ │ │ │ │ ├─ daily_return.xlsx
│ │ │ │ │ └─ final_profit_result.xlsx
│ │ │ │ ├─ DJIA
│ │ │ │ │ ├─ daily_cumulative_wealth.xlsx
│ │ │ │ │ ├─ daily_return.xlsx
│ │ │ │ │ └─ final_profit_result.xlsx
│ │ │ │ ├─ HSI
│ │ │ │ │ ├─ daily_cumulative_wealth.xlsx
│ │ │ │ │ ├─ daily_return.xlsx
│ │ │ │ │ └─ final_profit_result.xlsx
│ │ │ │ ├─ NYSE(N)
│ │ │ │ │ ├─ daily_cumulative_wealth.xlsx
│ │ │ │ │ ├─ daily_return.xlsx
│ │ │ │ │ └─ final_profit_result.xlsx
│ │ │ │ ├─ NYSE(O)
│ │ │ │ │ ├─ daily_cumulative_wealth.xlsx
│ │ │ │ │ ├─ daily_return.xlsx
│ │ │ │ │ └─ final_profit_result.xlsx
│ │ │ │ ├─ SP500
│ │ │ │ │ ├─ daily_cumulative_wealth.xlsx
│ │ │ │ │ ├─ daily_return.xlsx
│ │ │ │ │ └─ final_profit_result.xlsx
│ │ │ │ ├─ SSE
│ │ │ │ │ ├─ daily_cumulative_wealth.xlsx
│ │ │ │ │ ├─ daily_return.xlsx
│ │ │ │ │ └─ final_profit_result.xlsx
│ │ │ │ └─ TSE
│ │ │ │ ├─ daily_cumulative_wealth.xlsx
│ │ │ │ ├─ daily_return.xlsx
│ │ │ │ └─ final_profit_result.xlsx
│ │ │ └─ risk_metrics
│ │ │ ├─ CMEG
│ │ │ │ ├─ daily_drawdown.xlsx
│ │ │ │ └─ final_risk_result.xlsx
│ │ │ ├─ CRYPTO
│ │ │ │ ├─ daily_drawdown.xlsx
│ │ │ │ └─ final_risk_result.xlsx
│ │ │ ├─ DJIA
│ │ │ │ ├─ daily_drawdown.xlsx
│ │ │ │ └─ final_risk_result.xlsx
│ │ │ ├─ HSI
│ │ │ │ ├─ daily_drawdown.xlsx
│ │ │ │ └─ final_risk_result.xlsx
│ │ │ ├─ NYSE(N)
│ │ │ │ ├─ daily_drawdown.xlsx
│ │ │ │ └─ final_risk_result.xlsx
│ │ │ ├─ NYSE(O)
│ │ │ │ ├─ daily_drawdown.xlsx
│ │ │ │ └─ final_risk_result.xlsx
│ │ │ ├─ SP500
│ │ │ │ ├─ daily_drawdown.xlsx
│ │ │ │ └─ final_risk_result.xlsx
│ │ │ ├─ SSE
│ │ │ │ ├─ daily_drawdown.xlsx
│ │ │ │ └─ final_risk_result.xlsx
│ │ │ └─ TSE
│ │ │ ├─ daily_drawdown.xlsx
│ │ │ └─ final_risk_result.xlsx
│ │ └─ datasets
│ │ ├─ CMEG
│ │ ├─ CRYPTO
│ │ ├─ DJIA
│ │ ├─ HSI
│ │ ├─ NYSE(N)
│ │ ├─ NYSE(O)
│ │ ├─ SP500
│ │ ├─ SSE
│ │ └─ TSE
│ ├─ data_layer
│ │ ├─ __init__.py
│ │ ├─ data_loader.py
│ │ └─ scaler_selector.py
│ ├─ evaluation_layer
│ │ ├─ __init__.py
│ │ ├─ benchmark_loader.py
│ │ ├─ metric_caculator.py
│ │ └─ model_evaluator.py
│ ├─ main
│ │ ├─ main.ipynb
│ │ └─ main.py
│ ├─ model_layer
│ │ ├─ __init__.py
│ │ ├─ CNN.py
│ │ ├─ DNN.py
│ │ ├─ LSRE_CAAN.py
│ │ ├─ LSTM.py
│ │ ├─ RNN.py
│ │ ├─ Transformer.py
│ │ └─ model_selector.py
│ ├─ optimization_layer
│ │ ├─ __init__.py
│ │ ├─ criterion_selector.py
│ │ ├─ model_trainer.py
│ │ └─ optimizer_selector.py
│ ├─ setup.py
│ ├─ tutorials
│ │ ├─ README.md
│ │ ├─ _.ipynb
│ │ ├─ tutorial_1.ipynb
│ │ ├─ tutorial_2.ipynb
│ │ ├─ tutorial_3.ipynb
│ │ └─ tutorial_4.ipynb
│ ├─ update
│ │ └─ __init__.py
│ └─ utils.py
├─ logdir
├─ requirements.txt
└─ setup.py
Released under the MIT License.
For inquiries, please get in touch with us at [email protected] (Monday to Friday, 9:00 AM to 6:00 PM)