#scikit-learn #knn
#scikit-learn #knn
Вопрос:
Я хотел бы реализовать алгоритм K-nearest neighbor в индексе S amp; P 500 для прогнозирования будущей цены и разработки количественной модели торговли алгоритмами с помощью python с помощью библиотеки scikit-learn. Хотя у меня есть базовое понимание алгоритма kNN, я полный новичок в программировании машинного обучения на python, поэтому я был бы рад, если кто-нибудь сможет мне помочь.
Вот моя логика моделирования
- Актив: ежемесячная цена индекса S amp; P 500 (для инвестирования в ETF)
- Логические
- Прогнозируйте направление цены в следующем месяце (вверх или вниз) на основе алгоритма kNN каждый конец месяца —-> прогнозируемый рост: покупка индекса S amp; P 500, снижение: удержание наличных (гипотетический индекс 3% годовой доходности)
- Набор обучающих данных: последние данные за 12 месяцев (набор обучающих данных постоянно меняется с течением времени, как в случае со скользящим средним)
- Независимая переменная: последние 3, 6, 9, 12-месячный доход мотылька, последние 12 месяцев скользящее стандартное отклонение месячного дохода
- Зависимая переменная: доход за следующий месяц, выраженный как положительный или отрицательный
Вот мой код. Я мог бы закодировать базовый набор данных, но понятия не имею о кодировании основного алгоритма и логики моделирования. Кто-нибудь может завершить этот код?
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pandas_datareader.data as web
def price(stock, start):
price = web.DataReader(name=stock, data_source='yahoo', start=start)['Adj Close']
return price.div(price.iat[0]).resample('M').last().to_frame('price')
a = price('SPY','2000-01-01')
a['cash'] = [(1.03**(1/12))**x for x in range(len(a.index))]
a['R3'] = a.price/a.price.shift(3)
a['R6'] = a.price/a.price.shift(6)
a['R9'] = a.price/a.price.shift(9)
a['R12'] = a.price/a.price.shift(12)
a['rollingstd'] = a.price.pct_change().rolling(12).std()
Ответ №1:
Я сделал это. Хотя это еще одна версия стратегии, использующей оценку фрактального импульса, она может быть полезной
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pandas_datareader.data as web
from sklearn import neighbors, svm
from sklearn.ensemble import RandomForestClassifier
def price(stock, start):
price = web.DataReader(name=stock, data_source='yahoo', start=start)['Adj Close']
return price.div(price.iat[0]).resample('M').last().to_frame('price')
def fractal(a, p):
df = pd.DataFrame()
for count in range(1,p 1):
a['direction'] = np.where(a['price'].diff(count)>0,1,0)
a['abs'] = a['price'].diff(count).abs()
a['volatility'] = a.price.diff().abs().rolling(count).sum()
a['fractal'] = a['abs']/a['volatility']*a['direction']
df = pd.concat([df, a['fractal']], axis=1)
return df
def meanfractal(a, l=12):
a['meanfractal']= pd.DataFrame(fractal(a, l)).sum(1,skipna=False)/l
a = price('^KS11','2000-01-01')
a['cash'] = [(1.03**(1/12))**x for x in range(len(a.index))]
a['meanfractal']= pd.DataFrame(fractal(a, 12)).sum(1,skipna=False)/12
a['rollingstd'] = a.price.pct_change().shift(1).rolling(12).std()
a['result'] = np.where(a.price > a.price.shift(1), 1,0)
a = a.dropna()
print(a)
clf = neighbors.KNeighborsClassifier(n_neighbors=3)
clf1 = svm.SVC()
clf3 = RandomForestClassifier(n_estimators=5)
a['predicted']= pd.Series()
for i in range(12,len(a.index)):
x = a.iloc[i-12:i,6:8]
y = a['result'][i-12:i]
clf3.fit(x, y)
a['predicted'][i]= clf3.predict(x)[-1]
a = a.dropna()
a.price = a.price.div(a.price.ix[0])
print(a)
accuracy=clf3.score(a.iloc[:,6:8],a['result'])
a['결과'] = np.where(a.predicted.shift(1)==1,a.price/a.price.shift(1),1).cumprod()
a['result'] = np.where(a.predicted.shift(1)==1,(a.price/a.price.shift(1) 1.0026)/2,1.0026).cumprod()
a['동일비중'] = ((a.price/a.price.shift(1) 1.0026)/2).cumprod()
a[['result','price','결과']].plot()
plt.show()
print ("Predicted model accuracy: " str(accuracy))