add t-rate to VA

master
Dmitry Maylarov 4 years ago
parent 75e770960b
commit 9d74f43f71

@ -30,7 +30,7 @@ def get_data(stocks, start, end):
def human_readable_size(size, decimal_places=3): def human_readable_size(size, decimal_places=3):
for unit in ["$", "K$", "M$", "G$", "T$", "P$"]: for unit in ["$", "K$", "M$", "G$", "T$", "P$"]:
if size < 1000.0 or unit == "P$": if size < 1000.0 or unit == "P$":
return f"{size:.{decimal_places}f} {unit}" return f"{size:.{decimal_places}f}{unit}"
break break
size /= 1000.0 size /= 1000.0
@ -121,23 +121,25 @@ def simulate(stockData, monthly_params):
(actualEnd - actualStart).days / 365, (actualEnd - actualStart).days / 365,
) )
) )
# print(df[["annual%", "froi%", "cost", "total_value", "max_dd%", "max_md"]]) with pd.option_context("display.max_rows", None, "display.max_columns", None):
print(df) # print(df[["annual%", "froi%", "cost", "total_value", "max_dd%", "max_md"]])
print(df)
if __name__ == "__main__": if __name__ == "__main__":
stockList = ["^GSPC"] stockList = ["^GSPC"]
monthly_params = dict(sum=1000, coef=1.001) monthly_params = dict(sum=1000, coef=1, t_rate=1 + 0.02 / 12)
# startDate = datetime.datetime.fromisoformat("2000-01-01") # startDate = datetime.datetime.fromisoformat("2000-01-01")
# endDate = datetime.datetime.fromisoformat("2022-01-01") # endDate = datetime.datetime.fromisoformat("2022-01-01")
print(stockList[0]) print(stockList[0])
for period_years in (1, 2, 5, 10, 20, 50, 100): """
for period_years in (10, 20):
end_date = datetime.datetime.now() end_date = datetime.datetime.now()
start_date = end_date - datetime.timedelta(days=period_years * 365) start_date = end_date - datetime.timedelta(days=period_years * 365)
stockData = get_data(stockList[0], start_date, end_date) stockData = get_data(stockList[0], start_date, end_date)
simulate(stockData, monthly_params) simulate(stockData, monthly_params)
""" """
period_years = 10 period_years = 5
stockData = get_data( stockData = get_data(
stockList[0], stockList[0],
datetime.datetime.fromisoformat("1900-01-01"), datetime.datetime.fromisoformat("1900-01-01"),
@ -147,9 +149,8 @@ if __name__ == "__main__":
end_date = start_date + datetime.timedelta(days=period_years * 365) end_date = start_date + datetime.timedelta(days=period_years * 365)
while start_date < datetime.datetime.today(): while start_date < datetime.datetime.today():
stockData = get_data(stockList[0], start_date, end_date) stockData = get_data(stockList[0], start_date, end_date)
simulate(stockData) simulate(stockData, monthly_params)
start_date, end_date = ( start_date, end_date = (
end_date, end_date,
end_date + datetime.timedelta(days=period_years * 365), end_date + datetime.timedelta(days=period_years * 365),
) )
"""

@ -41,7 +41,7 @@ class PercentageCommisionScheme(bt.CommInfoBase):
) )
def _getcommission(self, size, price, pseudoexec): def _getcommission(self, size, price, pseudoexec):
return abs(size * price * self.p.commission) + 4 # 290rub/month return abs(size * price * self.p.commission) + 4 # 290rub/month + 0.04%
class Investing(bt.Strategy): class Investing(bt.Strategy):
@ -136,18 +136,13 @@ class VA(FormulaInvesting):
def formula(self): def formula(self):
target_value = ( target_value = (
min( min(
self.months * self.monthly_cash, self.monthly_cash * self.months,
self.broker.get_value(), self.broker.get_value(),
) )
- reserve - reserve
) )
self.order_target_value(target=target_value), self.order_target_value(target=target_value),
self.broker.set_cash(self.broker.get_cash() * self.monthly_params["t_rate"])
class DCA(FormulaInvesting):
def formula(self):
target_value = self.broker.get_value() - reserve
self.order_target_value(target=target_value)
class QVA(VA): class QVA(VA):
@ -156,6 +151,12 @@ class QVA(VA):
super().formula() super().formula()
class DCA(FormulaInvesting):
def formula(self):
target_value = self.broker.get_value() - reserve
self.order_target_value(target=target_value)
class QDCA(DCA): class QDCA(DCA):
def formula(self): def formula(self):
if not self.months % 3: if not self.months % 3:

Loading…
Cancel
Save