Introduzione alla Programmazione e Applicazioni per la Finanza M2 (Prodotti Derivati) Lezione 13 Anno accademico 2006-07 Titolare corso: Prof. Costanza Torricelli Docente: Dott.ssa Marianna Brunetti
I pulsanti di comando personalizzati (CommandButton) I pulsanti di comando sono particolarmente utili se vogliamo collegare l esecuzione di macro ad uno specifico foglio di Excel Rispondono a diversi tipi di eventi: click del mouse o anche semplice spostamento del mouse sullo stesso Per collegare un pulsante di comando ad una routine di gestione degli eventi occorrono 3 fasi: 1. Creazione del CommandButton 2. Collegamento del CommandButton alla routine ( o macro) di gestione degli eventi 3. Esecuzione del CommandButton
Esempio: un CommandButton per il calcolo del VA Fase 1 Visualizza Barre degli Strumenti VBA Strumenti di Controllo 1. Casella di Controllo 2. Casella di Testo 3. Pulsante di Comando 4. Pulsante di Opzione 5. Casella di Riepilogo 6. Casella combinata 7. Interruttore 8. Pulsante di Comando e trascino per creare il Command Button => in entrambe le barre si attiva la Modalità Progettazione NB: Modalità Progettazione VS Modalità Esecuzione Pulsante destro Proprietà NOME: btnvaloreattuale CAPTION : Clicca qui per Calcolare il Valore Attuale ACCELLERATOR: A TAKEFOCUSONCLICK: False
Esempio: un CommandButton per il calcolo del VA Fase 2 Sempre in modalità progettazione, doppio click col sinistro Automaticamente si crea una Sub, ma osserviamo le differenze: Nome è NomeOggetto_NomeEvento (qui btnvaloreattuale_click) Public VS Private Riporto la subroutine per il calcolo del Valore Attuale Private Sub btnvaloreattuale_click() Dim FC As Double FC = InputBox("Immettere il valore del flusso di cassa futuro", "Calcolo Valore Attuale", 0) Dim Tasso As Double Tasso = InputBox("Immettere il tasso periodale", "Calcolo Valore Attuale") Dim Periodi As Integer Periodi = InputBox("Immettere il numero di periodi", "Calcolo Valore Attuale") MsgBox "Il Valore Attuale di " & FC & " al tasso periodale di " & Tasso & " per " & Periodi & _ " periodi é: " & Round(PV(Tasso, Periodi, -FC), 2), vbinformation, Calcolo Valore Attuale" End Sub
Esempio: un CommandButton per il calcolo del VA Fase 3 Esco dalla modalità progettazione Click sul pulsante di comando personalizzato Clicca qui per calcolare il Valore Attuale Si attiva la macro! Cfr. risultati Flusso di cassa Tasso di Numero di Valore interesse periodi Attuale 100 0.05 10 772.17 200 0.03 5 915.94 300 0.03 7 1,869.08 400 0.06 2 733.36 1000 0.11 1 900.90
Le Caselle Combinate (ComboBox) Menù a tendina che limitano i dati in input ad un insieme di valori predefiniti Esempio Visualizza Barre degli Strumenti VBA Strumenti di Controllo Casella Combinata trascino Pulsante destro Proprietà NOME: cmbnomecognome, cmbpercorso, cmbemail BORDER STYLE: BorderStyleSingle (valore 1) SPECIAL EFFECT: SpecialEffectSunken (valore 2) LIST FILL RANGE: I3:I22, J25:J27, K3:K22 STYLE: StyleDropDownList (valore 2) Formali Sostanziali Selezioniamo dai menù a tendina i valori corrispondenti per Nome, Percorso ed e-mail
Le UserForm Finestre di dialogo personalizzate incorporabili nell interfaccia di Excel Anche qui occorrono 3 fasi: 1. Creazione della UserForm 2. Stesura del codice per il funzionamento della UserForm 3. Collegamento della UserForm ad Excel Esempio Crea una finestra di dialogo per il calcolo del prezzo di call e put secondo il modello di B&S
La UserForm per B&S Fase 1 VBA Inserisci UserForm => 1. UserForm vuota 2. Casella Strumenti NOME: frmblackandscholes, CAPTION: Calcolo del prezzo B&S di un'opzione Aggiungiamo i vari ActiveXcontrols (bottoni, menu a tendina, caselle di testo etc ) Etichette Caselle di Testo Pulsanti di Comando Casella Combinata
La UserForm per B&S Fase 1 (ctd) Etichette: funzione puramente descrittiva modifico il testo o tramite CAPTION o digitandovi dentro il testo desiderato Caselle di Testo: permettono l inserimento di testo da parte dell utente importante modificarne il nome di default => NOME: qui txtsottostante, txtstrike, txttassointeresse, txtscadenza, txtvarianza, txtprezzo ComboBox: ci permetterà di scegliere tra Call e Put NOME: cmbtipoopzione Pulsanti: NOME: btnok, btnannulla, btnchiudi CAPTION: OK, Annulla, Chiudi NB: Formato Allinea, Rendi Uguale, Adatta, Centra nel Form, Spaziatura verticale o orizzontale, etc
Le UserForm Fase 2 Colleghiamo la Form ad una routine per il calcolo del prezzo secondo B&S Tasto DX Visualizza Codice => 2 menù a tendina Generale Contiene l elenco di tutti gli oggetti presenti nella finestra, compresa la Form stessa => possiamo selezionare da qui l oggetto al quale vogliamo collegare una routine Eventi Contiene l elenco dei possibili eventi a cui possiamo associare l oggetto selezionato Modificando l oggetto selezionato, tale elenco viene automaticamente aggiornato con tutti i possibili eventi ad esso associabili
La UserForm per B&S Fase 2 Scegliamo oggetto: UserForm ed evento: Initialize Private Sub UserForm_Initialize(). End Sub a questo punto occorre aggiungere le due scelte call e put al combobox cmbtipoopzione.additem "Call" cmbtipoopzione.additem "Put" End Sub e collegare l esecuzione della routine che calcola il prezzo B&S per le opzioni all evento click su OK => seleziono dal menù oggetti btnok e da quello eventi Click (default) Private Sub btnok_click() End Sub ora resta da scrivere il codice per il calcolo del prezzo delle opzioni secondo B&S
La UserForm per B&S Fase 2 (ctd) Dichiariamo le variabili che useremo con i relativi tipi Dim S, X, r, T, sigma, d1, d2, Nd1, Nd2, C, P As Double Dim TipoOpzione As Integer Indichiamo a VBA dove andare a recuperarsi i valori di ciascuna di esse S = Val(txtSottostante) X = Val(txtStrike) r = Val(txtTassoInteresse) T = Val(txtScadenza) sigma = Val(txtVarianza) Indichiamo dove individuare il tipo di opzione da prezzare TipoOpzione = cmbtipoopzione.listindex
La UserForm per B&S Fase 2 (ctd) Impostiamo i messaggi di errore da far comparire in caso di mancato inserimento dei valori If S = 0 Then MsgBox "Attenzione! Non hai inserito il valore del sottostante (S)",, "Attenzione!" ElseIf X = 0 Then MsgBox "Attenzione! Non hai inserito il valore dello strike (X)",, "Attenzione!" ElseIf r = 0 Then MsgBox "Attenzione! Non hai inserito il tasso di interesse (r)",, "Attenzione!" ElseIf T = 0 Then MsgBox "Attenzione! Non hai inserito la scadenza (T)",, "Attenzione!" ElseIf sigma = 0 Then MsgBox "Attenzione! Non hai inserito la varianza (sigma)",, "Attenzione!" Else: Inseriti tutti i valori, la routine procede con i soliti passaggi per il calcolo dei prezzi di call e put europee secondo B&S
La UserForm per B&S Fase 2 (ctd) d1 = (Log(S / X) + (r + 0.5 * (sigma) ^ 2) * T) / (sigma * Sqr(T)) d2 = d1 - Sqr(T) * sigma Nd1 = Application.WorksheetFunction.NormSDist(d1) Nd2 = Application.WorksheetFunction.NormSDist(d2) C = S * Nd1 - X * Exp(-r * T) * Nd2 P = C + X * Exp(-r * T) - S End If Specifichiamo quale valore vogliamo che VBA mostri nella casella testo Prezzo B&S (dipende dalla scelta fatta nel combobox!): Select Case TipoOpzione Case 0: txtprezzo = Round(C,3) Case 1: txtprezzo = Round(P, 3) End Select End Sub Arrotondando il risultato mostrato a sole 3 cifre decimali...
La UserForm per B&S Fase 2 (ctd) Quali eventi vogliamo collegare al clik sui restanti due Pulsanti? Annulla Private Sub btnannulla_click() MsgBox "Così non concludi nulla...!!!", vbcritical, "Attenzione! Pessima Scelta" End Sub Chiudi Private Sub btnchiudi_click() Me.Hide End Sub Non resta altro che collegare la UserForm ad Excel, ad esempio tramite un CommandButton: NOME: btncollegamentoaduserform CAPTION: Clicca qui per attivare la UserForm
La UserForm per B&S Fase 3 Clicca qui per attivare la UserForm Doppio click Private Sub btncollegamentoaduserform_click() frmblackandscholes.show End Sub Implementiamo in Excel: Se manca qualche dato, viene correttamente segnalato? OK, Annulla e Chiudi rispondono alle aspettative? Inserendo tutti i dati, i risultati corrispondono (cfr. valori riportati sul foglio di lavoro)? Come dovrei modificare la UserForm in modo da poter scegliere anche il modello di pricing (es. binomiale o B&S)? E per avere in output la volatilità implicita?