Topic: calcolo del prezzo di un'opzione con simulazione di monte carlo  (Letto 443 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline SaraLeo94

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Ciao ragazzi!
Ho una serie di problemi nel sviluppare questo lavoro.
ho calcolato il prezzo di una european call option usandola simulazione di montecarlo. Questo è il mio codice e funziona piuttosto bene:

 from time import time
from math import exp, sqrt, log
from random import gauss, seed
import matplotlib.pyplot as plt

 
seed (20000)
t0 = time()
 
S0 = 100
Kc = 110
Kp = 90
T = 1.0
r = 0.05
sigma = 0.2
M = 252
dt = T/M
I = 1000

S = []
for i in range(I):
    path =[]
    for t in range (M+1):
      if t == 0:
         path.append(S0)
      else:
         Z = gauss(0.0, 1.0)
         St = path[t - 1] *exp((r - 0.5*sigma**2)*dt + sigma*sqrt(dt)*Z)
         path.append(St)
    S.append(path)

C0 = exp(-r*T) * sum([max(path[-1]-Kc, 0) for path in S]) / I

print(C0)

plt.plot(path)
plt.grid(True)
plt.xlabel('time step')
plt.ylabel ('index level')
plt.show()

ora però ho dei problemi a fare un grafico di tutti i miei path del valore S.

Altra cosa: fino ad ora ho calcolato un solo valore di C, ma ora dovrei calcolare diversi valori di C per I che va da 1 a 10000 e poi plottare i miei valori di C. per cui ottenere un grafico con i miei valori di I sull'asse x e i miei valori di C sull'asse delle y.

Qualcuno che può aiutarmi???
Grazie mille!!

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re:calcolo del prezzo di un'opzione con simulazione di monte carlo
« Risposta #1 il: Dicembre 18, 2017, 19:07 »
Allora, innanzitutto quando posti il codice sul forum usa il pulsante con l'icona di Python per fare in modo che la sintassi venga evidenziata in modo appropriato.

Il tuo codice è abbastanza buono ma è molto lento. La prima cosa che devi fare è imparare a usare NumPy. Nello specifico, ci sono molte operazioni che puoi vettorizzare per evitare di usare for loop in Python. L'obiettivo è sfruttare il più possibile NumPy, che è scritto in C e Fortran.

Una volta che usi NumPy, quello che vuoi fare è molto facile. Per esempio, se trasformi la lista delle tracce S in un array NumPy puoi scrivere
[codice]
plt.plot(S[:11].T)
[/codice]

per plottare le prime 11 tracce nello stesso grafico (.T restituisce l'array trasposto). Per il secondo punto, potresti anche calcolare il prezzo dell'opzione per ogni I da 1 a 10'000, ma non è una grande idea. Primo perché ci vuole una vita, e poi non ha tanto senso se vuoi visualizzare la convergenza. Solitamente si usa una scala logaritmica (np.logspace in NumPy). Tra l'altro 10'000 iterazioni per una simulazione Monte Carlo è un numero abbastanza basso.

Ho riscritto il codice usando NumPy e vettorizzando ove possibile, e la mia versione è 10 volte più veloce della tua. Il codice risultante è il seguente:
[codice]
import numpy as np

def mc_option_price(S0, T, M, I, r, sigma):
    dt = T / M
    S = np.empty((I, M + 1))
    Z = np.random.normal(size=S.shape)
    S[:,0] = S0
    F = np.exp((r - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*Z)
    for t in range(1, M + 1):
        S[:,t] = S[:,t - 1] * F[:,t]
    return S

def payoff(type_, price, strike, I, T, r):
    if type_ == 'call':
        target = price - strike
    elif type_ == 'put':
        target = strike - price
    else:
        raise ValueError(f'unknown option type: {type_}')
    return np.exp(-r*T) * np.maximum(target, 0).sum() / I
[/codice]

Magari esiste un modo per eliminare il for loop rimasto. Io non ci ho pensato più di tanto e in ogni caso non sono un esperto di NumPy. Quello che conta è che sia sparito il loop che dipende da I. Inoltre, come vedi con NumPy puoi generare numeri casuali secondo specifiche distribuzioni, in modo indipendente, e averli in un array con la forma che vuoi tu.

Ho creato un Notebook Jupyter con il codice e dei plot di esempio che puoi vedere qui:
https://gist.github.com/rubik/73c4e21e34f3205d13f15afa29728f52


« Ultima modifica: Dicembre 18, 2017, 19:14 da Python »

Offline SaraLeo94

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re:calcolo del prezzo di un'opzione con simulazione di monte carlo
« Risposta #2 il: Dicembre 19, 2017, 11:44 »
Ciao! Grazie mille intanto! Io però ho un problema in questa parte del codice

raise ValueError(f 'unknown option type: {type_}')

perchè mi segna la seconda  '  come un sintax error

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re:calcolo del prezzo di un'opzione con simulazione di monte carlo
« Risposta #3 il: Dicembre 20, 2017, 09:00 »
È una feature di Python 3.6. Se usi Python 2.7 o superiore puoi sostituirlo con
[codice]
raise ValueError('unknown option type: {}'.format(type_))
[/codice]

Offline SaraLeo94

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re:calcolo del prezzo di un'opzione con simulazione di monte carlo
« Risposta #4 il: Dicembre 22, 2017, 17:20 »
[<matplotlib.lines.Line2D at 0x7f12f40e9cf8>,
 <matplotlib.lines.Line2D at 0x7f12f40e9ef0>,
 <matplotlib.lines.Line2D at 0x7f12f40fc080>,
 <matplotlib.lines.Line2D at 0x7f12f40fc1d0>,
 <matplotlib.lines.Line2D at 0x7f12f40fc320>,
 <matplotlib.lines.Line2D at 0x7f12f40fc470>,
 <matplotlib.lines.Line2D at 0x7f12f40fc5c0>,
 <matplotlib.lines.Line2D at 0x7f12ff285b38>,
 <matplotlib.lines.Line2D at 0x7f12f40fc828>,
 <matplotlib.lines.Line2D at 0x7f12f40fc978>,
 <matplotlib.lines.Line2D at 0x7f12f40fcac8>]

anche qui mi da <> e at e poi la parte dopo at come sintax error. mi sa appunto perchè ho la vesrione 2.7. tu sai se ci sono altre parti nello script che  i hai mandato che hanno versione 3.6? scusa ma mi da un errore alla volta

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:calcolo del prezzo di un'opzione con simulazione di monte carlo
« Risposta #5 il: Dicembre 23, 2017, 12:17 »
Senti, ti ha dato un esempio scritto per Python 3. Non prendere a martellate il suo codice per farlo girare con la versione "sbagliata" di Python (fra due anni cessa il supporto... sei sicura di volerti imbarcare con tecnologia morta?) O lo riscrivi per Python 2 (magari avendo la minima idea di quale siano le differenze, giusto per non lavorare a casaccio), oppure passi a Python 3.

A me sembra chiaro che stai procedendo a tentoni. Ma cosi' non vai da nessuna parte. Devi conoscere un minimo di Python e un minimo di come si programma per fare una roba  del genere in tempo breve.

Offline SaraLeo94

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re:calcolo del prezzo di un'opzione con simulazione di monte carlo
« Risposta #6 il: Dicembre 23, 2017, 16:17 »
Io sto chiedendo un aiuto appunto perchè abbiamo un compito, il nostro professore sa che non abbiamo mai fatto nulla di programmazione, ma non gli interessa. stiamo chiedendo aiuto a varie community appunto perchè nessuno di noi ha MAI fatto programmazione ma il professore pretende qualcosa. Chiedo scusa per il disturbo, speravamo in un po' di comprensione, visto che siamo stati tutti studenti.

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:calcolo del prezzo di un'opzione con simulazione di monte carlo
« Risposta #7 il: Dicembre 23, 2017, 19:27 »
Io sto chiedendo un aiuto appunto perchè abbiamo un compito, il nostro professore sa che non abbiamo mai fatto nulla di programmazione, ma non gli interessa. stiamo chiedendo aiuto a varie community appunto perchè nessuno di noi ha MAI fatto programmazione ma il professore pretende qualcosa. Chiedo scusa per il disturbo, speravamo in un po' di comprensione, visto che siamo stati tutti studenti.

Ma tu hai tutta la comprensione del mondo, ma se il tuo professore ti dice di fare la maratona, io ti dico che *devi* allenarti, perche' se no semplicemente non ce la fai.
Non c'e' colpa, non c'e' non comprensione. Non ho un siero magico per farti correre: ti posso dirti come allenarti. E' l'unica cosa che posso fare. E no, non ascoltare consigli miei su come correre... pero' su come affrontare un problema di programmazione due consigli li so dare. ;)

Nel caso specifico, quando hai un problema, puoi prenderlo a capocciate finche' lo hai grosso modo risolto (almeno per problemi semplici). Oppure fare un passo indietro studiare le basi e uscirne agevolmente. La cosa che probabilmente non ti e' chiara e' che la seconda via (quella che ti suggerisco) e' piu' *rapida* (oltre che meno faticosa e piu' fruttuosa in termini di risultati).

Se poi sei cosi' permalosa da prendertela per il mio post, non ti sara' troppo facile ottenere aiuto online. Mi sono riletto, e non c'e' davvero nulla di strano.

Devi usare Python 2? Ok, fair enough. Per quello che ne sappiamo noi potresti essere qualcuno che deve fare sta cosa per lavoro o per hobby e quindi ti interesserebbe che quello che scrivi non nascesse morto. Non ti interessa perche' e' un compito che una volta fatto puo' essere dimenticato? Bene. Non c'era modo di saperlo e *comunque* e' informazione preziosa.  Allora cerca di capire in cosa Python 3 differisce da Python 2 e metti a posto il codice di Python. Scusa, se ti avessimo scritto dello pseudo-codice? Sarebbe stato un modo completamente valido di aiutarti. E tu avresti dovuto comunque tradurlo in codice eseguibile.

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re:calcolo del prezzo di un'opzione con simulazione di monte carlo
« Risposta #8 il: Dicembre 24, 2017, 01:41 »
anche qui mi da <> e at e poi la parte dopo at come sintax error. mi sa appunto perchè ho la vesrione 2.7. tu sai se ci sono altre parti nello script che  i hai mandato che hanno versione 3.6? scusa ma mi da un errore alla volta

No, non ci siamo proprio. Quello è l'output del codice, non il codice. Il codice che ho scritto, a parte la modifica che ti ho già detto, funziona anche su Python 2.7. Ti ho messo il codice in un notebook Jupyter perché così potevi vedere il codice insieme all'output corrispondente, e quindi anche i plot.

In ogni caso sono d'accordo con riko. Andando a caso perdi solo tempo, perché non cerchi di capire come funzionano le cose, anche a grandi linee, e poi le metti in pratica?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.869
  • Punti reputazione: 9
    • Mostra profilo
Re:calcolo del prezzo di un'opzione con simulazione di monte carlo
« Risposta #9 il: Dicembre 24, 2017, 11:18 »
Il problema, a dirla tutta, è che molto probabilmente l'OP *non* sa che cosa è uno jupyter notebook, e non ha idea di come funziona questo ambiente di programmazione.
Forse dovresti finire di preparare la pappa pronta...

Per l'OP: a parte che non ci credo a questa storia del professore così come l'hai messa. E' un piagnisteo che facevamo anche noi da ragazzi.
Ma anche se fosse, che problema c'è? Se non sapete programmare e il vostro prof vi chiede di programmare in un compito, voi lasciate perdere quella parte del compito, tutti insieme. E magari scrivete una bella lettera aperta al capo del professore spiegando le cose, e pubblicatela sul giornale locale. Sai, qui i casi sono due (e non voglio sapere, beninteso): se potete scrivere questa lettera con la coscienza a posto, allora il professore va licenziato. Se non potete scriverla perché il professore vi sbugiarderebbe, allora forse dovevate studiare qualcosa che non avete studiato.