playbook/docs/tsl/modules/tsbacktesting.md

616 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 策略回测框架 TSBackTesting
文档类型:模块 API 事实页
是否可直接用于生成代码:是,但策略逻辑、交易数据来源、资金参数、费用参数和实际证券池必须来自用户需求或项目上下文
遇到不确定时:[index.md](index.md)、[pytsl_api.md](pytsl_api.md)、[../reference/catalog/datawarehouse.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)` 返回。
- 不要发明股票池、费用、基准、初始资金、调仓周期、成交价来源或结果指标;这些值必须来自用户需求或项目上下文。
## 最小代码骨架
下面骨架用于生成最小可运行结构;策略信号、资金参数和查询指标按用户需求替换。
```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` | 查询结果里的日期按字符串处理;后续日期计算先转换回日期值 |