Jeg har allerede demonstreret, hvordan du kan hente f.eks. BNP-data fra FRED ved hjælp af pandas_datareader i Python. Jeg har også analyseret aktiekurser for Procter & Gamble ved hjælp af Yahoo Finance som kilde og trukket tilhørende data via pandas_datareader.
I dette indlæg vil jeg analysere daglige aktieafkast for UPS og FedEx. Jeg trækker dataene ved hjælp af pandas_datareader. Derefter vil jeg foretage yderligere analyser af disse data og visualisere resultaterne ved hjælp af matplotlib.pyplot.
Som altid er første trin at importere de relevante Python-moduler:
# import relevant modules import pandas as pd import pandas_datareader.data as web import datetime import matplotlib.pyplot as plt
Næste skridt er at trække aktiekursdataene fra Yahoo Finance via pandas_datareader:
# definer start- og slutdatoer start_date = datetime.datetime(2000, 1, 1) end_date = datetime.datetime(2020, 9, 30) # importer aktiedata for en given periode mellem start- og slutdato fra Yahoo Finance ups = web.DataReader("UPS", "yahoo", start_date, end_date) fedex = web.DataReader("FDX", "yahoo", start_date, end_date)
Vi har brug for nogle hjælpefunktioner i dette indlæg. Jeg definerer først en daglig aktieafkastfunktion:
def plottingReturns(title,xtitle,ytitle,df1,df2,color1,color2,returns1,returns2,alpha1,alpha2): # opret figur plt.figure(figsize=(17.5,10)) # opret linjediagrammer til daglige returneringer plt.plot(df1.index,returns1,color=color1,alpha=alpha1) plt.plot(df1.index,returns2,color=color2,alpha=alpha2) # df1.index placed here on purpose # tilføj titel til plot plt.title(title, size=22) # tilføj x-akselabel plt.xlabel(xtitle, size=16) # tilføj etiket på y-aksen plt.ylabel(ytitle, size=16)
Jeg definerer også en histogram-plotfunktion for at plotte fordelingen i daglige aktieafkast:
def histogramReturns(title,xtitle,ytitle,color1,color2,returns1,returns2,alpha1,alpha2,name1,name2): # opret figur plt.figure(figsize=(17.5,10)) # oprette linjediagrammer til daglige afkast plt.hist(returns1,histtype="bar",color=color1,alpha=alpha1,label=name1,bins=100) plt.hist(returns2,histtype="bar",color=color2,alpha=alpha2,label=name2,bins=100) # df1.index placed here on purpose # tilføj titel til diagram plt.title(title, size=22) # tilføj x-akselabel plt.xlabel(xtitle, size=16) # tilføj etiket på y-aksen plt.ylabel(ytitle, size=16)
Derudover definerer jeg en plotfunktion for aktiekurstidsserier:
def plottingPrices(title,xtitle,ytitle,df1,df2,color1,color2): # opret figur plt.figure(figsize=(17.5,10)) # oprette linjediagrammer til daglige lukkepriser plt.plot(df1.index,df1["Close"],color=color1,alpha=0.5) plt.plot(df1.index,df2["Close"],color=color2,alpha=0.5) # df1.index placed here on purpose # tilføj titel til plot plt.title(title, size=22) # tilføj x-akselabel plt.xlabel(xtitle, size=16) # tilføj etiket på y-aksen plt.ylabel(ytitle, size=16)
Endelig definerer jeg en daglig beregningsfunktion for aktieafkast:
def returns(df): prices = df["Close"] returns = [0 if i == 0 else 100*(prices[i]-prices[i-1])/(prices[i-1]) for i in range(0,len(prices))] return(returns)
Nu anvender jeg ovennævnte daglige beregningsfunktion til at beregne UPSs og FedExs daglige aktieafkast siden 2020, baseret på daglige aktielukningspriser:
return_ups = returns(ups) return_fedex = returns(fedex)
Jeg fortsætter med at udgive længden af begge returlister for derved at sikre, at mine data er konsistente:
print(len(return_ups))
5220
print(len(return_fedex))
5220
Jeg tester også, at længden af datalisten for UPS og FedEx-datarammen er den samme som længden af den daglige aktiereturliste:
print(len(ups.index))
5220
print(len(fedex.index))
5220
Testen giver grønt lys. Dataene ser ud til at være konsistente. Nu bruger jeg plotfunktionen, som allerede er blevet defineret, for at visualisere daglige lagerafkast for UPS og FedEx i perioden siden 2000:
plottingReturns("UPS [black] vs. FedEx [orange] daily stock returns since 2000","Date","Daily stock return [%]",ups,fedex,"black","orange",return_ups,return_fedex,0.25,0.60)
Lad os se på fordelingen af daglige aktieafkast for UPS og FedEx ved hjælp af histogram-funktionen:
histogramReturns("Histogram of daily stock returns for UPS [black] and FedEx [orange]","Daily return [%]","Absolute frequency [-]","black","orange",return_ups,return_fedex,0.25,0.60,"UPS","FedEx")
Endelig, for at færdiggøre denne analyse, lad os plotte aktieudviklingskursudvikling gennem tiden siden 2000. Til dette bruger jeg prisplanlægningsfunktionen defineret øverst i det aktuelle indlæg:
plottingPrices("Daily stock price development for UPS [black] and FedEx [orange]","Date","Daily stock closing price [USD]",ups,fedex,"black","orange")
FedEx har i gennemsnit været en mere rentabel investering, men det har også været mere risikabelt at være investeret i FedEx.
Industriingeniør som gerne beskæftiger sig med optimering, simulation og matematisk modellering i R, SQL, VBA og Python
Leave a Reply