# 回测 / 快速回测

## `quickBackTesting`

声明：class

执行简化的比例类组合回测，并查询组合与基准收益序列

<!-- tags: 调用 历史模拟 策略验证 比较基准 业绩基准 快速测试 -->

### `FEndT`

声明：field

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

可见性：`public`

类型：date_time

### `FCycle`

声明：field

调仓周期 月线

可见性：`public`

类型：string

### `FPoint`

声明：field

初始点位 1000

可见性：`public`

类型：integer

### `FIndexId`

声明：field

基准代码 SH000300

可见性：`public`

类型：string

### `FRateType`

声明：field

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

可见性：`public`

类型：integer

### `QuickBackTest()`

声明：function

执行快速回测主流程，循环调仓日期、生成目标持仓并完成清算

<!-- tags: 历史模拟 快速回测 策略验证 -->

可见性：`public`

返回：array

### `GetTimeSeries()`

声明：function

获取快速回测的调仓日期时间序列；可重写

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

可见性：`public`

返回：array

#### 示例

范例01：调用基类实现

```tsl
obj := createObject("quickBackTesting");
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

### `GetPortfolioReturn()`

声明：function

获取区间资产数据，返回字段同 GetPortfolioReturn()，此方法可指定区间

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

可见性：`public`

返回：array

### `GetPortfolioReturn(v_beg_t, v_end_t)`

声明：function

获取区间资产数据，返回字段同 GetPortfolioReturn()，此方法可指定区间

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

可见性：`public`

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

返回：array

### `GetPortfolioReturn2(v_beg_t, v_end_t)`

声明：function

获取区间组合累计收益率(%)

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

可见性：`public`

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

返回：float

### `GetPortfolioReturn3(v_beg_t, v_end_t)`

声明：function

获取区间内组合、基准、超额及累计收益率序列

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

可见性：`public`

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

返回：array

#### 示例

范例01：调用示例

```tsl
//新建子类继承基类
Type myQKBackTesting=class(quickBackTesting)
public
   function GetTimeSeries();override;
   function GetTradeOrder(vEndT);override;
end;
 //重写GetTimeSeries方法
function myQKBackTesting.GetTimeSeries();override;
begin
 //具体代码省略
end;
 //重写GetTradeOrder方法
function myQKBackTesting.GetTradeOrder(vEndT);override;
begin
 //具体代码省略
end;
```

范例02：调用示例

```tsl
Function MyQKBackTesting(BegT,EndT,MyPortfolioArr);
Begin
  //创建对象
   obj := CreateObject('myQKBackTesting');
   //初始化实例，给变量赋值（其他变量可参考成员变量介绍）
   obj.FBegT := BegT;



   obj.FEndT := EndT;
      //回测：调用对象obj的backtest方法
   obj.QuickBackTest();
    //通过调用类提供的查询方法得到回测结果
   return
 array(
"资产配置":obj.GetPortfolioReturn(BegT,EndT),
"组合收益率":obj.GetPortfolioReturn2(BegT,EndT),
'区间组合收益率序列':obj.GetPortfolioReturn3(BegT,EndT)
        );
End;
```

范例03：调用示例

```tsl
Function
TSFL_QuickBackTesting_File(Begt,Endt,IndexId,IniPoint,Ratetype,Mydata);
Begin
   obj := CreateObject('qKbackTestEg');
      //用户导入的配置数据
   obj.MyPortfolioArr := mydata;
      //回测开始时间
   obj.FBegT := BegT;
      //回测截止时间
   obj.FEndT := EndT;
      //基准代码
   obj.FIndexId := IndexId;
      //比例配比方式(本范例以用户自定义输入)
   obj.FRateType := Ratetype;
      //初始资金
   obj.FPoint := IniPoint;
      //回测
      obj.QuickBackTest();

      //获取返回结果（返回结果可根据需要选择）
   return array(
                 '资产配置':obj.GetPortfolioReturn(begt,endt),
                 '区间收益率':obj.GetPortfolioReturn2(begt,endt),
                 '组合和基准收益率序列':obj.GetPortfolioReturn3(begt,endt)
                );

End;

Type qKbackTestEg=class(quickBackTesting)
public
   MyPortfolioArr;
   function GetTimeSeries();override;





   function GetTradeOrder(vEndT);override;
end;

function qKbackTestEg.GetTimeSeries();override;
begin
      //从导入的配置文件中获取调仓日序列
   return MyPortfolioArr[:,'截止日'] union2 array();
end;

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