261 lines
6.7 KiB
Python
261 lines
6.7 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import numpy as np
|
|
import pandas as pd
|
|
|
|
def EMA(DF, N):
|
|
return pd.Series.ewm(DF, span=N, min_periods=N - 1, adjust=True).mean()
|
|
|
|
|
|
def MA(DF, N):
|
|
return pd.Series.rolling(DF, N).mean()
|
|
|
|
|
|
def SMA(DF, N, M):
|
|
DF = DF.fillna(0)
|
|
z = len(DF)
|
|
var = np.zeros(z)
|
|
var[0] = DF[0]
|
|
for i in range(1, z):
|
|
var[i] = (DF[i] * M + var[i - 1] * (N - M)) / N
|
|
for i in range(z):
|
|
DF[i] = var[i]
|
|
return DF
|
|
|
|
|
|
def ATR(DF, N):
|
|
C = DF['close']
|
|
H = DF['high']
|
|
L = DF['low']
|
|
TR1 = MAX(MAX((H - L), ABS(REF(C, 1) - H)), ABS(REF(C, 1) - L))
|
|
atr = MA(TR1, N)
|
|
return atr
|
|
|
|
|
|
def HHV(DF, N):
|
|
return pd.Series.rolling(DF, N).max()
|
|
|
|
|
|
def LLV(DF, N):
|
|
return pd.Series.rolling(DF, N).min()
|
|
|
|
|
|
def SUM(DF, N):
|
|
return pd.Series.rolling(DF, N).sum()
|
|
|
|
|
|
def ABS(DF):
|
|
return abs(DF)
|
|
|
|
|
|
def MAX(A, B):
|
|
var = IF(A > B, A, B)
|
|
return var
|
|
|
|
|
|
def MIN(A, B):
|
|
var = IF(A < B, A, B)
|
|
return var
|
|
|
|
|
|
def IF(COND, V1, V2):
|
|
var = np.where(COND, V1, V2)
|
|
for i in range(len(var)):
|
|
V1[i] = var[i]
|
|
return V1
|
|
|
|
|
|
def REF(DF, N):
|
|
var = DF.diff(N)
|
|
var = DF - var
|
|
return var
|
|
|
|
|
|
def STD(DF, N):
|
|
return pd.Series.rolling(DF, N).std()
|
|
|
|
|
|
def MACD(DF, FAST, SLOW, MID):
|
|
EMAFAST = EMA(DF, FAST)
|
|
EMASLOW = EMA(DF, SLOW)
|
|
DIFF = EMAFAST - EMASLOW
|
|
DEA = EMA(DIFF, MID)
|
|
MACD = (DIFF - DEA) * 2
|
|
DICT = {'DIFF': DIFF, 'DEA': DEA, 'MACD': MACD}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def KDJ(DF, N, M1, M2):
|
|
C = DF['close']
|
|
H = DF['high']
|
|
L = DF['low']
|
|
RSV = (C - LLV(L, N)) / (HHV(H, N) - LLV(L, N)) * 100
|
|
K = SMA(RSV, M1, 1)
|
|
D = SMA(K, M2, 1)
|
|
J = 3 * K - 2 * D
|
|
DICT = {'KDJ_K': K, 'KDJ_D': D, 'KDJ_J': J}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def OSC(DF, N, M): # 变动速率线
|
|
C = DF['close']
|
|
OS = (C - MA(C, N)) * 100
|
|
MAOSC = EMA(OS, M)
|
|
DICT = {'OSC': OS, 'MAOSC': MAOSC}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def BBI(DF, N1, N2, N3, N4): # 多空指标
|
|
C = DF['close']
|
|
bbi = (MA(C, N1) + MA(C, N2) + MA(C, N3) + MA(C, N4)) / 4
|
|
DICT = {'BBI': bbi}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def BBIBOLL(DF, N1, N2, N3, N4, N, M): # 多空布林线
|
|
bbiboll = BBI(DF, N1, N2, N3, N4)
|
|
UPER = bbiboll + M * STD(bbiboll, N)
|
|
DOWN = bbiboll - M * STD(bbiboll, N)
|
|
DICT = {'BBIBOLL': bbiboll, 'UPER': UPER, 'DOWN': DOWN}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def PBX(DF, N1, N2, N3, N4, N5, N6): # 瀑布线
|
|
C = DF['close']
|
|
PBX1 = (EMA(C, N1) + EMA(C, 2 * N1) + EMA(C, 4 * N1)) / 3
|
|
PBX2 = (EMA(C, N2) + EMA(C, 2 * N2) + EMA(C, 4 * N2)) / 3
|
|
PBX3 = (EMA(C, N3) + EMA(C, 2 * N3) + EMA(C, 4 * N3)) / 3
|
|
PBX4 = (EMA(C, N4) + EMA(C, 2 * N4) + EMA(C, 4 * N4)) / 3
|
|
PBX5 = (EMA(C, N5) + EMA(C, 2 * N5) + EMA(C, 4 * N5)) / 3
|
|
PBX6 = (EMA(C, N6) + EMA(C, 2 * N6) + EMA(C, 4 * N6)) / 3
|
|
DICT = {'PBX1': PBX1, 'PBX2': PBX2, 'PBX3': PBX3,
|
|
'PBX4': PBX4, 'PBX5': PBX5, 'PBX6': PBX6}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def BOLL(DF, N): # 布林线
|
|
C = DF['close']
|
|
boll = MA(C, N)
|
|
UB = boll + 2 * STD(C, N)
|
|
LB = boll - 2 * STD(C, N)
|
|
DICT = {'BOLL': boll, 'UB': UB, 'LB': LB}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def ROC(DF, N, M): # 变动率指标
|
|
C = DF['close']
|
|
roc = 100 * (C - REF(C, N)) / REF(C, N)
|
|
MAROC = MA(roc, M)
|
|
DICT = {'ROC': roc, 'MAROC': MAROC}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def MTM(DF, N, M): # 动量线
|
|
C = DF['close']
|
|
mtm = C - REF(C, N)
|
|
MTMMA = MA(mtm, M)
|
|
DICT = {'MTM': mtm, 'MTMMA': MTMMA}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def MFI(DF, N): # 资金指标
|
|
C = DF['close']
|
|
H = DF['high']
|
|
L = DF['low']
|
|
VOL = DF['vol']
|
|
TYP = (C + H + L) / 3
|
|
V1 = SUM(IF(TYP > REF(TYP, 1), TYP * VOL, 0), N) / \
|
|
SUM(IF(TYP < REF(TYP, 1), TYP * VOL, 0), N)
|
|
mfi = 100 - (100 / (1 + V1))
|
|
DICT = {'MFI': mfi}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def SKDJ(DF, N, M):
|
|
CLOSE = DF['close']
|
|
LOWV = LLV(DF['low'], N)
|
|
HIGHV = HHV(DF['high'], N)
|
|
RSV = EMA((CLOSE - LOWV) / (HIGHV - LOWV) * 100, M)
|
|
K = EMA(RSV, M)
|
|
D = MA(K, M)
|
|
DICT = {'SKDJ_K': K, 'SKDJ_D': D}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def WR(DF, N, N1): # 威廉指标
|
|
HIGH = DF['high']
|
|
LOW = DF['low']
|
|
CLOSE = DF['close']
|
|
WR1 = 100 * (HHV(HIGH, N) - CLOSE) / (HHV(HIGH, N) - LLV(LOW, N))
|
|
WR2 = 100 * (HHV(HIGH, N1) - CLOSE) / (HHV(HIGH, N1) - LLV(LOW, N1))
|
|
DICT = {'WR1': WR1, 'WR2': WR2}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def BIAS(DF, N1, N2, N3): # 乖离率
|
|
CLOSE = DF['close']
|
|
BIAS1 = (CLOSE - MA(CLOSE, N1)) / MA(CLOSE, N1) * 100
|
|
BIAS2 = (CLOSE - MA(CLOSE, N2)) / MA(CLOSE, N2) * 100
|
|
BIAS3 = (CLOSE - MA(CLOSE, N3)) / MA(CLOSE, N3) * 100
|
|
DICT = {'BIAS1': BIAS1, 'BIAS2': BIAS2, 'BIAS3': BIAS3}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def RSI(DF, N1, N2, N3): # 相对强弱指标RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;
|
|
CLOSE = DF['close']
|
|
LC = REF(CLOSE, 1)
|
|
RSI1 = SMA(MAX(CLOSE - LC, 0), N1, 1) / SMA(ABS(CLOSE - LC), N1, 1) * 100
|
|
RSI2 = SMA(MAX(CLOSE - LC, 0), N2, 1) / SMA(ABS(CLOSE - LC), N2, 1) * 100
|
|
RSI3 = SMA(MAX(CLOSE - LC, 0), N3, 1) / SMA(ABS(CLOSE - LC), N3, 1) * 100
|
|
DICT = {'RSI1': RSI1, 'RSI2': RSI2, 'RSI3': RSI3}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def ADTM(DF, N, M): # 动态买卖气指标
|
|
HIGH = DF['high']
|
|
LOW = DF['low']
|
|
OPEN = DF['open']
|
|
DTM = IF(OPEN <= REF(OPEN, 1), 0, MAX(
|
|
(HIGH - OPEN), (OPEN - REF(OPEN, 1))))
|
|
DBM = IF(OPEN >= REF(OPEN, 1), 0, MAX((OPEN - LOW), (OPEN - REF(OPEN, 1))))
|
|
STM = SUM(DTM, N)
|
|
SBM = SUM(DBM, N)
|
|
ADTM1 = IF(STM > SBM, (STM - SBM) / STM,
|
|
IF(STM == SBM, 0, (STM - SBM) / SBM))
|
|
MAADTM = MA(ADTM1, M)
|
|
DICT = {'ADTM': ADTM1, 'MAADTM': MAADTM}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|
|
|
|
|
|
def DDI(DF, N, N1, M, M1): # 方向标准离差指数
|
|
H = DF['high']
|
|
L = DF['low']
|
|
DMZ = IF((H + L) <= (REF(H, 1) + REF(L, 1)), 0,
|
|
MAX(ABS(H - REF(H, 1)), ABS(L - REF(L, 1))))
|
|
DMF = IF((H + L) >= (REF(H, 1) + REF(L, 1)), 0,
|
|
MAX(ABS(H - REF(H, 1)), ABS(L - REF(L, 1))))
|
|
DIZ = SUM(DMZ, N) / (SUM(DMZ, N) + SUM(DMF, N))
|
|
DIF = SUM(DMF, N) / (SUM(DMF, N) + SUM(DMZ, N))
|
|
ddi = DIZ - DIF
|
|
ADDI = SMA(ddi, N1, M)
|
|
AD = MA(ADDI, M1)
|
|
DICT = {'DDI': ddi, 'ADDI': ADDI, 'AD': AD}
|
|
VAR = pd.DataFrame(DICT)
|
|
return VAR
|