当前位置: 首页 > 科技观察

使用Python预测比特币价格

时间:2023-03-15 23:56:44 科技观察

本文转载自微信公众号《区块链研究实验室》,作者连三丰。转载本文请联系区块链研究实验室公众号。在本文中,我们将讨论与比特币价格预测相关的程序。涵盖的主题:1.什么是比特币2.如何使用比特币3.使用深度学习预测比特币价格什么是比特币?比特币是所有加密爱好者普遍使用的加密货币之一。即使与以太坊、瑞波币、莱特币等几种著名的加密货币并驾齐驱,比特币仍位居榜首。加密货币通常用作我们货币的加密形式,并广泛用于购物、交易、投资等。它使用点对点技术,其背后没有任何驱动力或任何第三方干预在内部完成的交易网络。此外,比特币是“开源”的,任何人都可以使用。特点:快速的点对点交易低费用的全球支付使用的原则-密码学:加密货币(比特币)背后的工作原理是“加密”,它们用于保护和验证谈判,并控制新组件的开发加密货币建立。如何使用比特币?安全钱包:比特币钱包应该更加安全,以便轻松顺畅地进行交易比特币价格波动:比特币价格可能会波动。价格可能会上涨或下跌,具体取决于通货膨胀率、交易量等多种因素。使用深度学习预测比特币价格1.数据收集:导入CSV文件数据集。importpandasaspdimportnumpyasnpiimportmatplotlib.pyplotasplt现在,使用pandas和numpy导入数据集。Numpy在python中主要用于科学计算,coindata=pd.read_csv('Dataset.csv')googledata=pd.read_csv('DS2.csv')打印加载的原始数据集,coindata=coindata.drop(['#'],axis=1)coindata.columns=['Date','Open','High','Low','Close','Volume']googledata=googledata.drop(['Date','#'],axis=1)不用的列会放在这里。从硬币数据和Google数据集中删除两列,因为它们是未使用的列。从数据集中删除未使用的列后,将打印两个数据集的最终结果。last=pd.concat([coindata,googledata],axis=1)连接两个数据集(coindata和googledata)并使用函数last.to_csv('Bitcoin3D.csv',index=False)打印它2.一维RNN:现在连接两个数据集后,将导出最终数据集。importpandasaspdimportmatplotlib.pyplotaspltimportnumpyasnpimportmathfromsklearn.preprocessingimportMinMaxScalerfromsklearn.metricsimportmean_squared_errorfromkeras.modelsimportSequentialfromkeras.layersimportDense,Activation,Dropoutfromkeras.layersimportLSTM在这里使用Keras库。Keras使用高效的计算库仅需几行代码即可训练神经网络模型。MinMaxScaler将通过将每个特征映射到给定比例来转换特征。sklearn包将提供该程序所需的一些实用函数。密集层将执行以下操作并返回输出。output=activation(dot(input,kernel)+bias)defnew_dataset(dataset,step_size):data_X,data_Y=[],[]foriinrange(len(dataset)-step_size-1):a=dataset[i:(i+步长),0]data_X.append(a)data_Y.append(dataset[i+step_size,0])returnnp.array(data_X),np.array(data_Y)将数据预处理阶段收集的一维数据分解为对于时间序列数据,df=pd.read_csv("Bitcoin1D.csv")df['Date']=pd.to_datetime(df['Date'])df=df.reindex(index=df.index[::-1])数据集已加载。该函数是从Bitcoin1D.csv文件中读取的。此外,将“日期”列转换为“日期时间”。按“日期”列重新索引所有数据集。zaman=np.arange(1,len(df)+1,1)OHCL_avg=df.mean(axis=1)直接分配一个新的索引数组。OHCL_avg=np.reshape(OHCL_avg.values,(len(OHCL_avg),1))#7288datascaler=MinMaxScaler(feature_range=(0,1))OHCL_avg=scaler.fit_transform(OHCL_avg)归一化数据集后分配scaler,#打印(OHCL_avg)train_OHLC=int(len(OHCL_avg)*0.56)test_OHLC=len(OHCL_avg)—train_OHLCtrain_OHLC,test_OHLC=OHCL_avg[0:train_OHLC,:],OHCL_avg[train_OHLC:len(OHCL_avg),:]#TrainthedatasetsandtestittrainX,trainY=new_dataset(train_OHLC,1)testX,testY=new_dataset(test_OHLC,1)从平均OHLC(高开低开)创建一维数据集,trainX=np.reshape(trainX,(trainX.shape[0],1,trainX.shape[1]))testX=np.reshape(testX,(testX.shape[0],1,testX.shape[1]))step_size=1在3D维度对LSTM数据集进行整形。将step_size赋值为1。model=Sequential()model.add(LSTM(128,input_shape=(1,step_size)))model.add(Dropout(0.1))model.add(Dense(1))model.add(Activation('linear'))创建LSTM模型,model.compile(loss='mean_squared_error',optimizer='adam')model.fit(trainX,trainY,epochs=10,batch_size=25,verbose=2)定义epochs的数量为10,batch_size为25=scaler.inverse_transform([testY])为绘图标准化,trainScore=math.sqrt(mean_squared_error(trainY[0],trainPredict[:,0]))testScore=math.sqrt(mean_squared_error(testY[0],testPredict[:,0]))计算预测测试数据集的性能度量RMSE,trainPredictPlot=np.empty_like(OHCL_avg)trainPredictPlot[:,:]=np.nantrainPredictPlot[step_size:len(trainPredict)+step_size,:]=trainPredict将transform最后的火车n数据集用于绘图,testPredictPlot=np.empty_like(OHCL_avg)testPredictPlot[:,:]=np.nantestPredictPlot[len(trainPredict)+(step_size*2)+1:len(OHCL_avg)-1,:]=testPredict使用转换后的预测测试数据集进行绘图,最后可视化预测值OHCL_avg=scaler.inverse_transform(OHCL_avg)plt.plot(OHCL_avg,'g',label='OrginalDataset')plt.plot(trainPredictPlot,'r',label='TrainingSet')plt.plot(testPredictPlot,'b',label='Predictedprice/testset')plt.title("BitcoinPredictedPrices")plt.xlabel('Time',fontsize=12)plt.ylabel('ClosePrice',fontsize=12)plt.legend(loc='upperright')plt.show()3.多变量的RNN:importpandasaspdfrompandasimportDataFramefrompandasimportconcatfrommathimportsqrtfromnumpyimportconcatenateimportmatplotlib.pyplotaspyplotimportnumpyasnpfromsklearn.metricsimportmean_squared_errorfromsklearn.preprocessingimportMinMaxScalerfromkerasimportSequentialfromkeras.layersimportLSTM,Dense,Dropout,Activationfrompandasimportread_csv使用Keras库。Kerasisanefficientcomputationallibraryfortrainingneuralnetworkmodelswithjustafewlinesofcode.sklearn包将提供该程序所需的一些实用函数。密集层将执行以下操作并返回输出。dataset=read_csv('Bitcoin3D.csv',header=0,index_col=0)print(dataset.head())values=dataset.values使用Pandas库加载数据集。此处准备了用于可视化的列。groups=[0,1,2,3,5,6,7,8,9]i=1将序列转换为监督学习。defseries_to_supervised(数据,n_in=1,n_out=1,dropnan=True):n_vars=1iftype(data)islistelsedata.shape[1]df=DataFrame(data)cols,names=list(),list()#Hereiscreatedinputcolumnswhichare(t-n,...t-1)foriinrange(n_in,0,-1):cols.append(df.shift(i))names+=[('var%d(t-%d)'%(j+1,i))forjinrange(n_vars)]#在这里,我们创建了输出/预测列,其中有(t,t+1,...t+n)foriinrange(0,n_out):cols.append(df.shift(-i))ifi==0:names+=[('var%d(t)'%(j+1))forjinrange(n_vars)]else:names+=[('var%d(t+%d)'%(j+1,i))forjinrange(n_vars)]agg=concat(cols,axis=1)agg.columns=names#droprowswithNaNvaluesifdropnan:agg.dropna(inplace=True)returnagg检查值是否为数字格式,values=values.astype('float32')数据集值通过MinMax方法进行归一化,scaler=MinMaxScaler(feature_range=(0,1))scaled=scaler.fit_transform(values)将归一化值转换为监督学习,reframed=series_to_supervised(scaled,1,1)#重构。drop(reframed.columns[[9,10,11,12,13,14,15]],axis=1,inplace=True)将数据集分为两组,即训练集和测试集,values=reframed.valuestrain_size=int(len(values)*0.70)train=values[:train_size,:]test=values[train_size:,:]分割数据集分割成trainX,trainY,testX和testY,trainX,trainY=train[:,:-1],train[:,13]testX,testY=test[:,:-1],test[:,13]为LSTM在3D中重塑训练和测试数据集,trainX=trainX.reshape((trainX.shape[0],1,trainX.shape[1]))testX=testX.reshape((testX.shape[0],1,testX.shape[1]))创建LSTM模型并调整神经元结构,model=Sequential()model.add(LSTM(128,input_shape=(trainX.shape[1],trainX.shape[2])))model.add(Dropout(0.05))model.add(Dense(1))model.add(Activation('linear'))model.compile(loss='mae',optimizer='adam')通过使用trainX和trainY训练数据集,history=model.fit(trainX,trainY,epochs=10,batch_size=25,validation_data=(testX,testY),verbose=2,shuffle=False)计算每个训练周期的loss值并可视化,pyplot.plot(history.history['loss'],label='train')pyplot.plot(history.history['val_loss'],label='test')pyplot.title("TestandTrainsetLossValueRate")pyplot.xlabel('EpochsNumber',fontsize=12)pyplot.ylabel('LossValue',fontsize=12)pyplot.legend()pyplot.show()对训练数据集执行预测过程,trainPredict=model.predict(trainX)trainX=trainX.reshape((trainX.shape[0],trainX.shape[2]))对测试数据集进行预测过程,testPredict=model.predict(testX)testX=testX.reshape((testX.shape[0],testX.shape[2]))训练数据集反向缩放进行训练,testPredict=model.predict(testX)testX=testX.reshape((testX.shape[0],testX.shape[2]))用于预测的测试数据集逆缩放,testPredict=concatenate((testPredict,testX[:,-9:]),axis=1)testPredict=scaler.inverse_transform(testPredict)testPredict=testPredict[:,0]#invertscalingforactualtestY=testY.reshape((len(testY),1))inv_y=concatenate((testY,testX[:,-9:]),axis=1)inv_y=scaler.inverse_transform(inv_y)inv_y=inv_y[:,0]计算通过使用mean_squared_error进行训练和测试预测的性能指标,rmse2=sqrt(mean_squared_error(trainY,trainPredict))rmse=sqrt(mean_squared_error(inv_y,testPredict))训练和测试预测集连接在一起final=np.追加(trainPredict,testPredict)最终=pd.DataFrame(数据=最终,columns=['Close'])actual=dataset.Closeactual=actual.valuesactual=pd.DataFrame(data=actual,columns=['Close'])最后可视化训练和预测结果pyplot.plot(actual.Close,'b',label='OriginalSet')pyplot.plot(final.Close[0:16781],'r',label='Trainingset')pyplot.plot(final.Close[16781:len(final)],'g',label='Predicted/Testset')pyplot.title("BitcoinPredictedPrices")pyplot.xlabel('Time',fontsize=12)pyplot.ylabel('ClosePrice',fontsize=12)pyplot.legend(loc='best')pyplot.show()到目前为止,我们已经使用历史比特币价格数据集开发了价格预测模型,通过使用Python中的RNN和LSTM算法来寻找价格预测。