Last active
January 15, 2022 18:06
-
-
Save bfan1256/114f8e5445009bd5d117351906508858 to your computer and use it in GitHub Desktop.
5 Performance Metrics for Trading Algorithms and Investment Portfolios
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from blankly import Alpaca, CoinbasePro # supports stocks, crypto, and forex | |
import numpy as np | |
from math import sqrt | |
def cagr(start_value: float, end_value: float, years: int): | |
return (end_value / start_value) ** (1.0 / years) - 1 | |
def sharpe(account_values: np.array, risk_free_rate, annualize_coefficient): | |
diff = np.diff(account_values, 1) / account_values[1:] # this gets our pct_return in the array | |
# we'll get the mean and calculate everything | |
# we multiply the mean of returns by the annualized coefficient and divide by annualized std | |
annualized_std = diff.std() * sqrt(annualize_coefficient) | |
return (diff.mean() * annualize_coefficient - risk_free_rate) / annualized_std | |
def sortino(account_values: np.array, risk_free_rate, annualize_coefficient): | |
diff = np.diff(account_values, 1) / account_values[1:] | |
# we'll get the mean and calculate everything | |
# remember, we're only using the negative returns | |
neg_returns = diff[diff < 0] | |
annualized_std = neg_returns.std() * sqrt(annualize_coefficient) | |
return (diff.mean() * annualize_coefficient - risk_free_rate) / annualized_std | |
def value_at_risk(account_values, alpha: float): | |
initial_value = account_values[0] | |
returns = np.diff(account_values, 1) / account_values[1:] | |
returns_sorted = np.sort(returns) # sort our returns (should be estimated normal) | |
index = int(alpha * len(returns_sorted)) | |
return initial_value * abs(returns_sorted[index]) | |
def max_drawdown(account_values): | |
returns = account_values.diff(1) / account_values[1:] | |
cumulative = (returns + 1).cumprod() | |
peak = cumulative.expanding(min_periods=1).max() | |
dd = (cumulative / peak) - 1 | |
return dd.min() | |
a = Alpaca() # initialize the Alpaca Exchange | |
def beta(returns, baseline='SPY', return_resolution='1m'): | |
market_base_returns = a.interface.history(baseline, len(returns), resolution=return_resolution) # get the last X month bars of the baseline asset | |
m = np.matrix([returns, market_base_returns]) | |
return np.cov(m)[0][1] / np.std(market_base_returns) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment