Vai al contenuto

Calcoli scientifici con Julia/Investire in opzioni

Wikibooks, manuali e libri di testo liberi.
Indice del libro

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
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