def __compute_final_stats(self): self._final_stats["MeanProfit"] = np.mean( self._trade_detail["EverytimeProfit"]) self._final_stats["MaxLoss"] = np.min( self._trade_detail["EverytimeProfit"]) self._final_stats["FinalProfit"] = self._trade_detail[ "EverytimeProfit"].values[-1] self._final_stats["MeanProfitPer"] = round( self._final_stats["MeanProfit"] / self.trader_fund * 100, 2) self._final_stats["FinalProfitPer"] = round( self._final_stats["FinalProfit"] / self.trader_fund * 100, 2) self._final_stats["MaxLossPer"] = round( self._final_stats["MaxLoss"] / self.trader_fund * 100, 2) self._final_stats["AnnualReturnPer"] = round( period_return2annual_return( self._final_stats["FinalProfitPer"] / 100, self._trade_period_years, ) * 100, 2, ) time_step_returns = ( self._trade_detail["EverytimeProfit"] - self._trade_detail["EverytimeProfit"].shift(1) ) / (self._trade_detail["EverytimeProfit"].shift(1) + self.trader_fund) strategy_return = np.mean(time_step_returns) strategy_std = np.std(time_step_returns) self._final_stats["AnnualSharpRatio"] = calculate_sharp_ratio( strategy_return, strategy_std)
def __compute_compare_market(self): self._compare_market_detail = self._trade_detail[[ "date", "EverytimeTotalProfit" ]].copy() self._compare_market_detail["CumDailyReturn"] = ( np.log(self._compare_market_detail["EverytimeTotalProfit"]) - np.log( self._compare_market_detail["EverytimeTotalProfit"].shift(1)) ).fillna(0) self._compare_market_detail["CumDailyReturn"] = round( self._compare_market_detail["CumDailyReturn"].cumsum(), 5) tai_ex = self.data_loader.get_data( dataset="TaiwanStockPrice", data_id="TAIEX", start_date=self.start_date, end_date=self.end_date, )[["date", "close"]] tai_ex["CumTaiExDailyReturn"] = ( np.log(tai_ex["close"]) - np.log(tai_ex["close"].shift(1))).fillna(0) tai_ex["CumTaiExDailyReturn"] = round( tai_ex["CumTaiExDailyReturn"].cumsum(), 5) self._compare_market_detail = pd.merge( self._compare_market_detail, tai_ex[["date", "CumTaiExDailyReturn"]], on=["date"], how="left", ) self._compare_market_detail = self._compare_market_detail.dropna() self._compare_market_stats = pd.Series() self._compare_market_stats["AnnualTaiexReturnPer"] = ( period_return2annual_return( self._compare_market_detail["CumTaiExDailyReturn"].values[-1], self._trade_period_years, ) * 100) self._compare_market_stats["AnnualReturnPer"] = self._final_stats[ "AnnualReturnPer"]
def test_return2annual(period_return, period_years, expected): resp = period_return2annual_return(period_return, period_years) assert resp == expected