# 策略回测框架 TSBackTesting

文档类型：模块 API 事实页
是否可直接用于生成代码：是，但策略逻辑、交易数据来源、资金参数、费用参数和实际证券池必须来自用户需求或项目上下文
遇到不确定时：[index.md](index.md)、[pytsl_api.md](pytsl_api.md)、`tsl-api-reference` skill、项目实际接口定义

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

## 智能体 TSBackTesting 决策规则

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

## 最小代码骨架

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

```tsl
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    | 设置 `FBegT`、`FEndT`、`FCycle`、`FGroupType`、`FIniCash` 等成员变量 | 按策略类型设置                         |
| 4    | 调用 `BackTest()`                                                    | 触发时间序列循环、交易数据获取和清算   |
| 5    | 调用查询接口                                                         | 读取资产、持仓、交易、收益、风险指标   |

## 组合类别

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

## 交易数据字段

### 比例类组合字段

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

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

比例类方向值：

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

比例类规则：

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

### 数量类组合字段

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

| 字段              | 必填     | 接收类型   | 说明                                               |
| ----------------- | -------- | ---------- | -------------------------------------------------- |
| `截止日`          | 是       | `DateTime` | 通常等于 `vEndT`                                   |
| `代码`            | 是       | 字符串     | 交易证券代码                                       |
| `方向`            | 是       | 整数       | `1` 多单；`0` 空单；缺省时按多单处理               |
| `动作`            | 是       | 整数       | `0` 开仓；`1` 平仓；缺省时按开仓处理               |
| `成交量`          | 条件必填 | 数值       | `FOpenVolType := 1` 或 `FCloseVolType := 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` 决定                                       |
| `乘数`              | 否       | 数值       | 按品种设置                                               |
| `保证金比例(%)`     | 否       | 数值       | 按品种设置                                               |
| `组合类型`          | 条件必填 | 字符串     | 组合策略标识，如 `CNSJC`、`STD` 等                       |

期权组合动作：

| 动作 | 含义                 |
| ---- | -------------------- |
| `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`   | 止盈率，`FGLType` 为 `0` 或 `1` 时有效              |
| `FMaxLossRatio`     | 整数   | `-100`   | 止损率，`FGLType` 为 `0` 或 `1` 时有效              |
| `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` | 比例类按目标比例从大到小；数量类按成交金额从大到小 |

复合基准示例：

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

## 成员方法

### `BackTest()`

用途：回测主函数。

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

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

执行行为：

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

### `GetTimeSeries()`

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

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

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

重写规则：

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

### `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`          |
| `成交价`        | 是   | 数值       | 动作为 `2`、`3` 时为 `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`              | 查询结果里的日期按字符串处理；后续日期计算先转换回日期值          |
