趋势跟随策略最经典策略--海龟策略的技术实施

0
回复
3438
查看
[复制链接]

41

主题

32

回帖

248

积分

中级会员

积分
248
来源: 2019-8-13 07:28:45 显示全部楼层 |阅读模式
海龟交易系统是交易策略中最经典的策略之一,海龟交易系统本质上是一个趋势跟随的系统,但是最值得我们学习的,是资金管理尤其是分批建仓及动态止损的部分。他可以作为一套完整的趋势交易系统进行使用,通过趋势跟随中的四周法则,加上资金管理和仓位管理,实现跟随市场调整仓位。

一、趋势捕捉
海龟策略中底层基本指标是:唐奇安通道

该指标本是一个通道指标,他是有Richard Donchian发明的,是有3条不同颜色的曲线组成的,。指标用周期(一般都是20)内的最高价和最低价来显示市场价格的波动性,当其通道窄时表示市场波动较小,反之通道宽则表示市场波动比较大。具体公式如下:
      唐奇安通道三条线算法:
      上线=Max(最高价,n),下线=Min(最低价,n),中线=(上线+下线)/2
      基本的交易逻辑也非常简单:突破上线做多,突破下线做空。其实从本质上唐奇安通道是一种通道和高低点突破策略,一般的20日周期是用的交易中非常经典的四周法则。

二、资金管理

(一)仓位管理中的N值

N值是仓位管理的核心,涉及加仓及止损。另外,N值与技术指标平均真实波幅 ATR很相似

首先介绍真实波幅(ATR): MAX真实波幅=(|前一日最高价与最低价的差值|,|今日最高价与前一日收盘价差值|,|前一日收盘价与今日最低价差值|)
(二)首次开仓和买卖单位控制

首次建仓的时候,当捕捉到趋势,即价格突破唐奇安上轨时,买入1个unit。

其意义就是,让一个N值的波动与你总资金1%的波动对应,如果买入1unit单位的资产,当天震幅使得总资产的变化不超过1%。例如:

现在你有10万元资金,1%波动就是1000元。假如标X的N值为0.2元,1000元÷0.2元=5000股。也就是说,你的第一笔仓位应该是在其突破上轨(假设为5元)时立刻买入5000股,耗资25000元。

(三)加仓

若股价在上一次买入(或加仓)的基础上上涨了0.5N,则加仓一个Unit。


接上面的例子:假如N值仍为0.2。
    价格来到 5 + 0.2*0.5 = 5.1时,加仓1个Unit,买入5000股,耗资25500元,剩余资金 49500元
    价格来到 5.1 + 0.2*0.5 = 5.2 时再加仓1个unit。买入5000股,耗资26000元,剩余资金 23500元


(四)动态止损


接上面的例子,最后一次加仓价格为5.2。假如此时N值0.2元。 当价格下跌到 5.2 - 2*0.2 = 4.8元时,清仓。

持仓成本为 (5+5.1+5.2)*5000/15000 = 5.1元。 此时亏损 (5.1-4.8)*15000 = 4500元 对于10万来说 这波亏损4.5%

(五)止盈

当股价跌破10日唐奇安通道下沿,清空头寸结束本次交易

三、代码实现

初始化参数

  1. <div>def initialize(account):
  2.     account.last_buy_prcie = 0  #上一次买入价
  3.     account.hold_flag = False   # 是否持有头寸标志
  4.     account.limit_unit = 4     # 限制最多买入的单元数
  5.     account.unit = 0       # 现在买入1单元的股数</div><div>
  6. </div><div><b></b>
  7. </div>
复制代码

唐奇安计算
  1. def IN_OR_OUT(data,price,T):
  2.     up = max(data['highPrice'].iloc[-T:])
  3.     down = min(data['lowPrice'].iloc[-int(T/2):])  # 这里是10日唐奇安下沿
  4.     if price>up:
  5.         return 1
  6.     elif price<down:
  7.         return -1
  8.     else:
  9.         return 0
复制代码
ATR计算
   
  1. def CalcATR(data):
  2.     TR_List = []
  3.     for i in range(1,21):
  4.         TR = max(data['highPrice'].iloc[i]-data['lowPrice'].iloc[i],abs(data['highPrice'].iloc[i]-data['closePrice'].iloc[i-1]),abs(data['closePrice'].iloc[i-1]-data['lowPrice'].iloc[i]))
  5.         TR_List.append(TR)
  6.     ATR = np.array(TR_List).mean()
  7.     return ATR
复制代码
计算unit,注意股数为100的整数倍
  1. def CalcUnit(perValue,ATR):
  2.     return int((perValue/ATR)/100)*100
复制代码

判断是否加仓
  •   当价格相对上个买入价上涨 0.5ATR时,再买入一个unit



  •     当价格相对上个买入价下跌 2ATR时,清仓



  1. def Add_OR_Stop(price,lastprice,ATR):
  2.     if price >= lastprice + 0.5*ATR:
  3.         return 1
  4.     elif price <= lastprice - 2*ATR:
  5.         return -1
  6.     else:
  7.         return 0
复制代码
判断上次卖出操作是否成功(可能出现当日买进,之后却判断需要卖出)

  1. def SellComplete(hold_flag,security_position):
  2.     if len(security_position)>0 and hold_flag==False:
  3.        return True
  4.     else:
  5.         return False
复制代码


涨-多.jpg







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册
关注微信