有些指标TA-Lib没有提供,或者不符合使用的场景,需要改造更方便时使用,只能自己计算,有些是很早之前写的,写法或算法上没有经过优化,比较粗糙。
单个指标(没有与其他指标一起计算):
# ==========================================
# HHV公式:一定周期内求最高值,用法:HHV(X,N),求N周期内X最高值
# 参数:
# price_array:价格数组
# N:周期
# ==========================================
@staticmethod
def HHV(price_array, C):
ret_code = RET_OK
HHVALlPrice = price_array
# 取需要行数的数据
HHVPrice = HHVALlPrice.tail(C)
h_value = max(HHVPrice)
return ret_code, h_value
# ==========================================
# LLV公式:一定周期内求最低值,用法:HHV(X,N),求N周期内X最高值
# 参数:
# price_array:价格数组
# N:周期
# ==========================================
@staticmethod
def LLV(price_array, C):
ret_code = RET_OK
LLVVALlPrice = price_array
# 取需要行数的数据
LLVPrice = LLVVALlPrice.tail(C)
lValue = min(LLVPrice)
return ret_code, lValue
# ==========================================
# MA均线
# 参数:
# close_array:收盘价数组
# N:周期
# 响应:
# MA:MA值
# DIFF:与上一个值的差
# ==========================================
@staticmethod
def MA_1(close_array, N=10):
realPrice = np.array(close_array)
ma = pd.DataFrame()
realMa = ta.MA(realPrice, timeperiod=N, matype=0)
ma["MA"] = realMa
ma["DIFF"] = pd.DataFrame(realMa).diff()
# 删除空值
ma = ma[ma["DIFF"].notnull()]
return ma
# ==========================================
# MA均线,返回带有自动计算与上一MA的差值
# 参数:
# close_array:收盘价数组
# N:周期
# 响应:
# MA:MA值
# DIFF:与上一个值的差
# ==========================================
@staticmethod
def MA_DIFF(close_array, N):
ma = pd.DataFrame()
realMa = ta.MA(close_array, timeperiod=N, matype=0)
ma["MA"] = realMa
ma["DIFF"] = pd.DataFrame(realMa).diff()
# 删除空值
ma = ma[ma["MA"].notnull()]
return ma
# ==========================================
# MA均线
# 参数:
# close_array:收盘价数组
# N:周期
# 响应:
# MA:MA值
# ==========================================
@staticmethod
def MA(close_array, N):
ma = pd.DataFrame()
realMa = ta.MA(close_array, timeperiod=N, matype=0)
ma["MA"] = realMa
return ma
# ==========================================
# MA均线,已删除空值
# 参数:
# close_array:收盘价数组
# N:周期
# 响应:
# MA:MA值
# ==========================================
@staticmethod
def MA_NOTNULL(close_array, N):
ma = pd.DataFrame()
realMa = ta.MA(close_array, timeperiod=N, matype=0)
ma["MA"] = realMa
# 删除空值
ma = ma[ma["MA"].notnull()]
return ma
# ======================================
# EMA指标,返回带有自动计算与上一MA的差值,并删除空值
# 参数:
# close_array:close数组,numpy格式
# N:周期
# =======================================
@staticmethod
def EMA_1(close_array, N):
timeStamp = DateUtils.get_time_stamp()
realPrice = np.array(close_array)
ema = pd.DataFrame()
ema["EMA"] = realEma
ema["DIFF"] = pd.DataFrame(realEma).diff()
# 删除空值
ema = ema[ema["diff"].notnull()]
return ema
# ======================================
# EMA指标,返回带有自动计算与上一MA的差值
# 参数:
# close_array:收盘价numpy格式数组
# N:周期
# 响应:
# EMA: EMA值
# DIFF: 与上一个值的差
# =======================================
@staticmethod
def EMA(close_array, N):
ema = pd.DataFrame()
realEma = ta.EMA(close_array, timeperiod=N)
ema["EMA"] = realEma
ema["DIFF"] = pd.DataFrame(realEma).diff()
return ema
# ======================================
# RSI指标
# 参数:
# close_array:收盘价numpy格式数组
# P1,P2,P3:短中长三个值
#
# 响应:
# RSI1:RSI1
# RSI2:RSI2
# RSI3:RSI3
# =======================================
@staticmethod
def RSI(close_array, P1=6, P2=12, P3=24):
ret_code = RET_OK
rsiPrice = pd.DataFrame()
rsiValue = pd.DataFrame()
if len(close_array) == 0:
ret_code = RET_ERROR
else:
# rsiPrice = np.array(price)
rsiValue['RSI1'] = ta.RSI(close_array, timeperiod=P1)
rsiValue['RSI2'] = ta.RSI(close_array, timeperiod=P2)
rsiValue['RSI3'] = ta.RSI(close_array, timeperiod=P3)
return ret_code, rsiValue
# ======================================
# MACD指标
# 参数:
# close_array:收盘价numpy格式数组
# P1,P2,P3:短中长三个值
#
# 响应:
# RSI1:RSI1
# RSI2:RSI2
# RSI3:RSI3
# =======================================
@staticmethod
def MACD(stock_price, fastperiod=12, slowperiod=26, signalperiod=9):
dif, dea, macd = ta.MACD(stock_price,
fastperiod=fastperiod,
slowperiod=slowperiod,
signalperiod=signalperiod)
macd_values = pd.DataFrame()
macd_values['DIF'] = dif
macd_values['DEA'] = dea
macd_values['MACD'] = macd * 2
return macd_values
# ======================================
# RSI指标
# 参数:
# stock_price:DataFrame格式四个价格数组
# P1,P2,P3:短中长三个值
#
# 响应:
# K:K值
# D:D值
# J:J值
# KDIFF:K值与上一个值的差
# KDDIFF:K和D的差值
# =======================================
@staticmethod
def KDJ(stock_price, P1=9, P2=3, P3=3):
kdjData = pd.DataFrame()
# 获取最低价列表
lowList = stock_price.get("low").rolling(P1).min()
# 填充数据
lowList.fillna(0.0, inplace=True)
# lowList.fillna(inplace=True)
# 获取最高价列表
highList = stock_price.get("high").rolling(P1).max()
# 填充数据
highList.fillna(0.0, inplace=True)
RSV = (stock_price.get("close") - lowList) / (highList - lowList) * 100
kdjData["K"] = RSV.ewm(com=2).mean()
kdjData["D"] = kdjData["K"].ewm(com=2).mean()
kdjData["J"] = 3 * kdjData["K"] - 2 * kdjData["D"]
kdjData["KDIFF"] = kdjData["K"].diff()
kdjData["KDDIFF"] = (kdjData["K"] - kdjData["D"])
return kdjData
# ======================================
# CCI指标
# 参数:
# stock_price:DataFrame格式四个价格数组
# N:周期,默认14
#
# 响应:
# CCI:CCI值
# DIFF:与上一个值的差
# =======================================
@staticmethod
def CCI(stock_price, N=14):
cci = pd.DataFrame()
price_high = stock_price.get("high")
price_low = stock_price.get("low")
price_close = stock_price.get("close")
cci_array = ta.CCI(np.array(price_high), np.array(price_low), np.array(price_close), timeperiod=N)
cci["CCI"] = cci_array
cci["DIFF"] = pd.DataFrame(cci_array).diff()
# 删除空值
cci = cci[cci["DIFF"].notnull()]
return cci
# ======================================
# STD指标
# 参数:
# stock_price:DataFrame格式四个价格数组
# N:周期
#
# 响应:
# STD:STD值
# DIFF:与上一个值的差
# =======================================
@staticmethod
def STD(stock_price, N):
std = pd.DataFrame()
realPrice = np.array(stock_price["close"])
ema = pd.DataFrame()
real_std = ta.STDDEV(realPrice, timeperiod=N)
std["STD"] = real_std
std["DIFF"] = pd.DataFrame(real_std).diff()
# 删除空值
std = std[std["DIFF"].notnull()]
return std
# ====================================
# slope函数:SLOPE(X,N) 返回线性回归斜率
#
# 参数:
# stock_price:numpy格式的数组
# N:周期
# 响应:
#
# ====================================
@staticmethod
def SLOPE(stock_price, N):
slope = ta.LINEARREG_SLOPE(stock_price, timeperiod=N)
return slope
# ===================================
# SAR函数
#
# 参数:
# stock_price:dataFrame格式
# (N,S,M),N为计算周期,S为步长,M为极值
# 响应:
#
# ===================================
@staticmethod
def SAR(stock_price, S, M):
high = stock_price['high']
low = stock_price['low']
sar = ta.SAR(high, low, acceleration=S, maximum=M)
return sar
如有更好的写法可留言