ожидание и отклонение будущей цены акций в бинарном дереве

#python #statistics #probability #finance #quantitative-finance

Вопрос:

Вероятно, чрезмерно упрощенная модель цены акций: каждый день цена будет расти в 1,05 раза с вероятностью 0,6 или снизится до 1/1, 05 с вероятностью 0,4.Таким образом, это несимметричное двоичное дерево. Как я могу аналитически рассчитать ожидание и отклонение этой цены акций на будущую дату, скажем, на 100-й день. Кроме того, есть ли в python какой-либо модуль для обработки подобной модели двоичного дерева? оцените код для реализации этого.

С уважением

Комментарии:

1. Анализ, вероятно, будет проще, если вы возьмете логарифм цены, поэтому вместо продукта это суммирование. Распределение логарифма(цены) через 100 дней будет хорошо аппроксимировано гауссовым, поэтому распределение цены будет логнормальным. Из этого вы можете получить нужные вам свойства.

2. фантастическая идея, спасибо @RobertDodier

Ответ №1:

 import random as r
s = 100 # starting value
 

^^Начальные условия. Моделирование одного дня на фондовом рынке:

 def day(stock_value): #One day in the stock market
    k = r.uniform(0,1)
    if k < 0.6:
        output = 1.05*stock_value
    else:
        output = stock_value/1.05
    return(output)
 

Моделирование 100 дней на фондовом рынке:

 for j in range(100): #simulates 100 days in the stock market
    s = day(s)
    print(s)
 

Имитируя 100 дней 1000 раз:

 data = []
for i in range(1000):
    s = [100]
    for j in range(100): 
        s.append(day(s[j]))
    data.append(s)
 

Преобразование данных для учета только последнего дня:

 def mnnm(mat): #Makes an mxn matrix into an nxm matrix
    out = []
    for j in range(len(mat[0])):
        out.append([])
    for j in range(len(mat[0])):
        for m in range(len(mat)):
            out[j].append(mat[m][j])
    return(out)

data = mnnm(data)
data = data[-1]
 

Принимая среднее среднее значение:

 def lst_avg(lst): #Returns the average of a list
    output = 0
    for j in range(len(lst)):
        output = lst[j]/len(lst)
    return(output)
mean = lst_avg(data)
 

Различие:

 import numpy as np
for h in range(len(data)):
    data[h] = data[h]**2
mean_square = lst_avg(data)
variance = np.fabs(mean_square - mean**2)
 

Ответ №2:

Теоретическое значение через 1 день равно (при условии, что значение на 0-й день равно A)

А * 0.6 * 1.05 100 * 0.4/1.05

И через 100 дней это

А * (0.603 0.380952…)**100 итак…

(далее я использую 1 в качестве цены акций в день 0.)

 p1 = 0.6
p2 = 0.4
x1 = 1.05
x2 = 1/1.05

initial_value = 1
no_of_days = 100

# 1 day
expected_value_after_1_day = initial_value * ( p1*x1   p2*x2)  
print (expected_value_after_1_day, 'is the expected value of price after 1 day')
ex_squared_value_1_day = initial_value * (p1*x1**2   p2*x2**2)
# variance can be calculated as follows
variance_day_1 = ex_squared_value_1_day - expected_value_after_1_day**2
# or an alternative calculation, summing the squares of the differences from the mean
alt_variance_day_1 = p1 * (x1 - expected_value_after_1_day) ** 2   p2 * (x2 - expected_value_after_1_day) ** 2
print ('Variance after one day is', variance_day_1)

# 100 days
expected_value_n_days = initial_value * (p1*x1   p2*x2) ** no_of_days 
ex_squared_value_n_days = initial_value * (p1*x1**2   p2*x2**2) ** no_of_days
ex_value_n_days_squared = expected_value_n_days ** 2
variance_n_days = ex_squared_value_n_days - ex_value_n_days_squared

print(expected_value_n_days, 'is the expected value of price after {} days'.format(no_of_days))
print(ex_squared_value_n_days, 'is the expected value of the square of the price after {} days'.format(no_of_days))
print(ex_value_n_days_squared, 'is the square of the expected value of the price after {} days'.format(no_of_days))
print(variance_n_days, 'is the variance after {} days'.format(no_of_days))
 

Это, наверное, выглядит немного старомодно, надеюсь, вы не возражаете!

Выход

 1.0109523809523808 is the expected value of price after 1 day
Variance after one day is 0.0022870748299321786
2.972144657651404 is the expected value of price after 100 days
11.046309656223373 is the expected value of the square of the price after 100 days
8.833643866005783 is the square of the expected value of the price after 100 days
2.2126657902175904 is the variance after 100 days