Proiect de diplomă [617566]
Facultatea de Automatică și Calculatoar e
Departamentul de Automatică și Informatică Aplicată
Proiect de diplomă
Conducător științific: Absolvent:
Ș.l. dr. ing. Mircea -Bogdan RĂDAC Ianko -Iosif MERKA
Timișoara, 2019
2
Facultatea de Automatică și Calculatoar e
Departamentul de Automatică și Informatică Aplicată
Modelarea unor serii de timp financiare folosind rețele
neuronale
Proiect de diplomă
Conducător științific: Absolvent:
Ș.l. dr. ing. Mircea -Bogdan RĂDAC Ianko -Iosif MERKA
Timișoara, 2019
3
Cuprins
Cap.1 Introducere ………………………….. ………………………….. ………………………….. ………………….. 4
Cap. 2 Fundamente teoretice din domeniul Piețelor Financiare ………………………….. ……………. 5
Cap. 3 Fundamente din domeniul Rețelelor Neuronale ………………………….. ……………………….. 6
3.1 Neuronul ………………………….. ………………………….. ………………………….. ……………………… 7
3.2 Funcții de activare ………………………….. ………………………….. ………………………….. ………… 9
3.3 Arhitecturi de rețele neuronale ………………………….. ………………………….. ………………….. 12
3.3.1 Rețele neuronale cu propagare înainte(feedforward) ………………………….. ……… 12
3.3.1.1 Perceptronul simplu ………………………….. ………………………….. …………………… 13
3.3.1.2 Perceptronul multistrat ………………………….. ………………………….. ………………. 14
3.3.2 Rețele neuronale recurente ………………………….. ………………………….. …………….. 14
3.3.2.1 Rețele LSTM ………………………….. ………………………….. ………………………….. .. 16
3.3.3 Algoritmi de antrenare ………………………….. ………………………….. ………………………….. . 18
3.3.3.1 Algoritmul B ack-Propagation ………………………….. ………………………….. ………….. 19
3.3.3.2 Algoritmul hebbian generalizat ………………………….. ………………………….. ………… 24
Cap. 4 Modul de funcționare ………………………….. ………………………….. ………………………….. …. 26
4.1 Achiziția și prelucrarea de date ………………………….. ………………………….. …………….. 27
4.2 Configurarea rețelei neuronale ………………………….. ………………………….. ……………… 28
Cap. 5 Rezultate experimentale ………………………….. ………………………….. ………………………….. 33
Cap 6. Concluzii ………………………….. ………………………….. ………………………….. ………………….. 37
Bibliografie ………………………….. ………………………….. ………………………….. …………………………. 38
4
Cap.1 Introducere
Datorită evoluției tehnologiei, în ultimii ani aceasta a început să își facă simțită prezența și
în domeniul tranzacționării pe piețele financiare, ca rezultat marile fonduri de investiții aleg să
folosească din ce în ce mai mult tehnologiile care se bazează pe Învățare Automată. Din sfera
aceasta fac parte Rețelele Neuronale, care, dacă sunt antrenar e corespunzător, de multe ori stau
la baza multor decizii.
„Domeniul de studiu care oferă computere lor capacitatea de a învăța fără a fi programat
în mod explicit .” – așa descrie Arthur Lee SAMUEL , unul din pionierii Inteligenței Artificiale,
Învățarea Au tomată în anul 1959 . Iar Tom MITCHEL are propria lui definiție: „Se spune că
un program de calculator învață din experiența E, respectând o anumita clasă de sarcini T și
performanța măsurată P, dacă performanța sa la sarcini în T, măsurată prin P, se
îmbunătățește cu experiența E. ” [2]
Scopul acestei lucrări reprezintă modelarea și antrenarea de rețelele neuronal e. Datele de
intrare folosite pentru antrenarea rețelelor neuronale care urmează să fie prezentate în
continuare sunt serii financiare care, î n acest caz, reprezintă evoluția prețului unei parități
valuta re pe o perioadă de timp bine definită.
Obiectivele urmărite în această lucrare:
1 Testarea performanțelor unor modele de serii financiare.
2 Antrenarea unor rețele neuronale care să fie capabile sa ofere o predicție cât mai apropiată
de realitate.
3 Implementarea unor arhitecturi de rețele neuronale în mediul de lucru MATLAB.
În capitolul 2 sunt prezentate fundamentele teoretice din domeniul piețelor financiare pe
care se bazează lucrarea.
În capitolul 3 sunt prezentate fundamentele teoretice, tehnologii și teorii din domeniul
rețelelor neuronale pe care se bazează lucrarea.
În capitolul 4 este prezentat modul de funcționare al p ărții practice și programele software
folosite.
În capitolul 5 sunt prezentate rezultate experimentale ca urmare a aplicării fundamentelor
teoretice.
În capitolul 6 sunt prezentate concluzii trase în urma analizării datelor experimentale și a
rezultatelor obținute.
5
Cap. 2 Fundamente teoretice din domeniul Piețelor Financiare
Din punct de vedere conceptual Piețele Financiare reprezintă totalitatea formelor de
tranzacționare cu active financiare. În funcție de tipul activelor tranzacționate, piețele financiare
se împart în:
1. Piețe de capital – reprezintă piețele pe care se tranzacționează acțiuni ale unor companii
listate pe bursele de valori. Participanții la aceste piețe sun t investitorii privați , fondurile
de investiții și companiile listate pe bursele de valori.
2. Piețe valutare – reprezintă piețele pe care se tranzacționează diferite valute , unde
participanților li se permite să schimbe o anumită monedă contra alteia. Participanții
acestei piețe sunt: băncile centrale și comerciale , societății de importuri și exporturi,
fonduri de investiții și investitori privați.
3. Piețe de mărfuri – reprezi ntă piețele pe care se tranzacționează diferite mărfuri (ex:
bumbac, combustibil, gaze naturale, etc.). Participan ții acestei piețe sunt societățile de
brokeraj, companiile producătoare de mărfuri , cumpărători de mărfuri și băncile.
4. Piețe de monede virtuale – reprezintă piețele pe care se tranzacționează monedele
electronice precum Ethereum, Bitcoin și multe altele. Participanții acestor piețe sunt, ca
și în cazul piețelor valutare, investitorii privați, fondurile de investiții și băn cile.
Prin conven ție s-a stabilit că cea mai mica mișcare a prețului pe care un curs de schimb o
poate înregistra se numește punct de piață (erg. Pip – percentage in point) . Majoritatea
parităților valutare sunt evaluate cu patru zecimale , cea mai mica sch imbare fiind înregistrată
la ultima zecimală.
Exemplu: Dacă paritatea valutară USD/JPY este cotată la prețul de 132,62, valoarea unui
punct va fi 1/100/132.62 = 0.0000754.
Toate valutele sunt denumite conform semnifica ției standard ISO – 4217 : primele două ale
codului sunt identice cu codul ISO 3166 -1 alpha 21 al țării care emite valuta, iar cea de a treia
literă este identică cu prima literă din denumirea valutei .
Exemplu: USD -United States Dollar
GBP – Great Britain Pound
Atunci când este prezentată cotația unei parități valutare, aceasta reprezintă valoarea celei
de a doua valute în comparație cu prima . Prima valută este valuta de bază, care se considera
mereu o unitate, iar a doua este valuta de cotare, care exprimă prețu l valutei de bază.
1 ISO 3166 -1 alpha 2 – standard internațional prin care se reglementează codul de 2 litere de
prescurtare al denumirilor țărilor
6
Exemplu : GBP/USD = 1,2 7242 înseamnă ca o liră sterlină valorează 1,27242 dolari
americani.
Tranzacțiil e pe piețele financiare se execută în contracte standard denumite loturi – volumul
minim și nedivizat de bunuri care pot fi cumpărate s au vândute. Pe piețele valutare
internaționale un lot are valoarea de 100.000 unități monetare ale valutei de bază , aceasta este
lotul standard, însă există și excepții , unde un lot reprezintă 150.000 unități monetare.
La baza fiecărei tranzacții stă intenția investitorului de a obține profit, iar acest lucru se
întâmplă atunci când tranzacțiile sunt puse corespunzător. Tranzacțiile de cumpărare se execută
înaintea unei creșteri a cotației prețului, iar tranzacțiile de vânzare s e execută înaintea unei
scăderi a cotației prețului. Decizia din spatele unei tranzacții este luată pe baza unor analize
efectuate în prealabil , această analiză poate sa fie una grafică – o analiza care se bazează pe
identificarea unor tipare pe grafice , poate sa fie una tehnică – aceasta se bazează pe interpretarea
unor indicatori ai prețului și mai este analiza fundamentală care se bazează pe luarea unei decizii
în funcție de informațiile din presă sau din alt e surse.
Cap. 3 Fundamente din domeniul Rețel elor Neuronale
Rețelele neuronale reprezintă construcții cu rol computațional ale căror component ă de
bază este neuronul, ace stea având capacitatea de a dobândi diferite comportamente care sunt
obținute în urma unor antrenamente sau instruiri prealabile.
Evoluția rețelelor neuronale:
• [McCullough și Pitts, 1943] Au propus primul model matematic al neuronului artificial.
• [Hebb, 1949] A enunțat principiul permeabi lității sinaptice, care spune că la fiecare
utilizare a respectivei conexiuni, permeabilitatea acesteia o să suporte o creștere.
• [Rosenblatt, 1957] A dezvoltat perceptronul – o rețea neuronală care a fost
implementată hardware.
• [Widrow și Hof, 1950 -1960] Au dezvoltat algoritmii de învățare care s -au bazat pe
minimizarea erorilor pe setul de antrenare pentru rețele neuronale cu un singur strat de
neuroni.
• [Minsky și Papert, 1969] Au scris si ulterior au publicat cartea intitulată “Perceptrons”,
care prezintă limitările rețelelor neuronale uni -strat.
• [Kohonen, 1980] Dezvoltă rețele neuronale cu capacitatea de auto -organizare , care sunt
capabile să prelucreze date.
• [Hopfield, 1982] Propune o abordare complet diferită la vremea respectivă, analiza
rețelelor neuronale din pris ma unor concepte ce aparțin de fizica statică scoțând în
evidență analogia dintre rețelele recurente și sistemele de spini magnetici.
• [Carpenter, Gr osberg, 1983] Enunță teoria rezonanței adaptive, care ulterior o să
conducă la dezvoltarea algoritmilor de învățare nesupervizată bazată pe procese
competiționale.
• [Rumelhart, Parker, 1985] Propune algoritmul de antrenare pentru rețelele cu
propagarea erorii înapoi( eng: backpropagation) .
7
3.1 Neuronul
Neuronul reprezintă unitatea de bază a sistemului nervos uman , cu funcția de procesare și
transmitere de informație sub forma unor impulsuri nervoase. Emitorul fiecărui neuron îl
reprezintă ax onul, care comunică cu receptorii altor neuroni, dendritele, prin intermediul
sinapselor . Aceste sinapse sunt n iște legături care se formează prin contac tul dintre axonul unui
neuron și dendritele altor neuroni . Sistemul nervos uman cuprinde aproximativ 86 de miliarde
de neuroni care formeaz ă peste 1014 sinapse.
Neuronul ca și model computațional transmite semnalele prin axon( 𝒙𝟎) și acestea
interacționează într -un mod de multiplica re(𝒘𝟎∗𝒙𝟎) cu dendritele altui neuron , tot acest proces
bazându -se pe puterea de procesare sinaptică (𝒘𝟎). Principiul de la care s -a plecat este acela că
puterea sinaptică arată cât de influențat este un neuron în fu ncție de altul , iar acest proces poate
să fie învățat și chiar îmbunătățit. În modelul de bază , corpul neuronului primește semnalul de
la dendrite și îl însumează, iar dacă valoarea însumată depășește un anumit prag, care este
pragul de activare, neuronul trimite un impuls prin intermediul axonului spre alți neuroni cu
care are si napse.
Fig. 3.1.1 Neuronul biologic.
Primul model matematic al unui neuron artificial a fost pro pus de către McCulloch și Pitts
în anul 1943, aceștia de asemenea au reușit să obțină modelul matematic al interconexiunilor
dintre mai mulți neuroni, astfel punând bazele acestui domeniu. (PITTS 1943)
Neuronul artificial (Fig. 3.1.2) este o unitate computațională cu mai multe intrări și o singură
ieșire , aceasta reprezentând terminalul prin care sunt furnizate calculele efectuate .
8
Fig. 3.1.2 Modelul neuronului artificial cu intrări binare propus de McCulloch, Pitts
(1943) . (PITTS 1943)
În Fig. 2.2. 1.2 este prezentat modelul matematic al neuronului artificial, cu următoarele
notații:
• 𝑥1,𝑥2 ,…,𝑥𝑛 reprezintă intrările modelului
• 𝑤1,𝑤2 ,…,𝑤𝑛 reprezintă ponderile corespunzătoare fiecărei intrări
• reprezintă valoarea de prag , peste care neuronul este activ at
• y reprezintă ieșirea modelului .
Fig. 3.1.3 Modelul matematic al neuronului artificial .
Formula matematică aplicată este prezentată în expresia:
𝑦=𝑓(∑𝑥𝑖∗𝑤𝑖− )𝑛
𝑖=1
(2.2.1 – 1)
Iar funcția f(x) poate să returneze după caz următoarele valori :
f(x) = {1 − 𝑑𝑎𝑐ă 𝑥 0
0 − 𝑑𝑎𝑐ă 𝑥< 0 (2.2.1 – 2)
9
3.2 Funcții de activare
Funcțiile de activare sunt denumite și funcții de neliniaritate , acestea au rolul de a prelua
răspunsul unor neuroni și de a efectua o anumita operație matematică asu pra acestuia. În cele
ce urmează vor fi prezentate câteva funcții de activare des folosite în practică.
Funcția sigmoid – are rolul de a prelua un număr real și de a-l scala la intervalul [0, 1].
În cazuri mai rare, când se lucrează cu valori pozitive foarte mari acestea devin 1, iar
valorile negative foarte mici devin 0. În practică, această funcție nu se mai folosește atât de
des deoarece are 2 dezavantaje:
1. Funcția sigmoid conduce la saturația și distrugerea gradientului în 1 sau în 0,
gradientul acestor capete de interval fiind aproape 0. În cadrul procesului
“backpropagation” acest gradient aproape nul nu permite trecerea prin neuron spre
ponderile acestuia.
2. Ieșirile acestei funcții nu sunt centrate în zero astfel ca și neuronii aflați în straturi
ulterioare procesării vor primi date care nu sunt centrate.
Expresia matematică a funcției sigmoid este redată mai jos:
𝜎(𝑥)=1
1+𝑒−1
(2.2.2 – 1)
Fig. 3.2.1 Funcția sigmoid scaleaz ă valorile în intervalul [0,1]
Funcția tangentă hiperbolică – este o funcție de activare care introduce valori reale în
intervalul [-1, 1] așa cum se poate observa în Fig. 3.2.2 și spre deosebire de funcția sigmoid ală,
aceasta este centrată în origine.
10
Fig. 3.2.2 Fucția de activare tangent hiperbolică.
Forma matematică a funcției tangentă hiperbolică este prezentată în expresia următoare:
𝑦=𝑡𝑎𝑛ℎ(𝑥)=𝑒2𝑥 − 1
𝑒2𝑥 + 1
(2.2.2 – 2)
Despre func ția tanh putem afirma că este mai preferată, în comparație cu funcția sigmoidă, iar
neuronul tanh este un ne uron de tip sigmoid scalat la origine, iar de aici reiese și relația:
𝑡𝑎𝑛ℎ(𝑥)=2𝜎(2𝑥)−1
(2.2.2 – 3)
Funcția de activare liniară – calculeaz ă răspunsul în funcție de intrarea primită iar în
expresia (2.2.2 – 4) este prezentată funcția matematică.
𝑦=𝑥 (2.2.2 – 4)
Fig. 3.2.3 Func ția de activare liniară reprezentată pe intervalul [-5,5].
11
Funcția ReLU (Rectified Linear Unit ) – aceas tă funcție are forma 𝑓(𝑥)=𝑚𝑎𝑥 (0,𝑥) și are
pragul inferior în 0. Folosirea în practică a acestei funcții prezintă și anumite avantaje,
enumerate în continuare:
1. Dacă o comparăm cu funcția sigmoidă sau tangentă hiperbolică observăm că are o
convergență mai bună a gradientului stohastic, fapt datorat formei liniare care nu se
saturează.
2. Implementarea simplă a funcției ReLU prin pr ăguirea mat ricei de activare în 0.
Fig. 3.2.4 Funcția de activare ReLU, care are valoarea 0 când x < 0 și apoi devine liniară cu
panta = 1 când x > 0 . (Karpathy n.d.)
Un dezavantaj al folosirii acestei funcții este sensibilitatea și fragilitatea funcției la un
gradient foarte mare care ar duce în timpul antrenamentului la situația de incapacitate de
activare a neuronilor iar acest lucru ar omorî o parte din neuronii rețelei. Aceasta situație este
posibilă dacă rata d e învățare este setată necorespunzător și are o valoare mult prea mare. Dar
se poate evita acest fenomen prin setarea corectă a ratei de învățare.
Funcția de activare Gaussiană – are ca și condiție inițială de funcționare ca parametrul
𝜎 > 0 și are form ula matematică corespunzătoare expresiei (2.2. 2 – 5).
y = e−x2
σ2
(2.2.2 – 5)
12
Fig. 3.2.5 Funcția de activare gaussiană, reprezentată pe intervalul [0,100].
3.3 Arhitecturi de rețele neuronale
Rețelele de neuroni sunt modelate sub forma unor colecții de neuroni, care sunt legați
sub forma unui graf neciclic. Putem să afirmăm că într -o rețea cu mai multe straturi de neuroni
ieșirile unor neuroni au posibilitatea de a deveni intrări pentru alți neu roni, dar niciodată neuroni
ai aceluiași strat nu o sa aibă o conexiune între ei. În literatura de specialitate , adesea , rețelele
de neuroni sunt prezentate sub forma unor grafuri, unde nodurile sunt chiar neuronii iar arcele
dintre noduri sunt conexiunile dintre neuroni.
De-a lungul timpului, datorită creșterii interesului asupra acestui domeniu au apărut și
anumite conv enții de numire, aceste convenții reglementează faptul ca atunci când se face
referire la o rețea neuronală de x straturi, nu se ia în calcul și stratul de intrare. În cazul în care
facem referire la o rețea cu 3 straturi, atunci spunem ca rețeaua are 2 st raturi ascunse și un strat
de ieșire, fiind evident faptul ca are și un strat de intrare.
3.3.1 Rețele neuronale cu propagare înainte( feedforward )
În cazul rețelei neuronale cu propagare înainte, neuronii sunt organizați pe straturi , formând
un strat de intrar e, unul de ieșire și unul sau mai multe straturi ascunse. Particularitatea acestei
arhitecturi o reprezintă faptul că fiecare neuron primește un semnale de intrare fie din mediul
exterior, fie de la alți neuroni, fără existența unei conexiuni de reacție în cadrul rețelei. Astfel
putem să afirmăm c ă rețelele feedforward furnizează un set de ieșire ca răspuns la un set de date
de intrare , de asemenea se poate afirma că o rețea neuronală este total conectată dacă fiecare
neuron de pe fiecare strat este conectat cu toți neuronii de pe stratul precedent.
13
Fig 3.3.1.1 Graful unei rețele neuronale de tip feedforward cu structura 8x3x8 , având
8 neuroni în stratul de intrare, 3 neuroni în stratul ascuns și 8 neuroni în stratul de ieșire
(Mitchell 1997) .
Se consideră că o rețea de tipul feedforward este antrenată cu succes atunci când
semnalul de eroare ajunge la valori minime . Acest tip de rețea nu are o noțiune a ordinii în
timp și singura intrare pe care o poate percepe este cea a exemplului curent la care este
expusă, ceea ce ne face să concluzi onăm ca nu are capacități de memorare.
3.3.1.1 Perceptronul simplu
Perceptronul a fost unul dintre primele rețele neuronale dezvoltate pe baza modelului
McCulloch Pitts (1943) de către Frank Rosen baltt în anul 1958, acest avea o propagare înainte
a semnalului. Perceptronul este cea mai rudimentară forma a unei rețele neuronale folosită
pentru clasificarea unor tipare care au proprietatea de liniar separabilitate , acesta are capacitatea
de a generaliza – poate sa opereze cu date diferite față de cele din etapa de instruire și poate să
învețe plecând de la valori aleatoare ale ponderilor sinaptice ale rețelei. Ponderile inițiale sunt
inițializate în mod aleator, de obicei primind valori din intervalul [-0.5, 0.5] , iar ulterio r valorile
acestora sunt actualizate astfel încât semnalul de ieșire să tindă spre valorile dorite.
Dezavantajul major al perceptronului este acela că nu poate să clasifice tipare neliniare, dar
acest lucru a fost aprofundat în studiul perceptronului multi strat.
Fig 3.3.1.1.1 Arhitectura p erceptronul ui simplu . (Mitchell 1997)
Scopul perceptronului este acela de a clasifica un set de date din experior în una din cele
2 clase disponibile( y = -1 sau y = 1) .
14
3.3.1.2 Perceptronul multistrat
Acest tip de perceptron a fost dezvoltat din nevoia de a rezolva problema liniar
separabilității apăruta anterior la perceptronul simplu . Acesta este tot o rețea neuronală cu
propagare înainte a semnalului și este compusă din : un strat de intrare, unul sau mai multe straturi
ascunse și un strat de ieșire.
Perceptronul multistrat (eng: Mult ilayer Perceptron , prescurtat MLP) a fost conceput
astfel încât neuronii de pe straturile de intrare, ascuns și de ieșire să aibă inclus în modelul lor
matematic funcții de activare neliniare . Adaptarea ponderilor pentru o asemenea rețea se poate
face folosind 2 metode:
– Antrenare incrementală – actualizarea ponderilor se face după fiecare set aplicat
perceptronului
– Antrenare periodică – ponder ile se actualizează o singura dată și numai la sfârșitul unei
epoci de antrenare, actualizarea ponderilor are loc numai după ce toți vectorii de test
sunt aplica ți perceptronului .
Fig. 3.3.1.2.1 Arhitectura generală a unui perceptron multistrat . (Zakaria Alameer 2019)
3.3.2 Rețele neuronale recurente
Rețelele neuronale recurente (eng: Recurrent Neural Networks , RNN ) ies în evidență prin
faptul că există un semnal de reacție , atât de la neuronii de pe un strat superior pentru neuronii
de pe un strat inferior cât și pentru propriile lor intrări , de asemenea aceste rețele se împart în
rețele parțial recurente și rețele total recurente. În Fig. 3.3.2.1 este prezentată o rețea neuronală
recurentă care neuroni cu ieșirile conectate la propriile intrări. Acest tip de rețele are capacitatea
de a memora stări anterioare și datorită acestui fapt sunt folosite pentru recunoașterea modelelor
și a tiparelor în secvențe de date. Ca urmare a proprietăților deosebite, a cest tip de rețele este
folosit pe următoarele exemple de secvențe: scris de mână, serii numerice temporale , vorbire,
genomi și multe altele. Din categoria aceasta fac parte: rețelele neuronale Hopfield și rețelele
neuronale Boltzmann . (MUREȘAN Anul 2009)
Rețelele neuronale recurente sunt deosebite prin faptul că au în componență unități de
procesare neliniare, au o simetrie a conexiunilor neuronale și folosesc reacția într -un mod
intensi v. Pe lângă caracteristicile mai sus menționate, la utilizarea acestui tip de rețele apar și
unele dificultăți care îngreunează procesul de învățare:
15
– poate să fie prezent un comportament haotic al rețelei, ceea ce duce la un proces de
învățare mai dificil ;
– când vine v orba de propagarea semnalelor în rețea , este necesară o sincronizare a
acestora pentru a putea obține timpi de antrenare cât mai potriviți ;
– cel mai des se pune problema care este numărul de momente de timp anterioare pe care
le poate memora o rețea recurentă.
Fig. 3.3.2.1 Arhitectura unei rețele neuronale recurente.
În ultimii ani rețelele neuronale recurente și -au găsit aplicabilitatea în rezolvarea multor
probleme precum: recunoașterea obiectelor în imagini, recunoașterea vorbirii, modelarea
limbajului , traduceri și multe alte situații în c are au prezentat un adevărat succes.
Fig 3.3.3.2 Modulul care se repetă într -o rețea neuronală recurentă ce conține un singur
strat. Sursa: (Olah 2015) .
16
3.3.2.1 Rețele LSTM
Acest tip special de rețele de memorie pe termen scurt (Long Short Term Memory ) este o
rețea neuronală specială și mai performantă decât rețelele neuronale recurente, care este
capabilă să învețe dependențe pe termen lung, ele au fost introduse de Hochreiter &
Schmidhuber în anul 1997 și ulterior au fost dezvoltate de mai mulți cercetători din domeniu.
Au o funcționalitate mult mai bună în comparație cu celelalte tipuri de rețele când vine vorba
despre memorarea informațiilor pentru perioade mai lungi de timp, acesta fiind și
comportam entul lor implicit. Dacă facem o comparație între rețelele neuronale recurente și
rețele de memorie pe termen scurt (Long Short Term Memory ), cele din urmă au o structură
mai diferită și mai complex ă. Acestea sunt organizate în module c are cuprind 4 stratu ri ce
interacționează într -un mod diferit.
Fig. 3.3.2.1.1 Modulul care se repetă într -o rețea LSTM , modul ce conține 4 straturi
care interacționează . Sursa: (Olah 2015)
Funcționalitatea acestor rețele este descrisă în figura de mai sus unde se poate observa
existența celor 4 unități care presupun: funcția de activare tangentă hiperbolică , poarta de uitare
(forget gate) , poarta de scriere (write gate) și poarta de citire (read gate) .
Funcționa rea rețelelor LSTM este descrisă în expresiile ce urmează, prezentate într -o
ordine secvențială:
Poarta de uitare:
𝑓𝑡 = 𝜎(𝑊ℎ𝑓 ⋅ ℎ𝑡−1 + 𝑊ℎ𝑓 ⋅ 𝑥𝑡 + 𝑏𝑓) (3.3.2.1 – 1)
Poarta de intrare:
𝑖𝑡 = 𝜎(𝑊𝑖 ⋅ ℎ𝑡−1 + 𝑊𝑥𝑖 ⋅ 𝑥𝑡 + 𝑏𝑖) (3.3.2.1 – 2)
Poarta C:
𝐶𝑡 = 𝑡𝑎𝑛ℎ(𝑊ℎ𝑐 ⋅ ℎ𝑡−1 + 𝑊𝑥𝑐 ⋅ 𝑥𝑡 + 𝑏𝑐) (3.3.2.1 – 3)
17
Poarta de ieșire:
𝑜𝑡 = 𝜎(𝑊ℎ𝑜 ⋅ ℎ𝑡−1 + 𝑊𝑥𝑜 ⋅ 𝑥𝑡 + 𝑏𝑜) (3.3.2.1 – 4)
Calculul sistemului de cunoștinț e, cel care are rolul de a actualiza starea rețelei, corespunzător
acestui pas:
𝐶𝑡 = 𝑓𝑡 ⋅ 𝐶𝑡−1 + 𝑥𝑡 ⋅ 𝐶𝑡 (3.3.2.1 – 5)
Calcului ieșirii ℎ𝑡 se face conform expresiei:
ℎ𝑡 = 𝑖𝑡 ⋅ 𝑡𝑎𝑛ℎ(𝐶𝑡) (3.3.2.1 – 6)
Unde reamintim formula matematică a tangentei hiperbolice:
𝑡𝑎𝑛ℎ(𝑥) = 𝑒2𝑥 − 1
𝑒2𝑥 + 1
(3.3.2.1 – 7)
Avem notațiile:
• ℎ𝑡−1 reprezintă predicția la iterația precedentă ;
• 𝑥𝑡 reprezintă intrarea curentă ;
• 𝐶𝑡−1 reprezintă sistemul de cunoștințe C, cunoștințe acumulate până la momentul curent
înainte să suf ere modificări.
Ieșirea dintr -o celula a rețelei LSTM se face res pectând pașii enumerați în continuare:
1. Poarta de uitare calculează o valoare 𝑓∈[0,1] pe baza valorilor variabilelor ℎ𝑡 și 𝑥𝑡,
rolul acestei valori este acela de a spune în ce procentaj o sa fie reținută informația din
𝐶𝑡−1, restul informației nefolositoare fiind uitată.
2. Stratul care are în componență funcția tanh calculează potențialul de cu noștințe de la
iterația actuală 𝐶𝑡.
3. Folosind o funcție de activare, poarta de intrare condiționează procentual ce procent va
din cunoștințele 𝐶𝑡 va intra în componența 𝐶𝑡−1, astfel obținându -se noua valoare 𝐶𝑡.
4. Poarta de ieșire împreună cu valoarea 𝐶𝑡 fiind transformate de poarta tanh, vor genera
ieșirea ℎ𝑡.
Din toate cele 4 porți menționate anterior, poarta de uitare (forget gate) are cel mai
important rol, dar și cel mai mare impact în reținerea informației relevante și totodată să mențină
unele depend ențe pe termen lung. Plecând de la aceste fapte rețelele LSTM reprezintă o metodă
potrivită în predicția seriilor financiare de timp. (Dan -Andrei 2019) .
Fluxul de pași de timp al une i secvențe care trece printr -un strat de rețea LSTM în mediul
de lucru MATLAB este redat în figura Fig. 3.3.2.1.2, unde prim a celulă LSTM utilizează starea
inițială a rețelei dar și primul pas de timp al secvenței de la intrarea celulei, astfel rezultând
prima secvență de ieșire și actualizarea starii celulei. Într -un mod identic funcționeaza și
celelalte celule unde este folosită starea curentă a celulei și pasul de timp următor.
18
Fig. 3.3.2.1.2 Fluxul de date dintr -un strat de rețea LSTM.
Un rol important în antrenarea și utilizarea rețelelor recurente LSTM îl joacă funcția
”predictAndUpdateState ”, care are rolul de a prezice răspunsul unei rețele antrenate la secvența
de intrare și mai are rolul de a actualiza starea rețelei. Este important de specificat faptul că
această funcție poate să fie folosită numai când se lucrează cu rețele neuronale rec urente.
Sintaxa funției este următoarea:
[updatedNet,YPred] = predictAndUpdateState(recNet,sequences) ,
unde perechea [updatedNet,YPred] salvează rețeaua neuronală cu starea actualizată și răspunsul
acesteia. Parametrii funcției sunt: numele rețelei neuron ale recurente și secvența de data de
intrare.
3.3.3 Algoritmi de antrenare
Prin învățare se în țelege procesul prin care are loc adaptarea continuă a ponderilor
conexiunilor neuronale în cadrul unei rețele neuronale.
Acești algoritmi, care sunt numiți și algoritmi de învățare sau de instruire, se împart în
3 categorii principale în funcție de modul în care se face antrenarea :
– de învățare supervizată
– de învățare nesupervizată
– de învățare prin reîntărire
În cadrul antrenamentului, prezentarea într egului set de date rețelei neuronale poartă
denumirea de epocă de antrenare , în felul acesta procesul de adaptare al ponderilor pentru
obținerea rezultatului dorit este format dintr -un anumit număr de epoci de antrenare. De
menționat este faptul că numărul de epoci de antrenare este variabil și poate sa fie ajustat în
funcție de mai multi parametri.
Tot în cadrul antrenamentelor este întâlnit și fenomenul de overfitting – memorarea sau
învățarea pe de rost a datelor din setul de antrenare, lucru ce duce la incapacitatea rețelei de a
19
mai generaliza date ulterior. Acest fenomen are loc dacă alegem să instruim rețeaua în timpul
a prea multor epoci sau dacă numărul de neuroni din rețea este prea mi c. Ca și soluție pentru
această problem s -a propus folos irea seturilor de date de validare (Mitchell 1997) .
În cazul învăț ării superviza te se impune aplicarea unei intrări rețelei, după care se
compară ieșirea obținută de la rețea cu ieșirea dorită și ulterior se modifică ponderile astfel încât
să se minimizeze diferența dintre cele două seturi de date, practic se urmărește minimizarea
erorilor (Mitchell 1997) . Exemple de asemenea algoritmi sunt: algoritmul propagării erorii
înapoi( eng: back -propagation ), regula delta, algoritmii stohastici, algoritmi de învățare
hebbiană și mașina Boltzmann.
În cazul învățării nesupervizate rețeaua funcționează ca un black -box, se construiesc
modele interne fară să se precizeze datele de antrenament , rețeaua primește doar datele de
intrare și în urma execuției oferă date de ieșire. Exemple de asemenea algoritmi sunt: unii
algoritmi de învățare hebbiană, rețelele Kohonen cu autootganizare și unii algoritmi specifici
rețelelor ART( Adaptive resonance the ory).
În cazul învățării prin întărire (eng: Reinforcement Learning ) rețeaua neuronală
testează anumite acțiuni asupra mediului , iar pentru fiecare dintre aceste acțiuni primește o
evaluare, care poartă denumirea de semnal de întărire care poate să fie perceput ca o recompensă
sau ca o pedeapsă . Acest tip de algoritm are ca scop maximizarea recompensei primite într -o
anumită perioadă d e timp iar in felul acesta rețeaua este antrenată fără a primi indicații sau
instrucțiuni inițiale.
3.3.3.1 Algoritmul Back -Propagation
Algoritmul de învățare cu propagare înapoi este un algoritm de învățare supervizată care
generalizează regula delta a lui Widrow -Hoff. Acesta a fost propus de Werbos prima dată în
anul 1971 și redescoperit ulterior de Parker în anul 1982 și de Hinton, Will iams și Rumelhart
în anul 1986. Inițial acest algoritm a fost conceput pentru antrenarea rețelelor neuronale statice
cu propagare înainte, dar ulterior a fost extins și în cazul rețelelor neuronale recurente. Acest
algoritm constă în compararea setului de date de la ieșirile rețelei cu un set de date de antrenare
și pe urmă propagarea înapoi a erorii de la un strat superior la un strat inferior, în felul acesta
ajustându -se ponderile conexiunilor neuronale cu sc opul de a minimiza eroarea. Se poate spune
despre acest algoritm că este un algoritm de modificare pas cu pas a gradientului funcției de
eroare.
În expresia de mai jos este formula erorii ce aparține neuronului j din stratul de ieșire
din timpul iterației n :
𝑒𝑗(𝑛)=𝑑𝑗(𝑛)−𝑦𝑗(𝑛)
(3.3.3.1 – 1)
unde:
• 𝑑𝑗 reprezintă semnalul de referință
• 𝑦𝑗 reprezintă răspunsul actual al rețelei neuronale.
20
Eroarea instantanee a neuronului j este exprimată astfel:
𝜀(𝑛)=1
2𝑒𝑗2(𝑛)
(3.3.3.1 – 2)
Iar pentru obținerea erorii instantanee la nivelul întregului strat de ieșire se va calcula suma
erorilor tuturor neuronilor de pe respectivul strat:
𝜀(𝑛)=1
2∑𝑒𝑗2(𝑛)
𝑗∈𝐶
(3.3.3.1 – 3)
unde în mulțimea C sunt incluși toți neur onii ce aparțin stratului de ieșire. Dacă definim N –
numărul total de tipare din setul de date de antrenare , eroarea medie a întregului set de date va
fi funcția de cost din expresia (3.3.3.1 – 4) care ulterior va fi minimizată și va rezulta relația din
expresia (3.3.3.1 – 5):
𝜀𝑎𝑣(𝑛)=1
𝑁∑1
2𝑒𝑗2(𝑛)𝑁
𝑛=1
(3.3.3.1 – 4)
𝜀𝑎𝑣(𝑛)=1
𝑁∑𝜀(𝑛)𝑁
𝑛=1
(3.3.3.1 – 5)
Atât e roarea instantanee 𝜀(𝑛), cât și eroarea medie totală 𝜀𝑎𝑣(𝑛)sunt funcți i ale tuturor
parametrilor liberi ai rețelei , iar aici ne referim la ponderile sinaptice și valorile bias -urilor) .
Obiectivul acestui proces de antrenare este ajustarea parametrilor liberi ai rețelei, iar pentru a
face asta se urmărește minimizarea func ției 𝜀𝑎𝑣(𝑛). Pentru efectuarea acestei minimizări se
propune utilizar ea unei metode simple de antrenare ce presupune actualizarea incrementală a
ponderilor pe durata unei epoci. Ajustarea ponderilor se face folosind erorile corespunzătoare
calculate pentru fiecare tipar prezentat la intrarea rețelei neuronale.
Algoritmul backpropagation aplică o corecție ponderilor sinaptice, corecție care este
derivata p arțială a erorii după cum este prezentat în expresia (3.3.3.1 – 6):
∆𝑤𝑗𝑖(𝑛)=−𝜂𝜕𝜀(𝑛)
𝜕𝑤𝑗𝑖(𝑛)
(3.3.3.1 – 6)
unde:
• 𝑤𝑗𝑖(𝑛) este ponderea sinaptică ,
• ∆𝑤𝑗𝑖(𝑛) este corecția ponderii sinaptice ,
• 𝜂 este rata de învățare a algoritmului .
• 𝜕𝜀(𝑛) este derivata parțială a erorii
21
Semnul minus din ecuația (3.3.3.1 – 6) ne indică folosirea gradientului descendent în spațiul
ponderilor, se face căutarea direcției pentru a facilita modificarea ponderilor care o să ducă la
reducerea valorii erorii 𝜀(𝑛).
În continuare gradientul se va exprima confirm următoarei expresii:
𝜕𝜀(𝑛)
𝜕𝑤𝑗𝑖(𝑛) = 𝜕𝜀(𝑛)
𝜕𝑒𝑗(𝑛) ⋅ 𝜕𝑒𝑗(𝑛)
𝜕𝑦𝑗(𝑛) ⋅ 𝜕𝑦𝑗(𝑛)
𝜕𝑣𝑗(𝑛) ⋅ 𝜕𝑣𝑗(𝑛)
𝜕𝑤𝑗𝑖(𝑛)
(3.3.3.1 – 6)
Derivata parțială 𝜕𝜀(𝑛)
𝜕𝑤𝑗𝑖(𝑛) – factorul de senzitivitate are rolul de a determina direcția de căutare
în spațiul ponderilor pentru ponderea 𝑤𝑗𝑖.
Diferențiind și aducând la o formă mai simplă ecuațiile mai sus menționate vom obține
următoarele relații:
𝜀(𝑛)=1
2∑𝑒𝑗2(𝑛)
𝑗∈𝐶⇒𝜕𝜀(𝑛)
𝜕𝑒𝑗(𝑛)=𝑒𝑗(𝑛)
(3.3.3.1 – 7)
𝑒𝑗(𝑛)=𝑑𝑗(𝑛)−𝑦𝑗(𝑛) ⇒ 𝜕𝑒𝑗(𝑛)
𝜕𝑦𝑗(𝑛) = −1
(3.3.3.1 – 8)
𝑦𝑗(𝑛)=𝜑(𝑣𝑗(𝑛))⇒ 𝜕𝑦𝑗(𝑛)
𝜕𝑣𝑗(𝑛)=𝜑′(𝑣𝑗(𝑛))
(3.3.3.1 – 9)
𝑣𝑗(𝑛)=∑𝑤𝑗𝑖(𝑛)
𝑗𝑦𝑗(𝑛)⇒𝜕𝑣𝑗(𝑛)
𝜕𝑤𝑗𝑖(𝑛)=𝑦𝑗(𝑛)
(3.3.3.1 – 10)
Și ulterior se obține:
𝜕𝜀(𝑛)
𝜕𝑤𝑗𝑖(𝑛)=−𝑒𝑗(𝑛)⋅𝜑′(𝑣𝑗(𝑛))⋅𝑦𝑗(𝑛)
(3.3.3.1 – 11)
Dacă se definește gradientul local 𝛿𝑗(𝑛) descris în relațiile de mai jos:
𝛿𝑗(𝑛)=𝜕𝜀(𝑛)
𝜕𝑣𝑗(𝑛)
(3.3.3.1 – 11)
22
= 𝜕𝜀(𝑛)
𝜕𝑒𝑗(𝑛) ⋅ 𝜕𝑒𝑗(𝑛)
𝜕𝑦𝑗(𝑛) ⋅ 𝜕𝑦𝑗(𝑛)
𝜕𝑣𝑗(𝑛)
(3.3.3.1 – 12)
=𝑒𝑗(𝑛)⋅𝜑′(𝑣𝑗(𝑛))
(3.3.3.1 – 13)
Din care rezulta relația:
Δ𝑤𝑗𝑖(𝑛)=𝜂⋅𝛿(𝑛)⋅𝑦𝑗(𝑛)
(3.3.3.1 – 14)
După cum se poate observa în relațiile de mai sus, gradientul local 𝛿𝑗(𝑛) al neuronului
j din stratul de ieșire se calculează ca produsul semnalului de eroare 𝑒𝑗(𝑛) corespunzător
neuronului și derivata funcției de activare asociate 𝜑′(𝑣𝑗(𝑛)). În relațiile de mai sus se poate
observa că factorul cheie pentru calcularea ajustărilor ponderilor neuronale Δ𝑤𝑗𝑖(𝑛) este
semnalul de eroare 𝑒𝑗(𝑛) de la ieșirea neuronului j, iar în această situație se pot lua în
considerare 2 cazuri în funcție de poziția neuronului j în rețeaua din care face parte. Primul caz,
cel în care neuronul este un nod de ieșire , semnalul de eroare se poate calcula direct deoarece
este specificat răs punsul dorit al rețelei. În al doilea caz, neuronul j este pe un strat ascuns , aici
neavând posibilitatea să se calculeze direct răspunsul, acest lucru se poate face și indirect ,
întrucât neuronii de pe straturile ascunse sunt responsabili pentru erorile a părute la ieșirea
rețelei neuronale. Problema identificată este aceea de a știi cum să se recompenseze sau să se
penalizeze neuronii ascunși pentru contribuția lor , iar rezolvarea problemei se face prin
propagarea înapoi prin rețea a semnalelor de eroare.
În felul acesta, pentru un oarecare neuron j aflat pe un strat ascuns nu se specifică un
răspuns dorit. În continuare semnalul de eroare pentru un neuron se recomandă a fi determinat
într-o manieră recursivă, în funcție de semnalele de eroare ale tuturor neuronilor învecinați, dar
și direct conectați cu neuronul ascuns. În relația din expresia (3.3.3.1 – 15) se va redefini
gradientul local 𝛿𝑗(𝑛) pentru neu ronul j aflat pe un strat ascuns:
𝛿𝑗(𝑛)=−𝜕𝜀(𝑛)
𝜕𝑦𝑗(𝑛)⋅𝜕𝑦𝑗(𝑛)
𝜕𝑣𝑗(𝑛)=𝜕𝜀(𝑛)
𝜕𝑦𝑗(𝑛)⋅𝜑′(𝑣𝑗(𝑛))
(3.3.3.1 – 15)
Calcularea der ivatei parțiale 𝜕𝜀(𝑛)
𝜕𝑦𝑗(𝑛) va nec esita folosirea expresiei (3.3.3.1 – 16) unde
se va nota cu indexul k – neuronul din stratul de ieșire k iar cu indexul j – neuronul din stratul
ascuns j:
𝜀(𝑛) = 1
2∑ 𝑒𝑘2(𝑛)
𝑘∈𝐶
(3.3.3.1 – 16)
23
Ulterior va rezulta ecuația din expresia (3.3.3.1 – 17):
𝜕𝜀(𝑛)
𝜕𝑦𝑗(𝑛) = ∑𝑒𝑘𝜕𝑒𝑘(𝑛)
𝜕𝑦𝑗(𝑛)
𝑘
(3.3.3.1 – 17)
care se scrie mai departe sub forma:
𝜕𝜀(𝑛)
𝜕𝑦𝑗(𝑛) = ∑𝑒𝑘𝜕𝑒𝑘(𝑛)
𝜕𝑣𝑘(𝑛)𝜕𝑣𝑘(𝑛)
𝜕𝑦𝑗(𝑛)
𝑘
(3.3.3.1 – 18)
Se deduce expresia:
𝑒𝑘(𝑛)=𝑑𝑘(𝑛)−𝑦𝑘(𝑛)=𝑑𝑘(𝑛)−𝜑(𝑣𝑘(𝑛)) ⇒𝜕𝑒𝑘(𝑛)
𝜕𝑣𝑘(𝑛)
=𝜑′(𝑣𝑘(𝑛))
(3.3.3.1 – 19)
Notația potențialului local pentru neuronul k este redată în expresia următoare:
𝑣𝑘(𝑛) = ∑𝑤𝑘𝑗(𝑛)𝑦𝑖(𝑛)𝑚
𝑗=0
(3.3.3.1 – 20)
unde m reprezintă numărul de intrări ale neuronului k, exceptând bias -urile. Încă o data
ponderea sinaptică 𝑤𝑘0(𝑛) este egală cu bias -ul 𝑏𝑘(𝑛) al neuronului k, iar intrarea este setată
la valoarea +1. Mai departe dacă se diferențiază ultima ecuație menționată, în funcție de 𝑦𝑖(𝑛)
va rezulta:
𝜕𝑣𝑘(𝑛)
𝜕𝑦𝑖(𝑛)=𝑤𝑘𝑗(𝑛)
(3.3.3.1 – 21)
Mai departe se calculează derivata parțială:
𝜕𝜀(𝑛)
𝜕𝑦𝑗(𝑛) = −∑𝑒𝑘(𝑛)𝜑′(𝑣𝑘(𝑛))𝑤𝑘𝑗(𝑛)
𝑘=∑ 𝛿𝑘(𝑛)
𝑘𝑤𝑘𝑗(𝑛)
(3.3.3.1 – 21)
În final se obține formula back -propagation pentru gradientul local 𝛿𝑗(𝑛) descris de expresia:
𝛿𝑘(𝑛)=𝜑′
𝑗(𝑣𝑗(𝑛))∑𝛿𝑘(𝑛)
𝑘𝑤𝑘𝑗(𝑛)
(3.3.3 .1 – 22)
24
Factorul 𝜑′
𝑗(𝑣𝑗(𝑛)) depinde doar de funcția de activare a neuronului j, factorul celălalt
utilizat, suma de k, depinde de 2 termeni : 𝛿𝑘(𝑛) și 𝑤𝑘𝑗(𝑛) – ponderile sinaptice asociate
conexiunilor.
La final dacă se adună relațiile derivate anterior pentru algoritmul back -propagatio n, se
obține expresia:
∆𝑤𝑘𝑗(𝑛)=𝜂[𝜑′
𝑗(𝑣𝑘(𝑛))∑𝛿𝑘(𝑛)
𝑘𝑤𝑘𝑗(𝑛)]⋅𝑦𝑖(𝑛)
(3.3.3.1 –23)
3.3.3.2 Algoritmul hebbian generalizat
Algoritmul hebbian generalizat (eng: Generalized Hebbian Algorithm , GHA) a fost
propus de Sanger în anul 1989 și aparține învățării nesupervizate . Prin intermediul acestui
algoritm vectorii proprii ai matric ei de corelație a datelor de intrare se pot deduce iterativ
folosind o rețea neuronală cu un singur strat liniar.
Fig 3.3.3.1.1 Rețea neuronală folosită pentru implementarea algoritmului hebbian
generalizat. (MUREȘAN Anul 2009)
Fie vectorul intrărilor de forma :
𝑊𝑀 = [𝑊𝑀1,𝑊𝑀2,𝑊𝑀3,…..,𝑊𝑀𝑁]𝑇
(3.3.3.2 –1)
Problema acestui algoritm o reprezintă găsirea ponderilor 𝑊𝑗, iar pentru soluționarea ei
𝑊𝑗 se inițializează cu valori aleatoare, ulterior ponderile fiind modificate conform expresiei
(3.3.3.2 –2):
𝑊𝑗(𝑛)=𝑊𝑗(𝑛)+𝜂(𝑛)𝑦𝑗(𝑛)[𝑋(𝑛)−𝑦𝑗(𝑛)𝑊𝑗(𝑛)−∑𝑦𝑗(𝑛)𝑊𝑖(𝑛)
𝑖<𝑗]
(3.3.3.2 –2)
unde n reprezintă indexul iterațiilor iar 𝑦𝑗(𝑛) este exprimat astfel:
25
𝑦𝑗(𝑛)=𝑊𝑗𝑇(n)x(n)
(3.3.3.2 –3)
Sanger a observat c ă 𝑊𝑗 converge spre componenta de ordinul j a vectorului propriu al 𝑅𝑥𝑥 iar
Y. Ma și Y. Zhang au remarcat faptul că algoritmul este restrâns doar la domeniul real și pe
baza acestui fapt au propus în anul 1997 (CGHA, Complex Domain Generalized Hebbian
Algori thm ) , algoritm capabil să prelucreze date și din mulțimea numerelor complexe. În cazul
CGHA modificarea ponderilor are loc conform formulei din expresia (3.3.3.2 –4):
Wj(n+1) = Wj(n) + η(n)conj [yj(n)] [X(n) – yj(n)Wj(n) – ∑yi(n)Wi(n)
i<j]
(3.3.3.2 –4)
unde conj [yj(n)] este conjugatul complex al lui:
yj(n) = 𝑊𝑗𝐻(𝑛)𝑋(𝑛)
(3.3.3.2 –5)
iar X reprezintă hermitianul transpus. (MUREȘAN Anul 2009)
26
Cap. 4 Modul de funcționare
Folosind mediul de lucru MATLAB, versiunea 2018a de la MathWorks , se face achiziția
datelor, prelucrarea lor și folosirea lor pentru antrenare. Datele sunt obținute de pe platforma de
tranzacționare MetaTrader4 , acestea fiind descărcate în fiș iere cu extensia .csv (comma –
separated values). În fișier datele sunt așezate sub forma unor vectori coloană, așa cum se poate
observa și în Fig 4.0.1, fiecare coloană având valori care reprezintă caracteristici diferite ale
prețului. Primele 2 coloane reprezintă data și ora la care s -au înregistrat valorile prezentate,
următoarele 4 coloane prețul de deschidere, prețul cel mai mare atins, prețul cel mai mic atins
și prețul de închidere, în ordinea enumerată , iar ultima coloană reprezin tă volumul de bani cu
care s -a tranzacționat. Distanța de timp dintre 2 valori consecutive ale fiecărei coloane este
aceeași pentru tot setul de date , aceasta se poate alege la momentul descărcării de pe platforma
MetaTrader4 și poate să ia următoarele val ori temporale : 1 minut, 5 minute, 15 minute, 30
minute, 1 or ă, 4 ore, 1 zi, 1 săptămână, sau 1 luna.
Fig. 4.0.1 Prezentare a istoricului prețului pentru paritatea valutară GBP/USD (Lira
Sterlină/Dolar American) la pasul de timp de 4 ore .
27
4.1 Achiziția și prelucrarea de date
Modelul matematic care reflect ă modul de funcționare al rețelei neuronale recurente este
unul de tip auto -regresiv prezentat in ecuația (4.1 – 1), unde secvența de ieșire ale modelului
depind e de secvența anterioară momentelor de timp pentru care se dorește prezicerea valorilor .
𝑦̂𝑡=𝑓(𝑦̂𝑡−1)
(4.1 – 1)
Achiziția de date în mediul Matlab 2018a a f ăcut-o prin intermediul scriptului din fișierul
imp_data.m prezentat ă mai jos, am ales numai datele relevante și anume, numai prețul de
închidere, care se află pe coloana a 6 -a.
filename = 'C:\Users\ianko\OneDrive – Universitatea Politehnica
Timisoara \Licenta\Model_final_2 \GBPUSD_H4.csv' ;
delimiter = ',';
formatSpec = '%*q%*q%*q%*q%*q%f%*s%[^ \n\r]';
fileID = fopen(filename, 'r');%fi?ierul este deschis numai pentru
citire
dataArray = textscan(fileID, formatSpec, 'Delimiter' , delimiter,
'TextType' , 'string' , 'EmptyValue' , NaN, 'ReturnOnError' , false);
fclose(fileID);
dataArray = cellfun(@(x) num2cell(x), dataArray, 'UniformOutput' ,
false);
GBPUSDH4 = [ dataArray{1:end -1}];%salvarea datelor într -o variabilă
clearvars filename delimiter formatSpec fileID dataArray ans;
În variabila GBPUSDH4 este salvat prețul de închidere începând din 21 decembrie 2009
până în 30 august 2019, în antrenarea rețelei neuronale am folosit doar o parte din aceste date.
Folosind scriptul imp_data_1.m, am repetat aceeași operație ca mai sus, singura
diferență fiind aceea că aici am descărcat date de pe platforma de tranzacționare MetaTrader 4
cu o întârziere de 4 zile lucrătoare, având la dispoziție un vector cu 18 valori care nu se regăsesc
în achiziția precedentă , acestea reprezentând continuarea secvenței de valori.
Datele folosite au fost salvate în variabila data care are o dimensiune de 863 de valori.
Dintre aceste valori 99%, adică 854 au fost folosite pentru antrenarea rețelei neuronale, iar restul
până la 863 au fost folosite pentru testar e. Evoluția prețului este prezentată în figura Fig. 4.1.1
unde sunt cele 863 de valori care ap arțin variabilei data.
Ulterior achiziției de date am prelucrat datele pentru a le putea folosii în pașii următori,
aici am ales dimensiunea secven ței de predicție dar și standardizarea datelor înainte să fie
folosite la antrenare.
%se alege lungimea sec ventei de predictie
num_steps_train = floor(.99*numel(data)); %preferabil sa fie .99 sau
cel mult .97
train = data(1:num_steps_train+1);
test = data(num_steps_train+1:end);
(MathWorks 2019)
În secvența de cod dată au loc simple atribuiri dar și setarea unor dimensiuni potrivite pentru
variabila num_steps_train care este un parametru pentru antrenare și configurare. Acest
28
parametru are rolul de a determina care o sa fie dimensiunea setului de date de antrenare si
dimensiunea setului de date de testare, în cazul de față 99% din setul de date importat o sa fie
folosit în antrenare și 1% o să fie folosit în testare.
Fig. 4.1.1 Evoluția prețului parității valutare GBP/USD.
Standardizarea da telor se face folosind porțiunea de cod de mai jos unde mean – face
media aritmetică a valorilor iar std – calculează deviația standard:
%standardizarea datelor
mu = mean(train);
sigma = std(train);
std_train_data = (train -mu)/sigma;
În porțiunea de cod următoare se face inițializarea parametrilor rețelei, anume, numărul
intrărilor , straturilor ascunse și stratul de ieșire:
%se initializeaza parametri retelei
num_features = 1;
num_hidden_units = 80; %initial 200>150>120>100>80
num_responses =1;
4.2 Configurarea rețelei neuronale
Dacă facem o scurtă comparație între o rețea neuronal ă multi -perceptron recurentă și o
rețea LSTM, putem să observăm că există c âteva diferențe definitorii între acestea. Prima rețea
menționată, cu toate ca este recurentă, nu este capabilă să memoreze informație și apoi să o
utilizeze în aceeași manieră în care este capabilă să o facă o rețea LSTM , care este capabilă să
învețe dependințe de lungă durată . Un lucru important de reținut e ste faptul ca rețelele LSTM
au fost special concepute pentru a rezolva problema dependinței de lungă durat ă. Un alt aspect
care denotă complexitatea mai ridicată a rețelelor LSTM, este faptul ca aceste rețele permit
conservarea erorii, care poate fi propag ată înapoi în straturi dar și în timp, prin acest fapt se
permite învățarea de-a lungul mai multor pași dintr -o secvență. (Olah 2015)
29
Ca urmare a prezentării diferențelor de funcționare dar și de complexitate dintre cele 2
tipuri de rețele neuronale recurente menționate mai sus, dar și în capitolul precede nt,
continuăm cu prezentarea particularităților rețelei LSTM folosite.
Structura este dat ă de proprietățile enumerate sevențial mai jos:
%se initializeaza straturile din compon enta retelei
layers = [sequenceInputLayer(num_features),
lstmLayer(num_hidden_units),
fullyConnectedLayer(num_responses),
regressionLayer];
Rețeaua are în componență un strat de intrare, în stratul ascuns are neuroni specifici rețelelor
LSTM( long-short term memory) , un strat complet conectat și stratul de ieșire de tip regresor.
Am optat pentru op țiunile de antrenare enumerate mai jos în por țiunea de cod care este
responsabilă cu configurarea acestora.
options = trainingOptions( …
'adam',…
'MaxEpochs' ,100,…
'GradientThreshold' ,1,…
'InitialLearnRate' ,.015,…
'LearnRateSchedule' ,'piecewise' ,…
'LearnRateDropPeriod' ,125,…
'LearnRateDropFactor' ,.2,…
'Verbose' ,0,…
'Plots','training -progress' );
Opțiunea ”adam” se referă la modul de antrenare al rețelei, adam – estimarea
momentului adaptive este un optimizator care include și rata d e învățare (learning rate).
Opțiunea ”MaxEpochs” exprimă care este numărul maxim de epoci de antrenament pentru
rețeaua dată, în cazul de față numărul maxim este 100 iar la unele rețele cu număr mai mare de
neuroni de pe stratul lsmtLayer și alte caracteri stici modificate a fost nevoie de maxim 200 de
epoci de antrenare pentru a obține rezultate favorabile. De asemenea s -a optat pentru
vizualizarea progresului antrenamentului folosind 'Plots','training -progress' .
Caracteristicile salvate în layers pot fi vizualizate scriind ”layers” în linia de comandă
și se va obține:
layers =
4×1 Layer array with layers:
1 '' Sequence Input Sequence input with 1 dimensions
2 '' LSTM LSTM with 80 hidden units
3 '' Fully Connected 1 fully connected layer
4 '' Regression Output mean -squared -error
Antrenarea rețelei neuronale se face executând codul de mai jos care include atât
caracteristicile straturilor rețelei cât și opțiunile de învățare setate în codul prezentat anterior:
net = trainNetwork(XTrain,YTrain,layers,options)
unde trainNetwork reprezintă o comandă de antrenare cu mai mulți parametri.
net=predictAndUpdateState(net,XTrain);
[net,YPred] = predictAndUpdateS tate(net,YTrain(end));
num_steps_test=numel(XTest);
30
for i=2:num_steps_test
[net,YPred(:,i)]=predictAndUpdateState(net,YPred(:,i -1));
end
YPred=YPred*sigma+mu;
YTest=test(2:end);
rmse=sqrt(mean((YPred -YTest).^2));
idx=num_steps_train:( num_steps_train+num_steps_test);
Porțiunea de cod de mai sus are rolul de a face predicția și de a actualiza starea rețelei
neuronale. RMS E- root mean square error are valoarea medie a erorilor pătrate și se calculează
conform relației de mai jos:
𝑟𝑚𝑠 𝑒 = √1
𝑁∑|𝑥𝑛|2𝑁
𝑛=1
(4.2 – 1)
Folosind secvența de cod de mai jos se face ilustrarea prețului de închidere împreună cu
prețul prezis anterior, cele 2 fiind suprapuse, iar faptul că s -au urmărit indicii fiecărei valori
face posibilă prezentarea celor 2 prețuri astfel încât ele să apară sub forma undei secvențe
temporale:
figure
plot(train(1:end -1))
hold on
plot(idx,[data(num_steps_train), YPred], '.-')
legend("Observat" ,"Prezis" )
Fig 4.2.1 Ilustrarea evolu ției prețului real (linia albastră) și a prețului prezis (linia
portocalie) în cadrul un ei antren ări a rețelei.
31
Afișarea erorilor corelate cu valorile din variabila YPred se face prin intermediul
secvenței de cod de mai jos, unde se și optează pentru afișarea valorilor YPred din intervalul
(800:end ) care face ca să fie afișate datele începând de la indicele 800.
figure
subplot(2,1,1)
plot(YTest)
hold on
plot(YPred(800:end), '.-')
hold off
legend("Observat" ,"Prezis" )
subplot(2,1,2)
stem(YPred-YTest)
ylabel("Eroare" )
title("RMSE="+rmse)
În secvența de cod ce urmează se face resetarea stării rețelei iar ulterior, predicția și
actualizarea stării. De această dată însă, în predicție se introduce cel mai recent preț de închidere
anterior obs ervat (măsurat). Astfel, modelul de predicție este de forma de forma 𝑦̂𝑡=𝑓(𝑦𝑡−1).
Se calculează din nou predicția dar și RMSE – root mean square error , dar se face și
standardizarea datelor încă o dată.
net=resetState(net);
net=predictAndUpdateState(net,XTrain);
YPred=[];
for i=1:num_steps_test
[net,YPred(:,i)]=predictAndUpdateState(net,XTest(:,i));
end
YPred = sigma*YPred+mu;
rmse = sqrt(mean(YPred -YTest).^2)
Eroarea a fost calculată din nou pentru a se vedea dacă au ap ărut unele îmbunătățiri în
urma actualizării stării rețelei dar și în urma celorlalte operații.
În secțiunea de cod de mai jos, care aparține funcției calc.m s-au folosit datele mai
recente obținute în a doua achiziție de date și prin intermediul acestora s-a calculat eficiența
predicției obținu te. Prima dată s -a calculat efectiv care este diferența între ultima valoare a
fiecărui set de date, ulterior s -a urmărit obținerea unei figuri care să ajute din punct de vedere
vizual la analiza rezultatului, iar î n ultima parte din cod s -a calculat profitul, atât în puncte de
mișcare cât și în moneda Euro. Valoarea unui punct s -a aflat a fi de 8.9 euro când se execută o
tranzacție cu 10% dintr -un lot, astfel că valoarea unui punct în cazul tranzacționării cu un lot
întreg este de 89 euro. La aceste valori se ajunge aplicând formula prezentată în capitolul al
doilea, dar de asemenea se poate opta pentru a folosi și un calculator online.
diferenta = YPred(1,end) – d_a(end) %diferenta predic tie si
realitate , d_a – vector cu valorile reale ale pretului
diferenta_pret_h = YPred(1,end) – data(end) %se aplica la strategia
HOLD
diferenta_pret_s = data(end) – YPred(1,end) %se aplică daca se face
SELL
%se face o comparatie vizuala intre pretul przis si pretul real
figure
plot(data(end -7:end),'.-')
32
hold on
plot(YPred, '-o')
legend("Pretul de închidere prezis" ,"Pretul de închidere real" )
%calcularea profitului obbtinut
valoare_pip = 8.9; %la tranzactii de 0,1 loturi
%calcularea profitului obbtinut
profit_pip_h = floor( diferenta_pret_h*10000)
profit_pip_s = floor(diferenta_pret_s*10000)
profit_eur_h = valoare_pip * profit_pip_h
profit_eur_s = valoare_pip * profit_pip_s
Având la dispoziție această funcție de calculare a profitului, se poate determina mult
mai eficient dacă o predicție a fost corectă, prin urmare aduce un oarecare profit, sau dacă o
predicție a fost incorectă, asta atunci când se obțin valori negative. Profitul în cazul executării
unui ordin de vânzare se obținea atunci când valoarea parității s cade, iar daca aceasta crește se
înregistrează pierderi. În cazul unui ordin de cumpărare este invers, creșterea prețului duce la
obținerea profitului iar scăderea acestuia duce la pierderi. În secvența de cod de mai sus se face
calcularea profitului în pu ncte în variabila profit_pip_h atunci când se plasează o comandă
de cumpărare, iar in variabila profit_pip_s se calculează prețul atunci când se face o
comandă de vânzare.
33
Cap. 5 Rezultate experimentale
În urma antrenării rețelei neuronale se obține o predicție pentru 8 valori viitoare, datorită
faptului că datele de antrenament au fost alese să reprezinte prețul de închidere la intervale de
4 ore, se poate concluziona că predic ția se face pentru următoarele 32 de ore, interval aflat în
programul de tranzacționare.
Reamintim structura re țelei ca fiind cea descrisă de datele obținute executând comanda
”layers” și enumerate mai jos:
4×1 Layer array with layers:
1 '' Sequence Input Sequence input with 1 dimensions
2 '' LSTM LSTM with 80 hidden units
3 '' Fully Connected 1 fully connected layer
4 '' Regression Output mean -squared-error
iar antrenamentul s-a efectuat sub influența următoarelor opțiuni:
options =
TrainingOptionsADAM with properties:
GradientDecayFactor: 0.9000
SquaredGradientDecayFactor: 0.9990
Epsilon: 1.0000e -08
InitialLearnRate: 0. 0150
LearnRateScheduleSettings: [1×1 struct]
L2Regularization: 1.0000e -04
GradientThresholdMethod: 'l2norm'
GradientThreshold: 1
MaxEpochs: 100
MiniBatchSize: 128
Verbose: 0
VerboseFrequency: 50
ValidationData: []
ValidationFrequency: 50
ValidationPatience: 5
Shuffle: 'once'
CheckpointPath: ''
ExecutionEnvironment: 'auto'
34
WorkerLoad: []
OutputFcn: []
Plots: 'training -progress'
SequenceLength: 'longest'
SequencePaddingValue: 0
În urma rulării antrenament ului rețelei s -a obținut graficul din figura Fig. 5.1 unde se
poate observa predicția trendului pe care îl va urma prețul, de asemenea se prezic și valorile
celor 8 pași care sunt salvate în variabila YPred:
Ypred =
1.2156 1.2157 1.2157 1.2148 1.2141 1.2141 1.2137 1.2141
de aici majoritatea valorilor fiind într-o ordine descrescătoare, iar ultumele valori nu au a juns
să le depășească pe cele de la începutul secvenței se poate concluziona că trendul este unul
descrescător, lucru ce se confirmă și este mai evident în Fig 5.1.
Fig 5.1 Rezultatul predicției rețelei neuronale cu proprietățile prezentate în ”layers” și
”options”.
Mai departe este prezentat graficul cu r ădăcina pătrată a erorilor medii RMSE unde
valoarea obținută este 0,0086002 iar ulterior în urma actualizării rețelei, se ob ține 0.003 5697 o
eroare vizibil mai mică. În figura Fig 5.2 este red at acest lucru
35
Fig. 5.2 Predicția în urma actualizării rețelei în primul grafic , iar în al doilea grafic se
prezint ă valoarea erorii RMSE.
Fig 5.3 Comparația grafică dintre prețul de închidere prezis și prețul de închidere real –
obținut ulterior momentului prediției.
În urma calculelor a m obținut diferența de preț de închidere dintre ultima valoare a
variabilei data și ultima valoare prezisă a variabilei Y pred, iar rezultatul în puncte a avut
valoarea de 28, ceea ce îmseamnă că s -a exec utat un ordin care a adus profit, momentul
executării acestuia fiind la valoarea de 1.21700 iar momentul închiderii tranzacției fiind exa ct
după cele 8 perioade de timp a câte 4 ore. Ulterior predicției, în urma unei analize grafice am
constatat că prețul parității valutare a suferit o scădere considerabil mai mare față de cea prezisă.
De asemenea am implementat și o secvență de cod care are rolul de a calcula profitul și
într-o valutară de depozitare pentru a putea aprecia mai ușor funcționalitatea și cal itatea
36
antrenamentului rețelei neuronale. După cum s -a menționat și mai sus valoarea unui punct
atunci când se tranzacționează cu 10% dintr -un lot este de 8.9 euro , iar pentru a calcula profitul
și în euro s -a implementat o operație de înmulțire dintre con stanta valoare_pip și numărul
de puncte de mișcare a prețului.
Dacă stăm să analizăm și timpii de antrenare, dar și progresul antrenamentului, putem
să observăm în figura Fig. 5.4 durata de timp a antrenamentului fiind de 1 minut și 31 de
secunde , un timp de antrenament foarte scurt datorat atât setului de date de dimensiuni relative
mici cât și numărului restrâns de neuro ni de pe straturile rețelei dar și a numărului de epoci de
antrenare relativ scăzut. Antrenarea rețelei a folosit o rată de înv ățare de 0.015 și s -a folosit de
resursele procesorului, aici existând opțiunea, în ambele cazuri de a se alege și alte opțiuni: în
primul caz se putea opta pentru folosirea GPU – Graphic Precessing Unit , iar în al doilea caz
se putea opta pentru o rată de învățare mai mare sau mai mica.
Fig 5.4 Progresul antrenamentului rețelei neuronale.
37
Cap 6. Concluzii
În această lucrare se prezintă pe larg aplicati vitatea unei rețele neuronale LSTM în
domeniul tranzacționării pe piețel e financiar e, care învață dintr -o secvență ce constituie evoluția
prețului lirei sterline în comparație cu dolarul american. Obiectivul principal al acestei lucrări
îl constituie antrenarea unor rețele neuronale care să fie capabile sa ofere o predicție cât mai
apropiat ă de realitate.
Lucrarea începe cu o scurtă introducere în terminologia din domeniul piețelor
financiare , care este prezentată în capitolul al doilea și continuă cu fundamentele teoretice ale
rețelelor neuronale unde se prezintă mai în detaliu evoluția ace stora alături de diferite funcții de
activare, arhitecturi de organizare ale neuronilor și algoritmi de învățare propuși și dezvoltați
de pionierii acestui domeniu.
În capitolul 4 este descris modul de funcționare al părții practice din aceasta lucrare un de
sunt detaliate modul în care se face achiziția și prelucrarea de date, arhitectura rețelei neuronale
și sunt menționate și configurația folosit ă alături de secvențe din codul sursă . De asemenea este
menționată și versiunea programului software folosit: MATLAB 2018a, dar și organizarea
informației din setul de date folosit.
În capitolul 5 au fost aplicate fundamentele teoretice prezentate în capitolele precedente
și a fost implementată o rețea neuronală recurentă d e tipul LSTM, care a fost antrenată și ulterior
s-a obținut un r ăspuns convenabil . În faza incipientă a antrenamentelor și alegerii valorilor
parametrilor rețelei s -a observat importanța alegerii unei valori corecte pentru rata de învățare
a rețelei dar și importanța alegerii unei lungimi potrivite pentru secvența răspuns a rețelei. În
urma rulării mai multor sesiuni de antrenament s -a observat faptul că cu cât se dorește să se
obțină o predicție a unei valori mai îndepărtate cu atât crește și posibilitatea ca eroarea de
predicție să fie mai mare. Aceasta fiind și motivația pentru care în partea practică nu s -a ales să
se facă predicții pentru durate mai mari de timp.
Tot în urma procesului de antrenare a rețelei neuronale s -a constatat faptul că timpul de
antrenament crește o dat ă cu dimensiunea setului de date de antrenare, dar este influențat în
același fel și datorită numărului de straturi cu neuroni.
Datorită existenței particularităților definitorii ale majorității parităților valutare ce țin
de volatilitate , fluctuații și trend, se recomandă ca în cazul în care se dorește implementarea
rețelelor neuronale recurente și pe alte parități valutare, să se efectueze și etapa de antrenament
și configurare a rețelei pe respectiva paritate.
Prin implementarea și antrenarea rețelelor neuronale recurente este posibilă obținerea
unor predicții cât mai apropiate de realitate, fapt care contribuie în procesul de luare de decizii.
Acest lucru poate contribui la implementarea noi soluții în procesele de luare de decizii, în mai
multe domenii, nu numai în domeniul financiar.
38
Bibliografie
Alexandrina -Elena, Pandelea (căs. Andon). „DIAGNOSTICĂRI ÎN DOMENIUL
CONSTRUCȚIILORUTILIZÂND REȚELE NEURONALE ARTIFICIALE.” Iași,
2017.
Bishop, Christophe r M. Pattern Recognition and Machine Learning. New York: Springer
Science+Business Media, LLC, 2006.
Cătălin -Daniel Căleanu, Virgil Tiponuț. Rețele neuronale. Aplicații. Timișoara:
POLITEHNICA, 2002.
Dan-Andrei, Buboi. „Modelarea secventelor folosind retel e neuronale.” DISTRIBUTED
SYSTEMS RESEARCH LABORATORY. 07 Februarie 2019.
http://www.coned.utcluj.ro/~salomie/DS_Mas/4_Seminar/FullResearchPapers/14/Bub
oiDanAndrei_ResearchPaper_SD.pdf (accesat August 29, 2019).
Karpathy, Andrej. CS231. fără an. karpathy@cs.stanford.edu (accesat iunie 10, 2019).
Martin T. Hagan, Howard B. Demuth. Neural Network Design, 2nd Edtion. Oklahoma, 2014.
MathWorks. 2019. https://www.mathworks.com/help/deeplearning/examples/time -series –
forecasting -using -deep -learning.html (accesat August 20, 2019).
Mitchell, Tom M. Machine Learning. McGraw -Hill Science/Engineering/Math, 1997.
MUREȘAN, Drd. Ing. Bogdan. „STUDIU PRIVIND STADIUL ACTUAL ÎN UTILIZAREA
REȚELELOR NEURONALE PENTRU IDENTIFICAREA ȘI MODELAREA
SISTEMELOR.” T eză doctorat, Cluj -Napoca, Anul 2009.
Olah, Christopher. Understanding LSTM Networks. 27 August 2015.
http://colah.github.io/posts/2015 -08-Understanding -LSTMs/ (accesat August 29,
2019).
PITTS, WARREN S. MCCULLOCH AND WALTER. „A LOGICAL CALCULUS OF THE
IDEAS OF INMANENT IN NERVOUS ACTIVITY.” BULLETIN OF
MATHEMATICAL BIOPHYSICS VOLUME 5 , 1943: 115 -133.
The MathWorks, Inc. Long Short -Term Memory Networks. 2020.
https://www.mathworks.com/help /deeplearning/ug/long -short -term-memory –
networks.html (accesat 12 15, 2019).
Zakaria Alameer, Mohamed Abd Elaziz. „Forecasting gold price fluctuations using improved
multilayer perceptron neural network and whale optimization algorithm.” Elsevier ,
2019: 25 0-260.
39
Anexa
În această anexă sunt prezentate porțiuni din codul sursă care sunt responsabile de
funcționarea părții practice ale acestei lucrări. Acest cod este împărțit pe script -uri și fiecare
script are un rol specifi.
1. Importarea setului de date
filename = 'C:\Users\ianko\OneDrive – Universitatea Politehnica
Timisoara \Licenta\Model_final_2 \GBPUSD_H4.csv' ;
delimiter = ',';
formatSpec = '%*q%*q%*q %*q%*q%f%*s%[^ \n\r]';
fileID = fopen(filename, 'r');%fi?ierul este deschis numai pentru
citire
dataArray = textscan(fileID, formatSpec, 'Delimiter' , delimiter,
'TextType' , 'string' , 'EmptyValue' , NaN, 'ReturnOnError' , false);
fclose(fileID);
dataArray = cellfun(@(x) num2cell(x), dataArray, 'UniformOutput' ,
false);
GBPUSDH4 = [dataArray{1:end -1}];%salvarea datelor într -o variabilă
clearvars filename delimiter formatSpec fileID dataArray ans;
Prin prezentul script se face importarea datelor stocate în fișierul “GBPUSD_H4.csv” .
Se poate observa c ă imediat după ce se face importarea datelor, acestea sunt salvate într -o
variabilă . Acest script a fost salvat în fișierul imp_data.m .
filename = 'C:\Users\ianko\OneDrive – Universitatea
Politehnica
Timisoara \Licenta\Model_final_2 \GBPUSD_H4_actual.csv' ;
delimiter = ',';
formatSpec = '%*q%*q%*q%*q%*q%f%*s%[^ \n\r]';
fileID = fopen(filename, 'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter' ,
delimiter, 'TextType' , 'string' , 'EmptyValue' , NaN,
'ReturnOnError' , false);
fclose(fileID);
dataArray = cellfun(@(x) num2cell(x), dataArray,
'UniformOutput' , false);
data_actualizat = [dataArray{1:end -1}];
clearvars filename delimiter formatSpec fileID dataArray ans;
Acest script are același rol ca și precedentul, singura diferență fiind aceea că importarea de date
se face din fișierul “GBPUSD_H4_actual.csv”. Diferen ța dintre cele 2 fișiere de date este faptul
că, al doilea fișier de date conține 18 valori mai recente din punct de vedere cronologic, valori
care nu se află și în primul fișier. Acest script a fost salvat în fișierul imp_data_1.m .
40
2. Prelucrarea setului de date importat
clear, clc;
%pregătirea datelor de intrare
imp_data; %import preturi de închidere
imp_data_1; %import preturi de închidere actualizate, 18
timesteps diferen ță
data = GBPUSDH4(7000:end);
data = [data{:}];
data_actualizat = [data_actualizat{:}];
data_1=data; %salvare date nealterate
d_a = data_actual izat(end -7:end);
figure
plot(data)
title("Evoluția prețului")
În acest script se efectuează prelucrarea datelor salvate în cele 2 variabile: data și
data_actualizat , iar ulterior face un grafic cu secvența de valori salvată în prima variabilă
menționată. Acest script este salvat în fișierul nn_lstm.m.
3. Configurarea rețelei neuronale
%se alege lungimea secventei de predictie
num_steps_train = floor(.99*numel(data)); %preferabil sa fie
.99 sau cel mult .97
train = data(1:num_steps_train+1);
test = data(num_steps_train+1:end);
%standardizarea datelor
mu = mean(train);
sigma = std(train);
std_train_data = (train -mu)/sigma;
%prelucrarea std_train_data
XTrain=std_train_data(1:end -1);
YTrain=std_train_data(2:end);
%se initializeaza parametri retelei
num_features = 1;
num_hidden_units = 80; %initial 200>150>120>100>80
num_responses =1;
%se initializeaza straturile din componenta retelei
layers = [sequenceInputLayer(num_features),
lstmLayer(num_hidden_units),
41
fullyConnectedLa yer(num_responses),
regressionLayer];
%setarea optiunilor de antrenament
%nr max de epoci 150
% initial LR .005>.01
options = trainingOptions( …
'adam',…
'MaxEpochs' ,100,…
'GradientThreshold' ,1,…
'InitialLearnRate' ,.015,…
'LearnRateSchedule' ,'piecewise' ,…
'LearnRateDropPeriod' ,125,…
'LearnRateDropFactor' ,.2,…
'Verbose' ,0,…
'Plots','training -progress' );
În acest script se efectuează configurarea rețelei neuronale pentru etapa de antrenare și
este salvat în fișierul nn_lstm.m.
4. Antrenarea rețelei neuronale recurente
%antrenarea retelei
net = trainNetwork(XTrain,YTrain,layers,options)
std_test_data = (test -mu)/sigma;
XTest=std_test_data (1:end-1);
net=predictAndUpdateState(net,XTrain);
[net,YPred] = predictAndUpdateState(net,YTrain(end));
num_steps_test=numel(XTest);
for i=2:num_steps_test
[net,YPred(:,i)]=predictAndUpdateState(net,YPred(:,i -1));
end
YPred=YPred*sigma+mu;
YTest=test(2:end);
rmse=sqrt(mean((YPred -YTest).^2));
idx=num_steps_train:(num_steps_train+num_steps_test);
Acest script este salvat în fișierul nn_lstm.m .
5. Exprimarea grafică a rezultatelor
%figura 1: Predictia obtinuta
figure
plot(train (1:end-1))
hold on
plot(idx,[data(num_steps_train), YPred], '.-')
legend("Observat" ,"Prezis" )
42
%figura 2: Afisarea erorilor
figure
subplot(2,1,1)
plot(YTest)
hold on
plot(YPred(800:end), '.-')
hold off
legend("Observat" ,"Prezis" )
subplot(2,1,2)
stem(YPred -YTest)
ylabel("Eroare" )
title("RMSE="+rmse)
net=resetState(net);
net=predictAndUpdateState(net,XTrain);
YPred=[];
for i=1:num_steps_test
[net,YPred(:,i)]=predictAndUpdateState(net,XTest(:,i));
end
YPred = sigma*YPred+mu;
rmse = sqrt(mean( YPred-YTest).^2)
figure
subplot(2,1,1)
plot(YTest)
hold on
plot(YPred, '.-')
hold off
legend([ "Observat" ,"Prezis" ])
title("Predictia cu actualizare" )
subplot(2,1,2)
stem(YPred -YTest)%ilustrarea unei secven țe discrete de date
title("RMSE="+rmse)
pret_pre zis=YPred(1,8);
calc;
La finalul script -ului se poate observa apelarea funcției calc, aceasta are script -ul salvat
în fișierul “calc.m” și este redat în continuare.
diferenta = YPred(1,end) – d_a(end) %diferenta predic ție
realitate
diferenta_pret_h = YPred(1,end) – data(end) %se aplica la
strategia HOLD
diferenta_pret_s = data(end) – YPred(1,end) %se aplică daca
se face SELL
43
%se face o comparatie vizuala intre pretul przis si pretul
real
figure
plot(data(end -7:end),'.-')
hold on
plot(YPred, '-o')
legend("Pretul de închidere prezis" ,"Pretul de închidere
real")
%calcularea profitului obbtinut
valoare_pip = 8.9; %la tranzactii de 0,1 loturi
%calcularea profitului obbtinut
profit_pip_h = floor(diferenta_pret_h*10000)
profit_pip_s = fl oor(diferenta_pret_s*10000)
profit_eur_h = valoare_pip * profit_pip_h
profit_eur_s = valoare_pip * profit_pip_s
Această secvență de script are rolul de a calcula, în urma unei predictii și a validării
acesteia, potențialul câștig obținut.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Proiect de diplomă [617566] (ID: 617566)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
