Ниже приведено кое-что для начала. Акцент на «начало», потому что он не отвечает непосредственно на ваши вопросы.
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)
для проверки логики c. Теперь вы должны начать настраивать бесплатные параметры, а также логи c по своему вкусу.
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 и вернуться и поделиться своими решениями и выводами.