playbook/docs/tsl/modules/tsbacktesting.md

38 KiB
Raw Blame History

策略回测框架 TSBackTesting

文档类型:模块 API 事实页 是否可直接用于生成代码:是,但策略逻辑、交易数据来源、资金参数、费用参数和实际证券池必须来自用户需求或项目上下文 遇到不确定时:index.mdpytsl_api.md../reference/catalog/datawarehouse.md、项目实际接口定义

本页整理 TSBackTesting 回测框架的对象模型、成员变量、必须重写的方法、交易数据字段和查询接口。它负责告诉智能体“回测框架怎么组织代码、哪些属性控制行为、哪些方法可调用”,不负责替用户创造策略、证券池、费用口径或交易信号。

智能体 TSBackTesting 决策规则

  • 用户要“写回测 / 策略回测 / 回测框架 / 组合回测 / 绩效评价 / 持仓和交易结果”时,优先使用本页。
  • 用户给的是目标持仓、目标比例、调仓、选股、多因子、行业中性,默认 FGroupType := 1
  • 用户给的是成交明细、成交量、成交价、动作、高频交易、真实交易回放,默认 FGroupType := 2
  • 用户做期权或期权组合策略回测时,只使用数量类组合,即 FGroupType := 2
  • 写代码时默认新建 TSBackTesting 子类并重写 GetTradeOrder(vEndT);只有自定义调仓周期时才重写 GetTimeSeries()
  • 初始化对象时默认使用 new MyBackTesting()CreateObject("MyBackTesting") 只作为兼容创建方式。
  • 调用顺序固定为:声明子类 -> 设置成员变量 -> BackTest() -> 查询结果。
  • 不要把 BackTest() 当成会自动生成策略信号;策略信号必须由 GetTradeOrder(vEndT) 返回。
  • 不要发明股票池、费用、基准、初始资金、调仓周期、成交价来源或结果指标;这些值必须来自用户需求或项目上下文。

最小代码骨架

下面骨架用于生成最小可运行结构;策略信号、资金参数和查询指标按用户需求替换。

type MyBackTesting = class(TSBackTesting)
public
    function GetTradeOrder(vEndT); override;
end;

function MyBackTesting.GetTradeOrder(vEndT); override;
begin
    return -1;
end;

function RunBackTest(begT, endT);
begin
    obj := new MyBackTesting();
    obj.FBegT := begT;
    obj.FEndT := endT;
    obj.FCycle := cy_day();
    obj.FGroupType := 1;
    obj.FIniCash := 10000000;
    obj.FIndexId := "SH000300";
    obj.BackTest();
    return array(
        "资产配置": obj.GetAssetData(begT, endT),
        "持仓": obj.GetHoldData(begT, endT),
        "区间收益": obj.GetPortfolioReturn(begT, endT)
    );
end;

返回规则:

  • GetTradeOrder(vEndT) 返回二维数组:表示当前时点的目标持仓或交易明细。
  • GetTradeOrder(vEndT) 返回空数组:比例类组合表示完全清仓。
  • GetTradeOrder(vEndT) 返回 -1:表示当前时点不调仓或不交易。

回测开发流程

步骤 动作 决策点
1 继承 TSBackTesting 必须声明子类
2 重写 GetTradeOrder(vEndT) 必须返回比例类目标持仓或数量类交易明细
3 设置 FBegTFEndTFCycleFGroupTypeFIniCash 等成员变量 按策略类型设置
4 调用 BackTest() 触发时间序列循环、交易数据获取和清算
5 调用查询接口 读取资产、持仓、交易、收益、风险指标

组合类别

FGroupType 组合类别 用户提供 典型场景
1 比例类组合 目标持仓、方向、目标比例;成交量由框架计算 单因子、多因子、行业选股、配置类策略
2 数量类组合 成交明细、成交价、成交量、动作 技术指标、高频交易、真实交易回放、期权组合

交易数据字段

比例类组合字段

FGroupType := 1 时,GetTradeOrder(vEndT) 返回目标持仓和目标比例。

字段 必填 接收类型 说明
截止日 DateTime 通常等于 vEndT
代码 字符串 目标持仓证券代码
方向 整数 1 多单;0 空单;缺省时按多单处理
比例(%) 数值 目标持仓比例;FRateType <> -1 时可由框架按配比方式计算
成交价 数值 比例类通常由 FPriceTypeFPriceRateTo0 决定
乘数 数值 默认 1
保证金比例(%) 数值 默认 100
开仓费率(%) 数值 开仓费率;股票、基金常见默认 0.1
平仓费率(%) 数值 平仓费率;期货常见默认 0.01

比例类方向值:

方向 含义 常见对应
1 多单 股票多头、融资买入、融资偿还、期货买开、期货卖平
0 空单 融券卖出、融券偿还、期货卖开、期货买平

比例类规则:

  • 动作不由用户给定,框架根据目标持仓和当前持仓差值生成交易。
  • FRateType := -1 时,返回数据必须包含 比例(%)
  • 一期比例合计不得超过 100
  • 只想配置 80% 仓位时,直接让比例合计为 80;不要额外添加现金代码。
  • 完全清仓可返回空数组。

数量类组合字段

FGroupType := 2 时,GetTradeOrder(vEndT) 返回交易明细。

字段 必填 接收类型 说明
截止日 DateTime 通常等于 vEndT
代码 字符串 交易证券代码
方向 整数 1 多单;0 空单;缺省时按多单处理
动作 整数 0 开仓;1 平仓;缺省时按开仓处理
成交量 条件必填 数值 FOpenVolType := 1FCloseVolType := 1 时提供
资金 条件必填 数值 FOpenVolType := 2 时提供
剩余资金占比(%) 条件必填 数值 FOpenVolType := 3 时提供
平仓数量占比(%) 条件必填 数值 FCloseVolType := 2 时提供
成交价 数值 交易成交价
乘数 数值 默认 1
保证金比例(%) 数值 默认 100
费率(%) 条件必填 数值 FFeeType := 1 时提供
费用 条件必填 数值 FFeeType := 2 时提供;只适合数量类

数量类方向和动作:

交易含义 方向 动作
买开 / 开多单 1 0
卖平 / 平多单 1 1
卖开 / 开空单 0 0
买平 / 平空单 0 1

股票常见方向和动作:

交易含义 方向 动作
买入、融资买入 1 0
卖出、融资偿还 1 1
融券卖出 0 0
融券偿还 0 1

期权组合策略字段

期权组合策略使用数量类组合。

字段 必填 接收类型 说明
组 ID 字符串 同一组合内成分合约使用同一个组 ID
截止日 DateTime 交易时点
代码 字符串 期权或期货合约代码
方向 整数 1 权利仓或多单;0 义务仓或空单
动作 整数 0 开仓;1 平仓;32 构建期权组合;33 解锁期权组合
成交价 数值 构建、解锁交易中可为任意大于 0 的实数
成交量 数值 合约数量
费率(%)费用 条件必填 数值 FFeeType 决定
乘数 数值 按品种设置
保证金比例(%) 数值 按品种设置
组合类型 条件必填 字符串 组合策略标识,如 CNSJCSTD

期权组合动作:

动作 含义
0 开仓
1 平仓
32 申请构建期权组合策略
33 期权组合策略解锁

成员变量

基本设置

成员变量 类型 默认值 说明
FBegT DateTime 当前系统时间往前推 1 年 回测开始时间
FEndT DateTime 当前系统时间 回测截止时间
FCycle 字符串或周期值 月线 调仓或交易周期
FGroupType 整数 1 1 比例类;2 数量类
FIndexId 字符串 SH000300 基准代码
FIniCash 实数 10000000 初始资金,单位元

成交和费用

成员变量 类型 默认值 取值
FPriceType 整数 3 -1 自定义;1 时点价格;2 收盘价;3 日均价;4 开盘价;5 系统昨收
FPriceType1 整数 3 多头开仓价
FPriceType2 整数 3 多头平仓价
FPriceType3 整数 3 空头开仓价
FPriceType4 整数 3 空头平仓价
FVolModType 整数 -1 0 不取整;-1 按证券类型自适应取整
FFeeType 整数 1 1 费率法;2 费用法
FLowestFeeType 整数 0 0 不考虑最低费用;1 启用最低费用限制
FLowestFee 实数 5.0 最低费用
FOLowestFee 实数 5.0 开仓最低费用
FCLowestFee 实数 5.0 平仓最低费用

取整规则:

FVolModType 股票买入 股票卖出 期货 基金 债券
-1 100 的整数倍 1 的整数倍 1 的整数倍 小数点后三位 10 的整数倍
0 不取整 不取整 不取整 不取整 不取整

比例类专用

成员变量 类型 默认值 说明
FRateType 整数 4 比例类组合配比方式
FSumOfRate 数值 100 比例类配比之和;可用于非满仓
FFeeType2 整数 1 比例类费率来源
FPriceRateTo0 整数 3 自定义成交价且目标持仓没有旧持仓证券时的清仓价类别
FIndustryMethod 整数 0 0 不行业中性;1 行业中性
FIndustryType 整数 1 行业分类
FAdjustPositionPrice 整数 等于 FPriceType 比例类调仓价
FAdjustPriceType 整数 0 0 调仓价等于成交价;1 用户自设调仓价

FRateType 取值:

含义 规则
-1 用户自定义 GetTradeOrder 必须返回 比例(%)
0 总市值加权 按总市值分配
1 流通市值加权 按流通市值分配
4 等权重 每只证券等比例
5 等股数 按等股数分配
6 流通市值平方根加权 按流通市值平方根分配
7 总市值平方根加权 按总市值平方根分配

FPriceRateTo0 取值:

含义
1 时点价格
2 收盘价
3 日均价
4 开盘价
5 系统昨收
-1 用户重写 GetClearancePrice

数量类专用

成员变量 类型 默认值 说明
FOpenVolType 整数 1 开仓数量类别
FCloseVolType 整数 1 平仓数量类别

FOpenVolType 取值:

含义 GetTradeOrder 字段
1 固定成交量法 成交量
2 固定金额法 资金
3 剩余资金占比法 剩余资金占比(%)

FCloseVolType 取值:

含义 GetTradeOrder 字段
1 固定成交量法 成交量
2 可平仓数量占比法 平仓数量占比(%)

分红、配股和止盈止损

成员变量 类型 默认值 说明
FDividendType 整数 0 0 分红不再投资;1 分红再投资;-1 用户重载
FDividendType2 整数 1 货币基金是否分红再投资
FAllotmentType 整数 0 0 不自动参与配股;1 自动参与配股;-1 用户重载
FGLType 整数 -1 -1 不止盈止损;0 低频止盈止损;1 日内止盈止损
FMaxGainRatio 整数 10^8 止盈率,FGLType01 时有效
FMaxLossRatio 整数 -100 止损率,FGLType01 时有效
FMaxGainCondition 字符串 "CBJ" 止盈基准价表达式
FMaxLossCondition 字符串 "CBJ" 止损基准价表达式
FGainName 字符串 "止盈" 止盈交易备注
FLossName 字符串 "止损" 止损交易备注

止盈止损规则:

  • FGLType := 0:低频止盈止损,按交易日判断。
  • FGLType := 1:日内止盈止损,按当前时点价格判断。
  • 期权及期权组合策略不参与止盈止损。

交易约束

成员变量 类型 默认值 说明
FTradeOption 整数 0 0 非交易日可交易;1 非交易日不可交易
FNoZT 整数 0 0 涨停可买入;1 涨停不可买入
FNoDT 整数 0 0 跌停可卖出;1 跌停不可卖出
FNoOverSold 整数 0 0 允许超卖;1 不允许超卖
FPartialjy 整数 0 0 超卖时可部分成交;1 超卖时不可卖出
FMinVol 实数 -1 最小成交量
FMinAmount 实数 -1 最小成交金额
FMaxVolPercent 实数 -1 最大成交量占比
FMaxAmountPercent 实数 -1 最大成交金额占比
FMinBuyVol 实数 -1 最小买入数量
FMinSellVol 实数 -1 最小卖出数量
FMinBuyCash 实数 -1 最小买入金额
FMinSellCash 实数 -1 最小卖出金额
FMinBuyRatio 实数 -1 最小买入占比
FMinSellRatio 实数 -1 最小卖出占比

被交易约束剔除的交易,通过 GetDelTradeData(vBegT, vEndT) 查询。

期权、衍生品和主力合约

成员变量 类型 默认值 说明
FOptionRs 整数 0 0 盘后不自动构成备兑组合;1 盘后自动构成备兑组合
FAMType 整数 0 0 盘中不追加资金;1 盘中追加资金
FAMType2 整数 0 0 盘后不追加资金;1 盘后追加资金
FWithdrawableRatio 数值 100 衍生品可提资金比例
FTradeOfDelist 整数 1 0 到期不自动平仓;1 到期自动平仓
FMainFutureMap 整数 0 0 主力连续合约不映射;1 映射到实际合约交易

输出和基准

成员变量 类型 默认值 说明
FHisFlag 整数 1 0 不输出历史持仓;1 输出历史持仓
FVersionID 整数 1 1 不输出本地;2 每日一个文件;3 所有数据一个文件
FDestDir 字符串 "C:\\Test\\MyPortfolio\\" 本地输出目录
FDateToStr 整数 0 0 日期型;1 查询结果日期转字符串
FHFDataOutPut 整数 0 0 不输出高频每周期清算数据;1 输出
FisCashToAdjust 整数 0 0 不调整;1 现金小于 0 时调整买入量
FOrdertype 整数 3 买入量调整顺序
FBMType 整数 0 0 单一基准;1 复合基准
FBMDetail 数组 array() 复合基准成分,字段为 代码比例(%)
FBMOption 整数 0 0 累乘;1 累加

FOrdertype 取值:

资金分配顺序
0 资金先分配给符合交易约束的买入交易
1 按交易约束后的交易顺序分配
2 比例类按目标比例从小到大;数量类按成交金额从小到大
3 比例类按目标比例从大到小;数量类按成交金额从大到小

复合基准示例:

obj.FBMType := 1;
obj.FBMDetail := array(
    ("代码": "SH000001", "比例(%)": 40),
    ("代码": "SH000300", "比例(%)": 60)
);
obj.FBMOption := 0;

成员方法

BackTest()

用途:回测主函数。

参数个数0 返回值:数组;结果读取通常通过查询接口完成。

参数位置 参数名 必填 接收类型 说明

执行行为:

  1. 调用 GetTimeSeries() 获取回测时间序列。
  2. 对每个时间点调用 GetTradeOrder(vEndT)
  3. 根据交易数据、当前持仓、资产、费用和约束清算。
  4. 生成最新持仓、资产配置和绩效数据。

GetTimeSeries()

用途:获取调仓或交易时间序列。

参数个数0 返回值:一维时间序列数组。

参数位置 参数名 必填 接收类型 说明

重写规则:

  • 基类默认按 FBegTFEndTFCycle 生成市场交易日序列。
  • 自定义调仓日、事件驱动调仓、非固定周期交易时重写。
  • 比例类组合返回需要发生调仓的时点。
  • 数量类组合返回需要发生交易的时点。

GetTradeOrder(vEndT)

用途:获取当前时点目标持仓或交易明细。

参数个数1 返回值:二维数组、空数组或 -1

参数位置 参数名 必填 接收类型 说明
1 vEndT DateTime 当前调仓或交易时点,由 BackTest()GetTimeSeries() 结果传入

重写规则:

  • 必须在子类中重写。
  • 不要在 GetTradeOrder(vEndT) 中修改 vEndT
  • 如果要使用历史区间,从 vEndT 推导,例如 stockzf(incMonth(vEndT, -1), vEndT)

可重写方法

方法 参数个数 返回值 用途
GetTA(vEndT) 1 二维数组 获取申购赎回、资金转入转出数据
StockFee(stockId, vEndT, actionId, position) 4 实数 获取证券交易费率
GetPercent(t, vEndT) 2 二维数组 比例类组合中计算目标持仓比例
ReturnBenchmark(vBegT, vEndT, t) 3 二维数组 获取区间基准收益率序列;复合基准或高频基准可重写
GetOtherData(vEndT) 1 二维数组 自定义分红、送股、配股数据
GetClearancePrice(t, vEndT, ptype) 3 实数 比例类自定义清仓价
GetIntVol(stype, actionId, modType, vJYSL) 4 实数 自定义成交量取整

当前状态读取方法

方法 参数个数 返回值 用途
GetSurplusFund() 0 实数 最新剩余资金
GetNetAssetValue() 0 实数 最新资产净值
GetAssetData() 0 二维数组 最新资产配置
GetAssetJZValue() 0 实数 最新单位净值
GetHoldData() 0 二维数组 最新持仓
GetSellpool() 0 二维数组 当前可卖品种和数量
CalcashByTradeData(tjy) 1 一维数组 根据指定日交易数据计算交易资金变动和交易后剩余资金

GetTA(vEndT) 返回字段:

字段 必填 接收类型 说明
截止日 DateTime 资金发生日期
业务类型 整数 2 出金;3 入金
成交金额 数值 出入金额
备注 字符串 出金或入金说明

GetOtherData(vEndT) 返回字段:

字段 必填 接收类型 说明
截止日 DateTime 事件日期
代码 字符串 证券代码
方向 整数 1 多单;0 空单
动作 整数 2 分红;3 送股;4 配股
成交量 数值 动作为 2 时为 0
成交价 数值 动作为 23 时为 0
成交金额 数值 分红金额或配股金额
乘数 数值 默认 1
保证金比例(%) 数值 默认 100
费率(%) 数值 默认 0
备注 字符串 分红、配股等说明

查询接口

资产和持仓

方法 参数个数 返回值 用途
GetAssetData(vEndT) 1 二维数组 指定日资产配置
GetAssetData(vBegT, vEndT) 2 二维数组 区间资产配置
GetAssetJZData(vEndT) 1 实数 指定日单位净值
GetAssetJZData(vBegT, vEndT) 2 二维数组 区间单位净值
GetHoldData(vEndT) 1 二维数组 指定日持仓
GetHoldData(vBegT, vEndT) 2 二维数组 区间持仓
GetOptionGroupData() 0 二维数组 当前期权组合持仓
GetOptionGroupData(vEndT) 1 二维数组 指定日期权组合持仓
GetOptionGroupData(vBegT, vEndT) 2 二维数组 区间期权组合持仓

交易和剔除数据

方法 参数个数 返回值 用途
GetTradeData(vBegT, vEndT) 2 二维数组 区间交易数据
GetDelTradeData(vBegT, vEndT) 2 二维数组 被成交量约束、交易约束、期权组合构建或解锁失败剔除的交易
GetTAData(vBegT, vEndT) 2 二维数组 区间资金进出数据
GetPortfolioPercent(vBegT, vEndT) 2 二维数组 区间组合配比;比例类专用
GetJyByPercent(pfInfoData, tPercent) 2 二维数组 根据 T-1 调整后持仓和 T 日目标比例生成 T 日交易

盈亏和收益

方法 参数个数 返回值 用途
GetGainandLoss(vBegT, vEndT) 2 二维数组 区间组合、分类资产每日盈亏和累计盈亏
GetTradingAmount(vBegT, vEndT) 2 二维数组 区间每日买入、卖出、分红、净买卖金额
GetGainandLossBySecurity(vBegT, vEndT) 2 二维数组 区间按个券汇总盈亏
GetTradingAmountBySecurity(vBegT, vEndT) 2 二维数组 区间按个券汇总交易金额
GetPortfolioReturn() 0 实数 最新组合收益率
GetPortfolioReturn(vBegT, vEndT) 2 实数 区间组合收益率
GetPortfolioAccumulativeReturn() 0 实数 组合成立以来收益率
GetPortfolioReturn2(vBegT, vEndT) 2 二维数组 区间组合和基准每日收益率序列
GetTrailingReturn(vEndT) 1 二维数组 指定日阶段收益率
GetRollingReturn(vBegT, vEndT, cy) 3 二维数组 区间滚动收益率
GetStockBuyandHoldReturn(vBegT, vEndT) 2 二维数组 区间持仓不动收益和交易贡献
GetIRRReturn(vBegT, vEndT, vAnnual) 3 实数 区间现金流内部收益率

风险评价和行业配置

方法 参数个数 返回值 用途
GetSectorAllocation(vEndT) 1 二维数组 指定日行业配置
GetReturnandRisk(vBegT, vEndT) 2 二维数组 区间累计收益、标准差、夏普等风险回报
GetRelativePerformance(vBegT, vEndT) 2 二维数组 区间超额收益、alpha、beta、跟踪误差等相对表现

通用日期参数:

参数位置 参数名 必填 接收类型 说明
1 vBegT 视签名而定 DateTime 开始日
2 vEndT 视签名而定 DateTime 截止日

查询结果关键字段

GetAssetData

字段 说明
截止日 资产配置日期
现金市值 当前现金
股票市值 股票资产市值
基金市值 基金资产市值
债券市值 债券资产市值
金融衍生品市值 金融衍生品保证金市值
资产净值 组合资产净值
股票占净值比例(%) 股票市值 / 资产净值 * 100
现金占净值比例(%) 现金市值 / 资产净值 * 100

GetHoldData

字段 说明
组 ID 期权组合或组合持仓标识;全为空时不返回
截止日 持仓日期
代码 证券代码
方向 多单或空单
数量 持仓数量
收盘 收盘价格
市值 收盘 * 数量
保证金占用 收盘 * 数量 * 保证金比例
占净值比例(%) 保证金占用 / 资产净值 * 100
总成本 持仓总成本
成本价 持仓成本价
浮动盈亏 市值 - 总成本
浮盈率(%) 浮动盈亏 / 总成本
证券类别 证券类型
行业名称 行业分类名称
组合类型 期权组合策略类型;全为空时不返回

GetTradeData

字段 说明
组 ID 期权组合或组合交易标识
截止日 交易日期
代码 证券代码
名称 证券名称
方向 多单或空单
动作 开仓、平仓、构建、解锁等
成交价 成交价格
成交量 成交数量
费率(%) 交易费率
成交金额(税前) 成交价 * 成交量
费用 手续费
成交金额 税后成交金额
组合类型 期权组合策略类型
备注 交易备注
止盈止损基准价 有止盈止损交易时可能返回
止盈止损成交价 有止盈止损交易时可能返回

常见专项规则

高频回测

  • 高频策略通常设置 FCycle 为分钟线或秒线周期。
  • 高频策略若要以当前时点价格成交,设置 FPriceType := 1
  • 高频回测需要返回每个周期清算数据时,设置 FHFDataOutPut := 1
  • 高频并且重写 ReturnBenchmark 时,基准收益率也要按每个时点计算。

现金不足调整

  • 全股票组合经过涨停、跌停、停牌、超卖、最大最小成交量和成交金额约束后,如果可用资金小于 0,可设置 FisCashToAdjust := 1
  • FOrdertype 决定买入量调整顺序。
  • 调整后仍应通过 GetAssetData() 检查现金市值。

主力连续合约

  • FMainFutureMap := 0 时,不对期货主力连续合约做映射。
  • FMainFutureMap := 1 时,将主力连续合约映射到当时实际合约。
  • 比例类组合中,主力变更日若是调仓日,以当日调仓数据为准。
  • 数量类组合中,主力变更日无论是否为交易时点,都需要处理主力换仓交易。

自定义成交价

  • 比例类目标持仓使用自定义成交价时,设置 FPriceType := -1
  • GetTradeOrder(vEndT) 返回目标持仓中可提供 成交价
  • 原持仓证券在本期目标持仓中不存在时,清仓价由 FPriceRateTo0 决定。
  • FPriceRateTo0 := -1 时,重写 GetClearancePrice(t, vEndT, ptype)

缺失输入处理

情况 生成处理
只有“写回测框架”,没有策略逻辑 生成 TSBackTesting 子类骨架,GetTradeOrder(vEndT) 先返回 -1
没有证券池、调仓规则或交易明细 只生成框架和参数入口,不生成具体交易信号
没有期权需求 使用比例类或数量类普通字段,不加入期权组合字段
FGroupType := 1 GetTradeOrder(vEndT) 返回目标持仓和目标比例字段
FGroupType := 2 GetTradeOrder(vEndT) 返回成交明细、成交价、成交量和动作字段
高频且要求当前时点价格成交 设置 FPriceType := 1
FDateToStr := 1 查询结果里的日期按字符串处理;后续日期计算先转换回日期值