গভীর নিউরাল নেটওয়ার্কগুলি এই বছরগুলিতে ক্রমবর্ধমান জনপ্রিয়তা অর্জন করেছে এবং অনেক ক্ষেত্রে অতীতে সমাধান করা অসম্ভব সমস্যাগুলি সমাধান করার জন্য শক্তিশালী ক্ষমতা প্রদর্শন করেছে। সময়রেখার পূর্বাভাসের ক্ষেত্রে, সাধারণভাবে ব্যবহৃত নিউরাল নেটওয়ার্কগুলির দামগুলি হ'ল আরএনএন, কারণ আরএনএনগুলিতে কেবল বর্তমান ডেটা ইনপুটই নয়, বরং historicalতিহাসিক ডেটাও রয়েছে। অবশ্যই, যখন আমরা আরএনএনগুলির পূর্বাভাসের কথা বলি, তখন আমরা প্রায়শই আরএনএনগুলির একটির কথা বলিঃ এলএসটিএম। এই নিবন্ধটি পাইটর্চের উপর ভিত্তি করে বিটকয়েনের দামের পূর্বাভাস দেওয়ার মডেল তৈরি করবে। যদিও অনলাইনে সম্পর্কিত তথ্য প্রচুর, তবে এটি সম্পূর্ণ নয়, পাইটর্চ ব্যবহার করাও তুলনামূলকভাবে কম, এমনকি একটি ইতিবাচক নিবন্ধও প্রয়োজন, শেষ পর্যন্ত ফলাফলটি হ'ল বিটকয়েনের ব্যবসায়ের সর্বোচ্চ, সর্বোচ্চ, সর্বোচ্চ, দাম, দাম, ন্যূনতম এবং লেনদেনের পরিমাণের পূর্বাভাস সংগ্রহ করা। আমার ব্যক্তিগত নেটওয়ার্কটি সাধারণভাবে স্বাগতম। এই টিউটোরিয়ালটি এফএমজেডের ডিজিটাল মুদ্রা পরিমাণগত ট্রেডিং প্ল্যাটফর্মের আবিষ্কারক দ্বারা সরবরাহ করা হয়েছে।www.fmz.com), QQ গ্রুপে আপনাকে স্বাগতমঃ 863946592 ।
একটি প্রাসঙ্গিক মূল্য পূর্বাভাসের উদাহরণঃhttps://yq.aliyun.com/articles/538484RNN মডেল সম্পর্কে বিস্তারিতঃhttps://zhuanlan.zhihu.com/p/27485750RNN এর ইনপুট এবং আউটপুট বোঝাঃhttps://www.zhihu.com/question/41949741/answer/318771336পিটর্চ সম্পর্কেঃ সরকারী নথিhttps://pytorch.org/docsঅন্যান্য তথ্যের জন্য নিজেরাই অনুসন্ধান করুন। এই নিবন্ধটি পড়ার জন্য কিছু পূর্বের জ্ঞান প্রয়োজন, যেমন পান্ডা / সরীসৃপ / ডেটা প্রসেসিং ইত্যাদি, তবে এটি ঠিক আছে।
LSTM এর পরামিতিঃ
আমি যখন প্রথমবারের মতো ডকুমেন্টেশনে এইসব প্যারামিটার দেখলাম, তখন আমার প্রতিক্রিয়া ছিলঃআপনি যদি ধীরে ধীরে পড়েন, তাহলে হয়তো বুঝতে পারবেন।
input_size
: ইনপুট ভেক্টর x এর বৈশিষ্ট্যযুক্ত আকার, যদি বন্ধের দামের সাথে বন্ধের দাম পূর্বাভাস দেওয়া হয়, তাহলে ইনপুট_সাইজ=1; যদি বন্ধের দামের সাথে উচ্চ খোলা-নিম্ন পূর্বাভাস দেওয়া হয়, তাহলে ইনপুট_সাইজ=4hidden_size
: লুকানো স্তর আকারnum_layers
: RNN এর স্তর সংখ্যাbatch_first
: যদি True-এর জন্য প্রথম মাত্রা batch_size হয়, তাহলে এই প্যারামিটারটিও বিভ্রান্তিকর হতে পারে, যা নিচে বিস্তারিতভাবে বর্ণনা করা হয়েছে।
ইনপুট ডেটা প্যারামিটারঃ
input
: নির্দিষ্ট ইনপুট তথ্য, একটি তিন-মাত্রিক tensor, নির্দিষ্ট আকৃতিঃ ((seq_len, batch, input_size) ); এর মধ্যে, seq_len ক্রম সারি দৈর্ঘ্য, অর্থাৎ LSTM প্রয়োজন বিবেচনা করার জন্য কত সময় ঐতিহাসিক তথ্য, নোট করুন এই শুধুমাত্র ডেটা ফরম্যাট বোঝায়, না LSTM অভ্যন্তরীণ কাঠামো, একই LSTM মডেল বিভিন্ন seq_len তথ্য ইনপুট করতে পারেন, সব পূর্বাভাস ফলাফল দিতে পারে; ব্যাচ নির্দেশ করে ব্যাচ আকার, প্রতিনিধিত্ব করে কত গোষ্ঠী বিভিন্ন ডেটা আছে; ইনপুট_সাইজ হয় পূর্ববর্তী ইনপুট_সাইজ ‖h_0
: প্রাথমিক লুকানো অবস্থা, আকৃতি ((num_layers * num_directions, batch, hidden_size), যদি দ্বি-মুখী নেটওয়ার্ক num_directions=2 হয়c_0
: প্রাথমিক কোষের অবস্থা, আকৃতি একই, অনির্দিষ্ট হতে পারে.
আউটপুট প্যারামিটারঃ
output
: আউটপুট আকার (seq_len, batch, num_directions * hidden_size), মনোযোগ এবং মডেল পরামিতি batch_first সম্পর্কিতh_n
: t = seq_len মুহুর্তের h অবস্থা, h_0 এর সাথে একই আকৃতিরc_n
: t = seq_len মুহুর্তে c অবস্থা, আকৃতি একই c_0
প্রথমে প্রয়োজনীয় প্যাকেজগুলি আমদানি করুন
import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
এলএসটিএম মডেল সংজ্ঞায়িত করা
LSTM = nn.LSTM(input_size=5, hidden_size=10, num_layers=2, batch_first=True)
তথ্য ইনপুট করার জন্য প্রস্তুত
x = torch.randn(3,4,5)
# x的值为:
tensor([[[ 0.4657, 1.4398, -0.3479, 0.2685, 1.6903],
[ 1.0738, 0.6283, -1.3682, -0.1002, -1.7200],
[ 0.2836, 0.3013, -0.3373, -0.3271, 0.0375],
[-0.8852, 1.8098, -1.7099, -0.5992, -0.1143]],
[[ 0.6970, 0.6124, -0.1679, 0.8537, -0.1116],
[ 0.1997, -0.1041, -0.4871, 0.8724, 1.2750],
[ 1.9647, -0.3489, 0.7340, 1.3713, 0.3762],
[ 0.4603, -1.6203, -0.6294, -0.1459, -0.0317]],
[[-0.5309, 0.1540, -0.4613, -0.6425, -0.1957],
[-1.9796, -0.1186, -0.2930, -0.2619, -0.4039],
[-0.4453, 0.1987, -1.0775, 1.3212, 1.3577],
[-0.5488, 0.6669, -0.2151, 0.9337, -1.1805]]])
x এর আকৃতি হল ((3,4,5)), যেহেতু আমরা আগে এটিকে সংজ্ঞায়িত করেছি।batch_first=True
, এই সময়ে ব্যাচ_সাইজ ৩, sqe_len ৪, input_size ৫; x[০] প্রথম ব্যাচের প্রতিনিধিত্ব করে।
যদি batch_first সংজ্ঞায়িত না করা হয়, তবে ডিফল্টরূপে মিথ্যা, তবে এই সময়ে ডেটার প্রতিনিধিত্ব সম্পূর্ণ ভিন্ন, ব্যাচের আকার 4, sqe_len 3, input_size 5। এই সময়ে x[0] সমস্ত ব্যাচের প্রতিনিধিত্ব করে t=0 ডেটা, যথাক্রমে অনুমান করা হয়। ব্যক্তিগতভাবে এই সেটিংটি স্বজ্ঞাত নয় বলে মনে হয়, তাই একটি পরামিতি যুক্ত করা হয়েছে।batch_first=True
.
এই দুই দেশের মধ্যে ডেটা রূপান্তর করাও খুব সহজঃx.permute(1,0,2)
ইনপুট এবং আউটপুট
এলএসটিএম এর ইনপুট আউটপুট আকার সহজেই বিভ্রান্তিকর হতে পারে।
সূত্রঃhttps://www.zhihu.com/question/41949741/answer/318771336
x = torch.randn(3,4,5)
h0 = torch.randn(2, 3, 10)
c0 = torch.randn(2, 3, 10)
output, (hn, cn) = LSTM(x, (h0, c0))
print(output.size()) #在这里思考一下,如果batch_first=False输出的大小会是多少?
print(hn.size())
print(cn.size())
#结果
torch.Size([3, 4, 10])
torch.Size([2, 3, 10])
torch.Size([2, 3, 10])
এই ফলাফলটি পূর্ববর্তী প্যারামিটারের ব্যাখ্যাটির সাথে সামঞ্জস্যপূর্ণ। নোট করুন যেhn.size (()) এর দ্বিতীয় মানটি 3 এবং batch_size এর আকারের সাথে সামঞ্জস্যপূর্ণ, যা দেখায় যেhn-এ মধ্যবর্তী অবস্থা সংরক্ষণ করা হয় না, কেবলমাত্র শেষ ধাপ সংরক্ষণ করা হয়। যেহেতু আমাদের এলএসটিএম নেটওয়ার্কে দুটি স্তর রয়েছে, তাই শেষ স্তরের আউটপুটটি আউটপুটের মান, আউটপুটটি [3, 4, 10] আকৃতির, যা t = 0, 1, 2, 3 এর সমস্ত সময় ফলাফল সংরক্ষণ করে, তাইঃ
hn[-1][0] == output[0][-1] #第一个batch在hn最后一层的输出等于第一个batch在t=3时output的结果
hn[-1][1] == output[1][-1]
hn[-1][2] == output[2][-1]
এই সমস্ত বিষয়বস্তু আগে বলা হয়েছে, তবে এটি কেবল একটি প্যাকেজিং, এলএসটিএম এর ইনপুট এবং আউটপুট বোঝা গুরুত্বপূর্ণ, অন্যথায় অনলাইনে কিছু কোড নিষ্পত্তি করা সহজেই ভুল হতে পারে, কারণ সময়কালের উপর এলএসটিএম এর শক্তিশালী ক্ষমতা, এমনকি যদি মডেলটি ভুল হয় তবে শেষ পর্যন্ত ভাল ফলাফল পাওয়া যায়।
তথ্য সংগ্রহ
বিটফিনেক্স এক্সচেঞ্জের বিটিসি-ইউএসডি লেনদেনের জন্য বাজারের তথ্য ব্যবহার করা হয়েছে।
import requests
import json
resp = requests.get('https://q.fmz.com/chart/history?symbol=bitfinex.btc_usd&resolution=15&from=0&to=0&from=1525622626&to=1562658565')
data = resp.json()
df = pd.DataFrame(data,columns = ['t','o','h','l','c','v'])
print(df.head(5))
তথ্যের বিন্যাস নিম্নরূপঃ
ডেটা প্রিপ্রসেসিং
df.index = df['t'] # index设为时间戳
df = (df-df.mean())/df.std() # 数据的标准化,否则模型的Loss会非常大,不利于收敛
df['n'] = df['c'].shift(-1) # n为下一个周期的收盘价,是我们预测的目标
df = df.dropna()
df = df.astype(np.float32) # 改变下数据格式适应pytorch
ডেটা স্ট্যান্ডার্ডাইজেশনের পদ্ধতিটি খুব রুক্ষ এবং কিছু সমস্যা হতে পারে, কেবলমাত্র একটি প্রদর্শন, যা উপার্জন হার হিসাবে ডেটা স্ট্যান্ডার্ডাইজেশনের সাথে ব্যবহার করা যেতে পারে।
প্রশিক্ষণ ডেটা প্রস্তুত
seq_len = 10 # 输入10个周期的数据
train_size = 800 # 训练集batch_size
def create_dataset(data, seq_len):
dataX, dataY=[], []
for i in range(0,len(data)-seq_len, seq_len):
dataX.append(data[['o','h','l','c','v']][i:i+seq_len].values)
dataY.append(data['n'][i:i+seq_len].values)
return np.array(dataX), np.array(dataY)
data_X, data_Y = create_dataset(df, seq_len)
train_x = torch.from_numpy(data_X[:train_size].reshape(-1,seq_len,5)) #变化形状,-1代表的值会自动计算
train_y = torch.from_numpy(data_Y[:train_size].reshape(-1,seq_len,1))
চূড়ান্ত train_x এবং train_y এর আকারগুলি হলঃ torch.Size (([800, 10, 5]), torch.Size (([800, 10, 1]) । আমাদের মডেলটি 10 টি চক্রের তথ্যের ভিত্তিতে পরবর্তী চক্রের ক্লোজিং মূল্যের পূর্বাভাস দেওয়ার কারণে, তাত্ত্বিকভাবে 800 টি ব্যাচ, তবে 800 টি পূর্বাভাস ক্লোজিং মূল্যের জন্য যথেষ্ট। তবে train_y এর প্রতিটি ব্যাচে 10 টি ডেটা রয়েছে এবং বাস্তবে প্রতিটি ব্যাচের পূর্বাভাসের মধ্যবর্তী ফলাফল সংরক্ষিত রয়েছে, কেবলমাত্র শেষটি নয়। চূড়ান্ত ক্ষতির গণনা করার সময়, সমস্ত 10 টি পূর্বাভাসের ফলাফল এবং train_y এর প্রকৃত মানগুলির সাথে তুলনা করা যেতে পারে। তত্ত্বগতভাবে কেবলমাত্র শেষের পূর্বাভাসের ফলাফল গণনা করা যেতে পারে। এটি একটি মোটামুটি গ্রাফিকাল চিত্র আঁকতে উপযুক্ত।
মনে রাখবেন, প্রশিক্ষণ ডেটা প্রস্তুত করার সময়, উইন্ডোটির চলাচল ঝাঁপিয়ে পড়ে, ইতিমধ্যে ব্যবহৃত ডেটা আর ব্যবহার করা হয় না, এবং অবশ্যই উইন্ডোটি পৃথকভাবেও সরানো যেতে পারে, যা প্রশিক্ষণের সমাবেশকে অনেক বড় করে তোলে। তবে এটি অনুভূত হয় যে পার্শ্ববর্তী ব্যাচের ডেটা খুব বেশি পুনরাবৃত্তি করে, তাই বর্তমান পদ্ধতিটি গ্রহণ করা হয়।
চূড়ান্তভাবে নির্মিত মডেলটি নিম্নরূপ, এতে দুটি স্তর এলএসটিএম এবং একটি লিনিয়ার স্তর রয়েছে।
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, output_size=1, num_layers=2):
super(LSTM, self).__init__()
self.rnn = nn.LSTM(input_size,hidden_size,num_layers,batch_first=True)
self.reg = nn.Linear(hidden_size,output_size) # 线性层,把LSTM的结果输出成一个值
def forward(self, x):
x, _ = self.rnn(x) # 如果不理解前向传播中数据维度的变化,可单独调试
x = self.reg(x)
return x
net = LSTM(5, 10) # input_size为5,代表了高开低收和交易量. 隐含层为10.
অবশেষে প্রশিক্ষণ শুরু হল, কোডটি হলঃ
criterion = nn.MSELoss() # 使用了简单的均方差损失函数
optimizer = torch.optim.Adam(net.parameters(),lr=0.01) # 优化函数,lr可调
for epoch in range(600): # 由于速度很快,这里的epoch多一些
out = net(train_x) # 由于数据量很小, 直接拿全量数据计算
loss = criterion(out, train_y)
optimizer.zero_grad()
loss.backward() # 反向传播损失
optimizer.step() # 更新参数
print('Epoch: {:<3}, Loss:{:.6f}'.format(epoch+1, loss.item()))
এই প্রশিক্ষণের ফলাফল নিম্নরূপঃ
মডেলের পূর্বাভাসঃ
p = net(torch.from_numpy(data_X))[:,-1,0] # 这里只取最后一个预测值作为比较
plt.figure(figsize=(12,8))
plt.plot(p.data.numpy(), label= 'predict')
plt.plot(data_Y[:,-1], label = 'real')
plt.legend()
plt.show()
এই চিত্র থেকে দেখা যাচ্ছে যে, ট্রেনিং ডেটা (৮০০-এর আগে) এর মিল খুব বেশি, কিন্তু বিটকয়েনের দামের উচ্চতা পরে, মডেলটি এই ডেটা দেখেনি, এবং ভবিষ্যদ্বাণীটি হৃদয়গ্রাহী নয়। এটি পূর্ববর্তী ডেটা স্ট্যান্ডার্ডাইজেশনের ক্ষেত্রেও সমস্যা দেখা দেয়।
যদিও পূর্বাভাসের দাম সবসময় সঠিক হয় না, তবে হ্রাসের পূর্বাভাসের সঠিকতা কী?
r = data_Y[:,-1][800:1000]
y = p.data.numpy()[800:1000]
r_change = np.array([1 if i > 0 else 0 for i in r[1:200] - r[:199]])
y_change = np.array([1 if i > 0 else 0 for i in y[1:200] - r[:199]])
print((r_change == y_change).sum()/float(len(r_change)))
আমি জানি না আমি কোথায় ভুল করেছি, কিন্তু আমি মনে করি আমি আমার ভবিষ্যদ্বাণীগুলিকে ভুল করেছি।
অবশ্যই এই মডেলটির কোন বাস্তব মূল্য নেই, কিন্তু এটি সহজেই বোঝা যায়, এবং এটি কেবলমাত্র একটি প্রারম্ভিক, এবং এরপরে আরও অনেকগুলি নিউরাল নেটওয়ার্ক প্রারম্ভিক কোর্স আসবে যা ডিজিটাল মুদ্রার পরিমাণে প্রয়োগের জন্য প্রারম্ভিক।
জ্যাকমাপ্রশিক্ষণের তথ্য কি পরীক্ষার তথ্যের মতো?
a838899এটা কি বোঝাতে চাচ্ছে তা স্পষ্ট নয়, আপনি যদি ৮০০ দিনের ডেটা ব্যবহার করেন এবং পরের দিনের ডেটা বা পরবর্তী ৮০০ দিনের ডেটা পূর্বাভাস দেন।
ওরিওন ১৭০৮এই মডেলটির বাস্তব মূল্য নেই কেন?