You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:02:43