import numpy as np def probability(r, tau, u, d): """ Επιστρέφει την πιθανότητα p που χρησιμοποιούμε στο binomial pricing. Εδώ r είναι το ετήσιο επιτόκιο, tau είναι το χρονικό διάστημα από τη μια στιγμή στην επόμενη (σε έτη), u>1 είναι ο παράγοντας αύξησης της μετοχής, όταν αυτή αυξάνει, και d<1 είναι ο παράγοντας μείωσης όταν αυτή μειώνεται. Αναζητήστε τον τύπο από τις σημειώσεις. """ return (np.exp(r*tau)-d)/(u-d) def mean(p, a, b): """ Επιστρέφει τη μέση τιμή μιας ΤΜ παίρνει την τιμή a με πιθανότητα p και την τιμή b με πιθανότητα 1-p """ return p*a+(1-p)*b def gain(S, K): """ Επιστρέφει την αξία του συμβολαίου στη χρονική στιγμή που αυτό ασκείται από τον κάτοχό του. Στη συγκεκριμένη συνάρτηση το συμβόλαιο είναι αυτό που ονομάζεται call option, το δικαίωμα δηλ. να αγοράσει κανείς τη μετοχή στην τιμή K. Στην περίπτωση αυτή η αξία του συμβολαίου είναι S-K αν S>K και 0 αλλιώς. Μην αλλάξετε αυτή τη συνάρτηση. """ if S>K: return S-K return 0 def option_value(S0, K, u, d, r, tau, k): """ Επιστρέφει τη αξία του συμβολαίου τη χρονική στιγμή 0. Το συμβόλαιο αυτό ασκείται τη χρονική στιγμή k>1 κατά την οποία στιγμή η αξία του δίνεται από την παραπάνω ορισμένη συνάρτηση gain, όπου S είναι η αξία της μετοχής τη χρονική αυτή στιγμή. """ value = (k+1)*[0] # εδώ αποθηκεύονται οι αξίες σε μια χρονική στιγμή, # αρχίζοντας από τη χρονική στιγμή k και πηγαίνοντας προς τα πίσω new = (k+1)*[0] # ενδιάμεσες προσωρινές τιμές p = probability(r, tau, u, d) for j in range(k+1): value[j] = gain(u**j * d**(k-j) * S0, K) # υπολογίσαμε τις αρχικές τιμές (δηλ. για χρόνο k) print(value) for kk in range(k-1, -1, -1): # kk παίρνει τιμές από k-1 έως και το 0 for j in range(kk+1): # εδώ φτιάχνουμε τις τιμές στο χρόνο kk από τον επόμενο χρόνο new[j] = np.exp(-r*tau)*mean(p, value[j+1], value[j]) for j in range(kk+1): value[j] = new[j] # ενημέρωση των αξιών από χρόνο kk+1 σε χρόνο kk return value[0] r = 0.1 # 10% ετήσιο επιτόκιο tau = 1/365 # διάστημα μιας ημέρας ανάμεσα σε δύο διαδοχικές χρονικές στιγμές S0 = 100 # 100 ευρώ η τιμή της μετοχής αρχικά u = 1.03 # κάθε μέρα έχουμε αύξηση κατά 1% d = 0.96 # ή μείωση κατά 2% k = 30 # άσκηση δικαιώματος συμβολαίου μετά από k μέρες K = 90 # δικαίωμα αγοράς μιας μετοχής για K ευρώ με την άσκηση του συμβολαίου V = option_value(S0, K, u, d, r, tau, k) print(f"Αξία του συμβολαίου σε χρόνο 0: {V}")