Skip to content

Commit

Permalink
[Mod] 增加对回测过程中资金爆仓(小于等于0)情况的检查
Browse files Browse the repository at this point in the history
  • Loading branch information
vnpy committed Oct 20, 2022
1 parent 767ed8c commit 36b7858
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 30 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# 1.1.2版本
1. 增加对回测过程中资金爆仓(小于等于0)情况的检查

# 1.1.1版本

1. 使用zoneinfo替换pytz库
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
</p>

<p align="center">
<img src ="https://img.shields.io/badge/version-1.1.1-blueviolet.svg"/>
<img src ="https://img.shields.io/badge/version-1.1.2-blueviolet.svg"/>
<img src ="https://img.shields.io/badge/platform-windows|linux|macos-yellow.svg"/>
<img src ="https://img.shields.io/badge/python-3.7|3.8|3.9|3.10-blue.svg" />
<img src ="https://img.shields.io/github/license/vnpy/vnpy.svg?color=orange"/>
Expand Down
67 changes: 38 additions & 29 deletions vnpy_ctastrategy/backtesting.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,35 +311,37 @@ def calculate_statistics(self, df: DataFrame = None, output=True) -> dict:
if df is None:
df: DataFrame = self.daily_df

# Check for init DataFrame
if df is None:
# Set all statistics to 0 if no trade.
start_date: str = ""
end_date: str = ""
total_days: int = 0
profit_days: int = 0
loss_days: int = 0
end_balance: float = 0
max_drawdown: float = 0
max_ddpercent: float = 0
max_drawdown_duration: int = 0
total_net_pnl: float = 0
daily_net_pnl: float = 0
total_commission: float = 0
daily_commission: float = 0
total_slippage: float = 0
daily_slippage: float = 0
total_turnover: float = 0
daily_turnover: float = 0
total_trade_count: int = 0
daily_trade_count: int = 0
total_return: float = 0
annual_return: float = 0
daily_return: float = 0
return_std: float = 0
sharpe_ratio: float = 0
return_drawdown_ratio: float = 0
else:
# Init all statistics default value
start_date: str = ""
end_date: str = ""
total_days: int = 0
profit_days: int = 0
loss_days: int = 0
end_balance: float = 0
max_drawdown: float = 0
max_ddpercent: float = 0
max_drawdown_duration: int = 0
total_net_pnl: float = 0
daily_net_pnl: float = 0
total_commission: float = 0
daily_commission: float = 0
total_slippage: float = 0
daily_slippage: float = 0
total_turnover: float = 0
daily_turnover: float = 0
total_trade_count: int = 0
daily_trade_count: int = 0
total_return: float = 0
annual_return: float = 0
daily_return: float = 0
return_std: float = 0
sharpe_ratio: float = 0
return_drawdown_ratio: float = 0

# Check if balance is always positive
positive_balance: bool = False

if df is not None:
# Calculate balance related time series data
df["balance"] = df["net_pnl"].cumsum() + self.capital

Expand All @@ -357,6 +359,13 @@ def calculate_statistics(self, df: DataFrame = None, output=True) -> dict:
df["drawdown"] = df["balance"] - df["highlevel"]
df["ddpercent"] = df["drawdown"] / df["highlevel"] * 100

# All balance value needs to be positive
positive_balance = (df["balance"] > 0).all()
if not positive_balance:
self.output("回测中出现爆仓(资金小于等于0),无法计算策略统计指标")

# Calculate statistics value
if positive_balance:
# Calculate statistics value
start_date = df.index[0]
end_date = df.index[-1]
Expand Down

0 comments on commit 36b7858

Please sign in to comment.