├── Artemis.png ├── requirements.txt ├── LICENSE ├── README.md ├── .gitignore ├── cwarp_app.py ├── cwarp_defs.py └── Cole Wins Above Replacement Portfolio.ipynb /Artemis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpartemis/cwarp/HEAD/Artemis.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pandas==1.2.4 2 | numpy 3 | matplotlib 4 | seaborn 5 | yfinance 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 jpartemis 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cwarp 2 | Streamlit App and Notebook For CWARP 3 | 4 | ANY AND ALL CONTENTS OF THIS STREAMLIT APPLICATION ARE FOR INFORMATIONAL PURPOSES ONLY. NEITHER THE INFORMATION PROVIDED HEREIN NOR ANY OTHER DATA OR RESOURCES RELATED TO CWARP(TM) SHOULD BE CONSTRUED AS A GUARANTEE OF ANY PORTFOLIO PERFORMANCE USING CWARPTM OR ANY OTHER METRIC DEVELOPED OR DISCUSSED HEREIN. ANY INDIVIDUAL WHO USES, REFERENCES OR OTHERWISE ACCESSES THE WEBPAGE OR ANY OTHER DATA, THEORY, FORMULA, OR ANY OTHER INFORMATION CREATED, USED, OR REFERENCED BY ARTEMIS DOES SO AT THEIR OWN RISK AND, BY ACCESSING ANY SUCH INFORMATION, INDEMNIFIES AND HOLDS HARMLESS ARTEMIS CAPITAL MANAGEMENT LP, ARTEMIS CAPITAL ADVISERS LP, AND ALL OF ITS AFFILIATES (TOGETHER, “ARTEMIS”) AGAINST ANY LOSS OF CAPITAL THEY MAY OR MAY NOT INCUR BY UTILIZING SUCH DATA. ARTEMIS DOES NOT BEAR ANY RESPONSIBILITY FOR THE OUTCOME OF ANY PORTFOLIO NOT DIRECTLY OWNED AND/OR MANAGED BY ARTEMIS. 5 | 6 | This is live and hosted at: 7 | https://share.streamlit.io/jpartemis/cwarp/main/cwarp_app.py 8 | 9 | NOTE: The Streamlit app hosted at this server seems to be unstable, and sometimes fails when it encounters web traffic. We will keep monitoring and reboot the app when it fails. We are looking into this issue for longer term maintenance. If the app is not working when you try to access it, we welcome you to run the streamlit app locally or use the Jupyter notebook in the repository, if you have a python development environment installed. 10 | 11 | Please go to https://www.python.org/downloads/ to install the latest version of Python3. For running the jupyter notebook, you will of course need to install jupyter notebook dependency via the Package Installer for Python (pip). For running the streamlit app locally, you can install the streamlit dependency via pip as well. 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /cwarp_app.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | warnings.filterwarnings("ignore", category=RuntimeWarning) 3 | from cwarp_defs import * 4 | from io import BytesIO 5 | import datetime 6 | import seaborn as sns 7 | import streamlit as st 8 | from streamlit import caching 9 | caching.clear_cache() 10 | st.set_page_config(layout="wide", initial_sidebar_state="expanded") 11 | 12 | def render_latex(formula, fontsize=12, dpi=300): 13 | """Renders LaTeX formula into Streamlit.""" 14 | fig = plt.figure() 15 | text = fig.text(0, 0, '$%s$' % formula, fontsize=fontsize) 16 | fig.savefig(BytesIO(), dpi=dpi) # triggers rendering 17 | bbox = text.get_window_extent() 18 | width, height = bbox.size / float(dpi) + 0.05 19 | fig.set_size_inches((width, height)) 20 | dy = (bbox.ymin / float(dpi)) / height 21 | text.set_position((0, -dy)) 22 | buffer = BytesIO() 23 | fig.savefig(buffer, dpi=dpi, format='jpg') 24 | plt.close(fig) 25 | st.image(buffer) 26 | 27 | def retrieve_yhoo_data(ticker='spy', start_date = '2007-07-01', end_date = '2020-12-31'): 28 | try: 29 | data_hold=yf.Ticker(ticker) 30 | price_df=data_hold.history(start=start_date, end=end_date).Close.pct_change() 31 | price_df.name=ticker 32 | if price_df.shape[0] < 100: 33 | raise Exception('no prices.') 34 | return price_df 35 | except Exception as Ex: 36 | st.write(f"Sorry, Data not available for {ticker} please refresh the app.") 37 | 38 | def main(): 39 | st.sidebar.image('Artemis.png') 40 | st.header("CWARP\u2122 Calculator") 41 | 42 | st.markdown(""" 43 | 48 | """, unsafe_allow_html=True) 49 | 50 | body = """

ANY AND ALL CONTENTS OF THIS STREAMLIT APPLICATION ARE FOR INFORMATIONAL PURPOSES ONLY. NEITHER THE INFORMATION PROVIDED HEREIN NOR ANY OTHER DATA OR RESOURCES RELATED TO CWARP\u2122 SHOULD BE CONSTRUED AS A GUARANTEE OF ANY PORTFOLIO PERFORMANCE USING CWARP\u2122 OR ANY OTHER METRIC DEVELOPED OR DISCUSSED HEREIN. ANY INDIVIDUAL WHO USES, REFERENCES OR OTHERWISE ACCESSES THE WEBPAGE OR ANY OTHER DATA, THEORY, FORMULA, OR ANY OTHER INFORMATION CREATED, USED, OR REFERENCED BY ARTEMIS DOES SO AT THEIR OWN RISK AND, BY ACCESSING ANY SUCH INFORMATION, INDEMNIFIES AND HOLDS HARMLESS ARTEMIS CAPITAL MANAGEMENT LP, ARTEMIS CAPITAL ADVISERS LP, AND ALL OF ITS AFFILIATES (TOGETHER, “ARTEMIS”) AGAINST ANY LOSS OF CAPITAL THEY MAY OR MAY NOT INCUR BY UTILIZING SUCH DATA. ARTEMIS DOES NOT BEAR ANY RESPONSIBILITY FOR THE OUTCOME OF ANY PORTFOLIO NOT DIRECTLY OWNED AND/OR MANAGED BY ARTEMIS.

51 | 52 | CWARP\u2122, like the Sharpe or Sortino Ratios, is a number that quantifies the attractiveness of a prospective asset. 53 | Like the Sharpe Ratio, the more positive the CWARP\u2122 the more attractive an asset. 54 | 55 | Sharpe Ratios have the problem that the best portfolio isn't always built from a combination of assets which have the best Sharpe Ratios. 56 | In fact it is possible that between assets with three Sharpe Ratios $S_a < S_b < S_c$, the best portfolio is built from 57 | the two weaker assets $S_a, S_b$. Reliance on this simple number has lead to underdiversified, fragile portfolios. 58 | The whole is not the sum of the parts. 59 | 60 | To improve the situation, CWARP\u2122 $\chi$ measures the attractiveness of a portfolio after an asset is added. 61 | Here RMDD is the Return to Max-Drawdown Ratio, and n and p represent the new and old portfolio respectively : 62 | """ 63 | st.markdown(body,unsafe_allow_html=True) 64 | formula = render_latex(r'\chi/100 = \sqrt{ \left( \frac{S_n}{S_p} \right) \left( \frac{ RMDD_n }{ RMDD_p} \right) }-1.') 65 | st.markdown("""Using the boxes below, you can calculate CWARP\u2122 based on your own portfolio for prospective assets, 66 | so long as a data provider has history on your holdings. Just edit the example entries. Please note that the asset with the shortest period of historical data will constrain the timeframes of the other assets being compared. For more advanced capabilities, please download the [code from github](https://github.com/jpartemis/cwarp) and alter as necessary. 67 | """) 68 | 69 | try: 70 | start_date = st.sidebar.date_input("Start Date", datetime.date(2007,7,1)).strftime("%Y-%m-%d") 71 | end_date = st.sidebar.date_input("End Date", datetime.date(2020,12,31)).strftime("%Y-%m-%d") 72 | weight_asset = st.sidebar.slider('Diversifier Weight', min_value=0.0001, max_value=0.9999, value=.25, step=0.01) 73 | weight_replace_port = st.sidebar.slider('Replacement Portfolio Weight', min_value=0.0001, max_value=1.0000, value=1.00, step=0.01) 74 | risk_free_rate = st.sidebar.slider('Risk-Free Rate (annualized)', min_value=0.0, max_value=0.2, value=0.005, step=0.001, format='%.3f') 75 | financing_rate = st.sidebar.slider('Financing Rate (annualized)', min_value=0.0, max_value=0.2, value=0.01) 76 | replacement_port_name = st.sidebar.text_input("Replacement Portfolio Name", "Plain 60/40") 77 | 78 | ticker_string_ = "qqq, lqd, hyg, tlt, ief, shy, gld, slv, efa, eem, iyr, xle, xlk, xlf" 79 | ticker_string = st.text_input("Prospective Portfolio Diversifiers (comma separated)", ticker_string_) 80 | ticker_list=ticker_string.replace(' ','').split(',') 81 | 82 | port_string_ = ".6, spy, .4, ief" 83 | port_string = st.text_input("Portfolio (comma separated, fraction_1, symbol_1, fraction_2, symbol_2... )", port_string_) 84 | port_list=port_string.replace(' ','').split(',') 85 | replacement_port_tik=[] 86 | replacement_port_w=[] 87 | replacement_port_list = [] 88 | for i in range(len(port_list)//2): 89 | replacement_port_w.append(float(port_list[2*i])) 90 | replacement_port_tik.append(port_list[2*i+1]) 91 | with st.spinner("Pulling data..."): 92 | D = retrieve_yhoo_data(replacement_port_tik[-1], start_date, end_date) 93 | replacement_port_list.append(D) 94 | 95 | replacement_port = replacement_port_list[0]*(replacement_port_w[0]/sum(replacement_port_w)) 96 | for k in range(1,len(replacement_port_list)): 97 | replacement_port += replacement_port_list[k]*(replacement_port_w[k]/sum(replacement_port_w)) 98 | first_date_of_rp = replacement_port.dropna().index.min() 99 | if first_date_of_rp > datetime.date(2020,3,1): 100 | st.write("*** WARNING ***") 101 | st.write("Your portfolio has a very short (post-pandemic) history of available data.") 102 | st.write("This will lead to poor CWARP for diversifiers.") 103 | 104 | replacement_port.name=replacement_port_name 105 | risk_ret_df=pd.DataFrame(index=['Start_Date','End_Date','CWARP','+Sortino','+Ret_To_MaxDD','Sharpe','Sortino','Max_DD'],columns=ticker_list) 106 | new_risk_ret_df=pd.DataFrame(index=['Return','Vol','Sharpe','Sortino','Max_DD','Ret_To_MaxDD',f'CWARP_{round(100*weight_asset)}%_asset'],columns=ticker_list) 107 | new_risk_ret_df=new_risk_ret_df.add_suffix(f'@{round(100*weight_asset)}% | '+replacement_port.name+f'{round(100*weight_replace_port)}%') 108 | new_risk_ret_df[replacement_port.name]=np.nan 109 | prices_df=pd.DataFrame(index=retrieve_yhoo_data(ticker_list[0], start_date, end_date).index) 110 | 111 | # Save these for later plotting... 112 | new_ports = {} 113 | for i in range(0,len(ticker_list)): 114 | temp_data=retrieve_yhoo_data(ticker_list[i], start_date, end_date) 115 | prices_df=pd.merge(prices_df,temp_data, left_index=True, right_index=True) 116 | risk_ret_df.loc['Start_Date',ticker_list[i]]=min(temp_data.index).date() 117 | risk_ret_df.loc['End_Date',ticker_list[i]]=max(temp_data.index).date() 118 | risk_ret_df.loc['CWARP',ticker_list[i]]=cole_win_above_replace_port(new_asset=temp_data, replace_port=replacement_port, 119 | risk_free_rate = risk_free_rate, 120 | financing_rate = financing_rate, 121 | weight_asset = weight_asset, 122 | weight_replace_port = weight_replace_port, 123 | periodicity=252) 124 | risk_ret_df.loc['+Sortino',ticker_list[i]]=cwarp_additive_sortino(new_asset=temp_data, replace_port=replacement_port, 125 | risk_free_rate = risk_free_rate, 126 | financing_rate = financing_rate, 127 | weight_asset = weight_asset, 128 | weight_replace_port = weight_replace_port, 129 | periodicity=252) 130 | risk_ret_df.loc['+Ret_To_MaxDD',ticker_list[i]]=cwarp_additive_ret_maxdd(new_asset=temp_data, replace_port=replacement_port, 131 | risk_free_rate = risk_free_rate, 132 | financing_rate = financing_rate, 133 | weight_asset = weight_asset, 134 | weight_replace_port = weight_replace_port, 135 | periodicity=252) 136 | risk_ret_df.loc['Sharpe',ticker_list[i]]=sharpe_ratio(temp_data, risk_free = risk_free_rate, periodicity=252) 137 | risk_ret_df.loc['Sortino',ticker_list[i]]=sortino_ratio(temp_data, risk_free = risk_free_rate, periodicity=252) 138 | risk_ret_df.loc['Max_DD',ticker_list[i]]=max_dd(temp_data) 139 | new_risk_ret_df.loc['Return',new_risk_ret_df.columns[i]]=cwarp_port_return(new_asset=temp_data,replace_port=replacement_port, 140 | risk_free_rate = risk_free_rate, 141 | financing_rate = financing_rate, 142 | weight_asset = weight_asset, 143 | weight_replace_port = weight_replace_port, 144 | periodicity = 252) 145 | new_risk_ret_df.loc['Vol',new_risk_ret_df.columns[i]]=cwarp_port_risk(new_asset=temp_data,replace_port=replacement_port, 146 | risk_free_rate = risk_free_rate, 147 | financing_rate = financing_rate, 148 | weight_asset = weight_asset, 149 | weight_replace_port = weight_replace_port, 150 | periodicity=252) 151 | cnpd = cwarp_new_port_data(new_asset=temp_data,replace_port=replacement_port, risk_free_rate = risk_free_rate, 152 | financing_rate = financing_rate, 153 | weight_asset = weight_asset, 154 | weight_replace_port = weight_replace_port, 155 | periodicity = 252) 156 | new_ports[ticker_list[i]] = cnpd 157 | new_risk_ret_df.loc['Sharpe',new_risk_ret_df.columns[i]]=sharpe_ratio(cnpd.copy(), risk_free = risk_free_rate, periodicity=252) 158 | new_risk_ret_df.loc['Sortino',new_risk_ret_df.columns[i]]=sortino_ratio(cnpd.copy(), risk_free = risk_free_rate, periodicity=252) 159 | new_risk_ret_df.loc['Max_DD',new_risk_ret_df.columns[i]]=max_dd(cnpd.copy()) 160 | new_risk_ret_df.loc['Ret_To_MaxDD',new_risk_ret_df.columns[i]]=return_maxdd_ratio(cnpd.copy(), risk_free = risk_free_rate, periodicity=252) 161 | new_risk_ret_df.loc[f'CWARP_{round(100*weight_asset)}%_asset',new_risk_ret_df.columns[i]]=risk_ret_df.loc['CWARP',ticker_list[i]] 162 | 163 | new_risk_ret_df.loc['Return',[replacement_port_name]]=annualized_return(replacement_port, periodicity=252) 164 | new_risk_ret_df.loc['Vol',[replacement_port_name]]=target_downside_deviation(replacement_port, MAR=0)*np.sqrt(252) 165 | new_risk_ret_df.loc['Sharpe',[replacement_port_name]]=sharpe_ratio(replacement_port, risk_free = risk_free_rate, periodicity=252) 166 | new_risk_ret_df.loc['Sortino',[replacement_port_name]]=sortino_ratio(replacement_port, risk_free = risk_free_rate, periodicity=252) 167 | new_risk_ret_df.loc['Max_DD',[replacement_port_name]]=max_dd(replacement_port) 168 | new_risk_ret_df.loc['Ret_To_MaxDD',[replacement_port_name]]=return_maxdd_ratio(replacement_port, risk_free = risk_free_rate, periodicity=252) 169 | new_risk_ret_df.loc[f'CWARP_{round(100*weight_asset)}%_asset',[replacement_port_name]] = cole_win_above_replace_port(new_asset=replacement_port, replace_port=replacement_port, risk_free_rate=risk_free_rate, financing_rate=financing_rate, 170 | weight_asset=weight_asset, weight_replace_port=weight_replace_port, periodicity=252) 171 | first_col = new_risk_ret_df.pop(replacement_port_name) 172 | new_risk_ret_df.insert(0, replacement_port_name, first_col) 173 | # display dataframes 174 | st.write(risk_ret_df.sort_values(by='CWARP', axis=1, ascending=False).style.set_precision(3)) 175 | st.write(new_risk_ret_df.sort_values(by='Sharpe', axis=1, ascending=False).style.set_precision(3)) 176 | vol_arr=new_risk_ret_df.loc['Vol',new_risk_ret_df.columns[1:]] 177 | ret_arr=new_risk_ret_df.loc['Return',new_risk_ret_df.columns[1:]] 178 | sharpe_arr=new_risk_ret_df.loc['Sharpe',new_risk_ret_df.columns[1:]] 179 | cwarp_arr=risk_ret_df.loc['CWARP',:] 180 | #labels_arr=new_risk_ret_df.columns 181 | max_sr_vol=new_risk_ret_df.loc['Vol',replacement_port_name] 182 | max_sr_ret=new_risk_ret_df.loc['Vol',replacement_port_name] 183 | 184 | # f = plt.figure(figsize=(10,6)) 185 | # plt.scatter(vol_arr, ret_arr, c=cwarp_arr, cmap='winter',label=new_risk_ret_df.columns,alpha=.9) 186 | # plt.colorbar(label='Cole Win Above Replacement Portfolio') 187 | # plt.title('Efficient Frontier using CWARP', fontsize=15) 188 | # plt.xlabel('Downside Volatility',fontsize=15) 189 | # plt.ylabel('Return',fontsize=15) 190 | # plt.scatter(max_sr_vol, max_sr_ret,c='red', s=200) # red dot 191 | # st.write(f) 192 | 193 | sns.set_theme(style="white") 194 | sns.set(rc={'figure.figsize':(125,10)}) 195 | #Load Data 196 | adjust_new_risk = new_risk_ret_df.transpose() 197 | adjust_new_risk['Portfolio']=adjust_new_risk.index 198 | #Plot Seaborn 199 | p=sns.relplot(x="Vol", y="Return", hue="Portfolio", size=f"CWARP_{round(100*weight_asset)}%_asset", 200 | sizes=(50, 400), alpha=.9, palette="muted", 201 | height=6, data=adjust_new_risk) 202 | plt.title('Efficient Frontier with CWARP') 203 | st.pyplot(p) 204 | 205 | #plot the putative returns of the best CWARP asset, and the worst. 206 | best_div = risk_ret_df.loc['CWARP'].astype(float).idxmax(axis='columns') 207 | worst_div = risk_ret_df.loc['CWARP'].astype(float).idxmin(axis='columns') 208 | st.write(f"Best CWarp: {best_div.upper()} Worst CWarp {worst_div.upper()}") 209 | 210 | f = plt.figure(figsize=(8,6)) 211 | plt.plot((new_ports[best_div].astype(float)+1).cumprod(), label=best_div) 212 | plt.plot((new_ports[worst_div].astype(float)+1).cumprod(), label=worst_div) 213 | plt.title('Cumulative Returns With Best/Worst Diversifier') 214 | plt.legend() 215 | plt.xlabel('Date',fontsize=15) 216 | plt.ylabel('Return',fontsize=15) 217 | st.write(f) 218 | except Exception as Ex: 219 | st.write("There Has been an error:", Ex) 220 | st.write("Please refresh this app.") 221 | # plt.colorbar(label='Cole Win Above Replacement Portfolio') 222 | # plt.title('Efficient Frontier using CWARP', fontsize=15) 223 | # plt.xlabel('Downside Volatility',fontsize=15) 224 | # plt.ylabel('Return',fontsize=15) 225 | # plt.scatter(max_sr_vol, max_sr_ret,c='red', s=200) # red dot 226 | # st.write(f) 227 | 228 | 229 | main() 230 | -------------------------------------------------------------------------------- /cwarp_defs.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | from datetime import date 4 | import matplotlib 5 | import matplotlib.pyplot as plt 6 | import matplotlib.dates as mdates 7 | import seaborn as sns 8 | import yfinance as yf 9 | yf.pdr_override() 10 | import pandas as pd 11 | 12 | #Risk and Reward Functions################################################################## 13 | def sharpe_ratio(df,risk_free=0,periodicity=252): 14 | """df - asset return series, e.g. daily returns based on daily close prices of asset 15 | risk_free - annualized risk free rate (default is assumed to be 0) 16 | periodicity - number of periods at desired frequency in one year 17 | e.g. 252 business days in 1 year (default), 18 | 12 months in 1 year, 19 | 52 weeks in 1 year etc.""" 20 | # convert return series to numpy array (in case Pandas series is provided) 21 | df = np.asarray(df) 22 | # convert annualized risk free rate into appropriate value for provided frequency of asset return series (df) 23 | risk_free=(1+risk_free)**(1/periodicity)-1 24 | # calculate mean excess return based on return series provided 25 | dfMean=np.nanmean(df)-risk_free 26 | # calculate standard deviation of return series 27 | dfSTD=np.nanstd(df) 28 | # calculate Sharpe Ratio = Mean excess return / Std of returns * sqrt(periodicity) 29 | dfSharpe=dfMean/dfSTD*np.sqrt(periodicity) 30 | return dfSharpe 31 | 32 | def target_downside_deviation(df, MAR=0, periodicity=252): 33 | """df - asset return series, e.g. daily returns based on daily close prices of asset 34 | minimum acceptable return (MAR) - value is subtracted from returns before root-mean-square calculation to obtain target downside deviation (TDD)""" 35 | # convert return series to numpy array (in case Pandas series is provided) 36 | df = np.asarray(df) 37 | # TDD step 1: subtract mininum acceptable return (MAR) from period returns provided in df 38 | df_ = df - MAR 39 | # TDD step 2: zero out positive excess returns and calculate root-mean-square for resulting values 40 | df2 = np.where(df_<0, df_, 0) 41 | tdd = np.sqrt(np.nanmean(df2**2)) 42 | return tdd 43 | 44 | def sortino_ratio(df,risk_free=0, periodicity=252, include_risk_free_in_vol=False): 45 | """df - asset return series, e.g. daily returns based on daily close prices of asset 46 | risk_free - annualized risk free rate (default is assumed to be 0). Note: risk free rate is assumed to be the target return/minimum acceptable return (MAR) 47 | used in calculating both the mean excess return (numerator of Sortino ratio) and determining target downside deviation (TDD, the denominator of Sortino) 48 | periodicity - number of periods at desired frequency in one year 49 | e.g. 252 business days in 1 year (default), 50 | 12 months in 1 year, 51 | 52 weeks in 1 year etc.""" 52 | # convert return series to numpy array (in case Pandas series is provided) 53 | df = np.asarray(df) 54 | # convert annualized risk free rate into appropriate value for provided frequency of asset return series (df) 55 | risk_free=(1+risk_free)**(1/periodicity)-1 56 | # calculate mean excess return based on return series provided 57 | dfMean=np.nanmean(df)-risk_free 58 | # calculate target downside deviation (TDD) 59 | # assume risk free rate is MAR 60 | if include_risk_free_in_vol==True: MAR=risk_free 61 | else: MAR=0 62 | tdd = target_downside_deviation(df, MAR=MAR) 63 | # calculate Sortino Ratio = Mean excess return / TDD * sqrt(periodicity) 64 | dfSortino=(dfMean/tdd)*np.sqrt(periodicity) 65 | return dfSortino 66 | 67 | def annualized_return(df,periodicity=252): 68 | """df - asset return series, e.g. returns based on daily close prices of asset 69 | periodicity - number of periods at desired frequency in one year 70 | e.g. 252 business days in 1 year (default), 71 | 12 months in 1 year, 72 | 52 weeks in 1 year etc.""" 73 | # convert return series to numpy array (in case Pandas series is provided) 74 | df = np.asarray(df) 75 | # how many years of returns data is provided in df 76 | difference_in_years = len(df)/periodicity 77 | # starting net asset value / NAV (assumed to be 1) and cumulative returns (r) over time period provided in returns data 78 | start_NAV=1.0 79 | r = np.nancumprod(df+start_NAV) 80 | # end NAV based on final cumulative return 81 | end_NAV=r[-1] 82 | # determine annualized return 83 | AnnualReturn = end_NAV**(1 / difference_in_years) - 1 84 | return AnnualReturn 85 | 86 | def max_dd(df, return_data=False): 87 | """df - asset return series, e.g. returns based on daily close prices of asset 88 | return_data - boolean value to determine if drawdown values over the return data time period should be return, instead of max DD""" 89 | # convert return series to numpy array (in case Pandas series is provided) 90 | df = np.asarray(df) 91 | # calculate cumulative returns 92 | start_NAV = 1 93 | r = np.nancumprod(df+start_NAV) 94 | # calculate cumulative max returns (i.e. keep track of peak cumulative return up to that point in time, despite actual cumulative return at that point in time) 95 | peak_r = np.maximum.accumulate(r) 96 | # determine drawdowns relative to peak cumulative return achieved up to each point in time 97 | dd = (r - peak_r) / peak_r 98 | # return drawdown values over time period if return_data is set to True, otherwise return max drawdown which will be a positive number 99 | if return_data==True: 100 | out = dd 101 | else: 102 | out = np.abs(np.nanmin(dd)) 103 | return out 104 | 105 | def return_maxdd_ratio(df,risk_free=0,periodicity=252): 106 | """df - asset return series, e.g. returns based on daily close prices of asset 107 | risk_free - annualized risk free rate (default is assumed to be 0) 108 | periodicity - number of periods at desired frequency in one year 109 | e.g. 252 business days in 1 year (default), 110 | 12 months in 1 year, 111 | 52 weeks in 1 year etc.""" 112 | # convert return series to numpy array (in case Pandas series is provided) 113 | df = np.asarray(df) 114 | # convert annualized risk free rate into appropriate value for provided frequency of asset return series (df) 115 | risk_free=(1+risk_free)**(1/periodicity)-1 116 | # determine annualized return to be used in numerator of return to max drawdown (RMDD) calculation 117 | AnnualReturn = annualized_return(df, periodicity=periodicity) 118 | # determine max drawdown to be used in the denominator of RMDD calculation 119 | maxDD=max_dd(df,return_data=False) 120 | return (AnnualReturn-risk_free)/abs(maxDD) 121 | 122 | def avg_positive(ret,dropzero=1): 123 | if dropzero>0: 124 | positives = ret > 0 125 | else: 126 | positives = ret >= 0 127 | if positives.any(): 128 | return np.mean(ret[positives]) 129 | else: 130 | return 0.000000000000000000000000000001 131 | 132 | def avg_neg(ret): 133 | negatives = ret < 0 134 | if negatives.any(): 135 | return np.mean(ret[negatives]) 136 | else: 137 | return -1*0.000000000000000000000000000001 138 | 139 | def win_pct(ret,dropzero=1): 140 | if dropzero>0: 141 | win=len(np.where(ret>0)[0]) 142 | total=len(ret) 143 | else: 144 | win=len(np.where(ret>=0)[0]) 145 | total=len(ret) 146 | return (win/total) 147 | 148 | def kelly(df,dropzero=0): 149 | if dropzero==1: df = df[(df!= 0)] 150 | avg_pos=df[df>=0].mean() 151 | avg_neg=df[df<0].mean() 152 | win_pct=df[df>=0].count()/df.count() 153 | loss_pct=(1-win_pct) 154 | return ((avg_pos/abs(avg_neg))*win_pct-(loss_pct))/(avg_pos/abs(loss_pct)) 155 | 156 | def return_analyz(df_pct,bck_test_name='BackTest',bop=None,eop=None): 157 | df_pct=df_pct.copy() 158 | if bop==None: bop=min(df_pct.index) 159 | if eop==None: eop=max(df_pct.index) 160 | 161 | sharpe=SharpeAdj(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)].to_numpy(),dropzero=1, periodicity=252) 162 | sortino=SortinoAdj(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)].to_numpy(),dropzero=1, periodicity=252) 163 | annret=annualized_return(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)].to_numpy(),periodicity=252) 164 | maxdd=max_dd(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)],use_window=False,return_data=False) 165 | calmar=annret/abs(maxdd) 166 | #calmar=annualized_return(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)].to_numpy(),days_in_year=252)/abs(max_dd(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)])) 167 | vol=np.std(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)])*((252)**.5) 168 | worst_day=min(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)]) 169 | best_day=min(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)]) 170 | win_pct=df_pct[df_pct>=0].count()/df_pct.count() 171 | avg_positive=df_pct[df_pct>=0].mean() 172 | avg_neg=df_pct[df_pct<0].mean() 173 | kelly1=kelly(df_pct[(df_pct.index>=bop)&(df_pct.index<=eop)],dropzero=0) 174 | data=[annret,vol,sharpe,sortino,maxdd,calmar,kelly,bop,eop] 175 | arr= pd.DataFrame({'AnnRet': annret, 'Vol': vol, 'Sharpe': sharpe, 'Sortino': sortino, 'MaxDD': maxdd, 'Calmar': calmar, 176 | 'Kelly': kelly1, 'bop': bop, 'eop': eop},index=[bck_test_name]) 177 | return arr 178 | 179 | def monthly_ret_matrix(daily_nav_df): 180 | return_df=daily_nav_df.iloc[:,0] 181 | return_df=pd.DataFrame(return_df.resample('M').last()) 182 | return_df['Monthly%']=return_df.pct_change() 183 | return_df['month']=pd.DatetimeIndex(return_df.index).month 184 | return_df['year']=pd.DatetimeIndex(return_df.index).year 185 | return_table=pd.pivot_table(return_df,index=["month"], 186 | values=["Monthly%"], 187 | aggfunc='sum',fill_value=None, 188 | columns=["year"]) 189 | return_table=return_table.append(pd.DataFrame(((return_table+1).cumprod()-1).iloc[-1,:]).rename(columns={12: "Annual"}).T) 190 | return return_table 191 | 192 | def ReturnTable(daily_nav_df,freq='1M'): 193 | return_df=daily_pct_df.resample('1M').last() 194 | return_df 195 | 196 | 197 | def cole_win_above_replace_port(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252): 198 | """Cole Win Above Replacement Portolio (CWARP): Total score to evaluate whether any new investment improves or hurts the return to risk of your total portfolio. 199 | new_asset = returns of the asset you are thinking of adding to your portfolio 200 | replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio) 201 | risk_free_rate = Tbill rate (annualized) 202 | financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. 203 | weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard 204 | weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard 205 | periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count""" 206 | # convert annualized financing rate into appropriate value for provided periodicity 207 | # risk_free_rate will be converted appropriately in respective Sortino and RMDD calcs 208 | financing_rate=(1+financing_rate)**(1/periodicity)-1 209 | 210 | #Calculate Replacement Portfolio Sortino Ratio 211 | replace_port_sortino = sortino_ratio(replace_port, risk_free=risk_free_rate, periodicity=periodicity) 212 | 213 | #Calculate Replacement Portfolio Return to Max Drawdown 214 | replace_port_return_maxdd = return_maxdd_ratio(replace_port, risk_free=risk_free_rate, periodicity=periodicity) 215 | 216 | #Calculate New Portfolio Sortino Ratio 217 | new_port = (new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port 218 | new_port_sortino = sortino_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity) 219 | 220 | #Calculate New Portfolio Return to Max Drawdown 221 | new_port_return_maxdd = return_maxdd_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity) 222 | 223 | #Final CWARP calculation 224 | CWARP = ((new_port_return_maxdd/replace_port_return_maxdd*new_port_sortino/replace_port_sortino)**(1/2)-1)*100 225 | 226 | return CWARP 227 | 228 | def cwarp_additive_sortino(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252): 229 | """Cole Win Above Replacement Portolio (CWARP) Sortino +: Isolates new investment effect on total portfolio Sortino Ratio, which is a portion of the holistic CWARP score. 230 | new_asset = returns of the asset you are thinking of adding to your portfolio 231 | replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio) 232 | risk_free_rate = Tbill rate (annualized) 233 | financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. 234 | weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard 235 | weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard 236 | periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count""" 237 | # convert annualized financing rate into appropriate value for provided periodicity 238 | # risk_free_rate will be converted appropriately in respective Sortino and RMDD calcs 239 | financing_rate=(1+financing_rate)**(1/periodicity)-1 240 | 241 | #Calculate Replacement Portfolio Sortino Ratio 242 | replace_port_sortino = sortino_ratio(replace_port, risk_free=risk_free_rate, periodicity=periodicity) 243 | 244 | #Calculate New Portfolio Sortino Ratio 245 | new_port = (new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port 246 | new_port_sortino = sortino_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity) 247 | 248 | #Final calculation 249 | CWARP_add_sortino=((new_port_sortino/replace_port_sortino)-1)*100 250 | 251 | return CWARP_add_sortino 252 | 253 | def cwarp_additive_ret_maxdd(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252): 254 | """Cole Win Above Replacement Portolio (CWARP) Ret to Max DD +: Isolates new investment effect on total portfolio Return to MAXDD, which is a portion of the holistic CWARP score. 255 | new_asset = returns of the asset you are thinking of adding to your portfolio 256 | replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio) 257 | risk_free_rate = Tbill rate (annualized) 258 | financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. 259 | weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard 260 | weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard 261 | periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count""" 262 | # convert annualized financing rate into appropriate value for provided periodicity 263 | # risk_free_rate will be converted appropriately in respective Sortino and RMDD calcs 264 | financing_rate=(1+financing_rate)**(1/periodicity)-1 265 | 266 | #Calculate Replacement Portfolio Return to Max Drawdown 267 | replace_port_return_maxdd = return_maxdd_ratio(replace_port, risk_free=risk_free_rate, periodicity=periodicity) 268 | 269 | #Calculate New Portfolio Return to Max Drawdown 270 | new_port = (new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port 271 | new_port_return_maxdd = return_maxdd_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity) 272 | 273 | #Final calculation 274 | CWARP_add_ret_maxdd=((new_port_return_maxdd/replace_port_return_maxdd)-1)*100 275 | 276 | return CWARP_add_ret_maxdd 277 | 278 | def cwarp_port_return(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252): 279 | """Cole Win Above Replacement Portolio (CWARP) Portfolio Return: Returns of the aggregate portfolio after a new asset is financed and layered on top of the replacement portfolio. 280 | new_asset = returns of the asset you are thinking of adding to your portfolio 281 | replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio) 282 | risk_free_rate = Tbill rate (annualized) 283 | financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. 284 | weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard 285 | weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard 286 | periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count""" 287 | # convert annual financing based on periodicity 288 | financing_rate=((financing_rate+1)**(1/periodicity)-1) 289 | 290 | # compose new portfolio 291 | new_port=(new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port 292 | 293 | # calculate annualized return of new portfolio and subtract risk-free rate 294 | out = annualized_return(new_port, periodicity=periodicity) - risk_free_rate 295 | return out 296 | 297 | def cwarp_port_risk(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252): 298 | """Cole Win Above Replacement Portolio (CWARP) Portfolio Risk: Volatility of the aggregate portfolio after a new asset is financed and layered on top of the replacement portfolio. 299 | new_asset = returns of the asset you are thinking of adding to your portfolio 300 | replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio) 301 | risk_free_rate = Tbill rate (annualized) 302 | financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. 303 | weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard 304 | weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard 305 | periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count""" 306 | # convert annual financing and risk free rates based on periodicity 307 | financing_rate=((financing_rate+1)**(1/periodicity)-1) 308 | risk_free_rate=((risk_free_rate+1)**(1/periodicity)-1) 309 | # compose new portfolio 310 | new_port=(new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port 311 | # calculated target downside deviation (TDD) 312 | tdd = target_downside_deviation(new_port, MAR=0)*np.sqrt(periodicity) 313 | return tdd 314 | 315 | def cwarp_new_port_data(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252): 316 | """Cole Win Above Replacement Portolio (CWARP) return stream: Return series after a new asset is financed and layered on top of the replacement portfolio. 317 | new_asset = returns of the asset you are thinking of adding to your portfolio 318 | replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio) 319 | risk_free_rate = Tbill rate 320 | financing_rate = portfolio margin/borrowing cost to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. 321 | weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard 322 | weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard 323 | periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count""" 324 | # convert annual financing based on periodicity 325 | financing_rate=((financing_rate+1)**(1/periodicity)-1) 326 | new_port=(new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port 327 | return new_port 328 | -------------------------------------------------------------------------------- /Cole Wins Above Replacement Portfolio.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Cole Wins Above Replacement Portfolio (CWARP™) Jupyter Notebook Tutorial\n", 8 | "\n", 9 | "__\"Your goal shouldn’t be to buy players. Your goal should be to buy wins.\"__\n", 10 | "__Peter Brand (aka. Paul DePodesta), Moneyball__\n", 11 | "\n", 12 | "What matters in sports is whether a player helps the team win. What matters in investing is whether an asset improves the\n", 13 | "risk-adjusted returns of your total portfolio. \n", 14 | "\n", 15 | "COLE WINS ABOVE REPLACEMENT PORTFOLIO (CWARP)™ is a new metric devised by Artemis Capital Management that measures whether any investment improves the Return to Risk of your Total Portfolio. The CWARP score evaluates the non-linearity and correlation benefits of alternative investments where Sharpe Ratios and other metrics fail. CWARP is quick to calculate while providing a practical assessment of how an investment contributes to portfolio success. Unlike Sharpe Ratios, high CWARP assets are additive, providing a convenient method for allocators to screen investments that improve the portfolio. CWARP™ eliminates investments that \"pad\" performance statistics with leveraged beta and concave returns. CWARP helps fiduciaries identify hidden gems, true diversifying investments and managers that help the return to risk of your Portfolio. The score offers similar insights derived from complete portfolio optimization, but it is much easier to implement and observe from a tear sheet.\n", 16 | "\n", 17 | "The logic behind CWARP is intuitive in that it answers a simple question: If you borrowed capital to allocate to an alternative investment, does it help or hurt your aggregate portfolio's risk adjusted returns? What allocators will find is that many managers with positive Sharpe Ratios may have negative CWARP scores and vice versa.\n", 18 | "\n", 19 | "__CWARP™ is easy to use and interpret:__\n", 20 | "\n", 21 | "_CWARP™ > 0 means the new asset is improving your portfolio by increasing:_ \n", 22 | "_1) Return to Downside Volatility;_\n", 23 | "_2) Return to Maximum Drawdown;_\n", 24 | "_3) or BOTH_\n", 25 | "\n", 26 | "_CWARP™ < 0 means the new asset is hurting your portfolio by replicating risk exposures you already own resulting in higher drawdowns and volatility_\n", 27 | "\n", 28 | "The following workbook provides step-by-step examples and code to replicate the CWARP score for and test various portfolios. Yahoo Finance API is used to provide stock data and create the Efficient Frontier. \n", 29 | "\n", 30 | "Please feel free to use and distribute this workbook and code freely as part of your investment process. \n", 31 | "\n", 32 | "For full information on the theory and best implementation of CWARP please download the paper on our website.\n", 33 | "https://www.artemiscm.com/research-market-views\n", 34 | "\n", 35 | "www.artemiscm.com\n", 36 | "\n", 37 | "_Please see important disclaimers at the end of the notebook._" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 1, 43 | "metadata": {}, 44 | "outputs": [ 45 | { 46 | "data": { 47 | "text/html": [ 48 | "" 49 | ], 50 | "text/plain": [ 51 | "" 52 | ] 53 | }, 54 | "metadata": {}, 55 | "output_type": "display_data" 56 | }, 57 | { 58 | "name": "stderr", 59 | "output_type": "stream", 60 | "text": [ 61 | "/usr/local/lib/python3.8/dist-packages/pandas_datareader/compat/__init__.py:7: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n", 62 | " from pandas.util.testing import assert_frame_equal\n" 63 | ] 64 | } 65 | ], 66 | "source": [ 67 | "import pandas as pd \n", 68 | "import numpy as np\n", 69 | "from datetime import date\n", 70 | "\n", 71 | "%matplotlib inline\n", 72 | "import matplotlib\n", 73 | "import matplotlib.pyplot as plt\n", 74 | "import matplotlib.dates as mdates\n", 75 | "import seaborn as sns\n", 76 | "\n", 77 | "from IPython.core.display import display, HTML\n", 78 | "display(HTML(\"\"))\n", 79 | "\n", 80 | "import yfinance as yf\n", 81 | "yf.pdr_override()\n", 82 | "import pandas as pd" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "metadata": {}, 88 | "source": [ 89 | "__NOTES ON CALCULATION METHODOLOGY__ \n", 90 | "\n", 91 | "_In academic literature and across professional applications there is widespread disagreement over the proper calculation methodology for the Sharpe, Sortino, and Return to Max Drawdown Ratios. The most common methodology used by most professionals is the arithmetic mean and standard deviation of returns by period multiplied by the square root of the periodicity. Many others will point out that using logarithmic returns is more appropriate, or alternatively using geometric returns in the numerator(e.g. Geometric Sharpe Ratio). In some cases, the volatility calculation will take into account the subtraction of the risk-free rate, and in other cases, this is only applied to the numerator. For the benefit of the doubt, Artemis uses the most common methodology to calculate Sharpe and Sortino Ratios with arithmetic mean and standard deviations. In each respective case, we only subtract the risk-free rate from the numerator. Sortino Ratios assume the zeroing out of positive returns, as opposed to complete elimination, in the downside devation calculation. For the Return to Max Drawdown calculation, we assume the compound annualized growth rate of the asset minus the risk-free rate in the numerator. The maximum drawdown does not take into account the subtraction of the risk-free rate. In the original research paper, risk-free rate and the financing charges are applied by month to each respective return period. In the python code below, a consistent risk-free rate and financing charge is applied to the numerator, as opposed to a variable rate by period._ \n", 92 | "\n", 93 | "_While calculation methodology will numerically affect each metric slightly, and by proxy the CWARP score, they will not lead to radically different conclusions regarding the relative rankings of assets so long as there is consistency in the technique applied. If you prefer a different methodology, please feel free to edit the accompanying code to fit your preferences._ " 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": [ 100 | "# Traditional Risk to Return Portfolio Metrics\n", 101 | "To calculate the CWARP score first we must provide functions for classic risk-reward metrics like the Sharpe Ratio, Sortino Ratio, and Maximum Drawdown" 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "execution_count": 2, 107 | "metadata": {}, 108 | "outputs": [], 109 | "source": [ 110 | "#Risk and Reward Functions##################################################################\n", 111 | "def sharpe_ratio(df,risk_free=0,periodicity=252):\n", 112 | " \"\"\"df - asset return series, e.g. daily returns based on daily close prices of asset\n", 113 | " risk_free - annualized risk free rate (default is assumed to be 0)\n", 114 | " periodicity - number of periods at desired frequency in one year\n", 115 | " e.g. 252 business days in 1 year (default),\n", 116 | " 12 months in 1 year,\n", 117 | " 52 weeks in 1 year etc.\"\"\"\n", 118 | " # convert return series to numpy array (in case Pandas series is provided)\n", 119 | " df = np.asarray(df)\n", 120 | " # convert annualized risk free rate into appropriate value for provided frequency of asset return series (df)\n", 121 | " risk_free=(1+risk_free)**(1/periodicity)-1\n", 122 | " # calculate mean excess return based on return series provided\n", 123 | " dfMean=np.nanmean(df)-risk_free\n", 124 | " # calculate standard deviation of return series\n", 125 | " dfSTD=np.nanstd(df)\n", 126 | " # calculate Sharpe Ratio = Mean excess return / Std of returns * sqrt(periodicity)\n", 127 | " dfSharpe=dfMean/dfSTD*np.sqrt(periodicity)\n", 128 | " return dfSharpe\n", 129 | "\n", 130 | "def target_downside_deviation(df, MAR=0, periodicity=252):\n", 131 | " \"\"\"df - asset return series, e.g. daily returns based on daily close prices of asset\n", 132 | " minimum acceptable return (MAR) - value is subtracted from returns before root-mean-square calculation to obtain target downside deviation (TDD)\"\"\"\n", 133 | " # convert return series to numpy array (in case Pandas series is provided)\n", 134 | " df = np.asarray(df)\n", 135 | " # TDD step 1: subtract mininum acceptable return (MAR) from period returns provided in df\n", 136 | " df_ = df - MAR\n", 137 | " # TDD step 2: zero out positive excess returns and calculate root-mean-square for resulting values\n", 138 | " df2 = np.where(df_<0, df_, 0)\n", 139 | " tdd = np.sqrt(np.nanmean(df2**2))\n", 140 | " return tdd\n", 141 | "\n", 142 | "def sortino_ratio(df,risk_free=0, periodicity=252, include_risk_free_in_vol=False):\n", 143 | " \"\"\"df - asset return series, e.g. daily returns based on daily close prices of asset\n", 144 | " risk_free - annualized risk free rate (default is assumed to be 0). Note: risk free rate is assumed to be the target return/minimum acceptable return (MAR)\n", 145 | " used in calculating both the mean excess return (numerator of Sortino ratio) and determining target downside deviation (TDD, the denominator of Sortino)\n", 146 | " periodicity - number of periods at desired frequency in one year\n", 147 | " e.g. 252 business days in 1 year (default),\n", 148 | " 12 months in 1 year,\n", 149 | " 52 weeks in 1 year etc.\"\"\"\n", 150 | " # convert return series to numpy array (in case Pandas series is provided)\n", 151 | " df = np.asarray(df)\n", 152 | " # convert annualized risk free rate into appropriate value for provided frequency of asset return series (df)\n", 153 | " risk_free=(1+risk_free)**(1/periodicity)-1\n", 154 | " # calculate mean excess return based on return series provided\n", 155 | " dfMean=np.nanmean(df)-risk_free\n", 156 | " # calculate target downside deviation (TDD)\n", 157 | " # assume risk free rate is MAR\n", 158 | " if include_risk_free_in_vol==True: MAR=risk_free\n", 159 | " else: MAR=0\n", 160 | " tdd = target_downside_deviation(df, MAR=MAR)\n", 161 | " # calculate Sortino Ratio = Mean excess return / TDD * sqrt(periodicity)\n", 162 | " dfSortino=(dfMean/tdd)*np.sqrt(periodicity)\n", 163 | " return dfSortino\n", 164 | "\n", 165 | "def annualized_return(df,periodicity=252):\n", 166 | " \"\"\"df - asset return series, e.g. returns based on daily close prices of asset\n", 167 | " periodicity - number of periods at desired frequency in one year\n", 168 | " e.g. 252 business days in 1 year (default),\n", 169 | " 12 months in 1 year,\n", 170 | " 52 weeks in 1 year etc.\"\"\"\n", 171 | " # convert return series to numpy array (in case Pandas series is provided)\n", 172 | " df = np.asarray(df)\n", 173 | " # how many years of returns data is provided in df\n", 174 | " difference_in_years = len(df)/periodicity\n", 175 | " # starting net asset value / NAV (assumed to be 1) and cumulative returns (r) over time period provided in returns data\n", 176 | " start_NAV=1.0\n", 177 | " r = np.nancumprod(df+start_NAV)\n", 178 | " # end NAV based on final cumulative return\n", 179 | " end_NAV=r[-1]\n", 180 | " # determine annualized return\n", 181 | " AnnualReturn = end_NAV**(1 / difference_in_years) - 1\n", 182 | " return AnnualReturn\n", 183 | "\n", 184 | "def max_dd(df, return_data=False):\n", 185 | " \"\"\"df - asset return series, e.g. returns based on daily close prices of asset\n", 186 | " return_data - boolean value to determine if drawdown values over the return data time period should be return, instead of max DD\"\"\"\n", 187 | " # convert return series to numpy array (in case Pandas series is provided)\n", 188 | " df = np.asarray(df)\n", 189 | " # calculate cumulative returns\n", 190 | " start_NAV = 1\n", 191 | " r = np.nancumprod(df+start_NAV)\n", 192 | " # calculate cumulative max returns (i.e. keep track of peak cumulative return up to that point in time, despite actual cumulative return at that point in time)\n", 193 | " peak_r = np.maximum.accumulate(r)\n", 194 | " # determine drawdowns relative to peak cumulative return achieved up to each point in time\n", 195 | " dd = (r - peak_r) / peak_r\n", 196 | " # return drawdown values over time period if return_data is set to True, otherwise return max drawdown which will be a positive number\n", 197 | " if return_data==True:\n", 198 | " out = dd\n", 199 | " else:\n", 200 | " out = np.abs(np.nanmin(dd))\n", 201 | " return out\n", 202 | "\n", 203 | "def return_maxdd_ratio(df,risk_free=0,periodicity=252):\n", 204 | " \"\"\"df - asset return series, e.g. returns based on daily close prices of asset\n", 205 | " risk_free - annualized risk free rate (default is assumed to be 0)\n", 206 | " periodicity - number of periods at desired frequency in one year\n", 207 | " e.g. 252 business days in 1 year (default),\n", 208 | " 12 months in 1 year,\n", 209 | " 52 weeks in 1 year etc.\"\"\"\n", 210 | " # convert return series to numpy array (in case Pandas series is provided)\n", 211 | " df = np.asarray(df)\n", 212 | " # convert annualized risk free rate into appropriate value for provided frequency of asset return series (df)\n", 213 | " risk_free=(1+risk_free)**(1/periodicity)-1\n", 214 | " # determine annualized return to be used in numerator of return to max drawdown (RMDD) calculation\n", 215 | " AnnualReturn = annualized_return(df, periodicity=periodicity)\n", 216 | " # determine max drawdown to be used in the denominator of RMDD calculation\n", 217 | " maxDD=max_dd(df,return_data=False)\n", 218 | " return (AnnualReturn-risk_free)/abs(maxDD)" 219 | ] 220 | }, 221 | { 222 | "cell_type": "markdown", 223 | "metadata": {}, 224 | "source": [ 225 | "# Coles Win Above Replacement Portfolio (CWARP™) Code:\n", 226 | "\n", 227 | "CWARP begins with the assumption an allocator has a pre-existing or replacement portfolio (60/40 Equity-Bond or Passive Equity). The CWARP score first calculates the 1) Return to Downside Volatility (Sortino Ratio) and 2) Return to Maximum Drawdown of\n", 228 | "the ”replacement” portfolio. CWARP assumes the allocator borrows cash to layer an alternative investment on top of the replacement portfolio. CWARP recalculates the Return to Downside Volatility and Return to the Maximum Drawdown for the revised portfolio. CWARP is then calculated by taking the geometric average of the ratio between the Sortino Ratio and Return to Maximum Drawdown of the new and replacement portfolios.The CWARP shares inputs with the Sharpe Ratio, including manager returns, volatility, and the risk-free rate. Several new inputs include the returns of the replacement/base portfolio, financing rate, and the percentage allocation for the new investment. The standardized CWARP score uses a 60/40 portfolio or Equity Beta as the replacement strategy and a 25% weighting. If an asset can be portfolio margined without added cash (e.g., derivative-overlays), it may be appropriate to reduce financing charges to 0%." 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 3, 234 | "metadata": {}, 235 | "outputs": [], 236 | "source": [ 237 | "def cole_win_above_replace_port(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252):\n", 238 | " \"\"\"Cole Win Above Replacement Portolio (CWARP): Total score to evaluate whether any new investment improves or hurts the return to risk of your total portfolio.\n", 239 | " new_asset = returns of the asset you are thinking of adding to your portfolio\n", 240 | " replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio)\n", 241 | " risk_free_rate = Tbill rate (annualized)\n", 242 | " financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. \n", 243 | " weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard\n", 244 | " weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard\n", 245 | " periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count\"\"\"\n", 246 | " # convert annualized financing rate into appropriate value for provided periodicity\n", 247 | " # risk_free_rate will be converted appropriately in respective Sortino and RMDD calcs\n", 248 | " financing_rate=(1+financing_rate)**(1/periodicity)-1\n", 249 | "\n", 250 | " #Calculate Replacement Portfolio Sortino Ratio\n", 251 | " replace_port_sortino = sortino_ratio(replace_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 252 | "\n", 253 | " #Calculate Replacement Portfolio Return to Max Drawdown\n", 254 | " replace_port_return_maxdd = return_maxdd_ratio(replace_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 255 | "\n", 256 | " #Calculate New Portfolio Sortino Ratio\n", 257 | " new_port = (new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port\n", 258 | " new_port_sortino = sortino_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 259 | "\n", 260 | " #Calculate New Portfolio Return to Max Drawdown\n", 261 | " new_port_return_maxdd = return_maxdd_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 262 | "\n", 263 | " #Final CWARP calculation\n", 264 | " CWARP = ((new_port_return_maxdd/replace_port_return_maxdd*new_port_sortino/replace_port_sortino)**(1/2)-1)*100\n", 265 | "\n", 266 | " return CWARP\n", 267 | "\n", 268 | "def cwarp_additive_sortino(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252):\n", 269 | " \"\"\"Cole Win Above Replacement Portolio (CWARP) Sortino +: Isolates new investment effect on total portfolio Sortino Ratio, which is a portion of the holistic CWARP score.\n", 270 | " new_asset = returns of the asset you are thinking of adding to your portfolio\n", 271 | " replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio)\n", 272 | " risk_free_rate = Tbill rate (annualized)\n", 273 | " financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. \n", 274 | " weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard\n", 275 | " weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard\n", 276 | " periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count\"\"\"\n", 277 | " # convert annualized financing rate into appropriate value for provided periodicity\n", 278 | " # risk_free_rate will be converted appropriately in respective Sortino and RMDD calcs\n", 279 | " financing_rate=(1+financing_rate)**(1/periodicity)-1\n", 280 | "\n", 281 | " #Calculate Replacement Portfolio Sortino Ratio\n", 282 | " replace_port_sortino = sortino_ratio(replace_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 283 | "\n", 284 | " #Calculate New Portfolio Sortino Ratio\n", 285 | " new_port = (new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port\n", 286 | " new_port_sortino = sortino_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 287 | "\n", 288 | " #Final calculation\n", 289 | " CWARP_add_sortino=((new_port_sortino/replace_port_sortino)-1)*100\n", 290 | "\n", 291 | " return CWARP_add_sortino\n", 292 | "\n", 293 | "def cwarp_additive_ret_maxdd(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252):\n", 294 | " \"\"\"Cole Win Above Replacement Portolio (CWARP) Ret to Max DD +: Isolates new investment effect on total portfolio Return to MAXDD, which is a portion of the holistic CWARP score.\n", 295 | " new_asset = returns of the asset you are thinking of adding to your portfolio\n", 296 | " replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio)\n", 297 | " risk_free_rate = Tbill rate (annualized)\n", 298 | " financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. \n", 299 | " weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard\n", 300 | " weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard\n", 301 | " periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count\"\"\"\n", 302 | " # convert annualized financing rate into appropriate value for provided periodicity\n", 303 | " # risk_free_rate will be converted appropriately in respective Sortino and RMDD calcs\n", 304 | " financing_rate=(1+financing_rate)**(1/periodicity)-1\n", 305 | "\n", 306 | " #Calculate Replacement Portfolio Return to Max Drawdown\n", 307 | " replace_port_return_maxdd = return_maxdd_ratio(replace_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 308 | "\n", 309 | " #Calculate New Portfolio Return to Max Drawdown\n", 310 | " new_port = (new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port\n", 311 | " new_port_return_maxdd = return_maxdd_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 312 | "\n", 313 | " #Final calculation\n", 314 | " CWARP_add_ret_maxdd=((new_port_return_maxdd/replace_port_return_maxdd)-1)*100\n", 315 | "\n", 316 | " return CWARP_add_ret_maxdd\n", 317 | "\n", 318 | "def cwarp_port_return(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252):\n", 319 | " \"\"\"Cole Win Above Replacement Portolio (CWARP) Portfolio Return: Returns of the aggregate portfolio after a new asset is financed and layered on top of the replacement portfolio. \n", 320 | " new_asset = returns of the asset you are thinking of adding to your portfolio\n", 321 | " replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio)\n", 322 | " risk_free_rate = Tbill rate (annualized)\n", 323 | " financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. \n", 324 | " weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard\n", 325 | " weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard\n", 326 | " periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count\"\"\"\n", 327 | " # convert annual financing based on periodicity\n", 328 | " financing_rate=((financing_rate+1)**(1/periodicity)-1)\n", 329 | "\n", 330 | " # compose new portfolio\n", 331 | " new_port=(new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port\n", 332 | " \n", 333 | " # calculate annualized return of new portfolio and subtract risk-free rate\n", 334 | " out = annualized_return(new_port, periodicity=periodicity) - risk_free_rate\n", 335 | " return out\n", 336 | "\n", 337 | "def cwarp_port_risk(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252):\n", 338 | " \"\"\"Cole Win Above Replacement Portolio (CWARP) Portfolio Risk: Volatility of the aggregate portfolio after a new asset is financed and layered on top of the replacement portfolio. \n", 339 | " new_asset = returns of the asset you are thinking of adding to your portfolio\n", 340 | " replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio)\n", 341 | " risk_free_rate = Tbill rate (annualized)\n", 342 | " financing_rate = portfolio margin/borrowing cost (annualized) to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. \n", 343 | " weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard\n", 344 | " weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard\n", 345 | " periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count\"\"\"\n", 346 | " # convert annual financing and risk free rates based on periodicity\n", 347 | " financing_rate=((financing_rate+1)**(1/periodicity)-1)\n", 348 | " risk_free_rate=((risk_free_rate+1)**(1/periodicity)-1)\n", 349 | " # compose new portfolio\n", 350 | " new_port=(new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port\n", 351 | " # calculated target downside deviation (TDD)\n", 352 | " tdd = target_downside_deviation(new_port, MAR=0)*np.sqrt(periodicity)\n", 353 | " return tdd\n", 354 | "\n", 355 | "def cwarp_new_port_data(new_asset,replace_port,risk_free_rate=0,financing_rate=0,weight_asset=0.25,weight_replace_port=1,periodicity=252):\n", 356 | " \"\"\"Cole Win Above Replacement Portolio (CWARP) return stream: Return series after a new asset is financed and layered on top of the replacement portfolio. \n", 357 | " new_asset = returns of the asset you are thinking of adding to your portfolio\n", 358 | " replace_port = returns of your pre-existing portfolio (e.g. S&P 500 Index, 60/40 Stock-Bond Portfolio)\n", 359 | " risk_free_rate = Tbill rate \n", 360 | " financing_rate = portfolio margin/borrowing cost to layer new asset on top of prevailing portfolio (e.g. LIBOR + 60bps). No financing rate is reasonable for derivate overlay products. \n", 361 | " weight_asset = % weight you wish to overlay for the new asset on top of the previous portfolio, 25% overlay allocation is standard\n", 362 | " weight_replace_port = % weight of the replacement portfolio, 100% pre-existing portfolio value is standard\n", 363 | " periodicity = the frequency of the data you are sampling, typically 12 for monthly or 252 for trading day count\"\"\"\n", 364 | " # convert annual financing based on periodicity\n", 365 | " financing_rate=((financing_rate+1)**(1/periodicity)-1)\n", 366 | " new_port=(new_asset-financing_rate)*weight_asset+replace_port*weight_replace_port\n", 367 | " return new_port" 368 | ] 369 | }, 370 | { 371 | "cell_type": "markdown", 372 | "metadata": {}, 373 | "source": [ 374 | "Data function to pull yahoo finance time series" 375 | ] 376 | }, 377 | { 378 | "cell_type": "code", 379 | "execution_count": 4, 380 | "metadata": {}, 381 | "outputs": [], 382 | "source": [ 383 | "def retrieve_yhoo_data(ticker='spy', start_date='2007-07-01', end_date='2020-12-31'):\n", 384 | " data_hold=yf.Ticker(ticker)\n", 385 | " price_df=data_hold.history(start=start_date, end=end_date).Close.pct_change()\n", 386 | " price_df.name=ticker\n", 387 | " return price_df" 388 | ] 389 | }, 390 | { 391 | "cell_type": "markdown", 392 | "metadata": {}, 393 | "source": [ 394 | "Simple example of implementing CWARP Score for GLD (SPDR Gold Trust) as a diversifer on a 60/40 Stock-to-Bond portfolio" 395 | ] 396 | }, 397 | { 398 | "cell_type": "code", 399 | "execution_count": 5, 400 | "metadata": {}, 401 | "outputs": [ 402 | { 403 | "data": { 404 | "text/plain": [ 405 | "19.862679839852525" 406 | ] 407 | }, 408 | "execution_count": 5, 409 | "metadata": {}, 410 | "output_type": "execute_result" 411 | } 412 | ], 413 | "source": [ 414 | "cole_win_above_replace_port(new_asset=retrieve_yhoo_data('gld'),replace_port=retrieve_yhoo_data('spy')*.60+retrieve_yhoo_data('ief')*.40\n", 415 | " ,risk_free_rate=.005,financing_rate=0.01,weight_asset=0.25,weight_replace_port=1,periodicity=252)" 416 | ] 417 | }, 418 | { 419 | "cell_type": "markdown", 420 | "metadata": {}, 421 | "source": [ 422 | "# Discover Assets that Improve your Total Portfolio Risk-Adjusted Returns\n", 423 | "The code below references a 60% Stocks/40% Bonds as the replacement portfolio, and then iterates a wide range of portfolio diversifiers to calculate potential Efficient Frontiers" 424 | ] 425 | }, 426 | { 427 | "cell_type": "code", 428 | "execution_count": 6, 429 | "metadata": {}, 430 | "outputs": [], 431 | "source": [ 432 | "# set up parameters for comparing various additions to a base replacement portfolio composed of 60/40 stock-bond portfolio\n", 433 | "# however, this may be modified to evaluate for any replacement portfolio of choice\n", 434 | "start_date='2007-07-01'\n", 435 | "end_date='2020-12-31'\n", 436 | "ticker_list=['qqq','lqd','hyg','tlt','ief','shy','gld','slv','efa','eem','iyr','xle','xlk','xlf']\n", 437 | "replacement_port_tik=['spy','ief']\n", 438 | "replacement_port_w=[0.6,0.4]\n", 439 | "replacement_port=sum([retrieve_yhoo_data(sym, start_date, end_date)*replacement_port_w[i] for i, sym in enumerate(replacement_port_tik)])\n", 440 | "replacement_port_name='Classic 60/40'\n", 441 | "replacement_port.name=replacement_port_name\n", 442 | "financing_rate=.01\n", 443 | "risk_free_rate=0.005\n", 444 | "weight_asset=0.25\n", 445 | "weight_replace_port=1\n", 446 | "periodicity=252" 447 | ] 448 | }, 449 | { 450 | "cell_type": "code", 451 | "execution_count": 7, 452 | "metadata": {}, 453 | "outputs": [], 454 | "source": [ 455 | "# Formatting to set up two tables below\n", 456 | "# Table 1 (risk_ret_df): Evaluate Sharpe, Sortino, Max DD etc for various indices/assets/tickers and CWARP/CWARP components when added at 25% weighting as a layer on top of replacement portfolio\n", 457 | "# Table 2 (new_risk_ret_df): Evaluate the new portfolio's (when each asset added as 25% weighting as a layer on top of replacement portfolio) Return, Downside Vol, Sharpe, Sortino, Max DD, RMDD, CWARP\n", 458 | "percentage_weight_asset = \"{:.0%}\".format(weight_asset)\n", 459 | "percentage_weight_replace_port = \"{:.0%}\".format(weight_replace_port)\n", 460 | "CWARP_W_String=str('CWARP_'+percentage_weight_asset+'_asset')\n", 461 | "\n", 462 | "risk_ret_df=pd.DataFrame(index=['Start_Date','End_Date','CWARP','+Sortino','+Ret_To_MaxDD','Sharpe','Sortino','Max_DD'],columns=ticker_list)\n", 463 | "new_risk_ret_df=pd.DataFrame(index=['Return','Vol','Sharpe','Sortino','Max_DD','Ret_To_MaxDD',CWARP_W_String],columns=ticker_list)\n", 464 | "new_risk_ret_df=new_risk_ret_df.add_suffix('@'+percentage_weight_asset+' | '+replacement_port.name+'@'+percentage_weight_replace_port)\n", 465 | "new_risk_ret_df[replacement_port.name]=np.nan\n", 466 | "\n", 467 | "prices_df=pd.DataFrame(index=retrieve_yhoo_data(ticker_list[0]).index) \n", 468 | "\n", 469 | "# evaluate metrics for all tickers in list above\n", 470 | "for i in range(0,len(ticker_list)):\n", 471 | " temp_data=retrieve_yhoo_data(ticker_list[i], start_date, end_date)\n", 472 | " new_port = cwarp_new_port_data(new_asset=temp_data,replace_port=replacement_port,financing_rate=financing_rate,\n", 473 | " risk_free_rate=risk_free_rate,weight_asset=weight_asset,weight_replace_port=weight_replace_port,periodicity=periodicity)\n", 474 | " prices_df=pd.merge(prices_df,temp_data, left_index=True, right_index=True)\n", 475 | " risk_ret_df.loc['Start_Date',ticker_list[i]]=min(temp_data.index).date()\n", 476 | " risk_ret_df.loc['End_Date',ticker_list[i]]=max(temp_data.index).date()\n", 477 | " \n", 478 | " risk_ret_df.loc['CWARP',ticker_list[i]]=cole_win_above_replace_port(new_asset=temp_data,replace_port=replacement_port,financing_rate=financing_rate,\n", 479 | " risk_free_rate=risk_free_rate,weight_asset=weight_asset,weight_replace_port=weight_replace_port,periodicity=periodicity)\n", 480 | " \n", 481 | " risk_ret_df.loc['+Sortino',ticker_list[i]]=cwarp_additive_sortino(new_asset=temp_data,replace_port=replacement_port,financing_rate=financing_rate,\n", 482 | " risk_free_rate=risk_free_rate,weight_asset=weight_asset,weight_replace_port=weight_replace_port,periodicity=periodicity)\n", 483 | " \n", 484 | " risk_ret_df.loc['+Ret_To_MaxDD',ticker_list[i]]=cwarp_additive_ret_maxdd(new_asset=temp_data,replace_port=replacement_port,financing_rate=financing_rate,\n", 485 | " risk_free_rate=risk_free_rate,weight_asset=weight_asset,weight_replace_port=weight_replace_port,periodicity=periodicity)\n", 486 | " risk_ret_df.loc['Sharpe',ticker_list[i]]=sharpe_ratio(temp_data,risk_free=risk_free_rate, periodicity=periodicity)\n", 487 | " risk_ret_df.loc['Sortino',ticker_list[i]]=sortino_ratio(temp_data,risk_free=risk_free_rate, periodicity=periodicity)\n", 488 | " risk_ret_df.loc['Max_DD',ticker_list[i]]=max_dd(temp_data)\n", 489 | " \n", 490 | " new_risk_ret_df.loc['Return',new_risk_ret_df.columns[i]]=cwarp_port_return(new_asset=temp_data,replace_port=replacement_port,financing_rate=financing_rate,\n", 491 | " risk_free_rate=risk_free_rate,weight_asset=weight_asset,weight_replace_port=weight_replace_port,periodicity=periodicity)\n", 492 | " \n", 493 | " new_risk_ret_df.loc['Vol',new_risk_ret_df.columns[i]]=cwarp_port_risk(new_asset=temp_data,replace_port=replacement_port,financing_rate=financing_rate,\n", 494 | " risk_free_rate=risk_free_rate,weight_asset=weight_asset,weight_replace_port=weight_replace_port,periodicity=periodicity)\n", 495 | " \n", 496 | " new_risk_ret_df.loc['Sharpe',new_risk_ret_df.columns[i]]=sharpe_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 497 | " \n", 498 | " new_risk_ret_df.loc['Sortino',new_risk_ret_df.columns[i]]=sortino_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 499 | " \n", 500 | " new_risk_ret_df.loc['Max_DD',new_risk_ret_df.columns[i]]=max_dd(new_port)\n", 501 | " \n", 502 | " new_risk_ret_df.loc['Ret_To_MaxDD',new_risk_ret_df.columns[i]]=return_maxdd_ratio(new_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 503 | " \n", 504 | " new_risk_ret_df.loc[CWARP_W_String,new_risk_ret_df.columns[i]]=risk_ret_df.loc['CWARP',ticker_list[i]]\n", 505 | " \n", 506 | "new_risk_ret_df.loc['Return',[replacement_port_name]]=annualized_return(replacement_port, periodicity=periodicity)\n", 507 | "new_risk_ret_df.loc['Vol',[replacement_port_name]]=target_downside_deviation(replacement_port, MAR=0)*np.sqrt(periodicity)\n", 508 | "new_risk_ret_df.loc['Sharpe',[replacement_port_name]]=sharpe_ratio(replacement_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 509 | "new_risk_ret_df.loc['Sortino',[replacement_port_name]]=sortino_ratio(replacement_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 510 | "new_risk_ret_df.loc['Max_DD',[replacement_port_name]]=max_dd(replacement_port)\n", 511 | "new_risk_ret_df.loc['Ret_To_MaxDD',[replacement_port_name]]=return_maxdd_ratio(replacement_port, risk_free=risk_free_rate, periodicity=periodicity)\n", 512 | "new_risk_ret_df.loc[CWARP_W_String, [replacement_port_name]]=cole_win_above_replace_port(new_asset=replacement_port, replace_port=replacement_port, risk_free_rate=risk_free_rate, financing_rate=financing_rate, \n", 513 | " weight_asset=weight_asset, weight_replace_port=weight_replace_port, periodicity=periodicity)\n", 514 | "first_col = new_risk_ret_df.pop(replacement_port_name)\n", 515 | "new_risk_ret_df.insert(0, replacement_port_name, first_col)" 516 | ] 517 | }, 518 | { 519 | "cell_type": "markdown", 520 | "metadata": {}, 521 | "source": [ 522 | "First we evaluate each individual asset by CWARP score to see if it is helping the risk-adjusted returns of a 60/40 portfolio. We compare that data to outdated performance metrics like Sharpe and Sortino." 523 | ] 524 | }, 525 | { 526 | "cell_type": "code", 527 | "execution_count": 8, 528 | "metadata": { 529 | "scrolled": false 530 | }, 531 | "outputs": [ 532 | { 533 | "data": { 534 | "text/html": [ 535 | "\n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | "
tlt ief gld lqd shy qqq xlk slv hyg iyr eem efa xle xlf
Start_Date2007-07-022007-07-022007-07-022007-07-022007-07-022007-07-022007-07-022007-07-022007-07-022007-07-022007-07-022007-07-022007-07-022007-07-02
End_Date2020-12-302020-12-302020-12-302020-12-302020-12-302020-12-302020-12-302020-12-302020-12-302020-12-302020-12-302020-12-302020-12-302020-12-30
CWARP35.07521.35519.86310.3704.9643.0550.176-3.106-5.413-23.615-24.563-27.323-33.079-33.274
+Sortino29.87518.21613.8749.4403.7352.768-0.268-6.900-3.633-21.711-24.392-24.580-34.119-27.888
+Ret_To_MaxDD40.48324.57726.16611.3086.2083.3430.6230.843-7.160-25.473-24.733-29.966-32.022-38.257
Sharpe0.5450.7470.4740.6641.0500.7520.6850.3030.4650.2860.2390.1920.0910.212
Sortino0.7911.1010.6720.9431.6161.0650.9740.4140.6690.4050.3440.2670.1270.306
Max_DD0.2660.1040.4560.2180.0220.5340.5300.7630.3420.7050.6640.6100.7130.822
" 674 | ], 675 | "text/plain": [ 676 | "" 677 | ] 678 | }, 679 | "execution_count": 8, 680 | "metadata": {}, 681 | "output_type": "execute_result" 682 | } 683 | ], 684 | "source": [ 685 | "risk_ret_df.sort_values(by='CWARP', axis=1, ascending=False).style.set_precision(3)" 686 | ] 687 | }, 688 | { 689 | "cell_type": "markdown", 690 | "metadata": {}, 691 | "source": [ 692 | "Next we calculate the metrics of the brand new portfolios with the new asset layered on top at 25%. This is the raw data we can use to construct and Efficient Frontier" 693 | ] 694 | }, 695 | { 696 | "cell_type": "code", 697 | "execution_count": 9, 698 | "metadata": { 699 | "scrolled": true 700 | }, 701 | "outputs": [ 702 | { 703 | "data": { 704 | "text/html": [ 705 | "\n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | "
tlt@25% | Classic 60/40@100% ief@25% | Classic 60/40@100% gld@25% | Classic 60/40@100% lqd@25% | Classic 60/40@100% shy@25% | Classic 60/40@100% qqq@25% | Classic 60/40@100% Classic 60/40 xlk@25% | Classic 60/40@100% hyg@25% | Classic 60/40@100% slv@25% | Classic 60/40@100% iyr@25% | Classic 60/40@100% efa@25% | Classic 60/40@100% eem@25% | Classic 60/40@100% xlf@25% | Classic 60/40@100% xle@25% | Classic 60/40@100%
Return0.1010.0920.1000.0930.0820.1160.0840.1120.0900.0980.0910.0820.0860.0840.074
Vol0.0770.0780.0890.0860.0800.1180.0810.1190.0970.1110.1310.1210.1300.1350.132
Sharpe0.9100.8310.8060.7780.7370.7340.7120.7110.6900.6760.5620.5430.5370.5160.478
Sortino1.3201.2021.1581.1131.0551.0451.0171.0140.9800.9470.7960.7670.7690.7330.670
Max_DD0.2810.2900.3100.3290.3050.4370.3140.4360.3820.3820.4820.4620.4540.5410.435
Ret_To_MaxDD0.3760.3330.3380.2980.2840.2770.2680.2690.2480.2700.1990.1870.2010.1650.182
CWARP_25%_asset35.07521.35519.86310.3704.9643.055-1.4080.176-5.413-3.106-23.615-27.323-24.563-33.274-33.079
" 834 | ], 835 | "text/plain": [ 836 | "" 837 | ] 838 | }, 839 | "execution_count": 9, 840 | "metadata": {}, 841 | "output_type": "execute_result" 842 | } 843 | ], 844 | "source": [ 845 | "new_risk_ret_df.sort_values(by='Sharpe', axis=1, ascending=False).style.set_precision(3)" 846 | ] 847 | }, 848 | { 849 | "cell_type": "markdown", 850 | "metadata": {}, 851 | "source": [ 852 | "Lastly, we plot the portfolios to visualize how high CWARP assets push your portfolio further out on the Efficient Frontier of Return and Risk." 853 | ] 854 | }, 855 | { 856 | "cell_type": "code", 857 | "execution_count": 10, 858 | "metadata": { 859 | "scrolled": false 860 | }, 861 | "outputs": [ 862 | { 863 | "data": { 864 | "image/png": "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\n", 865 | "text/plain": [ 866 | "
" 867 | ] 868 | }, 869 | "metadata": {}, 870 | "output_type": "display_data" 871 | } 872 | ], 873 | "source": [ 874 | "import seaborn as sns\n", 875 | "sns.set_theme(style=\"white\")\n", 876 | "sns.set(rc={'figure.figsize':(125,10)})\n", 877 | "\n", 878 | "#Load Data\n", 879 | "adjust_new_risk = new_risk_ret_df.transpose()\n", 880 | "adjust_new_risk['Portfolio']=adjust_new_risk.index\n", 881 | "\n", 882 | "#Plot Seaborn\n", 883 | "ax=sns.relplot(x=\"Vol\", y=\"Return\", hue=\"Portfolio\", size=CWARP_W_String,\n", 884 | " sizes=(50, 400), alpha=.9, palette=\"muted\",\n", 885 | " height=6, data=adjust_new_risk)\n", 886 | "plt.title('Efficient Frontier by CWARP');" 887 | ] 888 | }, 889 | { 890 | "cell_type": "markdown", 891 | "metadata": {}, 892 | "source": [ 893 | "__DISCLAIMER:__ \n", 894 | "\n", 895 | "_THIS RESEARCH IS BEING PROVIDED FOR INFORMATIONAL PURPOSES ONLY AND SHOULD NOT BE CONSTRUED IN ANY WAY AS A SOLICITATION FOR ANY ARTEMIS FUND, STRATEGY, OR INVESTMENT PRODUCT. NONE OF THE DATA PRESENTED HEREIN REPRESENTS REAL OR HYPOTHETICAL RETURNS ACHIEVED BY ANY STRATEGIES OR INVESTMENT VEHICLES OF ARTEMIS CAPITAL MANAGEMENT LP, ARTEMIS CAPITAL ADVISERS LP, OR ITS AFFILIATES. THIS IS NOT AN OFFERING OR THE SOLICITATION OF AN OFFER TO PURCHASE AN INTEREST IN ANY STRATEGIES OR INVESTMENT VEHICLES OF ARTEMIS CAPITAL MANAGEMENT LP OR ARTEMIS CAPITAL ADVISERS LP. ANY SUCH OFFER OR SOLICITATION WILL ONLY BE MADE TO QUALIFIED INVESTORS BY MEANS OF A CONFIDENTIAL PRIVATE PLACEMENT MEMORANDUM (THE \"MEMORANDUM\") AND ONLY IN THOSE JURISDICTIONS WHERE PERMITTED BY LAW.\n", 896 | "AN INVESTMENT SHOULD ONLY BE MADE AFTER CAREFUL REVIEW OF A FUND'S MEMORANDUM. AN INVESTMENT IN A FUND IS SPECULATIVE AND INVOLVES A HIGH DEGREE OF RISK. OPPORTUNITIES FOR WITHDRAWAL, REDEMPTION, AND TRANSFERABILITY OF INTERESTS ARE RESTRICTED, SO INVESTORS MAY NOT HAVE ACCESS TO CAPITAL WHEN IT IS NEEDED. THERE IS NO SECONDARY MARKET FOR THE INTERESTS, AND NONE IS EXPECTED TO DEVELOP. NO ASSURANCE CAN BE GIVEN THAT THE INVESTMENT OBJECTIVE WILL BE ACHIEVED OR THAT AN INVESTOR WILL RECEIVE A RETURN\n", 897 | "OF ALL OR ANY PORTION OF HIS OR HER INVESTMENT IN A FUND. INVESTMENT RESULTS MAY VARY SUBSTANTIALLY OVER ANY GIVEN TIME PERIOD. CERTAIN DATA CONTAINED HEREIN IS BASED ON INFORMATION OBTAINED FROM SOURCES BELIEVED TO BE ACCURATE, BUT WE CANNOT GUARANTEE THE ACCURACY OF SUCH INFORMATION. ANY AND ALL CONTENTS OF THIS RESEARCH ARE FOR INFORMATIONAL PURPOSES ONLY. NEITHER THE INFORMATION PROVIDED HEREIN NOR THE PROGRAMMING AND QUANTITATIVE REFERENCE MATERIALS PROVIDED SHOULD BE CONSTRUED AS A GUARANTEE OF ANY PORTFOLIO PERFORMANCE USING CWARP OR ANY OTHER METRIC DEVELOPED OR DISCUSSED HEREIN. ANY INDIVIDUAL WHO USES, REFERENCES OR OTHERWISE ACCESSES THIS PAPER, THE GITHUB REPOSITORY, THE WEB-APP FOR CWARP EXPERIMENTATION OR ANY OTHER DATA, THEORY, FORMULA, OR ANY OTHER INFORMATION CREATED, USED, OR REFERENCED BY ARTEMIS DOES SO AT THEIR OWN RISK AND, BY ACCESSING ANY SUCH INFORMATION, INDEMNIFIES AND HOLDS HARMLESS ARTEMIS CAPITAL MANAGEMENT LP, ARTEMIS CAPITAL ADVISERS LP, AND ALL OF ITS AFFILIATES (TOGETHER, \"ARTEMIS\") AGAINST ANY LOSS OF CAPITAL THEY MAY OR MAY NOT INCUR BY UTILIZING SUCH DATA. ARTEMIS DOES NOT BEAR ANY RESPONSIBILITY FOR THEOUTCOME OF ANY PORTFOLIO NOT DIRECTLY OWNED AND/OR MANAGED BY ARTEMIS._" 898 | ] 899 | }, 900 | { 901 | "cell_type": "code", 902 | "execution_count": null, 903 | "metadata": {}, 904 | "outputs": [], 905 | "source": [] 906 | } 907 | ], 908 | "metadata": { 909 | "kernelspec": { 910 | "display_name": "Python 3", 911 | "language": "python", 912 | "name": "python3" 913 | }, 914 | "language_info": { 915 | "codemirror_mode": { 916 | "name": "ipython", 917 | "version": 3 918 | }, 919 | "file_extension": ".py", 920 | "mimetype": "text/x-python", 921 | "name": "python", 922 | "nbconvert_exporter": "python", 923 | "pygments_lexer": "ipython3", 924 | "version": "3.8.5" 925 | } 926 | }, 927 | "nbformat": 4, 928 | "nbformat_minor": 2 929 | } 930 | --------------------------------------------------------------------------------