Нейросеть для предсказания цены биткоина своими руками

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Разбираем с небольшой проект для сбора и анализа данных из социальных сетей с целью предсказать поведение цены биткоина в реальном времени.

Код, о котором пойдет речь продолжает Youtube-видео об автоматическом прогнозировании цены на биткоин.  

Проект позволяет предсказать цену криптовалюты и использует данные социальных сетей Reddit и Twitter для машинного обучения. Мы собираемся использовать технику, называемую анализом настроений, чтобы найти эмоции, стоящие за пользователями, и попытаться выяснить, коррелирует ли цена с тем, как люди относятся к популярной криптовалюте. Мы будем использовать API CoinDesk для извлечения данных о ценах биткоина и python для программирования приложения.

По словам автора, данная сборка готова к работе на платформе Google Cloud.

Сбор данных для оценки биткоина

Чтобы собирать данные для аналитики в фоновом режиме, необходимо запустить программы Continuous_Stream_Data.py и Continuous_Stream_Sentiment.py. Эти скрипты позволят осуществлять сбор и предварительную обработку входных данных, а после сохранять все в файлы live_tweet.csv и live_bitcoin.csv.

Ядро движка

Основой для обработки данных будет нейросеть, построенная по модели LSTM (Long short-term memory). Основные параметры (подключаемые модули, данные для соединения с базой данных и аккаунтом в Twilio) устанавливаются в файле engine.py.

Подключаемые пакеты, в том числе для создания и тренеровки модели нейросети:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

frommathimportsqrt

fromnumpy importconcatenate

frommatplotlib importpyplot

importpandas aspd

fromdatetimeimportdatetime

fromsklearn.preprocessing importMinMaxScaler

fromsklearn.preprocessing importLabelEncoder

fromsklearn.metrics importmean_squared_error

fromkeras.models importSequential

fromkeras.layers importDense

fromkeras.layers importLSTM

importnumpy asnp

importdatetime

frompytz importtimezone

est=timezone('US/Eastern')

Подключение аккаунта Twilio:

1

2

3

4

5

6

7

8

fromtwilio.rest importClient

# ID аккаунта из twilio.com/console

account_sid="*******"

# Токен из панели управления Twilio

auth_token="*******"

client=Client(account_sid,auth_token)

Сервис Twillio предоставляет различные API, например, для обработки смс и голосовых сообщений. В данном случае он используется для аутентификации и отправки сообщений.

Дальше ядро загружает данные для тренеровки сети и передает их экземпляру библиотеки Keras, на основе которой строится модель:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

data=pd.read_csv("merged_data.csv")

datag=data[['Price','Sentiment']].groupby(data['Time']).mean()

fromsklearn.preprocessing importMinMaxScaler

values=datag['Price'].values.reshape(-1,1)

sentiment=datag['Sentiment'].values.reshape(-1,1)

values=values.astype('float32')

sentiment=sentiment.astype('float32')

scaler=MinMaxScaler(feature_range=(0,1))

scaled=scaler.fit_transform(values)

train_size=int(len(scaled)*0.7)

test_size=len(scaled)-train_size

train,test=scaled[0:train_size,:],scaled[train_size:len(scaled),:]

print(len(train),len(test))

split=train_size

defcreate_dataset(dataset,look_back,sentiment,sent=False):

dataX,dataY=[],[]

foriinrange(len(dataset)-look_back):

ifi>=look_back:

a=dataset[i-look_back:i+1,0]

a=a.tolist()

if(sent==True):

a.append(sentiment[i].tolist()[0])

dataX.append(a)

dataY.append(dataset[i+look_back,0])

#print(len(dataY))

returnnp.array(dataX),np.array(dataY)

look_back=2

trainX,trainY=create_dataset(train,look_back,sentiment[0:train_size],sent=True)

testX,testY=create_dataset(test,look_back,sentiment[train_size:len(scaled)],

sent=True)

trainX=np.reshape(trainX,(trainX.shape[0],1,trainX.shape[1]))

testX=np.reshape(testX,(testX.shape[0],1,testX.shape[1]))

model=Sequential()

model.add(LSTM(100,input_shape=(trainX.shape[1],trainX.shape[2]),return_sequences=True))

model.add(LSTM(100))

model.add(Dense(1))

model.compile(loss='mae',optimizer='adam')

history=model.fit(trainX,trainY,epochs=300,batch_size=100,

validation_data=(testX,testY),verbose=0,shuffle=False)

yhat=model.predict(testX)

yhat_inverse_sent=scaler.inverse_transform(yhat.reshape(-1,1))

testY_inverse_sent=scaler.inverse_transform(testY.reshape(-1,1))

rmse_sent=sqrt(mean_squared_error(testY_inverse_sent,yhat_inverse_sent))

print('Test RMSE: %.3f'%rmse_sent)

Подключение базы данных:

1

2

3

4

5

6

7

8

9

10

11

12

importMySQLdb

#Enter the values for you database connection

dsn_database="bitcoin"# название базы данных

dsn_hostname="173.194.231.244"# имя хоста, напрмер localhost

dsn_port=3306# порт хоста

dsn_uid="demo"# имя пользователя БД

dsn_pwd="[email protected]"# пароль от базы данных

conn=MySQLdb.connect(host=dsn_hostname,port=dsn_port,user=dsn_uid,

passwd=dsn_pwd,db=dsn_database)

cursor=conn.cursor()

Ядро обрабатывает данные базы и csv-файлов для подготовки статистики и расчета советов:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

importqueue

importtime

importqueue

importmatplotlib.pyplot asplt

true_q=queue.Queue()

pred_q=queue.Queue()

'''

fig = plt.figure()

ax = fig.add_subplot(111)

fig.show()

fig.canvas.draw()

plt.ion()

'''

defprocess_data(in_data):

out_data=[]

forline inin_data:

out_data.append(float(line.split(',')[0]))

returnnp.array(out_data).reshape(-1,1)

prev=15000

threshold=0.05

whileTrue:

btc=open('live_bitcoin.csv','r')

sent=open('live_tweet.csv','r')

bit_data=btc.readlines()

sent_data=sent.readlines()

bit_data=process_data(bit_data[len(bit_data)-5:])

sent_data=process_data(sent_data[len(sent_data)-5:])

live=scaler.transform(bit_data)

testX,testY=create_dataset(live,2,sent_data,sent=True)

testX=np.reshape(testX,(testX.shape[0],1,testX.shape[1]))

yhat=model.predict(testX)

yhat_inverse=scaler.inverse_transform(yhat.reshape(-1,1))

true_q.put(bit_data[4])

pred_q.put(yhat_inverse[0])

val=100*((yhat_inverse[0][0]-prev)/prev)

Если текущее значение оказывается больше или меньше порогового, сформируется соответствующее сообщение:

Python

1

2

3

4

5

6

7

8

9

10

ifval>threshold:

decision='Buy!!!'

message=client.messages.create(to="+15184234418?",from_="+15188883052",

body=decision+' - Price of Bitcoin is expected to rise.')

elifval<-threshold:

decision='Sell!!!'

message=client.messages.create(to="+15184234418",from_="+15188883052",

body=decision+' - Price of Bitcoin is expected to drop.')

else:

decision=''

Данные о решении записываются в базу:

1

2

3

4

5

6

7

prev=yhat_inverse[0][0]

input_string="INSERT INTO live_data values ({},{},{},'{}',

'{}');".format(yhat_inverse[0][0],bit_data[0][0],sent_data[4][0],

datetime.datetime.now(tz=est).strftime('%Y-%m-%d %H:%M:%S'),decision)

cursor.execute(input_string)

conn.commit()

time.sleep(60)

Здесь можно посмотреть код ядра целиком.

Пример содержания live_bitcoin:

1

2

3

4

5

6

7

8

15078.2,12753300000.0,252259597803,16730087.0,16730087.0,-1.7,-6.13,35.79,14579.62,14598.6,

14589.11,17-12-09-15-25

15078.2,12753300000.0,252259597803,16730087.0,16730087.0,-1.7,-6.13,35.79,14579.62,14598.6,

14589.11,17-12-09-15-26

15078.2,12753300000.0,252259597803,16730087.0,16730087.0,-1.7,-6.13,35.79,14599.06,14608.1,

14603.58,17-12-09-15-26

15078.2,12753300000.0,252259597803,16730087.0,16730087.0,-1.7,-6.13,35.79,14579.62,14598.6,

14589.11,17-12-09-15-26

И live_tweet:

1

2

3

4

0.0475357211354,17-12-12-21-35

0.0471845801768,17-12-12-21-36

0.0471845801768,17-12-12-21-37

0.0471845801768,17-12-12-21-38

Нейросеть выдает значение будущей цены биткоина с временной меткой. Вычисления делаются на основе порогового значения, установленного в коде движка. Полученная информация о времени, предсказанной и текущей цене, а также рекомендуемом действии (покупка/продажа) записывается в MySQL базу данных.

Автор отмечает, что поскольку модель вышла перегруженной (она хорошо работает с обучающей выборкой, но не очень – с тестовыми данными), не стоит рассматривать ее как инструмент для помощи в торговле. Однако этот код остается хорошим пособием по применению нейросетей и может помочь в изучении их работы.

Вас также могут заинтересовать другие статьи по теме:


Источник: proglib.io

Комментарии: