同步回测与tqsdk

This commit is contained in:
2025-07-01 10:14:28 +08:00
parent 70c3b8186a
commit 4c243a4b47
7 changed files with 27641 additions and 25887 deletions

View File

@@ -51,9 +51,14 @@ def calculate_metrics(
total_days = (df_values.index.max() - df_values.index.min()).days
if total_days > 0:
annualized_return = (1 + total_return) ** (252 / total_days) - 1
if total_return > -1:
annualized_return = (1 + total_return) ** (252 / total_days) - 1
else:
annualized_return = -9999999
else:
annualized_return = 0.0
print(f'total_return: {total_return}, annualized_return:{annualized_return}, 252 / total_days:{252 / total_days}')
rolling_max = df_values["total_value"].cummax()
daily_drawdown = (rolling_max - df_values["total_value"]) / rolling_max
@@ -63,7 +68,10 @@ def calculate_metrics(
daily_volatility = excess_daily_returns.std()
if daily_volatility > 0:
sharpe_ratio = np.sqrt(252) * (excess_daily_returns.mean() / daily_volatility)
if total_return > -1:
sharpe_ratio = np.sqrt(252) * (excess_daily_returns.mean() / daily_volatility)
else:
sharpe_ratio = -10
else:
sharpe_ratio = 0.0

View File

@@ -330,6 +330,8 @@ class SimpleLimitBuyStrategyShort(Strategy):
# 只有当有持仓时才考虑平仓
if current_pos_volume < 0: # 假设只做多,所以持仓量 > 0
avg_entry_price = self.get_average_position_price(self.symbol)
self.log(f'avg_entry_price {avg_entry_price}, bar.open {bar.open}')
if avg_entry_price is not None:
pnl_per_unit = (
avg_entry_price - bar.open