通达信公式改写成python代码的最简实现方式

您所在的位置:网站首页 cci公式解释 通达信公式改写成python代码的最简实现方式

通达信公式改写成python代码的最简实现方式

2023-07-18 03:24| 来源: 网络整理| 查看: 265

MyTT

MyTT是您量化工具箱里的瑞士军刀,精炼而高效,它将通达信,同花顺,文华麦语言等指标公式indicators,最简移植到Python中,核心库单个文件,仅百行代码,实现和转换同花顺通达信所有常见指标MACD,RSI,BOLL,ATR,KDJ,CCI,PSY等,全部基于numpy和pandas的函数封装,简洁且高性能,能非常方便的应用在各自股票股市技术分析,股票自动程序化交易,数字货币BTC等量化等领域

功能特点

核心库轻量化: 项目库就一个文件MyTT.py,不用安装,不用设置,随用随走 ( from MyTT import * 即可 )

代码人类化:) 没有什么炫耀的编程花样,初学者也能看懂,自己就能自行增加指标,马上就能用在项目中。

不需要安装ta-lib库,是纯python代码实现的的核心逻辑,很多人都有安装ta-lib库的痛苦经历

和通达信,同花顺的指标写法完全兼容,一个新的指标基本不用做修改,直接拿来即可使用

超高性能,基本不用循环,全是靠numpy,pandas的内置函数实现各种指标

和Talib库一样是多天参数进,多天指标出(序列进,序列出),便于画图和观察趋势

MyTT实现的各种指标和通达信,同花顺,雪球等软件的技术指标一致到小数点后2位

先看一个最简单的例子 #股市行情数据获取和作图 -2 from Ashare import * #股票数据库 https://github.com/mpquant/Ashare from MyTT import * #myTT麦语言工具函数指标库 https://github.com/mpquant/MyTT # 证券代码兼容多种格式 通达信,同花顺,聚宽 # sh000001 (000001.XSHG) sz399006 (399006.XSHE) sh600519 ( 600519.XSHG ) df=get_price('000001.XSHG',frequency='1d',count=120) #获取今天往前120天的日线实时行情 print('上证指数日线行情\n',df.tail(5)) #-------有数据了,下面开始正题 ------------- CLOSE=df.close.values; OPEN=df.open.values #基础数据定义,只要传入的是序列都可以 HIGH=df.high.values; LOW=df.low.values #例如 CLOSE=list(df.close) 都是一样 MA5=MA(CLOSE,5) #获取5日均线序列 MA10=MA(CLOSE,10) #获取10日均线序列 up,mid,lower=BOLL(CLOSE) #获取布林带指标数据 print('BTC5日均线', MA5[-1] ) # 只取最后一个数 print('BTC10日均线',RET(MA10)) # RET(MA10) == MA10[-1] print('今天5日线是否上穿10日线',RET(CROSS(MA5,MA10))) print('最近5天收盘价全都大于10日线吗?',EVERY(CLOSE>MA10,5) ) #上证指数日线行情---------------------------------------------------- open close high low volume 2021-06-07 3597.14 3599.54 3600.38 3581.90 303718677.0 2021-06-08 3598.75 3580.11 3621.52 3563.25 304491470.0 2021-06-09 3576.80 3591.40 3598.71 3572.64 298323296.0 2021-06-10 3587.53 3610.86 3624.34 3584.13 318174808.0 2021-06-11 3614.11 3589.75 3614.40 3587.15 360554970.0 #贵州茅台60分钟线---------------------------------------------------- open close high low volume 2021-06-10 14:00:00 2237.00 2224.16 2245.00 2222.00 4541.53 2021-06-10 15:00:00 2222.21 2238.48 2240.34 2222.21 4146.88 2021-06-11 10:30:00 2239.00 2220.00 2244.00 2197.86 12030.00 2021-06-11 11:30:00 2220.01 2210.18 2231.80 2200.18 4868.00 2021-06-11 14:00:00 2210.10 2223.35 2224.48 2206.01 4544.00 2021-06-11 15:00:00 2223.33 2178.81 2226.80 2178.81 12529.00 MyTT库中的部分工具函数 #------------------ 0级:核心工具函数 -------------------------------------------- def RD(N,D=3): return np.round(N,D) #四舍五入取3位小数 def RET(S,N=1): return np.array(S)[-N] #返回序列倒数第N个值,默认返回最后一个 def ABS(S): return np.abs(S) #返回N的绝对值 def MAX(S1,S2): return np.maximum(S1,S2) #序列max def MIN(S1,S2): return np.minimum(S1,S2) #序列min def MA(S,N): #求序列的N日平均值,返回序列 return pd.Series(S).rolling(N).mean().values # pd.rolling_mean(S,N) (Python2) def REF(S, N=1): #对序列整体下移动N,返回序列(shift后会产生NAN) return pd.Series(S).shift(N).values def DIFF(S, N=1): #前一个值减后一个值,前面会产生nan return pd.Series(S).diff(N) #np.diff(S)直接删除nan,会少一行 def STD(S,N): #求序列的N日标准差,返回序列 return pd.Series(S).rolling(N).std(ddof=0).values def IF(S_BOOL,S_TRUE,S_FALSE): #序列布尔判断 res=S_TRUE if S_BOOL==True else S_FALSE return np.where(S_BOOL, S_TRUE, S_FALSE) def SUM(S, N): #对序列求N天累计和,返回序列 N=0对序列所有依次求和 return pd.Series(S).rolling(N).sum().values if N>0 else pd.Series(S).cumsum() #pd.rolling_sum(S,N) (Python2) def HHV(S,N): # HHV(C, 5) # 最近5天收盘最高价 return pd.Series(S).rolling(N).max().values # pd.rolling_max(S,N) (Python2) def LLV(S,N): # LLV(C, 5) # 最近5天收盘最低价 return pd.Series(S).rolling(N).min().values # pd.rolling_min(S,N) (Python2) def EMA(S,N): #指数移动平均,为了精度 S>4*N EMA至少需要120周期 return pd.Series(S).ewm(span=N, adjust=False).mean().values def SMA(S, N, M=1): #中国式的SMA,至少需要120周期才精确 (雪球180周期) alpha=1/(1+com) return pd.Series(S).ewm(com=N-M, adjust=True).mean().values def AVEDEV(S,N): #平均绝对偏差 (序列与其平均值的绝对差的平均值) avedev=pd.Series(S).rolling(N).apply(lambda x: (np.abs(x - x.mean())).mean()) return avedev.values def SLOPE(S,N,RS=False): #返S序列N周期回线性回归斜率 (默认只返回斜率,不返回整个直线序列) M=pd.Series(S[-N:]); poly = np.polyfit(M.index, M.values,deg=1); Y=np.polyval(poly, M.index); if RS: return Y[1]-Y[0],Y return Y[1]-Y[0] 已经实现的技术指标,基本涵盖了绝大多数常用指标 #------------------ 2级:技术指标函数(全部通过0级,1级函数实现) ------------------------------ def MACD(CLOSE,SHORT=12,LONG=26,M=9): # EMA的关系,S取120日,和雪球小数点2位相同 DIF = EMA(CLOSE,SHORT)-EMA(CLOSE,LONG); DEA = EMA(DIF,M); MACD=(DIF-DEA)*2 return RD(DIF),RD(DEA),RD(MACD) def KDJ(CLOSE,HIGH,LOW, N=9,M1=3,M2=3): # KDJ指标 RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100 K = EMA(RSV, (M1*2-1)); D = EMA(K,(M2*2-1)); J=K*3-D*2 return K, D, J def RSI(CLOSE, N=24): DIF = CLOSE-REF(CLOSE,1) return RD(SMA(MAX(DIF,0), N) / SMA(ABS(DIF), N) * 100) def WR(CLOSE, HIGH, LOW, N=10, N1=6): #W&R 威廉指标 WR = (HHV(HIGH, N) - CLOSE) / (HHV(HIGH, N) - LLV(LOW, N)) * 100 WR1 = (HHV(HIGH, N1) - CLOSE) / (HHV(HIGH, N1) - LLV(LOW, N1)) * 100 return RD(WR), RD(WR1) def BIAS(CLOSE,L1=6, L2=12, L3=24): # BIAS乖离率 BIAS1 = (CLOSE - MA(CLOSE, L1)) / MA(CLOSE, L1) * 100 BIAS2 = (CLOSE - MA(CLOSE, L2)) / MA(CLOSE, L2) * 100 BIAS3 = (CLOSE - MA(CLOSE, L3)) / MA(CLOSE, L3) * 100 return RD(BIAS1), RD(BIAS2), RD(BIAS3) def BOLL(CLOSE,N=20, P=2): #BOLL指标,布林带 MID = MA(CLOSE, N); UPPER = MID + STD(CLOSE, N) * P LOWER = MID - STD(CLOSE, N) * P return RD(UPPER), RD(MID), RD(LOWER) def PSY(CLOSE,N=12, M=6): PSY=COUNT(CLOSE>REF(CLOSE,1),N)/N*100 PSYMA=MA(PSY,M) return RD(PSY),RD(PSYMA) def CCI(CLOSE,HIGH,LOW,N=14): TP=(HIGH+LOW+CLOSE)/3 return (TP-MA(TP,N))/(0.015*AVEDEV(TP,N)) def ATR(CLOSE,HIGH,LOW, N=20): #真实波动N日平均值 TR = MAX(MAX((HIGH - LOW), ABS(REF(CLOSE, 1) - HIGH)), ABS(REF(CLOSE, 1) - LOW)) return MA(TR, N) def BBI(CLOSE,M1=3,M2=6,M3=12,M4=20): #BBI多空指标 return (MA(CLOSE,M1)+MA(CLOSE,M2)+MA(CLOSE,M3)+MA(CLOSE,M4))/4 def DMI(CLOSE,HIGH,LOW,M1=14,M2=6): #动向指标:结果和同花顺,通达信完全一致 TR = SUM(MAX(MAX(HIGH - LOW, ABS(HIGH - REF(CLOSE, 1))), ABS(LOW - REF(CLOSE, 1))), M1) HD = HIGH - REF(HIGH, 1); LD = REF(LOW, 1) - LOW DMP = SUM(IF((HD > 0) & (HD > LD), HD, 0), M1) DMM = SUM(IF((LD > 0) & (LD > HD), LD, 0), M1) PDI = DMP * 100 / TR; MDI = DMM * 100 / TR ADX = MA(ABS(MDI - PDI) / (PDI + MDI) * 100, M2) ADXR = (ADX + REF(ADX, M2)) / 2 return PDI, MDI, ADX, ADXR def TAQ(HIGH,LOW,N): #唐安奇通道(海龟)交易指标,大道至简,能穿越牛熊 UP=HHV(HIGH,N); DOWN=LLV(LOW,N); MID=(UP+DOWN)/2 return UP,MID,DOWN def KTN(CLOSE,HIGH,LOW,N=20,M=10): #肯特纳交易通道, N选20日,ATR选10日 MID=EMA((HIGH+LOW+CLOSE)/3,N) ATRN=ATR(CLOSE,HIGH,LOW,M) UPPER=MID+2*ATRN; LOWER=MID-2*ATRN return UPPER,MID,LOWER def TRIX(CLOSE,M1=12, M2=20): #三重指数平滑平均线 TR = EMA(EMA(EMA(CLOSE, M1), M1), M1) TRIX = (TR - REF(TR, 1)) / REF(TR, 1) * 100 TRMA = MA(TRIX, M2) return TRIX, TRMA def VR(CLOSE,VOL,M1=26): #VR容量比率 LC = REF(CLOSE, 1) return SUM(IF(CLOSE > LC, VOL, 0), M1) / SUM(IF(CLOSE REF(CLOSE,1),VOL,IF(CLOSEBB) & (AA>CC),AA+BB/2+DD/4,IF( (BB>CC) & (BB>AA),BB+AA/2+DD/4,CC+DD/4)); X=(CLOSE-LC+(CLOSE-OPEN)/2+LC-REF(OPEN,1)); SI=16*X/R*MAX(AA,BB); ASI=SUM(SI,M1); ASIT=MA(ASI,M2); return ASI,ASIT #望大家能提交更多指标和函数 https://github.com/mpquant/MyTT BOLL带指标数据获取和做图演示 (上证综指) up,mid,lower=BOLL(CLOSE) #获取布林带数据 plt.figure(figsize=(15,8)) plt.plot(CLOSE,label='上证'); plt.plot(up,label='up'); #画图显示 plt.plot(mid,label='mid'); plt.plot(lower,label='lower');

在这里插入图片描述

需安装第三方库(无需ta-lib库,所有指标实现仅需要安装pandas既可) pandas 目前项目已经开源:

https://github.com/mpquant/MyTT



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3