Python library to make development of portfolio analysis faster and easier
To install Trafalgar, you should do:
pip install trafalgar.py
(https://pypi.org/project/trafalgar.py/)
For Anaconda setup you can simply run below to install all dependencies with env name trafalgar.
conda env create --file environment.yaml
Note : Step 1 and 2 are not always necessary, just make sure the libraries required by trafalgar are installed in you project env.
- Get close price, open price, adj close, volume and graphs of these in one line of code!
- Build an efficient frontier programm in 3 lines of code
- Make quantitative analysis on stocks/portfolios (alpha, beta, skew, kurtosis, rolling volatility...)
- Build a Capital Asset Pricing Model of a portfolio
- Backtest a portfolio, see its stats and compare it to a benchmark
- many other things...
Here is the code from a google collab, you can use it to follow along with the code: https://colab.research.google.com/drive/13i049m2kIHK3WdklOZXrhqF1jw93kEBb?usp=sharing
This library would not exist without the existence of Github and :
- the contributors @rslopes, @rakeshbhat9, @Haizzz and @george-adams1
- Quantopian and their incredible lectures (https://gist.github.com/ih2502mk/50d8f7feb614c8676383431b056f4291)
- the authors of codingfinance.com
- Quantconnect
- @mrmushfiq and his repo https://github.com/mrmushfiq/python_meets_finance
First, you should do:
from trafalgar import*
#graph_close(stock, start_date, end_date)
graph_close(["FB"], "2020-01-01", "2021-01-01")
graph_close(["FB", "AAPL", "TSLA"], "2020-01-01", "2021-01-01")
#graph_volume(stock, start_date, end_date)
#for one stock
graph_volume(["FB"], "2020-01-01", "2021-01-01")
#for multiple stocks
graph_volume(["FB", "AAPL", "TSLA"], "2020-01-01", "2021-01-01")
#graph_open(stock, start_date, end_date)
#for one stock
graph_open(["FB"], "2020-01-01", "2021-01-01")
#for multiple stocks
graph_open(["FB", "AAPL", "TSLA"], "2020-01-01", "2021-01-01")
#graph_adj_close(stock, start_date, end_date)
#for one stock
graph_adj_close(["FB"], "2020-01-01", "2021-01-01")
#for multiple stocks
graph_adj_close(["FB", "AAPL", "TSLA"], "2020-01-01", "2021-01-01")
#close(stock, start_date, end_date)
close(["AAPL"], "2020-01-01", "2021-01-01")
#volume(stock, start_date, end_date)
volume(["AAPL"], "2020-01-01", "2021-01-01")
#open(stock, start_date, end_date)
open(["AAPL"], "2020-01-01", "2021-01-01")
#adj_close(stock, start_date, end_date)
adj_close(["AAPL"], "2020-01-01", "2021-01-01")
#covariance(stocks, start_date, end_date, days) -> usually, days = 252
covariance(["AAPL", "DIS", "AMD"], "2020-01-01", "2021-01-01", 252)
#correlation(stocks, start_date, end_date)
correlation(["AAPL", "AMD", "TSLA", "AMZN", "DIS", "SBUX", "NFLX", "AMZN", "GOOG"], "2020-01-01", "2021-01-01")
#graph_correlation(stocks, start_date, end_date)
graph_correlation(["AAPL", "AMD", "TSLA", "AMZN", "DIS", "SBUX", "NFLX", "AMZN", "GOOG"], "2020-01-01", "2021-01-01")
#ohlcv(stock, start_date, end_date)
ohlcv("AAPL", "2020-01-01", "2021-01-01")
#graph_returns(stock,wts, start_date, end_date)
#for one stock
graph_returns(["AAPL"],1, "2020-01-01", "2021-01-01")
#for a portfolio
graph_returns(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "2020-01-01", "2021-01-01")
#returns(stocks,wts, start_date, end_date)
# sum of wts(weights) should always be equal to 1, it represents the allocation of shares in your portfolio (1 = 100%)
#for one stock
returns(["AAPL"],1, "2020-01-01", "2021-01-01")
#for a portfolio
returns(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "2020-01-01", "2021-01-01")
#graph_creturns(stock, wts, start_date, end_date)
#for one stock
graph_creturns(["TSLA"], 1, "2020-01-01", "2021-01-01")
#for a portfolio
graph_creturns(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "2020-01-01", "2021-01-01")
#creturns(stock, wts, start_date, end_date)
#for one stock
creturns(["TSLA"], 1, "2020-01-01", "2021-01-01")
#for a portfolio
creturns(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "2020-01-01", "2021-01-01")
#annual_volatility(stocks, wts, start_date, end_date)
#for one stock
annual_volatility(["TSLA"], 1, "2020-01-01", "2021-01-01")
#for multiple stocks
annual_volatility(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "2020-01-01", "2021-01-01")
#sharpe_ratio(stocks, wts, start_date, end_date)
#for one stock
sharpe_ratio(["TSLA"], 1, "2020-01-01", "2021-01-01")
#for multiple stocks
sharpe_ratio(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "2020-01-01", "2021-01-01")
#graph_rbenchmark(stocks, wts, benchmark, start_date, end_date)
#for a stock
graph_rbenchmark(["TSLA"], 1, "SPY", "2020-01-01", "2021-01-01")
#for a portfolio
graph_rbenchmark(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "SPY", "2020-01-01", "2021-01-01")
#rbenchmark(stocks, wts, benchmark, start_date, end_date)
#for one stock
rbenchmark(["TSLA"], 1, "SPY", "2020-01-01", "2021-01-01")
#for a portfolio
rbenchmark(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "SPY", "2020-01-01", "2021-01-01")
#graph_cbenchmark(stocks, wts, benchmark, start_date, end_date)
#for a stock
graph_cbenchmark(["TSLA"], 1, "SPY", "2020-01-01", "2021-01-01")
#for a portfolio
graph_cbenchmark(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "SPY", "2020-01-01", "2021-01-01")
#cbenchmark(stocks, wts, benchmark, start_date, end_date)
#for a stock
cbenchmark(["TSLA"], 1, "SPY", "2020-01-01", "2021-01-01")
#for a portfolio
cbenchmark(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "SPY", "2020-01-01", "2021-01-01")
#alpha(stocks, wts, benchmark, start_date, end_date)
#for a stock
alpha(["TSLA"], 1, "SPY", "2020-01-01", "2021-01-01")
#for a portfolio
alpha(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "SPY", "2020-01-01", "2021-01-01")
#beta(stocks, wts, benchmark, start_date, end_date)
#for one stock
beta(["TSLA"], 1, "SPY", "2020-01-01", "2021-01-01")
#for multiple stocks
beta(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "SPY", "2020-01-01", "2021-01-01")
#efficient_frontier(stocks, start_date, end_date, iterations) -> iterations = 10000 is a good starting point
efficient_frontier(["AAPL", "FB", "MSFT", "AMD", "AIR", "AAL", "NFLX", "SBUX", "GOOG", "BABA"], "2020-01-01", "2021-01-01", 10000)
#mean_daily_return(stocks,wts, start_date, end_date)
#for one stock
mean_daily_return(["AAPL"], 1, "2020-01-01", "2021-01-01")
#for multiple stocks
mean_daily_return(["AAPL", "AMD", "TSLA"], [0.25, 0.45, 0.3], "2020-01-01", "2021-01-01")
#var(value_invested, stocks, wts, alpha, start_date, end_date)
#for one stock
var(10000, ['AAPL'], 1, 0.95, "2020-01-01", "2021-01-01")
#for multiple stocks
var(10000, ['AAPL', 'TSLA', 'AMD'], [0.4, 0.2, 0.4], 0.95, "2020-01-01", "2021-01-01")
#graph_kalman(stocks, start_date, end_date, noise_value)
#noise_value = 0.01 is good to get started
graph_kalman("AAPL", "2020-01-01", "2021-01-01", 0.01)
#kalman(stocks, start_date, end_date, noise_value)
kalman("AAPL", "2020-01-01", "2021-01-01", 0.01)
#capm(stocks, wts, start_date, end_date)
stocks = ["AAPL", "AMD", "TSLA", "MSFT"]
wts = [0.3, 0.2, 0.2, 0.3]
capm(stocks, wts, "2020-01-01", "2021-01-01")
#cointegration(stock1, stock2, start_date, end_date)
cointegration("GOOG", "MSFT", "2012-01-01", "2021-01-01")
#return_cointegration(stock1, stock2, start_date, end_date)
return_cointegration("GOOG", "MSFT", "2012-01-01", "2021-01-01")
#stationarity(stock, start_date, end_date)
stationarity("GOOG", "2020-01-01", "2021-01-01")
#return_stationarity(stock, start_date, end_date)
return_stationarity("GOOG", "2020-01-01", "2021-01-01")
#graph_rvolatility(stock, wts, start_date, end_date, window_time)
#for a stock
graph_rvolatility(["TSLA"], 1, "2019-01-01", "2021-01-01", 180)
#for a portfolio
graph_rvolatility(["AAPL", "AMD", "TSLA"], [0.45, 0.45, 0.1], "2019-01-01", "2021-01-01", 180)
#rvolatility(stock, wts, start_date, end_date, window_time)
#for a stock
rvolatility(["TSLA"], 1, "2019-01-01", "2021-01-01", 180)
#for a portfolio
rvolatility(["AAPL", "AMD", "TSLA"], [0.45, 0.45, 0.1], "2019-01-01", "2021-01-01", 180)
#graph_rbeta(stock,wts, benchmark, start_date, end_date, window_time)
#for a stock
graph_rbeta(["TSLA"], 1, "SPY", "2019-01-01", "2021-01-01", 180)
#for a portfolio
graph_rbeta(["AAPL", "AMD", "GOOG"], [0.45, 0.45, 0.1], "SPY", "2019-01-01", "2021-01-01", 180)
#rbeta(stock,wts, benchmark, start_date, end_date, window_time)
#for a stock
rbeta(["TSLA"], 1, "SPY", "2019-01-01", "2021-01-01", 180)
#for a portfolio
rbeta(["AAPL", "AMD", "GOOG"], [0.45, 0.45, 0.1], "SPY", "2019-01-01", "2021-01-01", 180)
#graph_ralpha(stock,wts, benchmark, start_date, end_date, window_time)
#for a stock
graph_ralpha(["TSLA"], 1, "SPY", "2019-01-01", "2021-01-01", 180)
#for a portfolio
graph_ralpha(["AAPL", "AMD", "GOOG"], [0.45, 0.45, 0.1], "SPY", "2019-01-01", "2021-01-01", 180)
#ralpha(stock,wts, benchmark, start_date, end_date, window_time)
#for a stock
ralpha(["TSLA"], 1, "SPY", "2019-01-01", "2021-01-01", 180)
#for a portfolio
ralpha(["AAPL", "AMD", "GOOG"], [0.45, 0.45, 0.1], "SPY", "2019-01-01", "2021-01-01", 180)
#implied_vol(option_type, option_price, stock price, strike price, risk-free rate, the time to expiration, continuous dividend rate)
#option type : "c" (call option) or "p"(put option)
implied_vol('c', 0.3, 3, 3, 0.032, 30.0/365, 0.01)
#backtest(stocks, wts, benchmark, start_date, end_date)
stocks = ["GOOG", "AMZN", "FB", "AAPL"]
wts = [0.25, 0.25, 0.25, 0.25]
backtest(stocks, wts, "SPY", "2019-01-01", "2021-01-01")
MIT