CTA策略

CTA策略01_dualThrust

https://blog.csdn.net/u011331731/article/details/89259848

## dualThrust介绍

Dual Thrust是一个趋势跟踪系统,由Michael Chalek在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一。Dual Thrust系统具有简单易用、适用度广的特点,其思路简单、参数很少,配合不同的参数、止盈止损和仓位管理,可以为投资者带来长期稳定的收益,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。

在Dual Thrust交易系统中,对于震荡区间的定义非常关键,这也是该交易系统的核心和精髓。Dual Thrust系统使用Range = Max(HH-LC,HC-LL)来描述震荡区间的大小。其中HH是N日High的最高价,LC是N日Close的最低价,HC是N日Close的最高价,LL是N日Low的最低价。

具体说:

1、首先计算:

~~~~(1)N日High的最高价HH, N日Close的最低价LC;

(2)N日Close的最高价HC,N日Low的最低价LL;

(3)Range = Max(HH-LC,HC-LL)

(4)BuyLine = Open + K1*Range

(5)SellLine = Open + K2*Range

 

2.构造系统

(1)当价格向上突破上轨时,如果当时持有空仓,则先平仓,再开多仓;如果没有仓位,则直接开多仓;

(2)当价格向下突破下轨时,如果当时持有多仓,泽县平川,再开空仓;如果没有仓位,则直接开空仓;

 

## 回测图

参数 :

```

平台:vnpy

滑点手续费等均采用vnpy默认配置.(0.2滑点,0.3/万手续费)

测试标的:if0000

时间:2010418-20100818

k1=0.5

k2=0.5

```

回测图:

 

图示说明:

从上到下

第一张:交易次数和盈亏关系

第二张:基准行情

第三张:总资金图(如果每日都交易那么基本和第一张形态一样)

第四张:仓位图

第五张:每日的多空仓线

 

 

综合盈亏信息:

~~~~```

第一笔交易: 2010-04-29 14:56:00

最后一笔交易: 2010-08-18 14:56:00

总交易次数: 55.0

总盈亏: 20,105,684.34

最大回撤: -3,332,557.8

平均每笔盈利: 365,557.9

平均每笔滑点: 12,000.0

平均每笔佣金: 5,023.92

胜率 61.82%

盈利交易平均值 1,093,843.81

亏损交易平均值 -813,571.67

盈亏比: 1.34

 

总交易日: 77

盈利交易日 30

亏损交易日: 20

起始资金: 1000000

结束资金: 21,105,684.34

总收益率: 2,010.57%

年化收益: 2,527.52%

总盈亏: 20,105,684.34

最大回撤: -3,043,602.3

百分比最大回撤: -84.48%

总手续费: 276,315.66

总滑点: 660,000.0

总成交金额: 9,210,522,000.0

总成交笔数: 110.0

日均盈亏: 261,112.78

日均手续费: 3,588.52

日均滑点: 8,571.43

日均成交金额: 119,617,168.83

日均成交笔数: 1.43

日均收益率: 10.53%

收益标准差: 52.68%

Sharpe Ratio: 3.1

 

CTA策略02_boll

https://blog.csdn.net/u011331731/article/details/89260961

基本思路,使用boll带的上下界进行趋势交易,越过上届做多,越过下届做空.

使用boll进行趋势跟随操作:
cci>0:开多,限制价格bollUp
cci<0:开空,限制价格bollDown
持有多单:下止损单,止损价,持有以来最高-5.2倍ATR
持有空单:下止损单,止损价,持有以来最低+5.2倍ATR
回测参数:

平台:vnpy
版本:git01
滑点手续费等均采用vnpy默认配置.(0.2滑点,0.3/万手续费)
测试标的:if0000
时间:2010418-20100818
boll宽度:3.4
窗口长度:18
回测曲线:


图示说明: 从上到下 第一张:交易次数和盈亏关系
第二张:基准行情
第三张:总资金图(如果每日都交易那么基本和第一张形态一样)
第四张:仓位图
第五张:每日的多空仓线

详细回测结果:

第一笔交易:    2010-05-13 13:39:00
最后一笔交易:    2010-08-18 15:15:00
总交易次数:    16.0
总盈亏:            89,855.66
最大回撤:             -86,441.21
平均每笔盈利:    5,615.98
平均每笔滑点:    120.0
平均每笔佣金:    50.27
胜率                37.5%
盈利交易平均值    34,119.8
亏损交易平均值    -11,486.31
盈亏比:            2.97
 
计算按日统计结果
首个交易日:    2010-04-28
最后交易日:    2010-08-18
总交易日:    77
盈利交易日    26
亏损交易日:    36
起始资金:    1000000
结束资金:    1,089,942.17
总收益率:    8.99%
年化收益:    28.53%
总盈亏:            89,942.17
最大回撤:             -113,731.73
百分比最大回撤: -10.4%
总手续费:    777.83
总滑点:            1,860.0
总成交金额:    25,927,680.0
总成交笔数:    31.0
日均盈亏:    1,168.08
日均手续费:    10.1
日均滑点:    24.16
日均成交金额:    336,723.12
日均成交笔数:    0.4
日均收益率:    0.12%
收益标准差:    1.19%
Sharpe Ratio:    1.55
效果一般,个人认为主要原因是boll的追踪性比较强,一旦价格上涨boll也会立即变大,导致很难突破.即使突破也会由于短期涨幅过大,面临回调的风险.导致盈利受限.相比dualThrust的上下界就是由昨日价格确定,不会由于价格上涨而向上移动.

CTA策略05_AtrRsiStrategy

https://blog.csdn.net/u011331731/article/details/89342896

基本思路
空仓并且atr>atrma:
    if rsiValue>rsiBuy:
        开多单
    elfi rsiValue<rsiSell:
        开空单
有多头持仓:
    if self.rsiValue < self.rsiSell:
        平多单,开空单
有空头持仓:
    if self.rsiValue > self.rsiBuy:
        平空单开多单
回测参数
    atrLength = 22          # 计算ATR指标的窗口数   
    atrMaLength = 10        # 计算ATR均线的窗口数
    rsiLength = 5           # 计算RSI的窗口数
    rsiEntry = 35           # RSI的开仓信号
    self.rsiBuy = 50 + self.rsiEntry

参数优化
回测图中看到关键参数:
对于参数:

    atrLength = 22          # 计算ATR指标的窗口数  
    atrMaLength = 10        # 计算ATR均线的窗口数
二者只控制第一笔开仓交易时间/方向(类似择时,后续所有交易都非多即空).所以这2个参数可以暂时不理会。
较为重要的2个参数

    rsiLength = 5           # 计算RSI的窗口数
    rsiEntry = 35           # RSI的开仓信号
由于rsiLength控制rsi的计算周期,rsiEntry控制了买卖阈值,由于阈值对称的所以只使用一个变量就足够了,   参数优化

setting.addParameter('rsiLength', 5,55,10) 
setting.addParameter('rsiEntry', 15,35,5)

结果:

2019-04-16 17:04:39.688957    参数:{'rsiLength': 15, 'rsiEntry': 35},目标:1009033.0454
2019-04-16 17:04:39.688968    参数:{'rsiLength': 25, 'rsiEntry': 30},目标:1009033.0454
2019-04-16 17:04:39.688978    参数:{'rsiLength': 25, 'rsiEntry': 35},目标:1009033.0454
2019-04-16 17:04:39.688987    参数:{'rsiLength': 35, 'rsiEntry': 30},目标:1009033.0454
2019-04-16 17:04:39.688995    参数:{'rsiLength': 45, 'rsiEntry': 25},目标:1009033.0454
2019-04-16 17:04:39.689004    参数:{'rsiLength': 55, 'rsiEntry': 25},目标:1009033.0454
2019-04-16 17:04:39.689013    参数:{'rsiLength': 15, 'rsiEntry': 25},目标:1008501.46148
2019-04-16 17:04:39.689024    参数:{'rsiLength': 45, 'rsiEntry': 30},目标:1007747.00682
2019-04-16 17:04:39.689033    参数:{'rsiLength': 55, 'rsiEntry': 30},目标:1007747.00682
2019-04-16 17:04:39.689042    参数:{'rsiLength': 15, 'rsiEntry': 30},目标:1007084.02996
2019-04-16 17:04:39.689051    参数:{'rsiLength': 25, 'rsiEntry': 20},目标:1006781.83798
2019-04-16 17:04:39.689059    参数:{'rsiLength': 45, 'rsiEntry': 20},目标:1006625.14456
2019-04-16 17:04:39.689067    参数:{'rsiLength': 55, 'rsiEntry': 20},目标:1006625.14456
2019-04-16 17:04:39.689076    参数:{'rsiLength': 35, 'rsiEntry': 25},目标:1006493.14852
2019-04-16 17:04:39.689086    参数:{'rsiLength': 5, 'rsiEntry': 35},目标:1006110.091
2019-04-16 17:04:39.689096    参数:{'rsiLength': 35, 'rsiEntry': 15},目标:1005903.72738
2019-04-16 17:04:39.689105    参数:{'rsiLength': 45, 'rsiEntry': 15},目标:1005598.38058
2019-04-16 17:04:39.689114    参数:{'rsiLength': 25, 'rsiEntry': 25},目标:1005228.646
2019-04-16 17:04:39.689123    参数:{'rsiLength': 35, 'rsiEntry': 20},目标:1004246.28134
2019-04-16 17:04:39.689131    参数:{'rsiLength': 55, 'rsiEntry': 15},目标:1003646.62962
2019-04-16 17:04:39.689140    参数:{'rsiLength': 35, 'rsiEntry': 35},目标:1003168.86948
2019-04-16 17:04:39.689148    参数:{'rsiLength': 45, 'rsiEntry': 35},目标:1003168.86948
2019-04-16 17:04:39.689157    参数:{'rsiLength': 55, 'rsiEntry': 35},目标:1003168.86948
2019-04-16 17:04:39.689166    参数:{'rsiLength': 15, 'rsiEntry': 20},目标:1001145.649
2019-04-16 17:04:39.689174    参数:{'rsiLength': 25, 'rsiEntry': 15},目标:1000352.44112
2019-04-16 17:04:39.689183    参数:{'rsiLength': 15, 'rsiEntry': 15},目标:1000313.52388
2019-04-16 17:04:39.689192    参数:{'rsiLength': 5, 'rsiEntry': 30},目标:999301.5286
2019-04-16 17:04:39.689200    参数:{'rsiLength': 5, 'rsiEntry': 25},目标:994286.31328
2019-04-16 17:04:39.689209    参数:{'rsiLength': 5, 'rsiEntry': 20},目标:990900.77608
2019-04-16 17:04:39.689218    参数:{'rsiLength': 5, 'rsiEntry': 15},目标:989164.8178
最终选择参数: 'rsiLength': 25,'rsiEntry': 30,对应收益1009033.0454

参数稳定性测试
测试各个月份最优结果的下月表现

代码段 小部件

结论:参数组合'rsiLength': 25,'rsiEntry': 30,稳定性尚可02-03月份表现不佳,但是也是正收益
(实际还需要参考历史最大回撤,近20日最大回撤等,由于中间数据没保存下来,就不再重新跑了.)

回测图:

可见这个策略其实是有问题的,仅仅开仓一次,偶然因素很大,这也是回测时为何topn的收益等完全一样的原因.
 

CTA策略06_BollChannelStrategy
https://blog.csdn.net/u011331731/article/details/89341535
基本思路
持有空仓:
    if self.cciValue > 0:
        开多限价单,价格bollUp
    elif self.cciValue < 0:
        开空限价单,价格bollDown
持有多单:
   下平多止损单,区间最高价-ATR*倍率
持有空单:
   下平空止损单,区间最低价+ATR*倍率
        
回测参数
重要参数:

    bollWindow = 18                     # 布林通道窗口数
    bollDev = 3.4                       # 布林通道的偏差
    slMultiplier = 5.2                  # 计算止损距离的乘数
boll的计算窗口宽度和dev倍率的标准差,slMultiplier控制ATR的止损倍率
 

CTA策略07_MultiTimeframeStrategy

https://blog.csdn.net/u011331731/article/details/89342896

基本思路
构造k线:
1,5分钟k线
2,15分钟k线
构造基于15分钟k线的移动平均线ma5和ma20
定义:maTrend 为ma5(15分钟k)大于ma20(15分钟k),真为1,假为-1
 
空仓:
    if maTrend为1 并且RSI大于RSI做多阈值:
        开多单
    elif maTrend为-1 并且RSI小于RSI做空阈值:
        开空单
持有多单:
    if maTrend为-1并且RSI小于50:
        平多单
持有空单:
    if maTrend为1并且RSI大于50:
        平空单
回测参数
    rsiSignal = 20          # RSI信号阈值,多为50+20,空为50-20
    rsiWindow = 14          # RSI窗口
    fastWindow = 5          # 快速均线窗口,结合15分钟线使用
    slowWindow = 20         # 慢速均线窗口,结合15分钟线使用
回测结果
回测区间:20190105-20190405
标的:IF9999


参数优化
分组测试:

setting.addParameter('rsiSignal', 15, 30, 5)
setting.addParameter('rsiWindow', 10, 20, 5)
setting.addParameter('fastWindow', 5, 15, 5)
setting.addParameter('slowWindow', 20)
 
setting.addParameter('rsiSignal', 20)
setting.addParameter('rsiWindow', 14)
setting.addParameter('fastWindow', 5, 10, 5)
setting.addParameter('slowWindow', 20,40,10)
结果:

    annualizedReturn    fastWindow    slowWindow    rsiSignal    rsiWindow
0    2.34014462    5    20    20    14
1    2.259018138    5    40    20    14
2    2.121318283    10    30    20    14
3    2.091021151    5    30    20    14
4    1.991306239    10    40    20    14
5    1.935240956    10    20    20    14
 
参数优选:fastWindow,slowWindow,rsiSignal,rsiWindow分别为5,20,20,14
恰巧就是默认参数

完整回测报告

第一笔交易:    2019-01-17 14:20:00
最后一笔交易:    2019-04-04 11:10:00
总交易次数:    27.0
总盈亏:    137,678.72
最大回撤:     -32,268.1
平均每笔盈利:    5,099.21
平均每笔滑点:    120.0
平均每笔佣金:    63.01
胜率        40.74%
盈利交易平均值    20,521.38
亏损交易平均值    -5,503.53
盈亏比:    3.73
计算按日统计结果
------------------------------
首个交易日:    2019-01-15
最后交易日:    2019-04-04
总交易日:    47
盈利交易日    16
亏损交易日:    18
起始资金:    1000000
结束资金:    1,137,678.72
总收益率:    13.77%
年化收益:    67.52%
总盈亏:    137,678.72
最大回撤:     -36,433.56
百分比最大回撤: -3.3%
总手续费:    1,701.28
总滑点:    3,240.0
总成交金额:    56,709,180.0
总成交笔数:    54.0
日均盈亏:    2,929.33
日均手续费:    36.2
日均滑点:    68.94
日均成交金额:    1,206,578.3
日均成交笔数:    1.15
日均收益率:    0.28%
收益标准差:    1.15%
Sharpe Ratio:    3.78
线性回归系数 olsNum:    3,330.36
调整线性回归系数(olsNum/最大回撤) olsNum:    -0.0914
调整线性回归系数夏普(olsNum/日收益标准差) olsNumShape:    2,890.09
近20日的最大回撤     -36,433.56
近20日总收益     3.64%
近20日收益标准差     1.0%
近20日最大单日跌率     -0.98%
近20日下跌天数     8.0
------------------------------
盈利交易bar    1955
亏损交易bar:    1902
收益标准差:    0.09%
————————————————
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CTA(Commodity Trading Advisor)策略是一种基于技术分析和基本面分析的交易策略,主要应用于商品市场,包括期货、外汇、股票等。CTA策略通常包括以下几个方面: 1. 趋势跟踪:利用技术分析方法,识别市场的趋势方向和力度,并根据趋势的强度和持续时间来决定交易方向和持仓时间。 2. 均值回归:利用基本面分析和技术分析方法,识别市场价格偏离其均值的情况,并根据价格回归到均值的概率来决定交易方向和持仓时间。 3. 波动率策略:利用技术分析方法和一些波动率指标,如ATR(平均真实波动率)和Bollinger Bands(布林带),来识别市场的波动率水平,并根据波动率的水平来决定交易方向和持仓时间。 以下是一个简单的CTA策略代码示例: ``` import numpy as np import pandas as pd def trend_following_strategy(data, n): # 计算收盘价的n日移动平均线 data['MA'] = data['Close'].rolling(window=n).mean() # 计算收盘价的n日标准差 data['STD'] = data['Close'].rolling(window=n).std() # 计算上轨线和下轨线 data['Upper'] = data['MA'] + 2 * data['STD'] data['Lower'] = data['MA'] - 2 * data['STD'] # 判断上涨趋势和下跌趋势 data['Trend'] = np.where(data['Close'] > data['MA'], 1, -1) # 判断做多和做空信号 data['Signal'] = np.where(data['Close'] > data['Upper'], -1, np.where(data['Close'] < data['Lower'], 1, data['Trend'])) # 计算持仓仓位 data['Position'] = data['Signal'].shift(1) # 计算收益率 data['Return'] = data['Position'] * data['Close'].pct_change() # 计算累计收益率 data['Cumulative_Return'] = (1 + data['Return']).cumprod() return data ``` 以上代码实现了一个简单的趋势跟踪策略,通过计算收盘价的n日移动平均线和n日标准差,来确定上轨线和下轨线,判断市场的上涨趋势和下跌趋势,以及做多和做空信号。最后计算收益率和累计收益率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值