文化财经SAR指标计算(二)

简介

 文化财经SAR指标计算(一)主要介绍了SAR指标一次性计算的计算方式,但实际使用过程中,数据是一个个压入的形式,所以对算法需要修改。本文主要基于VNPY中实现SAR做demo。
 VNPY中指标的计算都放在ArrayManager类里面,故对该类重写。

代码实现

定义一个类,用于存储SAR需要用到的数据

class SarData:#存储结构

    def __init__(self, size=100):
        self.af = np.zeros(size)
        self.ep = np.zeros(size)
        self.sar =np.zeros(size)
        self.low_pre = 999999999  # 上一个周期最小值
        self.high_pre = 0  # 上一个周期最大值
        self.N=4
        self.af0=0.02
        self.mvalue=0.2
        self.up=False
        self.init_up_down=[False,False]
        self.init_up_down_ep=[0,0]

    def move_data(self):
        self.sar[:-1] = self.sar[1:]
        self.af[:-1] = self.af[1:]

接着就是对ArrayManager的重写:
主要注意一下几点:

  1. update_bar 函数中,计算SAR,每更新一个bar就计算sar
  2. 增加一个函数calculate_sar计算SAR
  3. 提供一个方法获取计算好的SAR
class ArrayManager(object):
    """
    For:
    1. time series container of bar data
    2. calculating technical indicator value
    """

    def __init__(self, size=100):
        """Constructor"""
        self.count = 0
        self.size = size
        self.inited = False

        self.open_array = np.zeros(size)
        self.high_array = np.zeros(size)
        self.low_array = np.zeros(size)
        self.close_array = np.zeros(size)
        self.volume_array = np.zeros(size)
        #增加一个存储Sar的
        self.sar_value = SarData(size)
    def calculate_sar(self):   #增加一个计算一个的SAR
        if self.count==self.sar_value.N+1:#初始化第一个sar
            if self.close[-1]> self.close[0]:#上升
                self.sar_value.up=True
            if   self.sar_value.up==True:  #涨势
                self.sar_value.ep[-1] = min(self.low[-1*self.sar_value.N-1:-1])
                self.sar_value.sar[-1] = self.sar_value.ep[-1]
                self.sar_value.init_up_down_ep[0] = max(self.high[-1 * self.sar_value.N-1 :-1])#涨势的话 需要先确定最高点 以便 转入涨势时 最低点不会错过初始几根线的最高点
            else:                          #跌势
                self.sar_value.ep[-1] = max(self.high[-1 * self.sar_value.N-1 :-1])
                self.sar_value.sar[-1] = self.sar_value.ep[-1]*-1
                self.sar_value.init_up_down_ep[1]=min(self.low[-1 * self.sar_value.N-1 :-1])#跌势的话 需要先确定最低点 以便 转入涨势时 最低点不会错过初始几根线的最低点
        elif self.count>self.sar_value.N+1:
            self.sar_value.af[-1] = self.sar_value.af[-2] + self.   sar_value.af0
            if self.sar_value.af[-1]> self.sar_value.mvalue:
                self.sar_value.af[-1] > self.sar_value.mvalue
            if self.sar_value.up:

                self.sar_value.sar[-1] = abs(self.sar_value.sar[-2]) + self.sar_value.af[-1] * (self.high[-2] - abs(self.sar_value.sar[-2]))
                # 转势头
                print("转势头",abs(self.sar_value.sar[-2]),self.sar_value.af[-1],self.high[-2] ,self.sar_value.sar[-1] )
                self.sar_value.high_pre = max(self.sar_value.high_pre, self.high[-1])


                if self.low[-1] < abs(self.sar_value.sar[-1]):
                    # print("转入跌势")
                    self.sar_value.up = False
                    self.sar_value.af[-1] = 0
                    self.sar_value.low_pre = self.low[-1]
                    if self.sar_value.init_up_down_ep[1] == 0:
                        self.sar_value.sar[-1] = max(self.sar_value.high_pre,self.sar_value.init_up_down_ep[0])
                    else:
                        self.sar_value.sar[-1] = self.sar_value.high_pre * -1
            else:
                self.sar_value.sar[-1] = (abs(self.sar_value.sar[-2]) +self. sar_value.af[-1] * (self.low[-2] - abs(self.sar_value.sar[-1])))

                self.sar_value.sar[-1] = -1 * self.sar_value.sar[-1]
                #self.sar_value.ep[-1] = min(self.sar_value.ep[-2], self.low[-1])
                self.sar_value.low_pre = min(self.sar_value.low_pre, self.low[-1])
                print("self.sar_value.low_pre",self.sar_value.low_pre)
                if self.high[-1] > abs(self.sar_value.sar[-1]):
                    # print("转入涨势")
                    self.sar_value.up = True
                    self.sar_value. high_pre = self.high[-1]
                    self. sar_value.af[-1] = 0
                    if self.sar_value.init_up_down_ep[0] == 0:  # 上涨第一个周期
                        self.sar_value.sar[-1] = min(self.sar_value.low_pre,self.sar_value.init_up_down_ep[1])
                        self.sar_value.init_up_down_ep[0]=self.sar_value. high_pre
                    else:
                        self.sar_value.sar[-1] = self.sar_value.low_pre

    def update_bar(self, bar):
        """
        Update new bar data into array manager.
        """
        self.count += 1
        if not self.inited and self.count >= self.size:
            self.inited = True

        self.open_array[:-1] = self.open_array[1:]
        self.high_array[:-1] = self.high_array[1:]
        self.low_array[:-1] = self.low_array[1:]
        self.close_array[:-1] = self.close_array[1:]
        self.volume_array[:-1] = self.volume_array[1:]

        self.open_array[-1] = bar.open_price
        self.high_array[-1] = bar.high_price
        self.low_array[-1] = bar.low_price
        self.close_array[-1] = bar.close_price
        self.volume_array[-1] = bar.volume #一个个移动到最后
        self.sar_value.move_data()
        self.calculate_sar()#计算SAR
        print(self.sar_value.sar)
    def SAR(self):
      """
      类似文化财经的SAR计算
      """
          return self.sar_value.sar

特别地,对此我选取了J2001.XDCE", start_date=‘2019-1-11’, end_date=‘2019-12-22’ 日线数据进行了验证,截几张图
![1月11号附近几天值(https://img-blog.csdnimg.cn/20191225111615624.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNjkwMw==,size_16,color_FFFFFF,t_70)12月22号附近值
注:本工作室提供量化策略代写以及交易、量化系统定制化开发服务:聚宽 米筐 优矿 文化财经 vnpy 发明者等 各大平台
本工作室提供以下服务:
1、量化策略代写以及优化以及研报建模
2、数据分析:主成分分析、频域分析(滤波、小波变换等)
3、量化系统定制开发
4、辅助搭建自己的量化平台
5、算法交易
价格根据服务双方协商。请联系微信quantcbll

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值