- Notifications
You must be signed in to change notification settings - Fork262
fastquant — Backtest and optimize your ML trading strategies with only 3 lines of code!
License
enzoampil/fastquant
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
fastquant allows you to easily backtest investment strategies with as few as 3 lines of python code. Its goal is to promote data driven investments by making quantitative analysis in finance accessible to everyone.
To do this type of analysis without coding, you can also try outHawksight, which was just recently launched! 😄
If you want to interact with us directly, you can also reach us on theHawksight discord. Feel free to ask about fastquant in the #feedback-suggestions and #bug-report channels.
- Easily access historical stock data
- Backtest and optimize trading strategies with only 3 lines of code
* - Both Yahoo Finance and Philippine stock data data are accessible straight from fastquant
Check out our blog posts in the fastquantwebsite and this introarticle on Medium!
pip install fastquantorpython -m pip install fastquantAll symbols fromYahoo Finance and Philippine Stock Exchange (PSE) are accessible viaget_stock_data.
from fastquant import get_stock_datadf = get_stock_data("JFC", "2018-01-01", "2019-01-01")print(df.head())# dt close# 2019-01-01 293.0# 2019-01-02 292.0# 2019-01-03 309.0# 2019-01-06 323.0# 2019-01-07 321.0The data is pulled from Binance, and all the available tickers are foundhere.
from fastquant import get_crypto_datacrypto = get_crypto_data("BTC/USDT", "2018-12-01", "2019-12-31")crypto.head()# open high low close volume# dt # 2018-12-01 4041.27 4299.99 3963.01 4190.02 44840.073481# 2018-12-02 4190.98 4312.99 4103.04 4161.01 38912.154790# 2018-12-03 4160.55 4179.00 3827.00 3884.01 49094.369163# 2018-12-04 3884.76 4085.00 3781.00 3951.64 48489.551613# 2018-12-05 3950.98 3970.00 3745.00 3769.84 44004.799448Daily Jollibee prices from 2018-01-01 to 2019-01-01
from fastquant import backtestbacktest('smac', df, fast_period=15, slow_period=40)# Starting Portfolio Value: 100000.00# Final Portfolio Value: 102272.90If you want to make this kind of analysis even more simple without having to code at all (or want to avoid the pain of doing all of the setup required), you can signup for free and try outHawksight - this new no-code tool I’m building to democratize data driven investments.
Hoping to make these kinds of powerful analyses accessible to more people!
fastquant allows you to automatically measure the performance of your trading strategy on multiple combinations of parameters. All you need to do is to input the values as iterators (like as alist orrange).
Daily Jollibee prices from 2018-01-01 to 2019-01-01
from fastquant import backtestres = backtest("smac", df, fast_period=range(15, 30, 3), slow_period=range(40, 55, 3), verbose=False)# Optimal parameters: {'init_cash': 100000, 'buy_prop': 1, 'sell_prop': 1, 'execution_type': 'close', 'fast_period': 15, 'slow_period': 40}# Optimal metrics: {'rtot': 0.022, 'ravg': 9.25e-05, 'rnorm': 0.024, 'rnorm100': 2.36, 'sharperatio': None, 'pnl': 2272.9, 'final_value': 102272.90}print(res[['fast_period', 'slow_period', 'final_value']].head())#fast_periodslow_periodfinal_value#015 40 102272.90#121 40 98847.00#221 52 98796.09#324 46 98008.79#415 46 97452.92| Strategy | Alias | Parameters |
|---|---|---|
| Relative Strength Index (RSI) | rsi | rsi_period,rsi_upper,rsi_lower |
| Simple moving average crossover (SMAC) | smac | fast_period,slow_period |
| Exponential moving average crossover (EMAC) | emac | fast_period,slow_period |
| Moving Average Convergence Divergence (MACD) | macd | fast_perod,slow_upper,signal_period,sma_period,dir_period |
| Bollinger Bands | bbands | period,devfactor |
| Buy and Hold | buynhold | N/A |
| Sentiment Strategy | sentiment | keyword ,page_nums,senti |
| Custom Prediction Strategy | custom | upper_limit,lower_limit,custom_column |
| Custom Ternary Strategy | ternary | buy_int,sell_int,custom_column |
backtest('rsi', df, rsi_period=14, rsi_upper=70, rsi_lower=30)# Starting Portfolio Value: 100000.00# Final Portfolio Value: 132967.87backtest('smac', df, fast_period=10, slow_period=30)# Starting Portfolio Value: 100000.00# Final Portfolio Value: 95902.74backtest('emac', df, fast_period=10, slow_period=30)# Starting Portfolio Value: 100000.00# Final Portfolio Value: 90976.00backtest('macd', df, fast_period=12, slow_period=26, signal_period=9, sma_period=30, dir_period=10)# Starting Portfolio Value: 100000.00# Final Portfolio Value: 96229.58backtest('bbands', df, period=20, devfactor=2.0)# Starting Portfolio Value: 100000.00# Final Portfolio Value: 97060.30Use Tesla (TSLA) stock from yahoo finance and news articles fromBusiness Times
from fastquant import get_yahoo_data, get_bt_news_sentimentdata = get_yahoo_data("TSLA", "2020-01-01", "2020-07-04")sentiments = get_bt_news_sentiment(keyword="tesla", page_nums=3)backtest("sentiment", data, sentiments=sentiments, senti=0.2)# Starting Portfolio Value: 100000.00# Final Portfolio Value: 313198.37# Note: Unfortunately, you can't recreate this scenario due to inconsistencies in the dates and sentiments that is scraped by get_bt_news_sentiment. In order to have a quickstart with News Sentiment Strategy you need to make the dates consistent with the sentiments that you are scraping.from fastquant import get_yahoo_data, get_bt_news_sentimentfrom datetime import datetime, timedelta# we get the current date and delta time of 30 dayscurrent_date = datetime.now().strftime("%Y-%m-%d")delta_date = (datetime.now() - timedelta(30)).strftime("%Y-%m-%d")data = get_yahoo_data("TSLA", delta_date, current_date)sentiments = get_bt_news_sentiment(keyword="tesla", page_nums=3)backtest("sentiment", data, sentiments=sentiments, senti=0.2)Multiple registered strategies can be utilized together in an OR fashion, where buy or sell signals are applied when at least one of the strategies trigger them.
df = get_stock_data("JFC", "2018-01-01", "2019-01-01")# Utilize single set of parametersstrats = { "smac": {"fast_period": 35, "slow_period": 50}, "rsi": {"rsi_lower": 30, "rsi_upper": 70} } res = backtest("multi", df, strats=strats)res.shape# (1, 16)# Utilize auto grid searchstrats_opt = { "smac": {"fast_period": 35, "slow_period": [40, 50]}, "rsi": {"rsi_lower": [15, 30], "rsi_upper": 70} } res_opt = backtest("multi", df, strats=strats_opt)res_opt.shape# (4, 16)This powerful strategy allows you to backtest your own trading strategies using any type of model w/ as few as 3 lines of code after the forecast!
Predictions based on any model can be used as a custom indicator to be backtested using fastquant. You just need to add acustom column in the input dataframe, and set values forupper_limit andlower_limit.
The strategy is structured similar toRSIStrategy where you can set anupper_limit, above which the asset is sold (considered "overbought"), and alower_limit, below which the asset is bought (considered "underbought).upper_limit is set to 95 by default, whilelower_limit is set to 5 by default.
In the example below, we show how to use the custom strategy to backtest a custom indicator based on out-of-sample time series forecasts. The forecasts were generated using Facebook'sProphet package on Bitcoin prices.
from fastquant import get_crypto_data, backtestfrom fbprophet import Prophetimport pandas as pdfrom matplotlib import pyplot as plt# Pull crypto datadf = get_crypto_data("BTC/USDT", "2019-01-01", "2020-05-31")# Fit model on closing pricests = df.reset_index()[["dt", "close"]]ts.columns = ['ds', 'y']m = Prophet(daily_seasonality=True, yearly_seasonality=True).fit(ts)forecast = m.make_future_dataframe(periods=0, freq='D')# Predict and plotpred = m.predict(forecast)fig1 = m.plot(pred)plt.title('BTC/USDT: Forecasted Daily Closing Price', fontsize=25)# Convert predictions to expected 1 day returnsexpected_1day_return = pred.set_index("ds").yhat.pct_change().shift(-1).multiply(100)# Backtest the predictions, given that we buy bitcoin when the predicted next day return is > +1.5%, and sell when it's < -1.5%.df["custom"] = expected_1day_return.multiply(-1)backtest("custom", df.dropna(),upper_limit=1.5, lower_limit=-1.5)See more exampleshere.
View full list of fastquan APIhere
Want to discuss more about fastquant with other users, and our team of developers?
You can reach us on theHawksight discord. Feel free to ask about fastquant in the #feedback-suggestions and #bug-report channels.
# Build the imagedocker build -t myimage .# Run the containerdocker run -t -d -p 5000:5000 myimage# Get the container iddocker ps# SSH into the fastquant containerdocker exec -it <CONTAINER_ID> /bin/bash# Run python and use fastquantpython>>> from fastquant import get_stock_data>>> df = get_stock_data("TSLA", "2019-01-01", "2020-01-01")>>> df.head()About
fastquant — Backtest and optimize your ML trading strategies with only 3 lines of code!
Topics
Resources
License
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.








