نیورل نیٹ ورک اور ڈیجیٹل کرنسی کی مقدار کی تجارت سیریز ((1) LSTM بٹ کوائن کی قیمت کی پیش گوئی کرتا ہے

مصنف:گھاس, تخلیق: 2019-07-12 14:28:20, تازہ کاری: 2023-10-24 21:42:00

img

1.简单介绍

گہری نیورل نیٹ ورکس نے ان سالوں میں تیزی سے مقبولیت حاصل کی ہے اور بہت سے شعبوں میں مشکل مسائل کو حل کرنے کی طاقت کا مظاہرہ کیا ہے۔ وقت کی ترتیب کی پیش گوئی میں ، عام طور پر استعمال ہونے والی نیورل نیٹ ورک کی قیمت RNN ہے ، کیونکہ RNN میں نہ صرف موجودہ ڈیٹا ان پٹ ہے ، بلکہ تاریخی ڈیٹا کی ان پٹ بھی ہے۔ یقینا ، جب ہم RNN کی قیمت کی پیش گوئی کے بارے میں بات کرتے ہیں تو ، ہم اکثر RNN کی ایک قسم کے بارے میں بات کرتے ہیں: LSTM. اس مضمون میں پیئٹورچ کی بنیاد پر بٹ کوائن کی قیمت کی پیش گوئی کرنے کا ماڈل بنایا جائے گا۔ اگرچہ آن لائن متعلقہ معلومات بہت زیادہ ہیں ، لیکن یہ کافی حد تک مکمل نہیں ہیں ، لیکن پیئٹورچ کا استعمال کرنا بھی نسبتا few کم ہے ، یا ایک مثبت مضمون بھی ضروری ہے ، آخر کار نتیجہ یہ ہے کہ بی ٹی سی کی تجارت کے آغاز کی قیمت ، سب سے زیادہ قیمت ، قیمت ، چوٹی ، قیمت ، کم سے کم تجارتی حجم کی پیش گوئی کرنے کے لئے نیورل نیٹ ورک کا استعمال کیا جاتا ہے۔ میں عام طور پر ، آپ کا یہ سبق ایف ایم زیڈ کے موجد ڈیجیٹل کرنسی کی مقدار کی تجارت کے پلیٹ فارم کے ذریعہ پیش کیا گیا ہے۔www.fmz.com), QQ گروپ میں خوش آمدید: 863946592 تبادلہ خیال.

2.数据和参考

بٹ کوائن کی قیمتوں کا ڈیٹا ایف ایم زیڈ کے موجدوں کی طرف سے حاصل کیا گیا ہے:https://www.quantinfo.com/Tools/View/4.htmlایک متعلقہ قیمت کی پیشن گوئی کی مثال:https://yq.aliyun.com/articles/538484RNN ماڈل کے بارے میں تفصیلات:https://zhuanlan.zhihu.com/p/27485750RNN کے ان پٹ اور آؤٹ پٹ کو سمجھنا:https://www.zhihu.com/question/41949741/answer/318771336pytorch کے بارے میں: سرکاری دستاویزاتhttps://pytorch.org/docsاس کے علاوہ، آپ اپنے آپ کو تلاش کر سکتے ہیں. اس مضمون کو پڑھنے کے لیے کچھ پیشگی معلومات کی ضرورت ہوتی ہے، جیسے پانڈاس/ریپٹیٹس/ڈیٹا پروسیسنگ وغیرہ، لیکن اس سے کوئی فرق نہیں پڑتا۔

3.pytorch LSTM ماڈل کی پیرامیٹرز

LSTM کے پیرامیٹرز:

جب میں نے پہلی بار دستاویزات میں ان پیچیدہ پیرامیٹرز کو دیکھا تو میں نے کہا:imgآپ نے اسے آہستہ آہستہ پڑھا تو شاید آپ نے اسے سمجھ لیا۔

img

input_size: ان پٹ ویکٹر x کی خصوصیت کا سائز ، اگر اختتامی قیمت پر اختتامی قیمت کی پیش گوئی کی جاتی ہے تو ، input_size = 1؛ اگر اختتامی قیمت پر اختتامی قیمت کی پیش گوئی کی جاتی ہے تو ، input_size = 4hidden_sizeچھپی ہوئی تہوں کا سائز:num_layersRNN کی تہوں کی تعداد:batch_first: اگر سچ کے لئے درج کرنے کے لئے سب سے پہلے طول و عرض batch_size ہے، تو یہ پیرامیٹر بھی الجھن میں ہے، جو ذیل میں تفصیل سے بیان کیا جائے گا.

ڈیٹا ان پٹ پیرامیٹرز:

img

input: مخصوص ان پٹ ڈیٹا ، ایک تین جہتی ٹینسر ہے ، جس کی مخصوص شکل یہ ہے: ((seq_len ، batch ، input_size) ؛ اس میں ، sec_len اشاریہ صف کی لمبائی ، یعنی LSTM کو اس بات پر غور کرنے کی ضرورت ہے کہ تاریخی اعداد و شمار کی لمبائی کتنی ہے ، نوٹ کریں کہ اس کا مطلب صرف اعداد و شمار کی شکل ہے ، نہ کہ LSTM کے اندرونی ڈھانچہ ، ایک ہی LSTM ماڈل مختلف sec_len کے اعداد و شمار کو ان پٹ کرسکتا ہے ، جو پیش گوئی شدہ نتائج دے سکتا ہے۔ بیچ کا مطلب ہے بیچ کا سائز ، جس میں مختلف اعداد و شمار کے کتنے گروپ ہیں؛ input_size اس سے پہلے کا input_size ہے۔h_0: ابتدائی پوشیدہ حالت ، شکل میں ((num_layers * num_directions ، batch ، hidden_size) ، اگر دو طرفہ نیٹ ورک نمبر_ڈائریکشن = 2c_0: ابتدائی سیل کی حالت، شکل ایک جیسی ہے، غیر متعین کیا جا سکتا ہے۔

آؤٹ پٹ پیرامیٹرز:

img

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 ہے

4.LSTM输入输出的简单例子

سب سے پہلے ضروری پیکجوں کو درآمد کریں

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اس وقت ، بیچ_سائز کا سائز 3 ہے ، sqe_len 4 ہے ، اور ان پٹ_سائز 5 ہے۔ x[0] پہلی بیچ کی نمائندگی کرتا ہے۔

اگر batch_first کی تعریف نہیں کی جاتی ہے تو ، پہلے سے طے شدہ طور پر غلط ، اس وقت اعداد و شمار کی نمائندگی بالکل مختلف ہے ، بیچ کا سائز 4 ، sqe_len 3 ، input_size 5 ہے۔ اس وقت x[0] تمام بیچوں کی نمائندگی کرتا ہے جب t = 0 اعداد و شمار ، اس طرح کی قیاس آرائی۔ ذاتی طور پر یہ احساس ہوتا ہے کہ یہ ترتیب غیر بدیہی ہے ، لہذا پیرامیٹر شامل کیا گیا ہے۔batch_first=True.

اس کے علاوہ ، یہ بھی آسان ہے کہ دونوں کے مابین ڈیٹا کو تبدیل کیا جاسکے:x.permute(1,0,2)

درآمد اور برآمد

LSTM کے ان پٹ اور آؤٹ پٹ کی شکل کو سمجھنے میں مدد کے لئے مندرجہ ذیل چارٹ استعمال کریں:img
ماخذ: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]

5.准备比特币行情数据

اس سے پہلے بہت ساری باتیں صرف ایک صفائی تھی ، لیکن ایل ایس ٹی ایم کے ان پٹ اور آؤٹ پٹ کو سمجھنا بہت ضروری ہے ، ورنہ کسی کوڈ کو انٹرنیٹ سے بے ترتیب طور پر نکالنے میں غلطی کرنا آسان ہے ، کیونکہ وقت کی ترتیب پر ایل ایس ٹی ایم کی زبردست صلاحیتوں کی وجہ سے ، یہاں تک کہ اگر ماڈل غلط ہے تو بھی آخر میں اچھے نتائج برآمد ہوتے ہیں۔

اعداد و شمار تک رسائی

اعداد و شمار کا استعمال Bitfinex ایکسچینج پر BTC_USD ٹریڈنگ جوڑی کے لئے مارکیٹ کے اعداد و شمار کا استعمال کرتے ہوئے کیا جاتا ہے۔

import requests
import json

resp = requests.get('https://www.quantinfo.com/API/m/chart/history?symbol=BTC_USD_BITFINEX&resolution=60&from=1525622626&to=1562658565')
data = resp.json()
df = pd.DataFrame(data,columns = ['t','o','h','l','c','v'])
print(df.head(5))

اعداد و شمار کی شکل مندرجہ ذیل ہے:img

اعداد و شمار کی پیشگی پروسیسنگ

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 میں اصل قیمت کا موازنہ کیا جاسکتا ہے۔ یہ بھی نظریاتی طور پر صرف آخری پیشن گوئی کے نتائج کا حساب لگایا جاسکتا ہے۔ اس مسئلے کا ایک موٹا گراف ڈرائنگ مناسب ہے۔ چونکہ LSTM کا اصل ماڈل seqlen_parameters شامل نہیں کرتا ہے ، لہذا ماڈل مختلف طول و عرض کے لئے موزوں ہے ، اور اس وجہ سے میں بھیimg

نوٹ کریں کہ تربیت کے اعداد و شمار کی تیاری کے دوران ، ونڈو کی نقل و حرکت چھلانگ لگتی ہے ، پہلے سے استعمال شدہ اعداد و شمار کو استعمال نہیں کیا جاتا ہے ، اور یقینا ونڈو کو انفرادی طور پر بھی منتقل کیا جاسکتا ہے ، جس سے تربیت کا ایک بہت بڑا اجتماع ملتا ہے۔ لیکن یہ محسوس ہوتا ہے کہ اس طرح کے ملحقہ بیچ ڈیٹا بہت زیادہ بار بار ہوتا ہے ، لہذا موجودہ طریقہ کار کو اپنایا جاتا ہے۔img

6.构造LSTM模型

حتمی طور پر تعمیر کردہ ماڈل مندرجہ ذیل ہے ، جس میں دو پرتوں والا ایل ایس ٹی ایم ، ایک لکیری پرت ہے۔

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.

7.开始训练模型

آخر میں تربیت شروع ہوئی، اور یہ کوڈ ہے:

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()))

ٹریننگ کے نتائج مندرجہ ذیل ہیں:img

8.模型评价

ماڈل کی پیشن گوئی:

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()

img
جیسا کہ آپ اس گراف سے دیکھ سکتے ہیں ، تربیت کے اعداد و شمار ((800 سے پہلے) میں بہت زیادہ مماثلت ہے ، لیکن بعد میں بٹ کوائن کی قیمت میں اضافہ ہوا ، ماڈل نے یہ اعداد و شمار نہیں دیکھے تھے ، اور پیش گوئی کرنے کی کوشش نہیں کی۔ اس سے یہ بھی ظاہر ہوتا ہے کہ پہلے کے اعداد و شمار کی معیاری کاری میں دشواری ہے۔ اگرچہ قیمتوں کی پیش گوئی ہمیشہ درست نہیں ہوتی ، لیکن گرنے کی پیش گوئی کی درستگی کیا ہے؟

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)))

اس کے نتیجے میں ، میں نے 81.4 فیصد کی درستگی کے ساتھ گرنے کی پیش گوئی کی ، جو میری توقع سے کہیں زیادہ ہے۔ مجھے نہیں معلوم کہ میں نے کیا غلط کیا ہے۔

اس ماڈل کی کوئی حقیقی قیمت نہیں ہے ، لیکن یہ آسان ہے ، اور اس کے ساتھ ہی ، اس کے بعد مزید نیورل نیٹ ورکس کی تعارف کے لئے تعارفی کورسز ہوں گے جو ڈیجیٹل کرنسیوں کی مقدار میں استعمال ہوتے ہیں۔


متعلقہ

مزید

جیکماکیا آپ کو لگتا ہے کہ آپ کی تربیت کے اعداد و شمار ٹیسٹ کے اعداد و شمار کی طرح ہیں؟

a838899اس کا کیا مطلب ہے؟ یہ واضح نہیں ہے کہ 800 دن کے اعداد و شمار کا استعمال کرتے ہوئے اگلے دن کے اعداد و شمار یا اگلے 800 دن کے اعداد و شمار کی پیشن گوئی کی جائے۔

اوریون1708اس ماڈل کی کوئی حقیقی قیمت کیوں نہیں ہے؟