import datetime import lib from matplotlib import pyplot as plt import strategies as st import pandas as pd if __name__ == "__main__": stockList = ["^GSPC"] monthly_params = dict(sum=100000, coef=1, t_rate=1 + 0.02 / 12) # startDate = datetime.datetime.fromisoformat("2000-01-01") # endDate = datetime.datetime.fromisoformat("2022-01-01") print(stockList[0]) stockData = lib.get_data(stockList[0]) start_date = stockData.index[0] year_step = 1 label_string = "Investing to {} monthly over {} years, increasing {:.2f}%, starting from ${}".format( stockList[0], year_step, (monthly_params["coef"] * 100) - 100, monthly_params["sum"], ) print(label_string) plot_param = "annual%" _strategies = ( st.QDCA, st.EDCA, st.SmaCross, ) strategies = (st.DCA,) + _strategies df_comp = pd.DataFrame(index=list(st.__name__ for st in strategies)) df_vwr = pd.DataFrame(index=list(st.__name__ for st in strategies)) df_rel_to_dca = pd.DataFrame(index=list(st.__name__ for st in _strategies)) for start_year in range( start_date.year, datetime.datetime.today().year - year_step + 1, year_step ): start_date = datetime.date(start_year, 1, 1) end_date = datetime.date(start_year + year_step - 1, 12, 31) if (today := datetime.date.today()) < end_date: end_date = today stockData = lib.get_data(stockList[0], start_date, end_date) start, end = lib.get_data_borders(stockData) print( "{} to {}, {:.1f} years".format( start, end, (end - start).days / 365, ) ) newdf = pd.concat( [ lib.test_strategy(stockData, strategy, monthly_params) for strategy in strategies ] ) print(newdf.to_string()) df_rel_to_dca[start_year] = list( newdf.loc[s.__name__][plot_param] - newdf.loc[st.DCA.__name__][plot_param] for s in _strategies ) df_comp[start_year] = newdf[plot_param].values # print(df[["annual%", "froi%", "cost", "total_value", "max_dd%", "max_md"]]) # print(newdf["annual%"]) print(df_rel_to_dca.to_string()) df_comp.T.plot() for index, s in df_rel_to_dca.iterrows(): print("{}: avg {:.3f} dev {:.3f}".format(index, s.mean(), s.std())) df_rel_to_dca.T.hist(bins=20) plt.grid() plt.title(label_string) plt.ylabel(plot_param) plt.xlabel("year") plt.show()