Prezzi e rendimenti con Pandas
Integrare direttamente in un post un notebook di Jupyter
fastpages, la piattaforma sulla quale è costruito questo blog, permette di integrare direttamente dei notebook di Jupyter
nei post. Per provare questa funzionalità, costruiamo un breve notebook su come gestire prezzi e rendimenti delle azioni con Pandas
, in alternativa a Excel. In questo modo, potremo osservare in azione alcuni degli strumenti che ho descritto in un mio post precedente.
import pandas as pd
import altair as alt
import yfinance as yf
Scarichiamo da Yahoo! Finance i prezzi di quattro azioni statunitensi, identificate attraverso i loro ticker: Apple (AAPL), Microsoft (MSFT), McDonald's (MCD) e Coca-Cola (KO). Due azioni della new economy e due della old, come si diceva qualche anno fa.
tickers = 'AAPL MSFT MCD KO'
data = yf.download(tickers=tickers, period='2y')
A questo punto, eliminiamo dal database che abbiamo costruito i prezzi open, high, low e il volume negoziato per tenerci solo i prezzi di chiusura, rettificati dei dividendi eventualmente distribuiti e delle corporate action. Vediamo le prime righe del database dei prezzi.
prices = data.xs('Adj Close', axis=1, level=0)
prices.tail()
Possiamo fare un primo grafico dell'andamento dei prezzi delle quattro azioni negli ultimi due anni, utilizzando Altair
, una libreria che permette di produrre grafici interattivi.
alt.Chart(
prices.reset_index().melt(
'Date',
var_name='Stock',
value_name='Price'
)
).mark_line().encode(
x='Date:T',
y='Price:Q',
color='Stock:N',
tooltip=['Stock', 'Price']
).properties(
title='Andamento prezzi negli ultimi due anni'
).interactive()
Per avere la possibilità di confrontare i quattro grafici, ribasiamo i dati facendo partire gli andamenti da quota 100.
rebased_prices = prices.div(prices.iloc[0, :]).mul(100)
alt.Chart(
rebased_prices.reset_index().melt(
'Date',
var_name='Stock',
value_name='Price'
)
).mark_line().encode(
x='Date:T',
y='Price:Q',
color='Stock:N',
tooltip=['Stock', 'Price']
).properties(
title='Andamento prezzi ribasati negli ultimi due anni'
).interactive()
Passiamo ora ai rendimenti e calcoliamo i rendimenti mensili delle quattro azioni.
monthly_returns = prices.resample('M').last().pct_change()
Possiamo fare un grafico a barre dei rendimenti appena calcolati, divisi per mese.
alt.Chart(
monthly_returns.reset_index().melt(
'Date',
var_name='Stock',
value_name='Return'
)
).mark_bar().encode(
y='Stock:N',
x='Return:Q',
color='Stock:N',
row='Date:T',
tooltip=['Stock', 'Return']
).properties(
title='Rendimenti percentuali per mese'
).interactive()
Oppure lo stesso grafico raggruppato per titolo, dove notiamo come Apple sia stato il titolo più volatile negli ultimi due anni, ma Coca-Cola e McDonald's abbiano avuto i maggiori drawdown.
alt.Chart(
monthly_returns.reset_index().melt(
'Date',
var_name='Stock',
value_name='Return'
)
).mark_bar().encode(
x='Date:T',
y='Return:Q',
color='Stock:N',
row='Stock:N',
tooltip=['Stock', 'Return']
).properties(
title='Rendimenti percentuali per mese'
).interactive()
Ci fermiamo qui con questo post di prova, che mostra le potenzialità di analisi esplorativa di Pandas, in grado in poche righe di codice di scaricare, elaborare e visualizzare serie storiche di dati con grande facilità.