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