Прогнозирование цен на акции с помощью моделирования методом Монте-Карло

Моделирование может быть мощным инструментом аналитики в составе решений Business Intelligence (BI). Используя методы имитационного моделирования, мы можем моделировать сложные процессы и принимать обоснованные решения на основе полученных в результате моделирования выводов. При наличии имитационной модели и параметров система многократно моделируется с использованием различных входных данных и сценариев. В результате каждого прогона формируется набор результатов, что позволяет аналитикам понять диапазон возможных результатов и связанные с ними вероятности.

Существует несколько методов имитационного моделирования, каждый из которых предназначен для решения конкретных задач . К ним относятся агентное моделирование (ABM), дискретно-событийное моделирование (DES), моделирование по теории игр и моделирование по методу Монте-Карло. Для данной цели мы используем моделирование методом Монте-Карло. Оно получило широкое распространение благодаря своей универсальности и способности решать сложные задачи с неопределенностью.

В трейдинге моделирование методом Монте-Карло предполагает внесение случайных изменений в исторические данные о ценах акций с последующим расчетом новой кривой цены акций. Оно используется для проверки того, достаточно ли надежна торговая стратегия, чтобы противостоять случайным изменениям. Оно также используется для оптимизации портфелей путем оценки потенциальных будущих показателей.

Мы использовали python для моделирования будущих цен на акции с помощью этого метода имитации. Это можно сделать и в excel, но работа в python гораздо эффективнее и быстрее, поскольку можно выполнить больше итераций за меньшее время.

# Import required libraries
import math
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import yfinance as yf
#obtaining and printing data
#we have used the ticker 'AC.TO', which is Air Canada

data = yf.download('AC.TO','2020-01-01','2023-01-01')
data.head()
Прогнозирование цен на акции с помощью моделирования методом Монте-Карло
#Next, we calculate the number of days that have elapsed in our chosen time window
time_elapsed = (data.index[-1] - data.index[0]).days
#Current price / first record (e.g. price at beginning of 2009)
#provides us with the total growth %
total_growth = (data['Adj Close'][-1] / data['Adj Close'][1])

#Next, we want to annualize this percentage
#First, we convert our time elapsed to the # of years elapsed
number_of_years = time_elapsed / 365.0
#Second, we can raise the total growth to the inverse of the # of years
#(e.g. ~1/10 at time of writing) to annualize our growth rate
cagr = total_growth ** (1/number_of_years) - 1

#Now that we have the mean annual growth rate above,
#we'll also need to calculate the standard deviation of the
#daily price changes
std_dev = data['Adj Close'].pct_change().std()

#Next, because there are roughy ~252 trading days in a year,
#we'll need to scale this by an annualization factor
#reference: https://www.fool.com/knowledge-center/how-to-calculate-annualized-volatility.aspx

number_of_trading_days = 252
std_dev = std_dev * math.sqrt(number_of_trading_days)

#From here, we have our two inputs needed to generate random
#values in our simulation
print ("cagr (mean returns) : ", str(round(cagr,4)))
print ("std_dev (standard deviation of return : )", str(round(std_dev,4)))
Прогнозирование цен на акции с помощью моделирования методом Монте-Карло
#Now that we've created a single random walk above,
#we can simulate this process over a large sample size to
#get a better sense of the true expected distribution
number_of_trials = 3000

#set up an additional array to collect all possible
#closing prices in last day of window.
#We can toss this into a histogram
#to get a clearer sense of possible outcomes
closing_prices = []

for i in range(number_of_trials):
    #calculate randomized return percentages following our normal distribution
    #and using the mean / std dev we calculated above
    daily_return_percentages = np.random.normal(cagr/number_of_trading_days, std_dev/math.sqrt(number_of_trading_days),number_of_trading_days)+1
    price_series = [data['Adj Close'][-1]]

    for j in daily_return_percentages:
        #extrapolate price out for next year
        price_series.append(price_series[-1] * j)

    #append closing prices in last day of window for histogram
    closing_prices.append(price_series[-1])

    #plot all random walks
    plt.plot(price_series)

plt.show()

#plot histogram
plt.hist(closing_prices,bins=40)

plt.show()
Прогнозирование цен на акции с помощью моделирования методом Монте-Карло
Прогноз цен для каждой трассы
Прогнозирование цен на акции с помощью моделирования методом Монте-Карло
#from here, we can check the mean of all ending prices
#allowing us to arrive at the most probable ending point
mean_end_price = round(np.mean(closing_prices),2)
print("Expected price: ", str(mean_end_price))
Прогнозирование цен на акции с помощью моделирования методом Монте-Карло

Таким образом, как было сказано выше, мы можем прогнозировать будущую цену любой финансовой ценной бумаги с помощью моделирования Монте-Карло. Важно также провести бэктест данной стратегии, чтобы убедиться в ее точности. В заключение следует отметить, что данная стратегия имитационного моделирования использует закон больших чисел, позволяющий делать прогнозы на основе исторических данных.

+1
0
+1
3
+1
1
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *