我不需要代码,只需逻辑上的方法即可。
Example of S/R levels and a trendline
我知道s / r水平在一个人与另一个人之间是不同的,因此我附上了一张图表,以显示我用来考虑支撑/阻力水平或趋势线的标准。
S / R级别必须有2次以上的触摸,如果超过此标准,则触地次数最多的是有效触摸,对于阻力而言也是相同的。
趋势线必须具有3次触摸才能生效。
由于所有行都可以扩展,因此所有行都有边距错误。当然,一旦支撑线断裂,它就会变成阻力。
我尝试采用一组最小值的值,然后查看其他条形是否在这些值的特定范围内,但不够准确!
最佳答案
下面是您开始的事情。强调“开始”,因为它不会直接回答您的问题。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
模拟数据。
np.random.seed(42)
mu = 0.03
ret = mu+np.random.randn(500)
price = 1+np.cumsum(ret)
首先查找
support
,用移动平均值去除信号中的噪声。按support
值进行偏移,然后查找偏移值为零的位置,即与support line
接触的位置。def get_support_line(df,days=100):
df['price_ma']=df['price'].rolling(5).mean()
df = df.dropna()
supports={}
for x in np.arange(0,len(df)-days,10):
price_tmp = df.iloc[x:x+days]['price_ma'].values
# offset signal by support value, loc crossing 0 will be support.
support_val = price_tmp[-1]
norm = price_tmp-support_val
lim = 0.05 # hack to find intersect with support line with tolerance
signal = np.logical_and(norm<lim,norm>-1*lim).astype(np.int)
inds = np.where(np.diff(signal)>0)[0]
if np.sum(signal)>3:
supports[x+days]={
'x':inds+x,
'y':support_val*np.ones(inds.shape)
}
return df, supports
df = pd.DataFrame()
df['price']=price
df, supports = get_support_line(df)
绘图以验证逻辑。现在,您应该开始调整自由参数以及“喜欢”的逻辑。
df.plot(figsize=(10,5))
for k,v in supports.items():
print('support identified at days prior index',k,'value: {:1.2f}'.format(v['y'][0]),'touch inds:',v['x'])
plt.plot([v['x'][0],v['x'][-1]],[v['y'][0],v['y'][-1]],color='red')
plt.grid(True)
我不购买技术分析,但是我认为这是一个有趣的问题,明智的实施!那里应该有很多图书馆。因此,请务必进行Google搜索,然后回来分享您的解决方案和发现。