Problema creazione funzione matlab

h0ld3n
Salve,

sono nuovo del forum, avrei bisogno cortesemente di una mano per capire se è corretta una funzione che sto cercando d'utilizzare in Matlab. vi copio il codice per farvi capire:

function call = callBSMcfPROVA (S0,K,T,r,q,theta)
vP1 = 0.5 + 1/ pi * quad (@P1,0,200,[],[],S0,K,T,r,q,theta);
vP2 = 0.5 + 1/ pi * quad (@P2,0,200,[],[],S0,K,T,r,q,theta);
call = exp (-q * T ) * S0 * vP1 - exp (-r * T ) * K * vP2 ;
end

function p = P1(om,S0,K,T,r,q,theta)
p = real ( exp (-1i* log (K)*om) .* cfBSM (om -1i,S0,T ,r,q,theta) ./ ... 
(1i * om * S0 * exp ((r-q) * T )));
end

function p = P2(om,S0,K,T,r,q,theta)
p = real ( exp (-1i* log (K)*om) .* cfBSM (om ,S0,T ,r,q,theta) ./ ...
(1i * om));
end

function cf = cfBSM (om,S0,T,r,q,theta)
cf = exp (1i * om * log (S0) + 1i * T * (r - q) * om - 0.5 * T * ...
theta * (1i * om + om .^ 2));
end


questa funzione è salvata in un unico m-file di nome callBSMcfPROVA.m . Il mio dubbio è se, scritta in questo modo, riesco a far dipendere la funzione principale (quella iniziale) da quelle sotto. Mi spiego meglio: quello che vorrei è che si calcolasse l'ultima scritta, e che il suo risultato rientri nella penultima e nella terzultima così da calcolare i valori di P1 e P2, i quali infine devono rientrare nella principale. Scritta in questo modo, è quello che veramente accade? Perché la funzione così scritta mi tira fuori dei valori che mi sembrano molto dubbi.

Grazie in anticipo per l'attenzione, se riuscite a risolvermi questo dubbio mi fareste un gran favore!

Buona serata

Risposte
walter891
a prima vista direi che c'è qualche problema... nella prima funzione non c'è nessuna chiamata ad altre funzioni

h0ld3n
Innanzitutto grazie per la risposta.
Secondo te come potrei fare a risolvere il mio problema? Perché comunque facendola girare, e andando poi a modificare manualmente i valori inseriti nelle funzioni sottostanti, i risultati finali variano: se ciò accade, vuol dire che la funzione nel complesso considera tutte le funzioni sottostanti..no?

walter891
non capisco bene qual è lo scopo del tuo programma... vorresti che la prima funzione esegua in automatico le altre per utilizzare i rispettivi output? Se si tratta di questo sei un po' fuori strada, se invece ti interessa solamente eseguirle in sequenza puoi benissimo scrivere tutto in una funzione sola

h0ld3n
L'intento è il primo che hai detto. Premetto che questa funzione l'ho trovata su diversi papers, ed in tutti più o meno è scritta in questo modo. Secondo te cosa c'è che non va? cioé, come dovrei metterla giù in modo tale che la funzione principale utilizzi le sottostanti?

h0ld3n
Aggiungo anche un'altra cosa che mi lascia un po' perplesso. Per vedere se il programma fosse corretto, ho provato a modificare alcuni parametri delle funzioni sottostanti..per farti capire meglio ti faccio un banale esempio: se prendo l'ultima delle sottofunzioni scritte ( function cf = cfBSM (om,S0,T,r,q,theta) ), e vado a sostituire l'argomento del logaritmo (per esempio, al posto di S0 metto un altro valore a caso, S0*100), nel momento in cui dopo faccio partire l'intera funzione, il risultato che mi da è diverso da quello precedente: in parole povere, il risultato della funzione principale è "sensibile" a questo cambiamento. Questo mi fa pensare che comunque sia, scritta in questo modo, le funzioni sottostanti vengano considerate per ottenere il risultato finale. Mi sbaglio?

Ti ringrazio ancora per l'attenzione!

walter891
Ovviamente cambiando il valore di "S0" cambierà il valore di "cf" calcolato, il punto è che poi questa variabile "cf" non viene mai utilizzata quindi a che scopo la calcoli? Nella prima funzione il valore di "call" viene calcolato direttamente attraverso il valore di "S0" e non attraverso i calcoli dell'ultima funzione.
Detto in un altro modo queste funzioni hanno alcuni input in comune ma i loro output a me sembrano del tutto sconnessi...

h0ld3n
No il valore S0 non l'ho cambiato per tutte le funzioni, ma solo per cf. Per esser più chiaro:
function cf = cfBSM (om,S0,T,r,q,theta)
cf = exp (1i * om * log (S0*100) + 1i * T * (r - q) * om - 0.5 * T * ...
theta * (1i * om + om .^ 2));


In questo modo, anche il valore finale "call" mi risultava diverso. Da questo quindi presumo che ci sia una sorta di interdipendenza fra le funzioni, no?
A prescindere da questo caso, come posso fare per far si che una funzione rientri in un'altra? C'è una regola "base" per creare una funzione che al suo interno incorpori più funzioni? Ripeto che maneggio matlab da un mesetto, e sto imparando facendo quello che mi serve nello specifico, quindi ho ancora parecchie cose da imparare.

walter891
richiamare una o più funzioni all'interno di un'altra significa fare questo:
function risultato=funz_esterna(var1,var2,...)
...
v1= %calcolo valore1
v2= %calcolo valore2
a=funz_interna(v1,v2,..);
...

dove evidentemente vengono calcolati i valori da assegnare alle funzioni interne prima di poterle utilizzare, le funzioni interne invece vengono implementate nel solito modo in file separati
function a=funz_interna(v1,v2,...)
...


mentre nel workspace (o in un M-file) devi assegnare un valore alle variabili della funzione esterna e poi è sufficiente scrivere
risultato=funz_esterna(var1,var2,..)


Sinceramente però non capisco se mi stai chidendo questo o se i tuoi dubbi sono altri, da che contesto esce questo programma?

h0ld3n
Si in linea generale è quello. Tutto questo mi serve per la tesi: in pratica devo studiarmi e implementare attraverso matlab alcuni modelli per calcolare il prezzo delle opzioni. Il programma scritto sopra è la Black Scholes in termini di funzione caratteristica. In parole povere P1 e P2 rappresentano delle probabilità da inserire all'interno della funzione principale che mi restituisce il prezzo (call). Per queste due probabilità però, dato che non è nota la loro funzione di densità, devo ricorrere alla funzione caratteristica: ossia quella chiamata csBSM. I codici scritti non sono altro che le formule ricavate dai papers in cui viene presentato questo modello.

Non mi hai ancora risposto ad una domanda però: se mi dici che alla fine, scritta così, non dovrebbe considerare le sottofunzioni, quando vado a cambiare i parametri in cfBSM, com'è possibile che il valore "call" si modifichi?

Se ne hai voglia, e te ne sarei davvero grato, prova tu stesso, ti scrivo qui già dei valori in modo da impiegarci davvero 30 secondi:
S0=50;
K=47.5;
r=0.05;
T=0.5;
q=0;
v0=0.2;


Se dopo provi a fare qualche modifica in cfBSM (che ne so, metti, a posto di log(S0), log(S0+5) ) vedrai che ti cambiano i valori.

Grazie ancora, davvero

walter891
ok effettivamente i valori cambiano ma forse non in maniera corretta...
da quello che vedo le funzioni P1 e P2 dovrebbero andar bene, però non capisco come poi usi queste all'nterno di call, prova a controllare ciò che c'è all'interno di quad()

h0ld3n
Guarda tocchi il tasto dolente :) per la valutazione dell'integrale non ho idea di come si faccia, ho preso per buono quello che ho trovato, tenendo conto che comunque in due diversi papers riportano la medesima formula per quel calcolo..sicuramente dovrò sbatterci la testa un po' su per cercare di capire come effettivamente si utilizzi la funzione quad, ma per adesso mi sto concentrando sullo studio teorico dei modelli, e dato che devo laureami a novembre, di tempo dovrei averne. Leggevo sul web che fra le altre cose la funzione quad è stata sostituita da INTEGRAL, e molti suggeriscono di utilizzare quest'ultima..ma cambia il metodo di immissione dei parametri, quindi dovrò vedere bene come fare.

Comunque la formula black scholes prevede una formula chiusa di facile applicazione (c'è anche all'interno del toolbox di matlab, si chiama blsprice), e i valori che mi tira fuori sono molto diversi da quella che hai provato ad utilizzare anche tu: questo sicuramente mi deve mettere allerta sulla correttezza di quest'ultima.

Provando però a calcolare il prezzo con altri modelli diversi dalla black scholes, utilizzando anche per questi la loro formula in versione "funzione caratteristica" (quindi molto simile a quella di cui stiamo discutendo), i valori che mi escono sono simili a quelli della Black Scholes "funzione caratteristica": quindi non so di quale fidarmi, da un lato ho tutte le formule "funzione caratteristica" che mi danno un prezzo simile, dall'altro ho l'unica formula chiusa, disponibile solo per Black e Scholes, che mi da un valore molto diverso.

L'unica soluzione che mi viene in mente è provare a costruire una formula con metodo Monte Carlo, e vedere il prezzo che esce a quale si avvicina di più fra quelli sopra.

è un casino assurdo, lo so :)

walter891
se sei alle prime armi con matlab io ti consiglio di prendere dimestichezza con dei calcoli semplici prima di scriverci una tesi... prova ad usare solamente la funzione quad e capire come lavora in base ai vari parametri, puoi anche consultare l'help relativo alla funzione ;)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.