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) # +1, calculate_Datenbr not include last day trade_days = (calculate_Datenbr( self._trade_detail["date"].min(), self._trade_detail["date"].max(), ) + 1) trade_years = (trade_days + 1) / 365 # +1, self._trade_detail wihtout contain first day self._final_stats["AnnualReturnPer"] = round( ((self._final_stats["FinalProfitPer"] / 100 + 1)** (1 / trade_years) - 1) * 100, 2, ) timestep_returns = (self._trade_detail["EverytimeProfit"] - self._trade_detail["EverytimeProfit"].shift(1)) / ( self._trade_detail["EverytimeProfit"].shift(1) + self.trader_fund) stratagy_return = np.mean(timestep_returns) stratagy_std = np.std(timestep_returns) self._final_stats["AnnualSharpRatio"] = calculate_sharp_ratio( stratagy_return, stratagy_std)
def __init__( self, user_id: str = "", password: str = "", stock_id: str = "", start_date: str = "", end_date: str = "", trader_fund: float = 0, fee: float = 0.001425, strategy: Strategy = None, ): self.stock_id = stock_id self.start_date = start_date self.end_date = end_date self.trader_fund = trader_fund self.fee = fee underlying_type = get_asset_underlying_type(stock_id) self.tax = get_underlying_trading_tax(underlying_type) self.trader = Trader( stock_id=stock_id, hold_volume=0, hold_cost=0, trader_fund=trader_fund, fee=self.fee, tax=self.tax, ) self.user_id = user_id self.password = password self.strategy = strategy self.stock_price = pd.DataFrame() self._trade_detail = pd.DataFrame() self._final_stats = pd.Series() self.__init_base_data() self._trade_period_years = convert_period_days2years( calculate_Datenbr(start_date, end_date) + 1 ) self._compare_market_detail = pd.DataFrame() self._compare_market_stats = pd.Series()
def test_calculate_Datenbr(day1, day2, expected): resp = calculate_Datenbr(day1, day2) assert resp == expected