# 回测 / 策略回测 ## `TSBackTesting` 声明:class 执行策略历史回测,并查询资产、持仓、交易、收益与绩效结果 ### `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 执行策略回测主流程,循环调仓时点、生成交易数据并完成清算 可见性:`public` 返回:array ### `getTimeSeries()` 声明:function 获取调仓周期时间序列;可按策略需要重写 可见性:`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 获取当前时点的目标持仓或成交明细;策略子类必须重写 可见性:`public` | 参数 | 类型 | 说明 | | --------- | --------- | -------------- | | `v_end_t` | date_time | 日期,当前时点 | 返回:array ### `getTA(v_end_t)` 声明:function 获取指定交易日的申购赎回与资金进出数据;可重写 可见性:`public` | 参数 | 类型 | 说明 | | --------- | --------- | -------------- | | `v_end_t` | date_time | 日期,当前时点 | 返回:array ### `getSurplusFund()` 声明:function 获取当前交易发生前的组合剩余可用资金 可见性:`public` 返回:float ### `getNetAssetValue()` 声明:function 获取当前交易发生前的组合资产净值 可见性:`public` 返回:float ### `getAssetData()` 声明:function 获取组合资产净值、分类资产市值及其占净值比例 可见性:`public` 返回:array ### `getHoldData()` 声明:function 获取当前或指定区间的组合持仓明细 可见性:`public` 返回:array ### `getSellpool()` 声明:function 获取当前可卖证券及可卖数量 可见性:`public` 返回:array ### `stockFee(stock_id, v_end_t, actionid, position)` 声明:function 当用户没有给交易费率时,回测框架可通过该接口获取默认的交易费率。默认情况下,该接 可见性:`public` | 参数 | 类型 | 说明 | | ---------- | -------- | -------- | | `stock_id` | string | 证券代码 | | `v_end_t` | datetime | 截止日 | | `actionid` | integer | 动作 | | `position` | integer | 方向 | 返回:real ### `calcashByTradeData(tjy)` 声明:function 根据用户给出的指定日的交易数据,回测框架会自动根据指定日的前一交易日的持仓、当前 可见性:`public` | 参数 | 类型 | 说明 | | ----- | ----- | ---------- | | `tjy` | array | 交易数据; | 返回:array ### `getPercent(t, v_end_t)` 声明:function 获取目标持仓比例数据 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------ | | `t` | array | 目标持仓,二维数组 | | `v_end_t` | datetime | 日期,当前时点 | ### `getAssetJZValue()` 声明:function 获取当前组合单位净值 可见性:`public` 返回:float ### `returnBenchmark(v_beg_t, v_end_t, t)` 声明:function 获取指定区间的基准收益率序列;可重写 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------------------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | | `t` | array | 组合净值收益率序列 | 返回:array ### `getOtherData(v_end_t)` 声明:function 获取分红送股、配股等公司行动数据;可重写 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_end_t` | datetime | 截止日 | 返回:array ### `getClearancePrice(t, v_end_t, ptype)` 声明:function 获取清仓证券的成交价格;可重写 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | -------------------------------- | | `t` | array | 策略生成的持仓、交易或收益数据 | | `v_end_t` | datetime | 当前计算日期或查询区间的结束日期 | | `ptype` | integer | 价格类型或价格选择模式 | 返回:real ### `getIntVol(stype, actionid, mod_type, v_jysl)` 声明:function 按证券类别、交易动作和取整模式计算成交量 可见性:`public` | 参数 | 类型 | 说明 | | ---------- | ------- | --------------------------------------------------------------------------------------------------------- | | `stype` | integer | 证券类别,整数 | | `actionid` | integer | 证券交易动作,整数 | | `mod_type` | integer | 成交量取整模式 实际值 含义 备注 0 成交量不取整 -1 成交量自适应取整 根据证券类型的不同,采取不同的取整模式 | | `v_jysl` | real | 证券交易数量,实数 | 返回:real ### `getAccountDateArr()` 声明:function 获取清算日期时间序列;可按账户市场重写 可见性:`public` 返回:array ### `getLastAccountDay(end_t)` 声明:function 获取当前清算日的上一清算日;可重写 可见性:`public` | 参数 | 类型 | 说明 | | ------- | -------- | -------------------------------- | | `end_t` | datetime | 查询区间的结束日期或当前计算日期 | 返回:array ### `getManageFeeTimeSeries()` 声明:function 获取管理费支付日期序列;可重写 可见性:`public` 返回:array ### `getCustodyFeeTimeSeries()` 声明:function 获取托管费支付日期序列;可重写 可见性:`public` 返回:array ### `getRZRQInterestRate(v_end_t)` 声明:function 获取指定日融资利率和融券利率;可重写 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | -------------------------------- | | `v_end_t` | datetime | 当前计算日期或查询区间的结束日期 | 返回:array ### `getAssetData(v_end_t)` 声明:function 获取组合资产净值、分类资产市值及其占净值比例 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_end_t` | datetime | 截止日 | 返回:array ### `getAssetData(v_beg_t, v_end_t)` 声明:function 获取组合资产净值、分类资产市值及其占净值比例 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getHoldData(v_end_t)` 声明:function 获取当前或指定区间的组合持仓明细 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_end_t` | datetime | 截止日 | 返回:array ### `getHoldData(v_beg_t, v_end_t)` 声明:function 获取当前或指定区间的组合持仓明细 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getDelTradeData(v_beg_t, v_end_t)` 声明:function 获取回测中被剔除或未执行的交易明细 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getSectorAllocation(v_end_t)` 声明:function 获取指定日股票类资产按行业汇总的市值配置 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_end_t` | datetime | 截止日 | 返回:array ### `getGainandLoss(v_beg_t, v_end_t)` 声明:function 获取区间组合及分类资产的每日和累计盈亏 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getTradingAmount(v_beg_t, v_end_t)` 声明:function 获取区间买入、卖出、分红及净买卖金额序列 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getGainandLossBySecurity(v_beg_t, v_end_t)` 声明:function 按证券汇总指定区间的盈亏 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getTradingAmountBySecurity(v_beg_t, v_end_t)` 声明:function 按证券汇总指定区间的交易金额 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getPortfolioReturn()` 声明:function 获取最新或指定区间的组合收益率 可见性:`public` 返回:float ### `getPortfolioReturn(v_beg_t, v_end_t)` 声明:function 获取最新或指定区间的组合收益率 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:float ### `getPortfolioAccumulativeReturn()` 声明:function 获取组合成立以来累计收益率 可见性:`public` 返回:float ### `getPortfolioReturn2(v_beg_t, v_end_t)` 声明:function 获取区间组合与基准的每日收益率序列 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getTrailingReturn(v_end_t)` 声明:function 获取组合阶段收益 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_end_t` | datetime | 截止日 | 返回:array ### `getRollingReturn(v_beg_t, v_end_t, cy)` 声明:function 获取组合区间滚动收益率序列 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | -------- | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | | `cy` | string | 分割周期 | 返回:array ### `getReturnandRisk(v_beg_t, v_end_t)` 声明:function 获取指定区间的组合收益风险指标 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getRelativePerformance(v_beg_t, v_end_t)` 声明:function 获取指定区间的相对业绩指标 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getJyByPercent(pf_info_data, t_percent)` 声明:function 根据上一期调整后持仓与当期目标比例计算交易指令 可见性:`public` | 参数 | 类型 | 说明 | | -------------- | ----- | --------------------------------------------------------------- | | `pf_info_data` | array | 组合基本信息,二维数组,可通过 GetPfInfoData()方法获取; | | `t_percent` | array | T 日目标持仓,二维数组,同 GetTradeOrder 返回的比例类组合的结果 | 返回:array ### `getOptionGroupData()` 声明:function 获取期权组合策略持仓数据 可见性:`public` 返回:array ### `getOptionGroupData(v_end_t)` 声明:function 获取期权组合策略持仓数据 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_end_t` | datetime | 截止日 | 返回:array ### `getOptionGroupData(v_beg_t, v_end_t)` 声明:function 获取期权组合策略持仓数据 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getTradeData(v_beg_t, v_end_t)` 声明:function 获取指定区间的交易明细 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getTA(v_beg_t, v_end_t)` 声明:function 获取指定交易日的申购赎回与资金进出数据;可重写 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getPortfolioPercent(v_beg_t, v_end_t)` 声明:function 获取指定区间的组合配比方案 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getAssetJZData(v_end_t)` 声明:function 获取指定日单位净值 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_end_t` | datetime | 截止日 | 返回:float ### `getAssetJZData(v_beg_t, v_end_t)` 声明:function 获取区间单位净值数据 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getStockBuyandHoldReturn(v_beg_t, v_end_t)` 声明:function 获取区间买入持有收益及交易贡献 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getIRRReturn(v_beg_t, v_end_t, v_annual)` 声明:function 获取考虑现金流的组合内部收益率 可见性:`public` | 参数 | 类型 | 说明 | | ---------- | -------- | -------------- | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | | `v_annual` | boolean | 收益率是否年化 | 返回:float ### `getInDebtandAssetTradeData(v_beg_t, v_end_t)` 声明:function 获取负债与资产相关的交易明细 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getInDebtandAssetHold()` 声明:function 获取负债与资产相关的持仓明细 可见性:`public` 返回:array ### `getInDebtandAssetHold(v_end_t)` 声明:function 获取负债与资产相关的持仓明细 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_end_t` | datetime | 截止日 | 返回:array ### `getInDebtandAssetHold(v_beg_t, v_end_t)` 声明:function 获取负债与资产相关的持仓明细 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_beg_t` | datetime | 开始日 | | `v_end_t` | datetime | 截止日 | 返回:array ### `getBalanceHoldData()` 声明:function 获取融资融券余额与持仓明细 可见性:`public` 返回:array ### `getBalanceHoldData(v_end_t)` 声明:function 获取融资融券余额与持仓明细 可见性:`public` | 参数 | 类型 | 说明 | | --------- | -------- | ------ | | `v_end_t` | datetime | 截止日 | 返回:array ### `getBalanceHoldData(v_beg_t, v_end_t)` 声明:function 获取融资融券余额与持仓明细 可见性:`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 //当持仓的证券个数大于最大持仓个数就终止开仓 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; ```