def withdrawals(self): # we start out with the default withdrawal rate. # n.b. that this is the ONLY time it is used. Every other # time we will use a tilt because we will either be above or # below this value withdrawal = self.portfolio.value * self.rate actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, None) assert isinstance(change, AnnualChange) while True: previous_portfolio_amount = self.portfolio.value self.portfolio.adjust_returns(change) gains = (self.portfolio.value - previous_portfolio_amount) / previous_portfolio_amount self.cumulative_inflation *= (1 + change.inflation) # Figure out which tilt we used based on the current (inflation-adjusted) # portfolio value if (self.portfolio.value / self.cumulative_inflation) < self.starting_portfolio_value: withdrawal = self.portfolio.value * (self.rate - self.tilt) else: withdrawal = self.portfolio.value * (self.rate + self.tilt) actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, gains) assert isinstance(change, AnnualChange)
def withdrawals(self): withdrawal = self.portfolio.value * self.rate actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, None) assert isinstance(change, AnnualChange) while True: previous_portfolio_amount = self.portfolio.value self.portfolio.adjust_returns(change) gains = (self.portfolio.value - previous_portfolio_amount) / previous_portfolio_amount withdrawal = self.portfolio.value * self.rate actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, gains) assert isinstance(change, AnnualChange)
def withdrawals(self): em = EM.calc_withdrawal(self.portfolio.value, self.years_left) withdrawal = em.send(None) actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, None) assert isinstance(change, AnnualChange) while True: (gains, _, _) = self.portfolio.adjust_returns(change) self.cumulative_inflation *= (1 + change.inflation) withdrawal = em.send((self.portfolio.value, change.inflation)) actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, gains) assert isinstance(change, AnnualChange)
def withdrawals(self): index = 0 withdrawal = VPW.calc_withdrawal(self.portfolio.value, index) actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, None) assert isinstance(change, AnnualChange) index += 1 while True: (gains, _, _) = self.portfolio.adjust_returns(change) withdrawal = vpw_rates[index] * self.portfolio.value actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, gains) assert isinstance(change, AnnualChange) index += 1
def withdrawals(self): withdrawal = self.start() actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, None) assert isinstance(change, AnnualChange) while True: # Update the world. self.current_inflation = change.inflation self.cumulative_inflation *= (1 + change.inflation) previous_portfolio_amount = self.portfolio.value (gains, _, _) = self.portfolio.adjust_returns(change) # Now we can make our next withdrawal. withdrawal = self.next() actual_withdrawal = self.harvest.send(withdrawal) change = yield report(self.portfolio, actual_withdrawal, gains) assert isinstance(change, AnnualChange)