59 KiB
回测 / 策略回测
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:调用基类实现
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:调用示例
//新建子类继承基类
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:调用示例
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:调用示例
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:调用示例
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:调用示例
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:调用示例
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:调用示例
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:调用示例
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:调用示例
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:调用示例
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;