2659 lines
59 KiB
Markdown
2659 lines
59 KiB
Markdown
# 回测 / 策略回测
|
|
|
|
## `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;
|
|
```
|