Support Resistance Algorithm - Technical analysis

后端 未结 11 580
悲哀的现实
悲哀的现实 2020-12-12 09:23

I have an intra-day chart and I am trying to figure out how to calculate support and resistance levels, anyone knows an algorithm for doing that, or a good starting point?

11条回答
  •  生来不讨喜
    2020-12-12 09:38

    The best way I have found to get SR levels is with clustering. Maxima and Minima is calculated and then those values are flattened (like a scatter plot where x is the maxima and minima values and y is always 1). You then cluster these values using Sklearn.

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from sklearn.cluster import AgglomerativeClustering
    
    # Calculate VERY simple waves
    mx = df.High_15T.rolling( 100 ).max().rename('waves')
    mn = df.Low_15T.rolling( 100 ).min().rename('waves')
    
    mx_waves = pd.concat([mx,pd.Series(np.zeros(len(mx))+1)],axis = 1)
    mn_waves = pd.concat([mn,pd.Series(np.zeros(len(mn))+-1)],axis = 1)    
    
    mx_waves.drop_duplicates('waves',inplace = True)
    mn_waves.drop_duplicates('waves',inplace = True)
    
    W = mx_waves.append(mn_waves).sort_index()
    W = W[ W[0] != W[0].shift() ].dropna()
    
    # Find Support/Resistance with clustering
    
    # Create [x,y] array where y is always 1
    X = np.concatenate((W.waves.values.reshape(-1,1),
                        (np.zeros(len(W))+1).reshape(-1,1)), axis = 1 )
    
    # Pick n_clusters, I chose the sqrt of the df + 2
    n = round(len(W)**(1/2)) + 2
    cluster = AgglomerativeClustering(n_clusters=n,
              affinity='euclidean', linkage='ward')
    cluster.fit_predict(X)
    W['clusters'] = cluster.labels_
    
    # I chose to get the index of the max wave for each cluster
    W2 = W.loc[W.groupby('clusters')['waves'].idxmax()]
    
    # Plotit
    fig, axis = plt.subplots()
    for row in W2.itertuples():
    
        axis.axhline( y = row.waves, 
                color = 'green', ls = 'dashed' )
    
    axis.plot( W.index.values, W.waves.values )
    plt.show()
    

提交回复
热议问题