You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
backtest/year_intervals.py

76 lines
2.5 KiB

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()