# 回测 / 策略回测

## `tsBackTesting`

声明：class

执行策略历史回测，并查询资产、持仓、交易、收益与绩效结果

<!-- tags: 调用 业绩表现 历史模拟 策略验证 仓位 买卖 交易策略 绩效评估 -->

### `FBegT`

声明：field

回测开始时间 从当前系统时间往前推 1 年

可见性：`public`

类型：date_time

### `FEndT`

声明：field

回测截止时间 当前系统时间

可见性：`public`

类型：date_time

### `FCycle`

声明：field

调仓周期 月线

可见性：`public`

类型：string

### `FGroupType`

声明：field

组合类型 1：比例类组合

可见性：`public`

类型：integer

### `FIndexId`

声明：field

基准代码 SH000300

可见性：`public`

类型：string

### `FIniCash`

声明：field

初始资金 100,000,000 元

可见性：`public`

类型：real

### `FAccountingCycle`

声明：field

清算周期 1：沪深交易日序列

可见性：`public`

类型：integer

### `FPriceType`

声明：field

成交价类别 3：日均价

可见性：`public`

类型：integer

### `FFeeType`

声明：field

费用类别 1：费率法

可见性：`public`

类型：integer

### `FRateType`

声明：field

比例类组合资金分配方式 4：等权重

可见性：`public`

类型：integer

### `FIndustryMethod`

声明：field

是否进行行业中性处理 0：不进行行业中性处理

可见性：`public`

类型：integer

### `FIndustryType`

声明：field

行业分类 1：申万一级行业

可见性：`public`

类型：integer

### `FSumOfRate`

声明：field

证券配比之和 100

可见性：`public`

类型：numeric

### `FFeeType2`

声明：field

比例类费率 1： 历史明细中查找开、 平仓费率

可见性：`public`

类型：integer

### `FPriceRateTo0`

声明：field

比例类成交价 3：日均价

可见性：`public`

类型：integer

### `FDividendType`

声明：field

是否分红再投资 0：分红不再投资

可见性：`public`

类型：integer

### `FDividendToAccount`

声明：field

股票分红到账日类型 1：除权除息日

可见性：`public`

类型：integer

### `FDividendType2`

声明：field

货币基金自动分红再投资 1：分红再投资

可见性：`public`

类型：integer

### `FAllotmentType`

声明：field

是否参与配股 0：不自动参与配股

可见性：`public`

类型：integer

### `FglType`

声明：field

止盈止损类型 -1：不考虑止盈止损

可见性：`public`

类型：integer

### `FMaxGainRatio`

声明：field

止盈率(%) 10^8

可见性：`public`

类型：integer

### `FMaxLossRatio`

声明：field

止损率(%) -100

可见性：`public`

类型：integer

### `FMaxGainCondition`

声明：field

止盈基准价表达式 CBJ：成本价

可见性：`public`

类型：string

### `FMaxLossCondition`

声明：field

止损基准价表达式 CBJ：成本价

可见性：`public`

类型：string

### `FLowestFeeType`

声明：field

最低费用限制类别 0：不考虑最低费用限制

可见性：`public`

类型：integer

### `FLowestFee`

声明：field

最低费用 5.0

可见性：`public`

类型：real

### `FoLowestFee`

声明：field

开仓最低费用 5.0

可见性：`public`

类型：real

### `FcLowestFee`

声明：field

平仓最低费用 5.0

可见性：`public`

类型：real

### `FamType`

声明：field

盘中是否追加资金 0：盘中不追加资金

可见性：`public`

类型：integer

### `FamType2`

声明：field

盘后是否追加资金 0：盘后不追加资金

可见性：`public`

类型：integer

### `FTradeOfDelist`

声明：field

到期自动平仓 1：到期自动平仓

可见性：`public`

类型：integer

### `FbmType`

声明：field

基准类型 0：单个基准

可见性：`public`

类型：integer

### `FbmDetail`

声明：field

复合基准成分详情 Array()

可见性：`public`

类型：array

### `FbmOption`

声明：field

累计收益率计算方法 0：累乘

可见性：`public`

类型：integer

### `FWithdrawableRatio`

声明：field

衍生品可提资金比例(%) 100

可见性：`public`

类型：real

### `FTradeOption`

声明：field

非交易日是否可以交易 0：可交易

可见性：`public`

类型：integer

### `FNoZT`

声明：field

涨停是否买入 0：涨停可买入

可见性：`public`

类型：integer

### `FNoDT`

声明：field

跌停是否卖出 0：跌停可卖出

可见性：`public`

类型：integer

### `FMinAmount`

声明：field

最小成交金额 -1：不考虑最小成交金额

可见性：`public`

类型：real

### `FMaxAmountPercent`

声明：field

最大成交金额占比(%) -1：不考虑最大成交金额占比

可见性：`public`

类型：real

### `FMinBuyCash`

声明：field

最小买入金额 -1：不考虑最小买入金额

可见性：`public`

类型：real

### `FMinSellCash`

声明：field

最小卖出金额 -1：不考虑最小卖出金额

可见性：`public`

类型：real

### `FMinBuyRatio`

声明：field

最小买入占比(%) -1：不考虑最小买入占比

可见性：`public`

类型：real

### `FMinSellRatio`

声明：field

最小卖出占比(%) -1：不考虑最小卖出占比

可见性：`public`

类型：real

### `FNoOverSold`

声明：field

是否允许超卖 0：允许超卖

可见性：`public`

类型：integer

### `FPartialjy`

声明：field

超卖时是否可以部分成交 0：超卖时可以部分成交

可见性：`public`

类型：integer

### `FSettlCurrency`

声明：field

结算币种 CNY

可见性：`public`

类型：string

### `FExchangeRateType`

声明：field

清算汇率类型 2：对应市场结算汇率中间价

可见性：`public`

类型：integer

### `FjyExchangeRatetype`

声明：field

交易汇率类型 2：对应市场买、结算汇率

可见性：`public`

类型：integer

### `FfhExchangeRatetype`

声明：field

分红汇率类型 2：对应市场结算汇率中间价

可见性：`public`

类型：integer

### `FDealAssetInDebt`

声明：field

是否自动处理负债 0：不处理

可见性：`public`

类型：integer

### `FPortfolioStartDate`

声明：field

组合开始时间 FBegT

可见性：`public`

类型：date_time

### `FManagementFee`

声明：field

管理费率(%) 0

可见性：`public`

类型：real

### `FCustodyFee`

声明：field

托管费率(%) 0

可见性：`public`

类型：real

### `FManagementFeePayCycle`

声明：field

管理费支付周期 月线

可见性：`public`

类型：string

### `FCustodyFeePayCycle`

声明：field

托管费支付周期 月线

可见性：`public`

类型：string

### `FPortfolioFee`

声明：field

港股通证券组合费清算 0：不清算

可见性：`public`

类型：integer

### `BackTest()`

声明：function

执行策略回测主流程，循环调仓时点、生成交易数据并完成清算

<!-- tags: 历史模拟 策略验证 清算 -->

可见性：`public`

返回：array

### `GetTimeSeries()`

声明：function

获取调仓周期时间序列；可按策略需要重写

<!-- tags: 查询 调仓周期 时序 -->

可见性：`public`

返回：array

#### 示例

范例01：调用基类实现

```tsl
obj := createObject("tsBackTesting");
obj.FBegT := intToDate(20130101);
obj.FEndT := intToDate(20130108);
obj.FCycle := cy_day();
ret := obj.GetTimeSeries();
echo toStn(ret);
return ret;
// 输出：array(41278.0,41281.0,41282.0)
```

### `GetTradeOrder(v_end_t)`

声明：function

获取当前时点的目标持仓或成交明细；策略子类必须重写

<!-- tags: 查询 成交明细 交易指令 -->

可见性：`public`

| 参数      | 类型      | 说明           |
| --------- | --------- | -------------- |
| `v_end_t` | date_time | 日期，当前时点 |

返回：array

### `GetTA(v_end_t)`

声明：function

获取指定交易日的申购赎回与资金进出数据；可重写

<!-- tags: 查询 申购赎回 资金进出 -->

可见性：`public`

| 参数      | 类型      | 说明           |
| --------- | --------- | -------------- |
| `v_end_t` | date_time | 日期，当前时点 |

返回：array

### `GetSurplusFund()`

声明：function

获取当前交易发生前的组合剩余可用资金

<!-- tags: 查询 剩余资金 可用资金 -->

可见性：`public`

返回：float

### `GetNetAssetValue()`

声明：function

获取当前交易发生前的组合资产净值

<!-- tags: 查询 资产净值 净资产 -->

可见性：`public`

返回：float

### `GetAssetData()`

声明：function

获取组合资产净值、分类资产市值及其占净值比例

<!-- tags: 查询 资产配置 组合资产 -->

可见性：`public`

返回：array

### `GetHoldData()`

声明：function

获取当前或指定区间的组合持仓明细

<!-- tags: 查询 持仓 仓位 -->

可见性：`public`

返回：array

### `GetSellpool()`

声明：function

获取当前可卖证券及可卖数量

<!-- tags: 查询 可卖品种 可卖数量 -->

可见性：`public`

返回：array

### `StockFee(stock_id, v_end_t, actionid, position)`

声明：function

当用户没有给交易费率时，回测框架可通过该接口获取默认的交易费率。默认情况下，该接

<!-- tags: 查询 历史模拟 策略验证 买卖 交易策略 证券 个股 -->

可见性：`public`

| 参数       | 类型     | 说明     |
| ---------- | -------- | -------- |
| `stock_id` | string   | 证券代码 |
| `v_end_t`  | datetime | 截止日   |
| `actionid` | integer  | 动作     |
| `position` | integer  | 方向     |

返回：real

### `CalcashByTradeData(tjy)`

声明：function

根据用户给出的指定日的交易数据，回测框架会自动根据指定日的前一交易日的持仓、当前

<!-- tags: 历史模拟 策略验证 仓位 买卖 交易策略 -->

可见性：`public`

| 参数  | 类型  | 说明       |
| ----- | ----- | ---------- |
| `tjy` | array | 交易数据； |

返回：array

### `GetPercent(t, v_end_t)`

声明：function

获取目标持仓比例数据

<!-- tags: 查询 目标持仓 组合权重 -->

可见性：`public`

| 参数      | 类型     | 说明               |
| --------- | -------- | ------------------ |
| `t`       | array    | 目标持仓，二维数组 |
| `v_end_t` | datetime | 日期，当前时点     |

### `GetAssetJZValue()`

声明：function

获取当前组合单位净值

<!-- tags: 查询 单位净值 组合净值 -->

可见性：`public`

返回：float

### `ReturnBenchmark(v_beg_t, v_end_t, t)`

声明：function

获取指定区间的基准收益率序列；可重写

<!-- tags: 查询 基准收益率 业绩基准 -->

可见性：`public`

| 参数      | 类型     | 说明               |
| --------- | -------- | ------------------ |
| `v_beg_t` | datetime | 开始日             |
| `v_end_t` | datetime | 截止日             |
| `t`       | array    | 组合净值收益率序列 |

返回：array

### `GetOtherData(v_end_t)`

声明：function

获取分红送股、配股等公司行动数据；可重写

<!-- tags: 查询 分红送股 配股 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetClearancePrice(t, v_end_t, ptype)`

声明：function

获取清仓证券的成交价格；可重写

<!-- tags: 查询 清仓价格 成交价 -->

可见性：`public`

| 参数      | 类型     | 说明                             |
| --------- | -------- | -------------------------------- |
| `t`       | array    | 策略生成的持仓、交易或收益数据   |
| `v_end_t` | datetime | 当前计算日期或查询区间的结束日期 |
| `ptype`   | integer  | 价格类型或价格选择模式           |

返回：real

### `GetIntVol(stype, actionid, mod_type, v_jysl)`

声明：function

按证券类别、交易动作和取整模式计算成交量

<!-- tags: 计算 成交量取整 交易数量 -->

可见性：`public`

| 参数       | 类型    | 说明                                                                                                      |
| ---------- | ------- | --------------------------------------------------------------------------------------------------------- |
| `stype`    | integer | 证券类别，整数                                                                                            |
| `actionid` | integer | 证券交易动作，整数                                                                                        |
| `mod_type` | integer | 成交量取整模式 实际值 含义 备注 0 成交量不取整 -1 成交量自适应取整 根据证券类型的不同，采取不同的取整模式 |
| `v_jysl`   | real    | 证券交易数量，实数                                                                                        |

返回：real

### `GetAccountDateArr()`

声明：function

获取清算日期时间序列；可按账户市场重写

<!-- tags: 查询 清算日 时序 -->

可见性：`public`

返回：array

### `GetLastAccountDay(end_t)`

声明：function

获取当前清算日的上一清算日；可重写

<!-- tags: 查询 上一清算日 交易日期 -->

可见性：`public`

| 参数    | 类型     | 说明                             |
| ------- | -------- | -------------------------------- |
| `end_t` | datetime | 查询区间的结束日期或当前计算日期 |

返回：array

### `GetManageFeeTimeSeries()`

声明：function

获取管理费支付日期序列；可重写

<!-- tags: 查询 管理费 支付周期 -->

可见性：`public`

返回：array

### `GetCustodyFeeTimeSeries()`

声明：function

获取托管费支付日期序列；可重写

<!-- tags: 查询 托管费 支付周期 -->

可见性：`public`

返回：array

### `GetRZRQInterestRate(v_end_t)`

声明：function

获取指定日融资利率和融券利率；可重写

<!-- tags: 查询 融资利率 融券利率 -->

可见性：`public`

| 参数      | 类型     | 说明                             |
| --------- | -------- | -------------------------------- |
| `v_end_t` | datetime | 当前计算日期或查询区间的结束日期 |

返回：array

### `GetAssetData(v_end_t)`

声明：function

获取组合资产净值、分类资产市值及其占净值比例

<!-- tags: 查询 资产配置 组合资产 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetAssetData(v_beg_t, v_end_t)`

声明：function

获取组合资产净值、分类资产市值及其占净值比例

<!-- tags: 查询 资产配置 组合资产 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetHoldData(v_end_t)`

声明：function

获取当前或指定区间的组合持仓明细

<!-- tags: 查询 持仓 仓位 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetHoldData(v_beg_t, v_end_t)`

声明：function

获取当前或指定区间的组合持仓明细

<!-- tags: 查询 持仓 仓位 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetDelTradeData(v_beg_t, v_end_t)`

声明：function

获取回测中被剔除或未执行的交易明细

<!-- tags: 查询 剔除交易 交易明细 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetSectorAllocation(v_end_t)`

声明：function

获取指定日股票类资产按行业汇总的市值配置

<!-- tags: 查询 行业配置 市值汇总 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetGainandLoss(v_beg_t, v_end_t)`

声明：function

获取区间组合及分类资产的每日和累计盈亏

<!-- tags: 查询 盈亏 损益 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetTradingAmount(v_beg_t, v_end_t)`

声明：function

获取区间买入、卖出、分红及净买卖金额序列

<!-- tags: 查询 交易金额 买卖金额 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetGainandLossBySecurity(v_beg_t, v_end_t)`

声明：function

按证券汇总指定区间的盈亏

<!-- tags: 查询 证券盈亏 分类汇总 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetTradingAmountBySecurity(v_beg_t, v_end_t)`

声明：function

按证券汇总指定区间的交易金额

<!-- tags: 查询 证券交易金额 分类汇总 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetPortfolioReturn()`

声明：function

获取最新或指定区间的组合收益率

<!-- tags: 查询 组合收益率 投资回报 -->

可见性：`public`

返回：float

### `GetPortfolioReturn(v_beg_t, v_end_t)`

声明：function

获取最新或指定区间的组合收益率

<!-- tags: 查询 组合收益率 投资回报 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：float

### `GetPortfolioAccumulativeReturn()`

声明：function

获取组合成立以来累计收益率

<!-- tags: 查询 累计收益率 成立以来收益 -->

可见性：`public`

返回：float

### `GetPortfolioReturn2(v_beg_t, v_end_t)`

声明：function

获取区间组合与基准的每日收益率序列

<!-- tags: 查询 组合收益率 基准收益率 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetTrailingReturn(v_end_t)`

声明：function

获取组合阶段收益

<!-- tags: 查询 阶段收益 区间回报 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetRollingReturn(v_beg_t, v_end_t, cy)`

声明：function

获取组合区间滚动收益率序列

<!-- tags: 查询 滚动收益率 区间回报 -->

可见性：`public`

| 参数      | 类型     | 说明     |
| --------- | -------- | -------- |
| `v_beg_t` | datetime | 开始日   |
| `v_end_t` | datetime | 截止日   |
| `cy`      | string   | 分割周期 |

返回：array

### `GetReturnandRisk(v_beg_t, v_end_t)`

声明：function

获取指定区间的组合收益风险指标

<!-- tags: 查询 风险回报 收益风险 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetRelativePerformance(v_beg_t, v_end_t)`

声明：function

获取指定区间的相对业绩指标

<!-- tags: 查询 相对回报 相对业绩 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetJyByPercent(pf_info_data, t_percent)`

声明：function

根据上一期调整后持仓与当期目标比例计算交易指令

<!-- tags: 计算 目标持仓 交易指令 -->

可见性：`public`

| 参数           | 类型  | 说明                                                            |
| -------------- | ----- | --------------------------------------------------------------- |
| `pf_info_data` | array | 组合基本信息，二维数组，可通过 GetPfInfoData()方法获取；        |
| `t_percent`    | array | T 日目标持仓，二维数组，同 GetTradeOrder 返回的比例类组合的结果 |

返回：array

### `GetOptionGroupData()`

声明：function

获取期权组合策略持仓数据

<!-- tags: 查询 期权组合 策略持仓 -->

可见性：`public`

返回：array

### `GetOptionGroupData(v_end_t)`

声明：function

获取期权组合策略持仓数据

<!-- tags: 查询 期权组合 策略持仓 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetOptionGroupData(v_beg_t, v_end_t)`

声明：function

获取期权组合策略持仓数据

<!-- tags: 查询 期权组合 策略持仓 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetTradeData(v_beg_t, v_end_t)`

声明：function

获取指定区间的交易明细

<!-- tags: 查询 交易明细 区间交易 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetTA(v_beg_t, v_end_t)`

声明：function

获取指定交易日的申购赎回与资金进出数据；可重写

<!-- tags: 查询 申购赎回 资金进出 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetPortfolioPercent(v_beg_t, v_end_t)`

声明：function

获取指定区间的组合配比方案

<!-- tags: 查询 组合配比 资产配置 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetAssetJZData(v_end_t)`

声明：function

获取指定日单位净值

<!-- tags: 查询 资产净值 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_end_t` | datetime | 截止日 |

返回：float

### `GetAssetJZData(v_beg_t, v_end_t)`

声明：function

获取区间单位净值数据

<!-- tags: 查询 资产净值 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetStockBuyandHoldReturn(v_beg_t, v_end_t)`

声明：function

获取区间买入持有收益及交易贡献

<!-- tags: 查询 买入持有收益 交易贡献 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetIRRReturn(v_beg_t, v_end_t, v_annual)`

声明：function

获取考虑现金流的组合内部收益率

<!-- tags: 查询 内部收益率 现金流 -->

可见性：`public`

| 参数       | 类型     | 说明           |
| ---------- | -------- | -------------- |
| `v_beg_t`  | datetime | 开始日         |
| `v_end_t`  | datetime | 截止日         |
| `v_annual` | boolean  | 收益率是否年化 |

返回：float

### `GetInDebtandAssetTradeData(v_beg_t, v_end_t)`

声明：function

获取负债与资产相关的交易明细

<!-- tags: 查询 负债交易 交易明细 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetInDebtandAssetHold()`

声明：function

获取负债与资产相关的持仓明细

<!-- tags: 查询 负债持仓 持仓明细 -->

可见性：`public`

返回：array

### `GetInDebtandAssetHold(v_end_t)`

声明：function

获取负债与资产相关的持仓明细

<!-- tags: 查询 负债持仓 持仓明细 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetInDebtandAssetHold(v_beg_t, v_end_t)`

声明：function

获取负债与资产相关的持仓明细

<!-- tags: 查询 负债持仓 持仓明细 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetBalanceHoldData()`

声明：function

获取融资融券余额与持仓明细

<!-- tags: 查询 融资融券 余额明细 -->

可见性：`public`

返回：array

### `GetBalanceHoldData(v_end_t)`

声明：function

获取融资融券余额与持仓明细

<!-- tags: 查询 融资融券 余额明细 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_end_t` | datetime | 截止日 |

返回：array

### `GetBalanceHoldData(v_beg_t, v_end_t)`

声明：function

获取融资融券余额与持仓明细

<!-- tags: 查询 融资融券 余额明细 -->

可见性：`public`

| 参数      | 类型     | 说明   |
| --------- | -------- | ------ |
| `v_beg_t` | datetime | 开始日 |
| `v_end_t` | datetime | 截止日 |

返回：array

#### 示例

范例01：调用示例

```tsl
//新建子类继承基类
Type myBackTesting=class(tsBackTesting)
public
   function GetTimeSeries();override;





   function GetTradeOrder(vEndT);override;
end;
 //重写GetTimeSeries 方法
function myBackTesting.GetTimeSeries();override;
begin
 //具体代码省略
end;
 //重写GetTradeOrder 方法
function myBackTesting.GetTradeOrder(vEndT);override;
begin
 //具体代码省略
end;
```

范例02：调用示例

```tsl
Function MyBackTesting(BegT,EndT,MyPortfolioArr);
Begin
  //创建对象
   obj := CreateObject('myBackTesting');
   //初始化实例，给变量赋值（其他变量可参考成员变量介绍）
   obj.FBegT := BegT;
   obj.FEndT := EndT;
      //回测：调用对象obj 的backtest 方法
   obj.BackTest();
    //通过调用类提供的查询方法得到回测结果
// // //此处返回结果集的大小取决于用户选择的方法的多少
   return
 array(
"资产配置":obj.GetAssetData(BegT,EndT),
"组合盈亏":obj.GetGainandLoss(BegT,EndT),
'区间组合收益率':obj.GetPortfolioReturn(BegT,EndT)
        );





End;
```

范例03：调用示例

```tsl
function myBackTesting.GetTradeOrder(vEndT);override;
begin
 //返回当前最新持仓，此时为vEndT 时点交易发生前的最新持仓
 GetHoldData();
 //返回结果为空，因为vEndT 时点的交易还未发生，系统还未生成vEndT 时点的持仓
 GetHoldData(vEndT);
 //返回上一个交易日的持仓数据。如果上一个交易日持仓不为空，则和GetHoldData()返回
// // 结果相同，如果上一个交易日持仓为空，则此处返回空数组
 GetHoldData(MarketLastTradeDay(vEndT));
 //返回从回测开始到vEndT 交易发生前所有的持仓
 GetHoldData(FBegT,vEndT);
 //返回最近5 个交易日的持仓数据
 GetHoldData(spec(StockEndTPrevNDay(vEndT,5),'SH000001'),vEndT);
end;
```

范例04：调用示例

```tsl
Function
TSFL_TSBackTesting_File(EndT,MyPortfolioArr,IndexId,IniCash,PriceType,VolModType,DividendType,AllotmentType);
Begin
   BegT := vselect minof(['截止日']) from MyPortfolioArr end;
      obj := CreateObject('tsMyBackTestingQuantity');
      //用户导入的配置数据
   obj.MyPortfolioArr := MyPortfolioArr;
      //回测开始时间
   obj.FBegT := BegT;
      //回测截止时间
   obj.FEndT := EndT;
      //组合类型(配置类组合)
   obj.FGroupType := 1;
      //基准代码
   obj.FIndexId := IndexId;
      //比例类组合配比方式(本范例以用户自定义输入)
   obj.FRateType := -1;
      //初始资金
   obj.FIniCash := IniCash;
      //成交价类别(此处以收盘价成交)
   obj.FPriceType := PriceType;
      //成交量取整模式





   obj.FVolModType := VolModType;
      //是否分红再投资
   obj.FDividendType := DividendType;
      //是否参与配股
   obj.FAllotmentType := AllotmentType;

      //回测
      obj.BackTest();

      //获取返回结果（返回结果可根据需要选择）
   return array(
                  //---组合基础
                '配置明细':obj.GetPortfolioPercent(BegT,EndT),
                '交易明细':obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),
                "行业配置":obj.GetSectorAllocation(BegT),

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),
                "交易汇总（按证券）":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                '区间组合收益率':  obj.GetPortfolioReturn(BegT,EndT),
                '组合和基准收益率序列':obj.GetPortfolioReturn2(BegT,EndT),
                '阶段收益':obj.GetTrailingReturn(EndT),
                '滚动收益':obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价
                '风险回报':obj.GetReturnandRisk(BegT,EndT),
                '相对回报':obj.GetRelativePerformance(BegT,EndT),
                );






End;

Type tsMyBackTestingQuantity=class(tsBackTesting)
public
   MyPortfolioArr;
   function GetTimeSeries();override;
   function GetTradeOrder(vEndT);override;
end;


function tsMyBackTestingQuantity.GetTimeSeries();override;
begin
      //从导入的配置文件中获取调仓日序列
   return SSelect distinct ['截止日'] from MyPortfolioArr order by ['截止日
'] end;
end;

function tsMyBackTestingQuantity.GetTradeOrder(vEndT);override;
begin
      //查询某个调仓日的配置数据
   t := Select * from MyPortfolioArr where ['截止日']=vEndT end;
   return t;
end;
```

范例05：调用示例

```tsl
Function TSFL_TSBackTesting_FutureAndETF(BegT,EndT);
Begin
   obj := createobject('tsetFandFutureBackTesting');

      //回测开始时间
   obj.FBegT := BegT;
      //回测截止时间





   obj.FEndT := EndT;
      //调仓周期
   obj.FCycle := cy_day();
      //组合类别（数量类组合）
   obj.FGroupType := 2;
      //基准代码
   obj.FIndexId := 'SH000300';
      //初始资金
   obj.FIniCash := 10^6;
      //成交价类别（此处为用户自定义价格）
   obj.FPriceType := -1;
      //成交量取整模式
   obj.FVolModType := -1;
      //是否分红再投资
   obj.FDividendType := 0;
      //是否参与配股
   obj.FDividendType := 0;
      //费用类别
   obj.FFeeType := 1;

      //回测
   obj.BackTest();

      //获取返回结果（返回结果可根据需要选择）
   return array(
                  //---组合基础
                '交易明细':obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),





                "交易汇总（按证券）":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                '区间组合收益率':  obj.GetPortfolioReturn(BegT,EndT),
                '组合和基准收益率序列':obj.GetPortfolioReturn2(BegT,EndT),
                '阶段收益':obj.GetTrailingReturn(EndT),
                '滚动收益':obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价
                '风险回报':obj.GetReturnandRisk(BegT,EndT),
                '相对回报':obj.GetRelativePerformance(BegT,EndT),
                );

End;

Type tsetFandFutureBackTesting=class(tsBackTesting)
//数量类对冲策略
{
截止日、代码、方向、动作、成交量、
成交价、乘数、保证金比例(%)、费率(%)
}
function GetTradeOrder(vEndT);override;
begin
   oV := BackUpSystemParameters();

   SetSysParam(PN_Cycle(),cy_day());
   PrevEndT := MarketLastTradeDay(vEndT);
   tP := GetHoldData();
   dayArr := GetTimeSeries();

   t := array();
   n := 0;
   if vEndT=dayArr[0] then //首日ETF 建仓
   begin





      StockId := 'SH510300';
      SetSysParam(PN_Stock(),StockId);
      SetSysParam(PN_Rate(),0);
      vC := StockClose(PrevEndT);

      t[n]['截止日'] := vEndT;
      t[n]['代码'] := StockId;
      t[n]['动作'] := 0; //开仓
      t[n]['成交量'] := RoundTo(60*10^4/vC,2);
      t[n]['成交价'] := StockPjCj4(vEndT);
      t[n]['方向'] := 1; //多头
      t[n]['乘数'] := 1;
      t[n]['保证金比例(%)'] := 100;
      t[n]['费率(%)'] := 0.1;
      n++;
   end;

      //T-1 日指数MACD
   IndexId := 'SH000300';
   SetSysParam(PN_Stock(),IndexId);
   SetSysParam(PN_Rate(),1);
   vMacd := specdate(MACD_MACD_v(12,26,9),PrevEndT);

   FutureId := 'IF01';
   SetSysParam(PN_Stock(),FutureId);
   Index := RecordExist2(tP,'代码','IF01');
   if vMACD<0 and Index<0 then //判断是否要开空单
   begin
      t[n]['代码'] := FutureId;
      t[n]['截止日'] := vEndT;
      t[n]['动作'] := 0;  //开仓
      t[n]['成交量'] := 1;
      t[n]['成交价'] := StockOpen(vEndT);
      t[n]['方向'] := 0;  //空头





      t[n]['乘数'] := 300;
      t[n]['保证金比例(%)'] := 20;
      t[n]['费率(%)'] := 0.01;
      n++;
   end
   else if vMACD>=0 and Index>=0 then //判断是要平空单
   begin
      t[n]['代码'] := FutureId;
      t[n]['截止日'] := vEndT;
      t[n]['方向'] := 0;  //空头
      t[n]['动作'] := 1;  //平仓
      t[n]['成交量'] := 1;
      t[n]['成交价'] := StockOpen(vEndT);
      t[n]['乘数'] := 300;
      t[n]['保证金比例(%)'] := 20;
      t[n]['费率(%)'] := 0.01;
      n++;
   end;
   RestoreSystemParameters(oV);
   return t;
end;
end;
```

范例06：调用示例

```tsl
Function
TSFL_TSBackTesting_HighFrequencyTrading(Stocks,BegT,EndT,Cycle,MaxN,MaxGR
,MaxLR,FeeRate);
Begin
   obj := createobject('highFrequencyTrading');

   //********************回测基本设置***************************//
// // //回测开始时间
   obj.FBegT := BegT;
      //回测截止时间
   obj.FEndT := EndT;
      //回测周期
   obj.FCycle := Cycle;
      //组合类型（数量类组合）
   obj.FGroupType := 2;

      //成交价类别（高频交易采用时点价格）
   obj.FPriceType := 1;
      //数量类组合开仓数量类别（此处采用固定金额法）
   obj.FOpenVolType := 2;
      //数量类组合平仓数量类别（此处采用可平仓数量占比法）
   obj.FCloseVolType := 2;

      //日内止盈止损
   obj.FglType := 1;
      //止盈线
   obj.FMaxGainRatio := MaxGR;
      //止损线
   obj.FMaxLossRatio := MaxLR;
      //费率(%)
   obj.FFeeRate := FeeRate;






   //********************用户自定义参数***************************//
// // //此处的股票池以数组的方式提供，实际可修改为按照选股方法获取
   obj.FStockArr := str2array(Stocks);
      //最大持有数量
   obj.FMaxN := MaxN;

      //回测
   obj.BackTest();


      //获取返回结果（返回结果可根据需要选择）
   return array(
                  //---组合基础
                '交易明细':obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),
                "行业配置":obj.GetSectorAllocation(BegT),

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),
                "交易汇总（按证券）":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                '区间组合收益率':  obj.GetPortfolioReturn(BegT,EndT),
                '组合和基准收益率序列':obj.GetPortfolioReturn2(BegT,EndT),
                '阶段收益':obj.GetTrailingReturn(EndT),
                '滚动收益':obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价
                '风险回报':obj.GetReturnandRisk(BegT,EndT),
                '相对回报':obj.GetRelativePerformance(BegT,EndT),
                );






End;


Type highFrequencyTrading=class(tsBackTesting)

   FStockArr;  //备选股票池
   FMaxN;      //最大持有股票数
   FFeeRate;   //费率(%)

   function GetTradeOrder(vEndT);override;
   begin
      oV := BackupSystemParameters2();
         //当前时间
      d := vEndT;

      echo datetimetostr(d);
      cc := GetHoldData();   //获取当前持仓
      cash := GetSurplusFund();  //获取剩余资金

      ccstocks := sselect distinct(['代码']) from cc end;  //获取持仓中的股票

      tjy := array();
      n := 0;
      if istable(ccstocks) then
         ccnum := length(ccstocks)
      else
         ccnum := 0;
      newccnum := ccnum;
      if newccnum<FMaxN then   //当前持仓股票个数小于最大持仓数
      begin
         setsysparam(pn_cycle(),FCycle);
            //判断开仓
         for nI := 0 to length(FStockArr)-1 do





         begin
            stockid := FStockArr[nI];
            setsysparam(pn_stock(),stockid);
            setsysparam(pn_date(),d);
            if not istradeday(d) then continue;
            if not (stockid in ccstocks) then   //如果持仓中不存在才判断是否满足
开仓
            begin
               setsysparam(pn_rate(),1);
               if cross(ma(close(),10),ma(close(),20))=1 then
               begin
                  tjy[n]['截止日'] := d;
                  tjy[n]['代码'] := stockid;
                  tjy[n]['名称'] := stockname(stockid);
                  tjy[n]['方向'] := 1;
                  tjy[n]['动作'] := 0;
                      //与FOpenVolType 关联，为2 时，提供金额即可，此处为剩余资金/剩
// // 余个数，由基类计算成交量
                  tjy[n]['资金'] := cash/(FMaxN-ccnum);
                  n++;
                  newccnum++;
               end
            end
            if newccnum>=FMaxN then   //当持仓的证券个数大于最大持仓个数就终止开仓
               break;
         end
      end;

         //平仓，对持仓循环判断是否达到平仓条件
      for nJ := 0 to length(cc)-1 do
      begin
         stockid := cc[nJ]['代码'];
         setsysparam(pn_stock(),stockid);
         setsysparam(pn_date(),d);





         setsysparam(pn_rate(),1);
         if cross(ma(close(),20),ma(close(),10))=1 then
         begin
            tjy[n]['截止日'] := d;
            tjy[n]['代码'] := stockid;
            tjy[n]['名称'] := stockname(stockid);
            tjy[n]['方向'] := 1;
            tjy[n]['动作'] := 1;
               //FCloseVolType 为2 时，提供平仓比例即可,此处平仓数量占比(%)即全部平
// // 仓。也可将FCloseVolType 设置为1，此处直接提供成交量
            tjy[n]['平仓数量占比(%)'] := 100;
            n++;
         end
      end;

         //添加费率(%)字段
      update tjy set ['费率(%)']=FFeeRate end;
      return tjy;
   end
End;
```

范例07：调用示例

```tsl
Function
TSFL_OPtionGroupTest(BegT,EndT,Cy,GroupType,IndexID,IniCash,PriceType,VolMo
dType,Feetype,OpenVolType,CloseVolType,MyPortfolioArr);
Begin
   obj := CreateObject("tsbackTestEgWJ");
   obj.FMyPortfolioArr := MyPortfolioArr;
   //********************回测基本参数****************//
// // //回测开始时间
   obj.FBegT := BegT;
   //回测截止时间
   obj.FEndT := EndT;
   //调仓周期
   obj.FCycle := Cy;
   //组合类别   1：比例类   2：数量类
   obj.FGroupType := GroupType;
   //基准代码
   obj.FIndexId := IndexID;
   //初始资金
   obj.FIniCash := IniCash;
   //成交价类别  -1：用户自定义  1：时点价格   2：收盘价  3：日均价 4：开盘价 5：系统昨收
   obj.FPriceType := PriceType;
   //成交量取整模式  0：成交量不取整   -1：成交量自动取整
   obj.FVolModType := VolModType;
   //费用类别
   obj.FFeeType := Feetype;
   //数量类组合开仓数量模式 ：固定成交量





   obj.FOpenVolType := OpenVolType;
   //数量类组合平仓数量模式 ：可平仓数量占比
   obj.FCloseVolType := CloseVolType;
   obj.BackTest();
   return array(
                  //---组合基础
                '交易明细':obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),
                "行业配置":obj.GetSectorAllocation(BegT),
                '剔除' :obj.GetDelTradeData(BegT,EndT),
                "持仓明细全集":obj.tallccmx,
                '资产配置全集':obj.tallzcpz,

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),
                "交易汇总（按证券）":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                '区间组合收益率':  obj.GetPortfolioReturn(BegT,EndT),
                '组合和基准收益率序列':obj.GetPortfolioReturn2(BegT,EndT),
                '阶段收益':obj.GetTrailingReturn(EndT),
                '滚动收益':obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价
                '风险回报':obj.GetReturnandRisk(BegT,EndT),
                '相对回报':obj.GetRelativePerformance(BegT,EndT),
                '期权组合持仓':obj.GetOptionGroupData(BegT,EndT)
                );
End;

type  tsbackTestEgWJ=class(tsBackTesting)





   FMyPortfolioArr;
   function GetTradeOrder(vendt);override;
   function GetOtherData(vendt);override;
end

function tsbackTestEgWJ.GetTradeOrder(vendt);override;
begin
   tjy := array();
   tjy := select * from  FMyportfolioarr where ["截止日"]=vendt
and ['动作']in array(0,1,32,33)
end;
   return tjy;

End;
function tsbackTestEgWJ.GetOtherData(vendt);override;
begin
    tother := array();
tother := select * from  FMyportfolioarr where ["截止日"]=vendt
and ['动作']in array(10,11)
end;
    return tother;
End
如果已经通过外部文件配置好了数据，则可以通过导入该文件里面的数据的方式进行回测。假设：配
置数据如下表所示：
组 ID 截止日 代码 方向 动作 乘数 保证金比例(%) 成交价 成交量 费率(%)





可将上表的值导入到函数 TSFL_qhOPtionGroupTest 的参数 MyPortfolioArr 中。





Function
TSFL_qhOPtionGroupTest(BegT,EndT,Cy,GroupType,IndexID,IniCash,PriceType,VolModType,Feetype,OpenVolType,CloseVolType,MyPortfolioArr);
Begin
   obj := CreateObject("tsbackTestEg");
   obj.FMyPortfolioArr := MyPortfolioArr;
   //回测开始时间
   obj.FBegT := BegT;
   //回测截止时间
   obj.FEndT := EndT;
   //调仓周期
   obj.FCycle := Cy;
   //组合类别   1：比例类   2：数量类
   obj.FGroupType := GroupType;
   //基准代码
   obj.FIndexId := IndexID;
   //初始资金
   obj.FIniCash := IniCash;
   //成交价类别  -1：用户自定义  1：时点价格  2：收盘价  3：日均价 4：开盘价    5：系统昨
// // 收
   obj.FPriceType := PriceType;
   //成交量取整模式  0：成交量不取整   -1：成交量自动取整
   obj.FVolModType := VolModType;
   //费用类别
   obj.FFeeType := Feetype;
   //数量类组合开仓数量模式 ：固定成交量
   obj.FOpenVolType := OpenVolType;
   //数量类组合平仓数量模式 ：可平仓数量占比
   obj.FCloseVolType := CloseVolType;
   obj.BackTest();
   return array(





                  //---组合基础
                '交易明细':obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),
                "行业配置":obj.GetSectorAllocation(BegT),
                '剔除' :obj.GetDelTradeData(BegT,EndT),
                "持仓明细全集":obj.tallccmx,
                '资产配置全集':obj.tallzcpz,

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),
                "交易汇总（按证券）":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                '区间组合收益率':  obj.GetPortfolioReturn(BegT,EndT),
                '组合和基准收益率序列':obj.GetPortfolioReturn2(BegT,EndT),
                '阶段收益':obj.GetTrailingReturn(EndT),
                '滚动收益':obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价
                '风险回报':obj.GetReturnandRisk(BegT,EndT),
                '相对回报':obj.GetRelativePerformance(BegT,EndT),
                '期权组合持仓':obj.GetOptionGroupData(BegT,EndT)
                );
End;

type  tsbackTestEg=class(tsBackTesting)
   FMyPortfolioArr;
   function GetTradeOrder(vendt);override;
end

function tsbackTestEg.GetTradeOrder(vendt);override;





begin
   tjy := array();
   tjy := select * from  FMyportfolioarr where ["截止日"]=vendt
                 and ['动作']in array(0,1)
                 end;
   return tjy;
End;
如果已经通过外部文件配置好了数据，则可以通过导入该文件里面的数据的方式进行回测。假设：配
置数据如下表所示：
截止日 代码 方向 动作 乘数 保证金比例(%) 成交价 成交量 费率(%)
可将上表的值导入到函数 TSFL_RSOptionTest 的参数 MyPortfolioArr 中。





Function
TSFL_RSOptionTest(BegT,EndT,Cy,GroupType,IndexID,IniCash,PriceType,VolModTyp
e,Feetype,OpenVolType,CloseVolType,OptionRs,MyPortfolioArr);
Begin
   obj := CreateObject("tsbackTestEg");
   obj.FMyPortfolioArr := MyPortfolioArr;

   //********************回测基本参数****************//
// // //回测开始时间
   obj.FBegT := BegT;

   //回测截止时间
   obj.FEndT := EndT;

   //调仓周期
   obj.FCycle := Cy;

   //组合类别   1：比例类   2：数量类
   obj.FGroupType := GroupType;

   //基准代码
   obj.FIndexId := IndexID;

   //初始资金
   obj.FIniCash := IniCash;

   //成交价类别  -1：用户自定义  1：时点价格   2：收盘价  3：日均价 4：开盘价    5：系统昨
// // 收
   obj.FPriceType := PriceType;

   //成交量取整模式  0：成交量不取整   -1：成交量自动取整





   obj.FVolModType := VolModType;

   //费用类别
   obj.FFeeType := Feetype;

   //数量类组合开仓数量模式 ：固定成交量
   obj.FOpenVolType := OpenVolType;

   //数量类组合平仓数量模式 ：可平仓数量占比
   obj.FCloseVolType := CloseVolType;
   //自动构建备兑组合
   obj.FOptionRs := OptionRs;

   obj.BackTest();

   return array(
                  //---组合基础
                '交易明细':obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),
                "行业配置":obj.GetSectorAllocation(BegT),
                '剔除' :obj.GetDelTradeData(BegT,EndT),
                "持仓明细全集":obj.tallccmx,
                '资产配置全集':obj.tallzcpz,

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),
                "交易汇总（按证券）":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                '区间组合收益率':  obj.GetPortfolioReturn(BegT,EndT),
                '组合和基准收益率序列':obj.GetPortfolioReturn2(BegT,EndT),





                '阶段收益':obj.GetTrailingReturn(EndT),
                '滚动收益':obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价
                '风险回报':obj.GetReturnandRisk(BegT,EndT),
                '相对回报':obj.GetRelativePerformance(BegT,EndT),
                '期权组合持仓':obj.GetOptionGroupData(BegT,EndT)
                );
End;

type  tsbackTestEg=class(tsBackTesting)
   FMyPortfolioArr;
   function GetTradeOrder(vendt);override;
end

function tsbackTestEg.GetTradeOrder(vendt);override;
begin
   tjy := array();
   tjy := select * from  FMyportfolioarr where ["截止日"]=vendt
                and ['动作']in array(0,1)
                end;
   return tjy;
End

如果已经通过外部文件配置好了数据，则可以通过导入该文件里面的数据的方式进行回测。假设：配





置数据如下表所示：
截止日 代码 方向 乘数 保证金比例(%) 开仓费率(%) 平仓费率(%)
Function
TSFL_MainFuturesChange_FGroupType1(BegT,EndT,cy,GroupType,RateType,IndexI
d,IniCash,PriceType,VolModType,MainFutureMap,MyPortfolioArr);
Begin
   obj := createobject('mainFuturesChange');
   begt := 20210701T;
   endt := 20210806T;
      //回测开始时间
   obj.FBegT := BegT;
      //回测截止时间
   obj.FEndT := EndT;
      //调仓周期
   obj.FCycle := cy;
      //组合类别(比例类组合)
   obj.FGroupType := GroupType;
      //比例类配比方式：等权重
   obj.FRateType := RateType;
      //基准代码
   obj.FIndexId := IndexId;





      //初始资金
   obj.FIniCash := IniCash;
      //成交价类别 ，收盘价
   obj.FPriceType := PriceType;
      //取整模式：自适应取整
   obj.FVolModType := VolModType;
      //主力合约转为实际合约交易
   obj.FMainFutureMap := MainFutureMap;
      //用户调仓明细
   obj.FMydata := MyPortfolioArr;
      //回测
   obj.BackTest();
     //获取返回结果
   return array(
                  //---组合基础
                "交易明细":obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),
                "剔除":obj.GetDelTradeData(BegT,EndT),

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),
                "交易汇总（按证券）
":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                "区间组合收益率":  obj.GetPortfolioReturn(BegT,EndT),
                "组合和基准收益率序列":obj.GetPortfolioReturn2(BegT,EndT),
                "阶段收益":obj.GetTrailingReturn(EndT),
                "滚动收益":obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价





                "风险回报":obj.GetReturnandRisk(BegT,EndT),
                "相对回报":obj.GetRelativePerformance(BegT,EndT),
                );
End;

type mainFuturesChange=class(tsBackTesting)
   FMydata;
   function GetTradeOrder(vEndT);override;
   begin
      tjy := array();
      tjy := select * from FMydata where ['截止日']=vendt end;
      return tjy;
   end

   function GetTimeSeries();override;
   begin
      timearr := array();
      timearr := sselect distinct['截止日'] from FMydata end;
      return timearr;
   end
End;
```

范例08：调用示例

```tsl
Function
TSFL_MainFuturesChange1_FGroupType1(BegT,EndT,cy,GroupType,RateType,Index
Id,IniCash,PriceType,VolModType,MainFutureMap,MyPortfolioArr);
Begin
   obj := createobject('mainFuturesChange');
   begt := 20210701T;
   endt := 20210806T;
      //回测开始时间
   obj.FBegT := BegT;
      //回测截止时间
   obj.FEndT := EndT;
      //调仓周期
   obj.FCycle := cy;
      //组合类别(比例类组合)
   obj.FGroupType := GroupType;
      //比例类配比方式：等权重
   obj.FRateType := RateType;
      //基准代码
   obj.FIndexId := IndexId;
      //初始资金
   obj.FIniCash := IniCash;
      //成交价类别 ，收盘价





   obj.FPriceType := PriceType;
      //取整模式：自适应取整
   obj.FVolModType := VolModType;
      //主力合约转为实际合约交易
   obj.FMainFutureMap := MainFutureMap;
      //用户调仓明细
   obj.FMydata := MyPortfolioArr;
      //回测
   obj.BackTest();
     //获取返回结果
   return array(
                  //---组合基础
                "交易明细":obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),
                "剔除":obj.GetDelTradeData(BegT,EndT),

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),
                "交易汇总（按证券）
":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                "区间组合收益率":  obj.GetPortfolioReturn(BegT,EndT),
                "组合和基准收益率序列":obj.GetPortfolioReturn2(BegT,EndT),
                "阶段收益":obj.GetTrailingReturn(EndT),
                "滚动收益":obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价
                "风险回报":obj.GetReturnandRisk(BegT,EndT),
                "相对回报":obj.GetRelativePerformance(BegT,EndT),
                );





End;

type mainFuturesChange=class(tsBackTesting)
   FMydata;
   function GetTradeOrder(vEndT);override;
   begin
      tjy := array();
      tjy := select * from FMydata where ['截止日']=vendt end;
      return tjy;
   end

   function GetTimeSeries();override;
   begin
      timearr := array();
      timearr := sselect distinct['截止日'] from FMydata end;
      return timearr;
   end
End;
```

范例09：调用示例

```tsl
Function
TSFL_MainFuturesChange_FGroupType2(BegT,EndT,cy,GroupType,OpenVolType,Clo
seVolType,IndexId,IniCash,PriceType,VolModType,MainFutureMap,Mydata);
Begin
   obj := createobject('mainFuturesChange');
   begt := 20210104T;
   endt := 20210301T;
   //********************回测基本设置***************************//
// // //回测开始时间
   obj.FBegT := BegT;
      //回测截止时间
   obj.FEndT := EndT;
      //调仓周期
   obj.FCycle := cy;
      //组合类别(数量类组合)
   obj.FGroupType := GroupType;
      //数量类开仓模式
   obj.FOpenVolType := OpenVolType;
      //数量类平仓模式
   obj.FCloseVolType := CloseVolType;
      //基准代码
   obj.FIndexId := IndexId;
      //初始资金
   obj.FIniCash := IniCash;
      //成交价类别 ，收盘价
   obj.FPriceType := PriceType;





      //成交量取整模式，自适应取整
   obj.FVolModType := VolModType;
      //主力合约映射到实际合约
   obj.FMainFutureMap := MainFutureMap;
      //用户调仓明细
   obj.FMydata := Mydata;
     //回测
   obj.BackTest();
     //获取返回结果（返回结果可根据需要选择）
   return array(
                  //---组合基础
                "交易明细":obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),
                "剔除":obj.GetDelTradeData(BegT,EndT),
                '资产配置全集':obj.tallzcpz,
                '持仓全集':obj.tallccmx,

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),
                "交易汇总（按证券）
":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                "区间组合收益率":  obj.GetPortfolioReturn(BegT,EndT),
                "组合和基准收益率序列":obj.GetPortfolioReturn2(BegT,EndT),
                "阶段收益":obj.GetTrailingReturn(EndT),
                "滚动收益":obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价
                "风险回报":obj.GetReturnandRisk(BegT,EndT),
                "相对回报":obj.GetRelativePerformance(BegT,EndT),





                );
End;

type mainFuturesChange=class(tsBackTesting)
   FMydata;
   function GetTradeOrder(vEndT);override;
   begin
      tjy := array();
      tjy := select * from FMydata where ['截止日']=vendt end;
      return tjy;
   end

   function GetTimeSeries();override;
   begin
      timearr := array();
      timearr := sselect distinct['截止日'] from FMydata end;
      return timearr;
   end
End;
```

范例10：调用示例

```tsl
Function
Update_IndustryType_FRateType(BegT,EndT,cy,GroupType,RateType,IndexId,Ini
Cash,PriceType,VolModType,IndustryMethod,IndustryType,MyPortfolioArr);
Begin
   obj := createobject('tsbackTestEgIndustry');
      //回测开始时间
   obj.FBegT := BegT;
      //回测截止时间
   obj.FEndT := EndT;
      //调仓周期(月判断）
   obj.FCycle := cy;
      //组合类别(比例类组合)
   obj.FGroupType := GroupType;
      //比例类配比方式：等权重
   obj.FRateType := RateType;
      //基准代码
   obj.FIndexId := IndexId;
      //初始资金
   obj.FIniCash := IniCash;
      //成交价类别 ：收盘价
   obj.FPriceType := PriceType;
      //取整模式：自适应取整
   obj.FVolModType := VolModType;
      //是否进行行业中性配比
   obj.FIndustryMethod := IndustryMethod;





      //行业分类标准
   obj.FIndustryType := IndustryType;
   obj.FMydata := MyPortfolioArr;
      //回测
   obj.BackTest();
     //获取返回结果
   return array(
                  //---组合基础
                "交易明细":obj.GetTradeData(BegT,EndT),
                "资产配置":obj.GetAssetData(BegT,EndT),
                "持仓明细":obj.GetHoldData(BegT,EndT),
                "剔除":obj.GetDelTradeData(BegT,EndT),

                  //---组合盈亏、交易
                "组合盈亏":obj.GetGainandLoss(BegT,EndT),
                "交易汇总":obj.GetTradingAmount(BegT,EndT),
                "组合盈亏（按证券）":obj.GetGainandLossBySecurity(BegT,EndT),
                "交易汇总（按证券）
":obj.GetTradingAmountBySecurity(BegT,EndT),

                  //---组合收益
                "区间组合收益率":  obj.GetPortfolioReturn(BegT,EndT),
                "组合和基准收益率序列":obj.GetPortfolioReturn2(BegT,EndT),
                "阶段收益":obj.GetTrailingReturn(EndT),
                "滚动收益":obj.GetRollingReturn(BegT,EndT,cy_month()),

                //----组合评价
                "风险回报":obj.GetReturnandRisk(BegT,EndT),
                "相对回报":obj.GetRelativePerformance(BegT,EndT),
                );
End;

type tsbackTestEgIndustry=class(tsBackTesting)
   FMydata;





   function GetTradeOrder(vEndT);override;
   begin
      tjy := select * from FMydata where ['截止日']=vendt end;
      return tjy;
   end

   function GetTimeSeries();override;
   begin
      timearr := sselect distinct['截止日'] from FMydata end;
      return timearr;
   end
End;
```
