【Kaiyun·yunkai(中国)官方网站】使用Tensorflow作为二进制分类问题预测加密货币价格
讲解在本教程中,我们将讲解神经网络的原型,该模型将使我们需要用于Keras和Tensorflow作为我们的主要clarvoyance工具来估算未来的加密货币价格(作为二进制分类问题)。然这很有可能不是解决问题的最佳方法(却是投资银行在研发这种算法上投放了数十亿美元),但如果我们需要在55%以上的时间里把问题解决问题好,我们就有钱人了!我们要做到什么1. 用于Binance APIiTunes数据2. 预处理数据3. 训练我们的模型4. 特征工程5. 评估性能最佳的模型用于Binance APIiTunes数据对于此示例,我们将iTunes单个调用中可提供的仅次于数据量。如果您想要训练更多更好的东西并在现实世界中用于它(不建议这样做到,那么您可能会浪费真钱),我建议您用于多次调用搜集更加多数据。import requestsimport jsonimport pandas as pdimport datetime as dtSTART_DATE = '2019-01-01'END_DATE = '2019-10-01'INTERVAL = '15m'def parse_date(x):return str(int(dt.datetime.fromisoformat(x).timestamp()))def get_bars(symbol, interval):root_url = 'https://api.binance.com/api/v1/klines'url = root_url + '?symbol=' + symbol + 'interval=' + interval + 'startTime=' + parse_date(START_DATE) + 'limit=1000'data = json.loads(requests.get(url).text)df = pd.DataFrame(data)df.columns = ['open_time', 'o', 'h', 'l', 'c', 'v', 'close_time', 'qav', 'num_trades', 'taker_base_vol', 'taker_quote_vol', 'ignore']df.drop(['ignore', 'close_time'], axis=1, inplace=True)return dfethusdt = get_bars('ETHUSDT', INTERVAL)ethusdt.to_csv('./data.csv', index=False)在这段非常简单的代码中,我们必须适当的程序包,设置几个参数(我自由选择了15分钟的时间间隔,但是您可以自由选择更加细致的时间间隔以展开更高频率的交易)并设置一些便利的函数,然后将数据留存到csv以供将来器重。
这应当是不言而喻的,但如果有什么事情让你疑惑,请求随时留给评论,拒绝回应:)数据预处理由于价格是顺序数据的一种形式,因此我们将用于LSTM层(长年短期记忆)作为我们网络中的第一层。我们期望将数据获取为一系列事件,这些事件将预测时间t + n处的价格,其中t是当前时间,n定义我们要预测的未来时间,为此,我们将数据作为 w长度的时间窗口。查阅代码后,一切将显得更为明晰,让我们开始引入所需的软件包。
import pandas as pdimport numpy as npimport seaborn as snsimport randomfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, LSTM, Dropoutfrom tensorflow.keras.callbacks import TensorBoardimport timeimport matplotlib.pyplot as plt这将引入Pandas,Numpy,我们训练模型所需的所有Tensorflow函数以及其他一些简单的软件包。接下来,我们要定义一些常量,并从csv读取我们的数据(防止您在其他文件上撰写训练代码:WINDOW = 10 # how many time units we are going to use to evaluatethe future value, in our case each time unit is 15 minutes so weare going to look at 15 * 10 = 150 minutes trading dataLOOKAHEAD = 5 # how far ahead we want to estimate if the futureprices is going to be higher or lower? In this case is 5 * 15 = 75minutes in the futureVALIDATION_SAMPLES = 100 # We want to validate our model on datathat wasn't used for the training, we are establishing how manydata point we are going to use here.data = pd.read_csv('./data.csv')data['future_value'] = data['c'].shift(-LOOKAHEAD) # This allows us todefine a new column future_value with as the value of c 5 time unitsin the futuredata.drop(['open_time'], axis=1, inplace=True) # we don't care about the timestamp forpredicting future prices让我们定义一个函数,该函数使我们可以定义将来的价格是低于还是高于当前收盘价:def define_output(last, future):if futurelast:return 1else:return 0如果价格高于或相等当前收盘价,只需将目标设置为0,如果价格低于或低于当前收盘价,则将其设置为1。现在让我们定义一个函数,该函数使我们需要创立必须输出神经网络的移动时间窗口:def sequelize(x):data = x.copy()buys = []sells = []holds = []data_length = len(data)for index, row in data.iterrows():if index = data_length - WINDOW:last_index = index + WINDOW -1rowset = data[index : index + WINDOW]row_stats = rowset.describe().transpose()last_close = rowset['c'][last_index]future_close = rowset['future_value'][last_index]rowset = 2 * (rowset - row_stats['min']) / (row_stats['max'] - row_stats['min']) - 1rowset.drop(['future_value'], axis=1, inplace=True)rowset.fillna(0, inplace=True)category = define_output(last_close, future_close)if category == 1:buys.append([rowset, category])elif category == 0:sells.append([rowset, category])min_len = min(len(sells), len(buys))results = sells[:min_len] + buys[:min_len]return resultssequences = sequelize(data)哦,好吧,这里有很多东西。
让我们一点一点地看:data = x.copy() # let's copy the dataframe, just in casebuys = []sells = []holds = []data_length = len(data)在这里,我们正在做到一些可行性的工作,拷贝数据板以保证我们不覆盖面积它(例如如果您用于Jupyter Notebook可能会很烦人),并设置用作交易的数组,我们将用于它们来均衡数据。for index, row in data.iterrows():if index = data_length - WINDOW:last_index = index + WINDOW -1rowset = data[index : index + WINDOW]当我们递归数据集中于的每一行时,如果索引小于我们定义的窗口大小,我们可以创立一个新的数据块,即窗口大小。在将此数据存储到另一个数组中之前,我们必须用于以下代码对其展开规范化:row_stats = rowset.describe().transpose()last_close = rowset['c'][last_index]future_close = rowset['future_value'][last_index] # we'll need to save this separately from the rest of the datarowset = 2 * (rowset - row_stats['min']) / (row_stats['max'] - row_stats['min']) - 1而且我们还想要从数据集中于移除future_value,后用0更换任何有可能的NaN(对于我们的目的而言,理想情况还过于好):rowset.drop(['future_value'], axis=1, inplace=True)rowset.fillna(0, inplace=True)最后我们要保证我们的交易均衡,如果其中一种再次发生的频率比另一种再次发生的频率低,我们的网络将很快偏向斜向,并且无法为我们获取可信的估算: if category == 1:buys.append([rowset, category])elif category == 0:sells.append([rowset, category])# the following 2 lines will ensure that we have an equal amount of buys and sellsmin_len = min(len(sells), len(buys))results = sells[:min_len] + buys[:min_len]return results最后我们在数据序列上运营此函数= sequelize(data)随机化我们的数据也是个好主意,这样我们的模型就会受到数据集排序的准确顺序的影响,以下代码将对数据集展开随机化,将训练数据集与测试数据集展开合并,并同时表明这两种数据中的购入与售出产于数据集。
随时新的运营此代码段,以保证更加平衡地分配出售和出售:random.shuffle(sequences)def split_label_and_data(x):length = len(x)data_shape = x[0][0].shapedata = np.zeros(shape=(len(x),data_shape[0],data_shape[1]))labels = np.zeros(shape=(length,))for index in range(len(x)):labels[index] = x[index][1]data[index] = x[index][0]return data, labelsx_train, y_train = split_label_and_data(sequences[: -VALIDATION_SAMPLES])x_test, y_test = split_label_and_data(sequences[-VALIDATION_SAMPLES :])sns.distplot(y_test)sns.。
本文关键词:Kaiyun·yunkai(中国)官方网站,Kaiyun·yunkai(中国)官方网站·IOS/手机版APP下载/APP
本文来源:Kaiyun·yunkai(中国)官方网站-www.hoymk.com