616 lines
38 KiB
Markdown
616 lines
38 KiB
Markdown
# 策略回测框架 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` | 查询结果里的日期按字符串处理;后续日期计算先转换回日期值 |
|