如何用vectorbt(From_Signal)或backtesting.py以绝对点数展示股指期货回测结果
用vectorbt(From_Signal)和backtesting.py实现股指期货绝对点数回测结果展示
针对股指期货每点对应固定收益的场景,以下是两种工具的具体实现方案,核心思路是用价格差×交易方向×每点固定金额替代默认的百分比收益计算:
vectorbt (From_Signal) 实现方式
vectorbt默认以相对收益展示结果,我们可以通过提取交易的入场/出场价格手动计算绝对点数收益,或者直接修改持仓收益的计算逻辑:
import vectorbt as vbt import pandas as pd # 定义每点固定收益(示例为沪深300股指期货每点300元) POINT_VALUE = 300 # 加载股指期货收盘价数据(替换为你的真实数据) price_data = pd.Series( [4000, 4010, 4025, 4018, 4030, 4040], index=pd.date_range('2024-01-01', periods=6) ) # 交易信号:1=做多,-1=做空,0=平仓(替换为你的策略信号) signals = pd.Series( [0, 1, 0, -1, 0, 1], index=price_data.index ) # 基于信号创建策略 strategy = vbt.Portfolio.from_signals(price_data, signals) # 方法1:计算每笔交易的绝对点数收益 trade_pnl_list = [] # 提取所有入场和出场的索引 entry_indices = strategy.entries.index[strategy.entries] exit_indices = strategy.exits.index[strategy.exits] for entry_idx, exit_idx in zip(entry_indices, exit_indices): entry_price = price_data.loc[entry_idx] exit_price = price_data.loc[exit_idx] # 根据入场信号方向计算点数差 direction = signals.loc[entry_idx] point_diff = (exit_price - entry_price) * direction trade_pnl_list.append(point_diff * POINT_VALUE) total_absolute_pnl = sum(trade_pnl_list) print(f"总绝对点数收益(元): {total_absolute_pnl}") # 方法2:直接修改每日持仓收益为绝对点数收益 daily_absolute_pnl = strategy.positions.value.diff().dropna() * POINT_VALUE print("每日绝对收益明细(元):\n", daily_absolute_pnl)
backtesting.py 实现方式
backtesting.py的默认收益计算也是基于百分比,我们可以在策略类中自定义收益计算逻辑,或者遍历交易记录统计绝对点数收益:
from backtesting import Backtest, Strategy from backtesting.lib import crossover import pandas as pd # 定义每点固定收益 POINT_VALUE = 300 # 加载股指期货OHLC数据(替换为你的真实数据) data = pd.DataFrame({ 'Open': [4000, 4010, 4025, 4018, 4030, 4040], 'High': [4015, 4020, 4030, 4022, 4035, 4045], 'Low': [3995, 4005, 4020, 4010, 4025, 4035], 'Close': [4010, 4020, 4022, 4020, 4035, 4045] }, index=pd.date_range('2024-01-01', periods=6)) class PointBasedStrategy(Strategy): def init(self): # 示例:用均线交叉生成交易信号(替换为你的策略逻辑) self.sma_short = self.I(lambda x: x.rolling(2).mean(), self.data.Close) self.sma_long = self.I(lambda x: x.rolling(3).mean(), self.data.Close) def next(self): if crossover(self.sma_short, self.sma_long): self.buy() elif crossover(self.sma_long, self.sma_short): self.sell() def get_absolute_pnl(self): # 自定义方法:计算总绝对点数收益 total_pnl = 0 for trade in self.trades: direction = 1 if trade.is_long else -1 point_diff = (trade.exit_price - trade.entry_price) * direction total_pnl += point_diff * POINT_VALUE return total_pnl # 运行回测(cash设为0,因为股指期货按保证金交易,这里只统计点数收益) bt = Backtest(data, PointBasedStrategy, cash=0, commission=0) stats = bt.run() # 获取自定义绝对收益并添加到回测统计中 total_absolute_pnl = stats._strategy.get_absolute_pnl() stats['Total Absolute PnL (CNY)'] = total_absolute_pnl print(f"总绝对点数收益(元): {total_absolute_pnl}") print("\n回测统计详情:\n", stats)
关键注意点
- 确保交易信号的方向(做多/做空)与点数差计算逻辑匹配,避免收益符号错误
- 每点固定金额需根据你交易的股指期货品种调整(比如中证500股指期货每点200元)
- 若需考虑手续费、滑点等成本,可在计算收益时直接扣除对应金额
内容的提问来源于stack exchange,提问作者Likey Fung
相关产品推荐
相关产品推荐

