Hvordan konstruerer, analyserer og visualiseres en portefølje vha. Python?

De fleste af os investerer i aktiemarkedet. Ved vi imidlertid kvantitativt, hvor meget afkast vi skal forvente af vores portefølje, og hvor meget risiko vi tager for dette afkast? I denne artikel skal vi opbygge en portefølje og analysere dets årlige forventede afkast og risiko og skabe smukke visualiseringer ved hjælp af Python.

1- Statistikken

For at beregne porteføljeafkastet skal vi bruge formlen;

hvor afkast er det historiske årlige afkast for hver bestand og vægt er vægten af ​​bestanden i vores portefølje. For eksempel, hvis vi laver en lige vægtet portefølje med Apple og Google, som har henholdsvis 10% og 8% årligt afkast, bliver vores forventede afkast 10% * 0,5 + 8% * 0,5 = 9%.

For at beregne standardafvigelsen, som betyder risiko for vores portefølje, har vi brug for hjælp fra multivariate statistikker. Den tilsvarende formel;

Multivariat standardafvigelsesformel = risiko

hvor vægt er en vektor af vores lagervægte og sigma er bestandens covariansmatrix.

2- Ansøgningen med Python

Lad os først og fremmest importere de pakker, vi har brug for.

import matplotlib.pyplot som plt #for grafer importer pandaer som pd #for at lagre data importer numpy som np #for matematik operationer importer seaborn som sns #for visualisering importer pandas_datareader.data som web #for at læse økonomiske data import matplotlib.ticker som ticker # for at ændre grafakse fra datetime importdato # dateringsmanipulation

Nu er vi klar til at hente dataene. Vi vil konstruere en portefølje ved hjælp af lagrene af Amazon, Netflix, Apple, Microsoft, Nvidia, Tesla, Taiwan Semiconductor, SAP, Tencent, Qualcomm, IBM, Alibaba, Adobe, Cisco, Facebook, Google, Baidu, Intel og AMD. Vores portefølje vil hovedsageligt bestå af amerikanske virksomheder og nogle store kinesiske virksomheder som Alibaba, Tencent og Baidu.

For at importere dataene skal vi bruge Yahoo Finance fra 2015–01–01 til 2020–03–25. Desværre åbnede nogle virksomheder som Facebook ($ FB) og Alibaba ($ BABA) for aktiemarkedet senere end andre. Derfor bruger vi 5 års data.

stock_labels = ['AMZN', 'NFLX', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'TSM', 'SAP', 'TCEHY', 'QCOM', 'ORCL', 'IBM' , 'BABA', 'ADBE', 'CSCO', 'FB', 'GOOG', 'BIDU', 'INTC', 'AMD']
fra = '2015-01-01' til = date.tay ()
panel_data = web.DataReader (stock_labels, 'yahoo', fra, til)
Paneldata

Nu lagrede vi alle aktiekurser i variabelt navn “panel_data”. Lad os beregne det daglige afkast af lagrene og foretage en forklarende analyse ved hjælp af korrelationsmatrix.

returnerer = panel_data ['Adj Close']. pct_change () # Brug af AdjustedPrices sns.heatmap (returns.corr (), annot = True, cmap = 'OrRd')

Som det ses af korrelationsmatrix, er de fleste af lagrene lidt korrelerede, da de er aktier og hovedsagelig teknologiselskaber. Som forventet har Tesla ingen sammenhæng mellem andre lagre, da det betragtes som en bilproducent (Skønt jeg tror, ​​Tesla vil blive betragtet som et "software" selskab i de kommende år ). Den interessante del er, at Netflix ($ NFLX), Facebook ($ FB), AMD ($ AMD) og Baidu ($ BIDU) også ser ud til at være ukorreleret med andre aktier. Det er meget gode nyheder for vores portefølje i tilfælde af diversificering!

For enkelhedens skyld konstruerer vi en portefølje med lige vægte for alle disse 20 virksomheder. Det betyder, at vi investerer 5% af vores penge til hver af de 20 aktier.

vægte = np.full ((20, 1), 0,05, dtype = float)

Først skal man beregne vores forventede årlige afkast for vores portefølje.

returnerer ['Portfolio'] = np.dot (returnerer, vægte) portfolio_annual_return = returnerer ['Portfolio']. middel () * 250
print ('Portefølje årligt forventet afkast er' + str (np.round (portfolio_annual_return, 2) * 100) + '%')

Årligt forventet afkast på porteføljen er 24,0%.

Wow! Er det ikke godt? Der er dog en meget BIG underliggende antagelse for dette. Det forventede afkast beregnes på baggrund af historiske data. Naturligvis stemmer forventningen muligvis ikke sammen med virkeligheden (coronavirus )

Lige nu ved vi, at hvis vi investerer vores penge ens til disse 20 virksomheder, forventer vi 22% årligt afkast. Der er dog et meget stort spørgsmål. Hvad er vores risiko?

Lad os nu beregne vores porteføljerisiko.

covariance_matrix = returns.cov () * 250 portfolio_var = np.dot (vægte.T, np.dot (covariance_matrix, vægte)) portfolio_std = np.sqrt (portfolio_var)
print ('Portfolio standart deviation is' + str (np.round (portfolio_std [0,0], 3) * 100) + '%')

Porteføljens standardafvigelse er 22,4%.

Nå ... Selvfølgelig er der en afvejning mellem risiko og afkast. Vi konstruerede en portefølje ved hjælp af teknologiselskaber, der har et højt afkast og en høj risiko.

Lad os nu finde ud af, hvor meget vi ville få, hvis vi investerede $ 1 til denne portefølje i 2015–01–01.

cum_return = (1 + returnerer) .cumprod () cum_return.Portfolio.dropna (). plot (color = '# a63287')
#formatting ax = plt.title ("Hypotetisk vækst på $ 1", skrifttype = 35) plt.xlabel ('Date', skrifttype = 30) plt.ylabel ('Værdi', skrifttype = 30) formatter = ticker.FormatStrFormatter (' $% 1,2f ') ax.yaxis.set_major_formatter (formater) ax.tick_params (axis =' begge ', som =' major ', labelsize = 20) plt.show ()

Temmelig imponerende! Hvis du investerede $ 1 i vores portefølje i begyndelsen af ​​2015. Du ville have cirka $ 3 fra 2020–03–25.

Indtil dette har vi opbygget en portefølje, der har 20 virksomheder lige vægtet. Som et sidste trin, lad os analysere afvekslingen mellem risiko og afkast for individuelle aktier og vores lige så vægtede portefølje.

df = pd.concat ([returns.mean () * 250, np.sqrt (250) * returns.std ()], axis = 1) df.columns = ['return', 'std'] ax = sns. scatterplot (x = df ['std'], y = df ['returnerer'], markør = "o", farve = '# a63287')
for linje inden for rækkevidde (0, df.shape [0]): ax.text (df.iloc [linje, 1], df.iloc [linje, 0], df.index [linje])
#formatering plt.xlabel ('Standart Deviation', størrelse = 25) plt.title ('Return and Risk Tradeoff', size = 25) plt.ylabel ('Annual Return', size = 25) ax.tick_params (axis = ' begge ', som =' major ', labelsize = 18) plt.show ()

Som det ses af grafen, overgår vores lige vægtede portefølje det årlige afkast af aktier som Apple, Google, Facebook, Intel og har mindre risiko end dem!

Konklusion: Diversificer! Diversificere! Diversificere! Du kan reducere dine risici dramatisk uden dramatisk at reducere dine forventede afkast.

I det hele taget forsøgte jeg at forklare ved hjælp af Python

  • hvordan man importerer lagerdataene
  • hvordan man konstruerer en portefølje
  • hvordan man beregner det forventede årlige afkast og risiko
  • hvordan man kører vores portefølje gennem tiden
  • hvordan man visualiserer afkast og risikoudveksling

Hvis du har spørgsmål angående indholdet eller Python-koden, så fortæl mig det!