Python中如何使用TensorFlow LSTM模型构建Bitcoin价格预测机器人

简介

TensorFlow-Bitcoin-Robot:一个基于 TensorFlow LSTM 模型的 Bitcoin 价格预测机器人。

上一篇的内容,太简单了,做了一个详细的补充: https://www.v2ex.com/t/383620

LSTM ( Long Short-Term Memory )是长短期记忆网络,是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM 已经在科技领域有了多种应用。基于 LSTM 的系统可以学习翻译语言、控制机器人、图像分析、文档摘要、语音识别图像识别、手写识别、控制聊天机器人、预测疾病、点击率和股票、合成音乐等等任务。比特币的成交记录就是事件序列上的加个数据,可以基于过去的成交记录序列来对未来的价格作出预测。

数据集

原始数据来自 btctrade,用 requests 爬取,它包含比特币的 50 个交易记录。

get_trades.py 会获取这些交易记录,重新转化为 json ,并且用图片的方式展示出来,供下一步数据分析使用。

模型

rnn_predicter.py

使用 LSMT 模型。截取 10 个交易记录作为输入,如果 第 11 个价格比第 10 个高,就把输出设置为 [1,0,0],如果低就设置为 [0,0,1] ,如果相同 [0,1,0]。

for i in range(0,20):
    #print(price)
    one_predictor=np.array(price[i:i+20],dtype=float)
    #print(one_predictor)
    train_x.append(one_predictor)
    if(int(price[i+20])>int(price[i+21])):
        train_y.append(np.array([1,0,0]))
    elif (int(price[i + 20]) == int(price[i + 21])):
        train_y.append(np.array([0,1,0]))
    elif(int(price[i+20])<int(price[i+21])):
        train_y.append(np.array([0,0,1]))

下一步定义模型:

def RNN(x, weights, biases):
    #首先把数据拆分为 n 个序列,每一个的维度 (batch_size, n_input)
    x = tf.unstack(x, n_steps, 1)
# 定一个 lstm cell
lstm_cell = rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)

# 获得 lstm 的输出
outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)
# 加个线性激活
return tf.matmul(outputs[-1], weights['out']) + biases['out']

获得结果,定义损失函数和优化函数

pred = RNN(x, weights, biases)
# Define loss and optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

Evaluate model

correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

项目开源地址和训练结果

https://github.com/TensorFlowNews/TensorFlow-Bitcoin-Robot/

后续更新发布

http://www.tensorflownews.com/

更新计划

模型持久化,训练数据集持久化,测试数据集。


Python中如何使用TensorFlow LSTM模型构建Bitcoin价格预测机器人

2 回复

要构建一个基于LSTM的比特币价格预测机器人,核心是搭建一个能处理时间序列数据的神经网络。这里给你一个完整的代码示例,包括数据预处理、模型构建、训练和预测的基本流程。

首先,确保安装了必要的库:tensorflow, pandas, numpy, scikit-learn。你可以用pip安装。

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
import yfinance as yf  # 用于获取比特币数据

# 1. 获取数据
def fetch_bitcoin_data():
    # 使用yfinance获取比特币历史价格数据
    ticker = yf.Ticker("BTC-USD")
    df = ticker.history(period="max")  # 获取所有可用历史数据
    # 我们只关心'Close'价格
    data = df[['Close']].values
    return data

# 2. 数据预处理
def prepare_data(data, look_back=60):
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled_data = scaler.fit_transform(data)

    X, y = [], []
    for i in range(look_back, len(scaled_data)):
        X.append(scaled_data[i-look_back:i, 0])
        y.append(scaled_data[i, 0])
    X, y = np.array(X), np.array(y)
    # 为LSTM层重塑数据为 [样本数, 时间步长, 特征数]
    X = np.reshape(X, (X.shape[0], X.shape[1], 1))
    return X, y, scaler

# 3. 构建LSTM模型
def build_lstm_model(input_shape):
    model = Sequential()
    # 第一层LSTM,返回序列
    model.add(LSTM(units=50, return_sequences=True, input_shape=input_shape))
    model.add(Dropout(0.2))
    # 第二层LSTM
    model.add(LSTM(units=50, return_sequences=True))
    model.add(Dropout(0.2))
    # 第三层LSTM,不返回序列
    model.add(LSTM(units=50))
    model.add(Dropout(0.2))
    # 输出层
    model.add(Dense(units=1))

    model.compile(optimizer='adam', loss='mean_squared_error')
    return model

# 4. 主程序流程
def main():
    # 获取数据
    print("正在获取比特币数据...")
    data = fetch_bitcoin_data()
    print(f"数据形状: {data.shape}")

    # 准备数据
    look_back = 60  # 用过去60天的数据预测下一天
    X, y, scaler = prepare_data(data, look_back)

    # 划分训练集和测试集 (80%训练, 20%测试)
    split = int(0.8 * len(X))
    X_train, X_test = X[:split], X[split:]
    y_train, y_test = y[:split], y[split:]

    # 构建模型
    print("正在构建LSTM模型...")
    model = build_lstm_model((X_train.shape[1], 1))

    # 训练模型
    print("正在训练模型...")
    history = model.fit(X_train, y_train, 
                        epochs=20, 
                        batch_size=32, 
                        validation_data=(X_test, y_test),
                        verbose=1)

    # 进行预测
    print("正在进行预测...")
    predicted_price = model.predict(X_test)
    # 将预测值反归一化回原始价格范围
    predicted_price = scaler.inverse_transform(predicted_price)
    # 同样处理真实值用于比较
    y_test_reshaped = y_test.reshape(-1, 1)
    real_price = scaler.inverse_transform(y_test_reshaped)

    # 这里可以添加逻辑,根据最新预测做出交易决策
    # 例如:如果预测明天价格高于今天,则发出“买入”信号
    latest_prediction = predicted_price[-1][0]
    print(f"最新的价格预测: ${latest_prediction:.2f}")

    # 简单示例:保存模型供后续使用
    model.save('bitcoin_lstm_model.h5')
    print("模型已保存为 'bitcoin_lstm_model.h5'")

if __name__ == "__main__":
    main()

代码解释:

  1. 数据获取:使用 yfinance 库获取比特币的历史收盘价。
  2. 数据预处理:将价格数据归一化到0-1之间,然后创建时间窗口(这里用过去60天的数据作为输入特征 X,下一天的收盘价作为目标 y)。
  3. 模型构建:创建一个三层LSTM的序列模型,每层后加了Dropout来防止过拟合,最后用一个全连接层输出预测值。
  4. 训练与预测:用80%的数据训练模型,20%的数据测试,训练完成后对测试集进行预测,并将结果反归一化得到实际价格。

核心要点:

  • 时间窗口 (look_back):这是关键参数,决定了模型用多少历史数据来做预测,需要根据数据特性调整。
  • 特征工程:这个基础示例只用了收盘价。要提升效果,可以加入更多特征,如开盘价、最高价、最低价、交易量,甚至技术指标(如RSI、MACD)。
  • 预测与交易:这个模型预测的是下一时间点的价格。要构建“交易机器人”,你需要在预测基础上制定策略(例如,预测上涨则买入,预测下跌则卖出),并连接交易所API执行交易。

一句话建议: 用更多特征和更复杂的模型结构来提升预测精度。


楼主靠他赚了钱没

回到顶部