def summary(self): """在最后输出简要回测结果""" d = {} balance = self.env.recorder.balance.dataframe() daily_basis_balance = balance.resample('D').last().dropna() initial_balance = balance.values[0][0] end_balance = balance.values[-1][0] total_return = end_balance / initial_balance - 1 max_drawdown = get_max_drawdown(balance) max_drawdown_date = get_max_drawdown_date(balance) max_duration_in_drawdown = get_max_duration_in_drawdown( daily_basis_balance) sharpe_ratio = get_sharpe_ratio(daily_basis_balance) d["Fromdate"] = self.env.fromdate d["Todate"] = self.env.todate d["Initial_Value"] = f'${initial_balance:.2f}' d["Final_Value"] = f'${end_balance:.2f}' d["Total_Return"] = f'{total_return*100:.3f}%' d["Max_Drawdown"] = f'{max_drawdown*100:.3f}%' d["Max_Duration"] = f'{max_duration_in_drawdown} days' d["Max_Drawdown_Date"] = f'{max_drawdown_date}' d["Sharpe_Ratio"] = f'{sharpe_ratio:.2f}' dict_to_table(d)
def check_setting(dict_data, name, check_only=False): if dict_data == {}: print('>' * 10, f'Attention!! There is No {name}!!!', '<' * 10) else: if not check_only: counter = count(1) dict_to_table( {f'{name}_{next(counter)}': key for key in dict_data})
def summary(self): """在最后输出简要回测结果""" total = pd.DataFrame(list(self.env.recorder.balance)) total.set_index("date", inplace=True) pct_returns = total.pct_change() total = total / self.env.recorder.initial_cash max_drawdown, duration = create_drawdowns(total["value"]) initial_cash = self.env.recorder.initial_cash final_value = self.env.recorder.balance.latest() sharpe_ratio = create_sharpe_ratio(pct_returns, len(pct_returns)) d = {} d["Final_Value"] = f'${final_value:.2f}' d["Total_return"] = f'{(final_value/initial_cash-1)*100:.5f}%' d["Max_Drawdown"], d["Duration"] = f'{max_drawdown*100:.5f}%', duration d["Sharpe_Ratio"] = f'{sharpe_ratio:.5f}' print(dict_to_table(d))
def summary2(): analysis = AmazingAnalysis() dict_to_table(analysis.general_summary()) print(analysis.detail_summary())