简介
文化财经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的重写:
主要注意一下几点:
- update_bar 函数中,计算SAR,每更新一个bar就计算sar
- 增加一个函数calculate_sar计算SAR
- 提供一个方法获取计算好的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)
注:本工作室提供量化策略代写以及交易、量化系统定制化开发服务:聚宽 米筐 优矿 文化财经 vnpy 发明者等 各大平台
本工作室提供以下服务:
1、量化策略代写以及优化以及研报建模
2、数据分析:主成分分析、频域分析(滤波、小波变换等)
3、量化系统定制开发
4、辅助搭建自己的量化平台
5、算法交易
价格根据服务双方协商。请联系微信quantcbll