Giter VIP home page Giter VIP logo

mpquant / mytt Goto Github PK

View Code? Open in Web Editor NEW
1.6K 44.0 530.0 415 KB

MyTT将通达信,同花顺,文华麦语言等指标公式,最简移植到Python中,核心库单个文件,仅百行代码,十几个核心函数,神奇的实现所有常见技术指标算法(不依赖talib库)的纯python实现和转换通达信MACD,RSI,BOLL,ATR,KDJ,CCI,PSY等公式,全部基于pandas函数计算方法封装,简洁且高性能,能非常方便的应用在股票指标公式,股市期货量化框架分析,自动程序化交易,数字货币量化等领域,它是您最精练的股市量化工具。Python library with most stock market indicators.

Python 100.00%
indicators python macd rsi boll atr kdj cci psy btc

mytt's People

Contributors

75168117 avatar mpquant avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mytt's Issues

增加一个ZIP之字转向吧

建议加一个ZIP之字转向。
ZIG(K,N),当价格变化超过N%时转向,K表示0:开盘价,1:最高价,2:最低价,3:收盘价,其余:数组信息。
例如:ZIGA(3,5)表示收盘价变化5%的ZIGA转向。

通达信指标的编写,遇到REF问题

你好,使用您的库函数如果编写下面的这两个公式:
VAR1:=(C>REF(C,1) AND C>REF(C,2));
VAR2:=(REF(VAR1,1) AND C<=REF(C,1) AND C>=REF(C,2));

我是这样编写的:
VAR1=(CLOSE>REF(CLOSE,1) & CLOSE>REF(CLOSE,2));
一直出现报错:
TypeError:unsupported operand type(s) for &: 'LinesOperation' and 'LinesOperation'

RSI指标计算

使用RSI指标计算的时候报错:
invalid value encountered in divide
return RD(SMA(MAX(DIF, 0), N) / SMA(ABS(DIF), N) * 100)

这里并不是一直报错,是运行一阵之后偶尔报错

为稳定版本,建议拉个开发分支出来

现有的main分支慎重更新,不然追求稳定的项目不大敢引用这个库,怕乱套了。

想法和贡献先在开发分支里实现,验证无误再合并main分支并打版本标签,这样就很清晰了。

BARSLAST这个函数不是应该返回一个序列吗

BARSLAST这个函数不是应该返回一个序列吗?假设一个列表有2个条件成立的位置,上个条件成立的位置到列表最后一个就是列表最大值,上个条件成立的位置起始点就是返回的最小值

贡献一个相对强弱指标stoch RSI

def STOCHRSI(CLOSE, N=14, S=5, P=3):  # 随机相对强弱指标  Stochastic Relative Strength Index(Stoch RSI)
    RSI_D = RSI(CLOSE, N=N)
    LLV_D = LLV(RSI_D, S)
    HHV_D = HHV(RSI_D, S)
    stochRSI = (RSI_D - LLV_D) / (HHV_D - LLV_D) * 100
    K = MA(stochRSI, P)
    D = MA(K, P)
    return K, D

add BARSLAST

上一次条件成立到当前的周期
BARSLAST(CLOSE/REF(CLOSE)>=1.1) #上一次涨停到今天的天数

关于REF函数

REF(price,N)N只能是整数,如果N是序列,该如何处理?

关于DMA函数的定义

看了一下myTT中对DMA函数的定义:

# myTT定义的DMA
def DMA(CLOSE, N1=10, N2=50, M=10):  # 平行线差指标
    DIF = MA(CLOSE, N1) - MA(CLOSE, N2)
    DIF_MA = MA(DIF, M)
    return DIF, DIF_MA

显然,与通达信的动态移动平均函数DMA不是一回事。

为此,给出与通达信完全一致的DMA函数定义:

# jqz1226定义的DMA, 通达信动态移动平均, py3版
def DMA(S, A):
    return pd.Series(S).ewm(alpha=A, adjust=False).mean().values
# jqz1226定义的DMA, 通达信动态移动平均, py2版
def DMA(S, A):
    return pd.ewma(S,com=1.0/A - 1,adjust=False)

价格为小数时,MyTT计算指标精度丢失

In [8]: cs=pd.Series([0.0014206, 0.0014267, 0.0014481, 0.0014968, 0.0015338, 0.001553 ,
   ...:        0.0015419, 0.0015932, 0.0016061, 0.0016428, 0.0015578, 0.0016377,
   ...:        0.0016215, 0.0015671, 0.0015631, 0.0015753, 0.0015723, 0.0015584,
   ...:        0.0015552, 0.0015157, 0.0015386, 0.0015448, 0.0015455, 0.001557 ,
   ...:        0.0015842, 0.0015893, 0.0016561, 0.0018115, 0.0018354, 0.0018405])
   ...: MyTT.BOLL(cs)
Out[8]: 
(array([  nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
        0.002, 0.002, 0.002]),
 array([  nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002,
        0.002, 0.002, 0.002]),
 array([  nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,   nan,
          nan, 0.001, 0.001, 0.001, 0.001, 0.002, 0.002, 0.002, 0.002,
        0.001, 0.001, 0.001]))

py2版SMA函数定义错误

mytt.py的py2版本中,SMA定义为:

def SMA(S, N, M=1):        #**式的SMA,至少需要120周期才精确 (雪球180周期)    alpha=1/(1+com)
    return pd.ewma(S,com=N-M,adjust=True)   

已知:
alpha =1/(1+com)

又知道,SMA正确的alpha是M/N
alpha = M/N

容易求出:
com = N/M-1=(N-M)/M

所以,py2中SMA中正确的定义应该是:

def SMA(S, N, M=1):        #**式的SMA,至少需要120周期才精确 (雪球180周期)    alpha=1/(1+com)
    return pd.ewma(S,com=((N-M)*1.0)/M,adjust=False)  

或者:

def SMA(S, N, M=1):        #**式的SMA,至少需要120周期才精确 (雪球180周期)    alpha=1/(1+com)
    return pd.ewma(S,com=(N*1.0)/M - 1,adjust=False)

注意到画蛇添足地乘以了1.0,是因为直接除,py2中会变成整除。先乘以1.0,int转化为float后,再除,就是正确的了。

已经在一创聚宽验证过了,上述两个修改版,计算结果都是正确的。

HHV和LLV的第二个参数如果是序列应该怎么实现?

下面是一段通达信的代码:
T:=BARSLAST(CROSS(MA5,MA60));{5日均线上穿10均线以来的周期数}
ZDL:=HHV(VOL,T+20);{最大成交量}
ZXL:=LLV(VOL,T);{最小成交量}
YT:=HHV(C,T);{鸭头顶}
A1:=EVERY(C>MA60,T);{收盘价都在MA60以上}

其中HHV、LLV的第二个参数是T的一个序列,这个好像在python中会报错,因为第二个参数不支持序列,请问有什么实现的办法吗?
谢谢了!

CROSS函数计算结果处理错误,修正建议

def CROSS(S1, S2): # 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5))
return np.concatenate(([False], np.logical_not((S1>S2)[:-1]) & (S1>S2)[1:])) # 不使用0级函数,移植方便 by jqz1226

改成:
def CROSS(S1, S2): # 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5))
return np.concatenate(([False], np.logical_not((S1 > S2)[:-1]) & (S1 > S2)[1:].reset_index(drop=True)))

错误应该挺多的

刚才测试了HHV和HHVBARS,发现跟通达信不同,你在通达信里面选择一个才上市的日K线少的股票测试一下就知道.,比如301302
HIGH
array([72.99, 64.79, 64.8 , 64.94, 67.21, 63.98, 69.6 , 72.12, 75. ,
72.72, 74.23, 70.33, 68.82, 65.38, 63.89, 66. , 66.52, 64.77,
66.4 , 68.68, 67.58])

HHV(HIGH,5)
array([ nan, nan, nan, nan, 72.99, 67.21, 69.6 , 72.12, 75. ,
75. , 75. , 75. , 75. , 74.23, 74.23, 70.33, 68.82, 66.52,
66.52, 68.68, 68.68])

HHVBARS(HIGH,5)
array([nan, nan, nan, nan, 4., 1., 0., 0., 0., 1., 2., 3., 4.,
3., 4., 4., 4., 1., 2., 0., 1.])

你们看看,这个是需要的结果么,肯定要把nan消除.
应该改成这样,加一个min_periods=1,HHVBARS也类似:

def HHV(S,N): #HHV(C, 5) 最近5天收盘最高价
return pd.Series(S).rolling(N,1).max().values

还有个问题,如果这个N是个序列,比如通达信里面可以这样:
M:=500;
HH1:=HHV(HIGH,M);{高点1}
HP1:=HHVBARS(HIGH,M);{高点1位置}
LL1:=LLV(LOW,M);{低点1}
LP1:=LLVBARS(LOW,M);{低点1位置}

HH2:=HHV(HIGH,LP1);{高点2} # 转成python后,这个LP1是序列,执行这行就崩溃了
HP2:=HHVBARS(HIGH,LP1);{高点2位置}
如果是序列,应该每根K线取对应的LP1里面的值,这个怎么写?没细想,:)

另外还有不少函数没实现,稍微复杂的公式,就发现没法跑

请问RET和REF有差别吗?

另外你例子里面数字货币判断今天是否上穿?我看你的CROSS函数是判断穿越包含了上穿和下穿。RET(CROSS())代表上穿吗

怎么引用通达信的dll

公式可以编写,但引用的dll没有源码,能直接像在通达信里绑定dll吗?怎么弄?

求通达信TFILTER函数

过滤连续出现的信号.
用法:TFILTER(买入条件,卖出条件,N);过滤掉买入(卖出)信号发出后,下一个反向信号发出前的所有买入(卖出)信号.

N=1表示仅对买入信号过滤;
N=2表示仅对卖出信号过滤;
N=0表示对买入和卖出信号都过滤,返回1,2表示买入或卖出条件成立;
同一K线上只能有一个信号;

CROSS结果不对

使用上穿时,debug肯定是有True的地方,事实结果全是flase
s1 = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,15,16])
s2 = pd.Series([6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,6])
s1 = MA(s1, 3)
s2 = MA(s2, 5)
c = CROSS(s1, s2)

结果全是false

贡献两个函数:WMA函数及FORCAST函数

def WMA(X, n):
    # type: (np.ndarray, int) -> np.ndarray
    """
    通达信WMA, X的N日加权移动平均,算法 Yn = (1*X1+2*X2+3*X3+...+n*Xn)/(1+2+3+...+Xn)
    :param X: 数组。源数据。

    :param n: 整数。周期。
    :return: 数组。X的N日加权移动平均
    """
    weights = np.array(range(1, n + 1))
    w = weights / np.sum(weights)
    S = pd.Series(X)

    res = S.rolling(window=n).apply(lambda x: np.sum(w * x), raw=False).values
    return res


def FORCAST(X, n):
    # type: (np.ndarray, int) -> np.ndarray
    """
    通达信FORCAST. 返回X的线性回归预测值,n暂时不支持变量
    参考资料:[FORCAST函数的真实含义](http://www.70822.com/soft/sort013/sort03/down-18804.html)
    
    :param X: 数组。源数据。
    :param n: 整数。周期。
    :return: 数组。线性回归预测值
    """
    return 3 * WMA(X, n) - 2 * MA(X, n)

FORCAST函数的实现,很另类,但反复核对,正确无误。

好哥哥,可以告诉我OBV函数怎么使用吗?

这是函数的参数定义
def OBV(CLOSE,VOL)
我传入收盘价与量的集合,会产生异常。
而我不传集合,每日收盘价和量不会异常,但是返回0.

So! 这个函数到底应该怎么用呢?

FILTER

建议加个filter函数,目前功能很完善,比funcat使用方便准确,多谢,加油

求CR指标,谢谢

这是通达信的参数

MID:=REF(HIGH+LOW+CLOSE,1)/3;
CR:SUM(MAX(0,HIGH-MID),N)/SUM(MAX(0,MID-LOW),N)*100,COLORFF7F27;

SMA函数定义错误

SMA函数正确的写法应该是:

def SMA(S, N, M=1):  # **式的SMA,至少需要120周期才精确,直接定义alpha=m/n
    return pd.Series(S).ewm(alpha=M / N, adjust=True).mean().values

贡献两个函数,filter,sumbars

def sumbars(X, A):
    # type: (np.ndarray, Optional[np.ndarray, float, int]) -> np.ndarray
    """
    通达信SumBars函数的Python实现
    SumBars函数将X向前累加,直到大于等于A, 返回这个区间的周期数。例如SUMBARS(VOL, CAPITAL),求完全换手的周期数。

    :param X: 数组。被累计的源数据。 源数组中不能有小于0的元素。
    :param A: 数组(一组)或者浮点数(一个)或者整数(一个),累加截止的界限数
    :return:  数组。各K线分别对应的周期数
    """
    X = np.flipud(X)  # 倒转
    length = len(X)

    if isinstance(A * 1.0, float):  # 是单值
        A = np.repeat(A, length)  # 转化为数组

    sumbars = np.zeros(length)  # 初始化sumbars为0
    Sigma = np.insert(np.cumsum(X), 0, 0.0)  # 在累加值前面插入一个0.0(元素变多1个,便于引用)

    for i in range(length):
        k = np.searchsorted(Sigma[i + 1:], A[i] + Sigma[i])
        if k < length - i:  # 找到
            sumbars[length - i - 1] = k + 1

    return sumbars.astype(int)


def filter(X, n):
    # type: (np.ndarray, int) -> np.ndarray
    """
    通达信filter函数,用于过滤连续出现的信号。X满足条件后,将其后n周期内的数据置为0. 例如filter(Close>Open,13)

    :param X: 信号原数组, bool类型
    :param n: 周期
    :return: 处理后的信号数组, bool类型
    """
    i = 0
    while i < len(X):
        if X[i]:
            X[i + 1: i + n + 1] = False  # 其后的n周期数据置为False
            i += n + 1  # 直接跳转到(n+1)个数据之后
        else:
            i += 1
    #
    return X

写的不怎么优雅,但准确性和速度是没有问题的。

对SLOPE函数的修改

myTT中现在的SLOPE函数:

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]

存在如下问题:
1) 有三个参数,与通达信不一致;
2)违背了array in, array out的原则;
3)写法繁琐

特修改如下:

def SLOPE(S, N):
    # type: (np.ndarray, int) -> np.ndarray
    """
    通达信SLOPE。返S序列N周期回线性回归斜率,N暂时不支持变量。
    """
    M = pd.Series(S)
    return M.rolling(window=N).apply(lambda y: np.polyfit(y.index, y.values, deg=1)[0], raw=False)

BARSLAST函数有两个潜在BUG

1 你们BARSLAST要求的参数S_BOOL 只能为ndarray类型,传入pd.Series会报错,还要用户在外面转换一道,建议在函数里面转换
2 BARSLAST返回的是一个值,我还以为是一个序列,那么返回序列的话要怎么改呢?

贡献3个函数:量比,钱龙短线指标,钱龙长线指标

def QRR(VOL):  # 量比(Quantity Relative Ratio)
    return (VOL / MA(REF(VOL), 5)).values


def SHO(CLOSE, VOL, N=5):  # 钱龙短线指标(Short)
    VAR1 = MA((VOL - REF(VOL, 1)) / REF(VOL, 1), 5)
    VAR2 = (CLOSE - MA(CLOSE, 24)) / MA(CLOSE, 24) * 100
    SHT = VAR2 * (1 + VAR1)
    SHTMA = MA(SHT, N)
    return SHT, SHTMA


def LON(CLOSE, HIGH, LOW, VOL):  # 钱龙长线指标(Long)
    LC = REF(CLOSE, 1)
    VID = SUM(VOL, 2) / (((HHV(HIGH, 2) - LLV(LOW, 2))) * 100)
    RC = (CLOSE - LC) * VID
    LONG = SUM(RC, 0)
    DIFF = SMA(LONG, 10, 1)
    DEA = SMA(LONG, 20, 1)
    LON = DIFF - DEA
    LONMA = MA(LON, 10)
    return LON, LONMA

CROSS 函数没有顺序性?

测试了一下为什么CROSS(MA(CLOSE, 30), MA(CLOSE, 10))和CROSS(MA(CLOSE, 10), MA(CLOSE, 30)) 返回的结果是一样的呢?
30日线穿过10日线,和10日线穿过30日线按理说应该不一样才对
求解答

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.