# 量化策略 / 轮动

## `tsRotationStrategy`

声明：class

轮动策略框架

<!-- tags: 资产轮动 择时 轮动策略 -->

### `FRotateSampleData`

声明：field

区间轮动样本数据 空

可见性：`public`

类型：array

### `FBegT`

声明：field

轮动开始日期 前推 1 年

可见性：`public`

类型：date_time

### `FEndT`

声明：field

轮动截止日期 当前

可见性：`public`

类型：date_time

### `FRotateSampleDataExp`

声明：field

单期轮动样本数据模型 ""

可见性：`public`

类型：string

### `FRotateCycle`

声明：field

轮动周期 月线

可见性：`public`

类型：string

### `FConStr`

声明：field

剔除条件 ""

可见性：`public`

类型：string

### `FStockArr`

声明：field

轮动样本空间，用于各期固定初始样本 空

可见性：`public`

类型：array

### `FRotateDateType`

声明：field

轮动选样交易日期类型 0

可见性：`public`

类型：integer

### `FMaxHoldNum`

声明：field

最大持仓个数 30

可见性：`public`

类型：integer

### `FIfTiming`

声明：field

是否考虑择时 0

可见性：`public`

类型：bool

### `FIfTiming2`

声明：field

轮动选样后首期是否考虑择时 0

可见性：`public`

类型：bool

### `FBuyCond`

声明：field

买入条件 ""

可见性：`public`

类型：string

### `FSellCond`

声明：field

卖出条件 "" 同上

可见性：`public`

类型：string

### `GetInitSampleArrByEndt(endt)`

声明：function

获取单期轮动初始样本池，仅当模式 2 轮动模型模式有效，适用于各期非固定初始样本池

<!-- tags: 查询 初始化 证券池 -->

可见性：`public`

| 参数   | 类型     | 说明                         |
| ------ | -------- | ---------------------------- |
| `endt` | datetime | 计算或查询使用的日期时间边界 |

### `GetRotateSampleArrByEndt(stock_arr, endt)`

声明：function

获取单期轮动目标样本池，仅模式 2 轮动模型模式需用户重写

<!-- tags: 查询 轮动目标池 单期样本 轮动策略 -->

可见性：`public`

| 参数        | 类型     | 说明                                         |
| ----------- | -------- | -------------------------------------------- |
| `stock_arr` | array    | 一维数组，当前设置的轮动样本空间 `fStockArr` |
| `endt`      | datetime | 计算或查询使用的日期时间边界                 |

### `GetBuySampleData(rotate_data, vendt)`

声明：function

获取当期择时买入池。仅当 FIfTiming=1 时有效（即考虑择时），如果择时买卖条件较为复杂

<!-- tags: 查询 择时买入池 轮动策略 买入信号 -->

可见性：`public`

| 参数          | 类型     | 说明                                               |
| ------------- | -------- | -------------------------------------------------- |
| `rotate_data` | array    | 二维数组，当期最新轮动样本池；已排除当期已持有证券 |
| `vendt`       | datetime | 当期择时判断日期                                   |

### `GetSellSampleData(hold_data, vendt)`

声明：function

获取当期择时卖出池。仅当 FIfTiming=1 时有效（即考虑择时）。重写后，卖出条件表达式

<!-- tags: 查询 择时卖出池 轮动策略 卖出信号 -->

可见性：`public`

| 参数        | 类型     | 说明                                                                 |
| ----------- | -------- | -------------------------------------------------------------------- |
| `hold_data` | array    | 二维数组，当期最新持仓池；已排除不在本期轮动池及已触发止盈止损的证券 |
| `vendt`     | datetime | 当期择时判断日期                                                     |

### `GetRotateSampleData()`

声明：function

获取当期最新轮动样本池

<!-- tags: 查询 轮动样本池 资产轮动 目标持仓 -->

可见性：`public`

### `GetRotateSampleData(vbegt, vendt)`

声明：function

获取区间轮动样本池

<!-- tags: 查询 轮动样本池 资产轮动 目标持仓 -->

可见性：`public`

| 参数    | 类型     | 说明                 |
| ------- | -------- | -------------------- |
| `vbegt` | datetime | 轮动样本区间开始日期 |
| `vendt` | datetime | 轮动样本区间结束日期 |

#### 示例

范例01：调用示例

```tsl
BegT := minvalue(RotateSampleData[:,"截止日"]);
   EndT := maxvalue(RotateSampleData[:,"截止日"]);
   obj := new tsRotationStrategy();

   //轮动设置
   obj.FRotateSampleData := RotateSampleData;
   obj.FMaxHoldNum := 4;
   obj.FRotateDateType := 0;

   //择时设置
   obj.FIfTiming := 1;
   obj.FIfTiming2 := 1;
   obj.FBuyCond := "cross(close(),MA(close(),5))=1";//当日金叉则买入
   obj.FSellCond := "cross(close(),MA(close(),5))=-1"; //当日死叉则卖出
      //回测
   obj.BackTest();
    //获取返回结果（返回结果可根据需要选择）
// // 返回样式同范例1
```

范例02：调用示例

```tsl
BegT := minvalue(RotateSampleData[:,"截止日"]);
   EndT := maxvalue(RotateSampleData[:,"截止日"]);
   obj := new tsRotationStrategy();

   //轮动设置
   obj.FRotateSampleData := RotateSampleData;
   obj.FMaxHoldNum := 4;
   obj.FRotateDateType := 1;//T+1 日
   obj.FParamCfg := array(
                        "调仓成交价类别":2,//调仓成交价类型 0：日均价，1：收盘价，2：
开盘价
                        "开仓费率(%)":0.03,
                        "平仓费率(%)":0.2,
                        );
   //回测
   obj.BackTest();
   //获取返回结果（返回结果可根据需要选择）
// // 返回样式同范例1
```
