285 lines
5.5 KiB
Markdown
285 lines
5.5 KiB
Markdown
# 回测 / 快速回测
|
|
|
|
## `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;
|
|
```
|