-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproject1_macd.py
More file actions
142 lines (104 loc) · 4.18 KB
/
project1_macd.py
File metadata and controls
142 lines (104 loc) · 4.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# Projekt nr 1 z Metod Numerycznych - MACD
# Dane historyczne: Asseco Business Solutions SA (ABS)
# Zakres danych 01.01.2017 - 24.01.2021 (1000 dni)
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# Mechanizm kupna i sprzedazy akcji
budzetStart = 1000
budzet = 1000
akcje = 0
def kup(cena):
global budzet
global akcje
budzet = budzet - cena
akcje += 1
def sprzedaj(cena):
global budzet
global akcje
budzet += cena
akcje -= 1
# Funkcja obliczajaca SIGNAL
def mySIGNAL(wynikiMACD, nrDanych):
return myEMA(9, wynikiMACD, nrDanych)
# Funkcja obliczajaca EMA
def myEMA(okres, otwarcie, nrDanych):
alfa = 2/(okres+1)
podstawa = 1 - alfa
mian = 0
licz = 0
for i in range(0,okres,1):
cena_otwarcia = otwarcie[i]
if nrDanych - i >= 0:
x = pow(podstawa, i)
mian += 1.0*x
x *= otwarcie[nrDanych - i]
licz += x
return licz / mian
# Funkcja wywolujaca obliczanie EMA dla podanych okresow
def myMACD(dane, nrDanych, lewyOkres, prawyOkres):
emaLeft = myEMA(lewyOkres, dane, nrDanych)
emaRight = myEMA(prawyOkres, dane, nrDanych)
return emaLeft - emaRight
# Funkcja tworzaca wykres
def myPlot(trueX, falseX, y1, y2, y3):
probka = list(range(1,len(y1)+1))
fig,ax = plt.subplots(figsize=(8,5.5), dpi=1000)
ax.set(xlabel='Numer próbki', ylabel='Cena otwarcia', title='Wykres wskaźnika MACD oraz SIGNAL')
#ax.plot(probka, y1, color='red', linewidth=0.8, label='Cena otwarcia') # wykres ceny otwarcia od daty
ax.plot(probka, y2, color='darkorange', linewidth=0.4, label='MACD') # wykres MACD od daty
ax.plot(probka, y3, color='blue', linewidth=0.4, label='SIGNAL') # wykres SIGNAL od daty
plt.axvline(trueX[0], color='green', linewidth=0.08, label='Kupno')
plt.axvline(falseX[0], color='red', linewidth=0.08, label='Sprzedaż')
for xc in trueX:
plt.axvline(xc, color='green', linewidth=0.08)
for xc in falseX:
plt.axvline(xc, color='red', linewidth=0.08)
ax.legend()
plt.xticks(rotation = 90)
plt.subplots_adjust(bottom=0.2)
plt.savefig('macd.png')
#plt.show()
#-----------------------#
# Glowna czesc programu #
#-----------------------#
# Wczytanie danych z pliku .csv do programu
dane = np.genfromtxt("abs_d.csv", delimiter=",", skip_header=1, dtype=str, encoding='utf8')
data = dane[:,0]
otwarcie = dane[:,1].astype(float)
najwyzszy = dane[:,2].astype(float)
najnizszy = dane[:,3].astype(float)
zamkniecie = dane[:,4].astype(float)
wolumen = dane[:,5].astype(float)
wynikiMACD = []
wynikiSIGNAL = []
# Policzenie MACD oraz SIGNAL dla wybranego zestawu danych
for i in range(0,len(dane),1):
wynikiMACD.append(myMACD(otwarcie, i, 12, 16)) # dla ema12 - ema16
for i in range(0,len(dane),1):
wynikiSIGNAL.append(mySIGNAL(wynikiMACD, i))
# Symulacja automatycznego kupna/sprzedazy akcji na podstawie zmian trendu
iloscDni = 14
dzienSprzedania = []
dzienKupienia = []
for dzien in range(iloscDni,len(dane)):
iloscDniMACD = wynikiMACD[dzien - iloscDni:dzien]
iloscDniSIGNAL = wynikiSIGNAL[dzien - iloscDni:dzien]
sredniaMACD = np.average(iloscDniMACD)
sredniaSIGNAL = np.average(iloscDniSIGNAL)
if wynikiMACD[dzien] - sredniaMACD < wynikiMACD[dzien] and wynikiMACD[dzien] > wynikiSIGNAL[dzien]:
if akcje > 2:
sprzedaj(otwarcie[dzien])
sprzedaj(otwarcie[dzien])
dzienSprzedania.append(dzien)
elif wynikiMACD[dzien] - sredniaMACD < wynikiMACD[dzien] and wynikiMACD[dzien] < wynikiSIGNAL[dzien]:
if budzet >= otwarcie[dzien]:
kup(otwarcie[dzien])
dzienKupienia.append(dzien);
for ak in range(akcje):
sprzedaj(otwarcie[len(dane)-1])
myPlot(dzienKupienia, dzienSprzedania, otwarcie, wynikiMACD, wynikiSIGNAL)
print("Poczatkowy budzet: ", budzetStart)
print("Ilosc sprzedanych akcji: ", len(dzienSprzedania))
print("Ilosc kupionych akcji: ", len(dzienKupienia))
print("Budzet koncowy: ", budzet, " -> Zysk: ", budzet - budzetStart)