Calcoli scientifici con Julia/Investire in opzioni
Un’opzione è un contratto finanziario che dà il diritto (non l'obbligo) a comprare azioni (Call) o venderle (Put) al prezzo di esercizio (strike) alla scadenza. Ad esempio se lo strike dell'opzione call corrispondente è 100€ , se il prezzo dell'opzione è 5€ si pagano subito 5€. Se alla scadenza l'azione vale 120€, si comprano le azioni a 100€ e si rivendono a 120€ per cui il profitto è 120-100-5 = 15€ . Se invece alla scadenza l'azione vale 90 perdo solo il prezzo dell'opzione e non esercito. Se lo strike dell'opzione put corrispondente è 100€ , se il prezzo dell'opzione è 5€ si pagano subito 5€. Se alla scadenza l'azione vale 80€, si rivendono le azioni allo strike 100€ per cui il profitto è 100-80-5 = 15€ . Se invece alla scadenza l'azione vale 120 perdo solo il prezzo dell'opzione e non esercito.
Implementazione in Julia
[modifica | modifica sorgente]Opzioni CALL
[modifica | modifica sorgente]Installo le librerie:
using Pkg
Pkg.add(["YFinance","DataFrames","CSV"])
Scarico le opzioni call di Google:
using DataFrames, YFinance, CSV
df = get_Options("GOOG")["calls"] |> DataFrame
A volte nello scaricamento dei dati ottengo l'errore : "Too many requests" e quindi se si riesce a scaricarli conviene salvarli in un file CSV:
CSV.write("calls_goog.csv", df)
Carico i dati :
using DataFrames, YFinance, CSV
df = CSV.read("calls_goog.csv", DataFrame)
Seleziono le colonne che mi interessano:
df1 = select(df,:contractSymbol,:strike,:lastPrice,:volume,:expiration,:impliedVolatility,:inTheMoney)
Alle 13,00 del 31 marzo 2026 le azioni Google sono quotate S = 273,14 . Le prime 13 opzioni sono "in the money" perché lo strike è inferiore al valore dell'azione . Alla scadenza del 2 aprile 2026 delle calls visualizzabile nella colonna expiration, se S = 280, otterrei un profitto pari a max(S - strike,0) - lastPrice , facendo valere il diritto di comprare l'azione allo strike e rivendendola subito dopo:
S = 280
df1.profitto_S_280 = max.(S.-df1.strike,0).-df1.lastPrice
Se invece alla scadenza del 2 aprile 2026 delle calls, S = 160, otterrei una perdita su tutte le calls pari a -lastPrice :
S = 160
df1.perdita_S_160 = max.(S.-df1.strike,0).-df1.lastPrice
Se alla scadenza del 2 aprile 2026 delle calls, S = 240, alcune calls con strike basso potrebbero essere in profitto, ma la maggior parte sarà in perdita:
S = 240
df1.perdita_S_240 =max.(S.-df1.strike,0).-df1.lastPrice
df1
| contractSymbol | strike | lastPrice | volume | expiration | impliedVolatility | inTheMoney | profitto_S_280 | perdita_S_160 | perdita_S_240 |
|---|---|---|---|---|---|---|---|---|---|
| GOOG260402C00170000 | 170.0 | 105.08 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 4.920000000000002 | -105.08 | -35.08 |
| GOOG260402C00180000 | 180.0 | 119.64 | 9 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | -19.64 | -119.64 | -59.64 |
| GOOG260402C00200000 | 200.0 | 76.77 | 5 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 3.230000000000004 | -76.77 | -36.769999999999996 |
| GOOG260402C00205000 | 205.0 | 71.63 | 5 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 3.3700000000000045 | -71.63 | -36.629999999999995 |
| GOOG260402C00210000 | 210.0 | 64.51 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 5.489999999999995 | -64.51 | -34.510000000000005 |
| GOOG260402C00225000 | 225.0 | 48.89 | 50 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 6.109999999999999 | -48.89 | -33.89 |
| GOOG260402C00230000 | 230.0 | 44.3 | 2 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 5.700000000000003 | -44.3 | -34.3 |
| GOOG260402C00235000 | 235.0 | 71.32 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | -26.319999999999993 | -71.32 | -66.32 | |
| GOOG260402C00240000 | 240.0 | 32.73 | 138 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 7.270000000000003 | -32.73 | -32.73 |
| GOOG260402C00245000 | 245.0 | 28.0 | 2 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 7.0 | -28.0 | -28.0 |
| GOOG260402C00250000 | 250.0 | 23.61 | 27 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 6.390000000000001 | -23.61 | -23.61 |
| GOOG260402C00255000 | 255.0 | 19.69 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 5.309999999999999 | -19.69 | -19.69 |
| GOOG260402C00260000 | 260.0 | 13.14 | 90 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 6.859999999999999 | -13.14 | -13.14 |
| --------------------- | |||||||||
| GOOG260402C00385000 | 385.0 | 0.1 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402C00390000 | 390.0 | 0.01 | 2 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.01 | -0.01 | -0.01 |
| GOOG260402C00395000 | 395.0 | 0.1 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402C00400000 | 400.0 | 0.01 | 10 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.01 | -0.01 | -0.01 |
| GOOG260402C00405000 | 405.0 | 0.01 | 2 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.01 | -0.01 | -0.01 |
| GOOG260402C00410000 | 410.0 | 0.1 | 3 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402C00415000 | 415.0 | 0.05 | 4 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.05 | -0.05 | -0.05 |
| GOOG260402C00420000 | 420.0 | 0.1 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402C00425000 | 425.0 | 0.1 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402C00430000 | 430.0 | 0.1 | 4 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402C00435000 | 435.0 | 0.05 | 2 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.05 | -0.05 | -0.05 |
| GOOG260402C00440000 | 440.0 | 0.1 | 4 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402C00445000 | 445.0 | 0.1 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402C00450000 | 450.0 | 0.06 | 10 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.06 | -0.06 | -0.06 |
Opzioni PUT
[modifica | modifica sorgente]df_puts = get_Options("GOOG")["puts"] |> DataFrame
CSV.write("puts_goog.csv", df_puts)
using DataFrames, YFinance, CSV
df = CSV.read("puts_goog.csv", DataFrame)
df2 = select(df,:contractSymbol,:strike,:lastPrice,:volume,:expiration,:impliedVolatility,:inTheMoney)
Alle 13,00 del 31 marzo 2026 le azioni Google sono quotate S = 273,14 . Le ultime opzioni puts sono "in the money" perché lo strike è maggiore del valore dell'azione . Alla scadenza del 2 aprile 2026 corrispondente alla colonna expiration del dataset , se S = 280, solo le put con strike > 280 generano profitto (pari a max(strike-S,0) - lastPrice), mentre le altre scadono senza valore con perdita pari a -lastPrice :
S = 280
df2.profitto_S_280 = max.(df2.strike.-S,0).-df2.lastPrice
S = 220
df2.profitto_S_220 = max.(df2.strike.-S,0).-df2.lastPrice
Se alla scadenza del 2 aprile 2026 delle puts visibile nella colonna expiration del dataset, S = 460, otterrei una perdita su tutte le puts (i valori nella colonna saranno tutti negativi) :
S = 460
df2.perdita_S_460 = max.(df2.strike.-S,0).-df2.lastPrice
df2
| contractSymbol | strike | lastPrice | volume | expiration | impliedVolatility | inTheMoney | profitto_S_280 | profitto_S_220 | perdita_S_460 |
|---|---|---|---|---|---|---|---|---|---|
| GOOG260402P00175000 | 175.0 | 0.3 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.3 | -0.3 | -0.3 |
| GOOG260402P00180000 | 180.0 | 0.02 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.02 | -0.02 | -0.02 | |
| GOOG260402P00190000 | 190.0 | 0.1 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402P00195000 | 195.0 | 0.03 | 10 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.03 | -0.03 | -0.03 |
| GOOG260402P00200000 | 200.0 | 0.09 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.09 | -0.09 | -0.09 |
| GOOG260402P00205000 | 205.0 | 0.1 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.1 | -0.1 | -0.1 |
| GOOG260402P00210000 | 210.0 | 0.04 | 4 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.04 | -0.04 | -0.04 |
| GOOG260402P00215000 | 215.0 | 0.03 | 1 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.03 | -0.03 | -0.03 |
| GOOG260402P00220000 | 220.0 | 0.02 | 34 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.02 | -0.02 | -0.02 |
| GOOG260402P00225000 | 225.0 | 0.02 | 2 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.02 | 4.98 | -0.02 |
| GOOG260402P00230000 | 230.0 | 0.01 | 5 | 2026-04-02T00:00:00.0 | 0.500005 | false | -0.01 | 9.99 | -0.01 |
| GOOG260402P00235000 | 235.0 | 0.02 | 20 | 2026-04-02T00:00:00.0 | 0.2500075 | false | -0.02 | 14.98 | -0.02 |
| GOOG260402P00240000 | 240.0 | 0.02 | 265 | 2026-04-02T00:00:00.0 | 0.2500075 | false | -0.02 | 19.98 | -0.02 |
| ------------------- | |||||||||
| GOOG260402P00312500 | 312.5 | 31.05 | 310 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 1.4499999999999993 | 61.45 | -31.05 |
| GOOG260402P00315000 | 315.0 | 25.6 | 4 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 9.399999999999999 | 69.4 | -25.6 |
| GOOG260402P00317500 | 317.5 | 38.6 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | -1.1000000000000014 | 58.9 | -38.6 |
| GOOG260402P00320000 | 320.0 | 45.26 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | -5.259999999999998 | 54.74 | -45.26 |
| GOOG260402P00322500 | 322.5 | 21.0 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 21.5 | 81.5 | -21.0 |
| GOOG260402P00325000 | 325.0 | 32.0 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 13.0 | 73.0 | -32.0 |
| GOOG260402P00330000 | 330.0 | 41.35 | 4 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 8.649999999999999 | 68.65 | -41.35 |
| GOOG260402P00335000 | 335.0 | 46.25 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 8.75 | 68.75 | -46.25 |
| GOOG260402P00340000 | 340.0 | 36.6 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 23.4 | 83.4 | -36.6 |
| GOOG260402P00345000 | 345.0 | 47.56 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 17.439999999999998 | 77.44 | -47.56 | |
| GOOG260402P00350000 | 350.0 | 47.58 | 30 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 22.42 | 82.42 | -47.58 |
| GOOG260402P00360000 | 360.0 | 45.03 | 1 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 34.97 | 94.97 | -45.03 |
| GOOG260402P00450000 | 450.0 | 162.3 | 2026-04-02T00:00:00.0 | 1.0000000000000003e-5 | true | 7.699999999999989 | 67.69999999999999 | -162.3 |