Monte-carlo simulering af aktiekurser (i Python)

I et af mine tidligere indlæg har jeg introduceret begrebet “Random-Walk” og jeg benyttede Python til implementeringen. I dette indlæg vil jeg gennemføre en monte-carlo simulation af tilfældige aktiekursforløb. Til dette vil jeg bruge følgende fiktive aktiehistorie:

# erklær liste med fiktive daglige aktiekurser
history_prices = [180,192,193,195,191,199,198,200,199,203,205,207,205,208,201,203,204,201,205,206,207]
print(stockPrices)
[180, 192, 193, 195, 206, 211, 191, 204, 215, 190, 205, 207, 205, 211, 222, 215, 245, 201, 205, 206, 214]

Som forberedelse til de næste trin importerer jeg nu alle relevante Python-moduler:

# importstatistikker til beregning af f.eks. standardafvigelse af prishistorik
import statistics as stat
# import pyplot til plotning
import matplotlib.pyplot as plt
# import tilfældigt til tilfældige antal generationer
import random as rnd

Under antagelse af tilfældig aktiekursbevægelser udleder jeg standardafvigelsen fra relative ændringer i den fiktive kurshistorie, således at jeg er i stand til at modellere tilfældige aktiekursbevægelser:

relative_prices = []
for i in range(0,len(history_prices)):
    if i == 0:
        pass
    else:
        relative_prices.append((history_prices[i]-history_prices[i-1])/(history_prices[i-1])) 
std_prices = stat.stdev(relative_prices)
print(std_prices)
0.021375589655016836

Nu modellerer jeg et tilfældig aktiekursforløb for 100 dage ind i fremtiden, forudsat at den tilfældige prisbevægelse er baseret på standardafvigelsen af ​​tilfældige priser. Jeg antager en tilfældig normalfordeling. Den sidst kendte pris i historien fungerer som udgangspunkt:

# modellering af en tilfældig prisgang over 100 dage
# - udfør beregning, definer funktion
def randomWalk(stdev,pastPrices):
    days = [i for i in range(1,101)]
    prices = []
    price = pastPrices[-1]
    for i in range(1,101):
        price = price + price*rnd.normalvariate(0,stdev)
        prices.append(price)
    return([days,prices])
# - udfør beregning, brug funktion
prices = randomWalk(std_prices,history_prices)
# - visualiser tilfældig tur i en linjeplot
plt.plot(prices[0],prices[1])
plt.title("random price walk")
plt.xlabel("day")
plt.ylabel("stock price")
Text(0, 0.5, 'stock price')

Jeg kan gentage denne proces ved at genberegne yderligere tilfældige gåture og derved skabe en monte-carlo-simulering af aktiekursbevægelser. I nedenstående eksempel gentager jeg den tilfældige process for 30 separate tilfældige kursforløb:

plt.figure()
for i in range(0,30):
    prices = randomWalk(std_prices,history_prices)
    plt.plot(prices[0],prices[1])
plt.title("monte-carlo simulation of stock price development")
plt.xlabel("day")
plt.ylabel("stock price")
Text(0, 0.5, 'stock price')

Leave a Reply

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Close

Meta