Блог им. Bondiator

Тетта - поделитесь скриптом для Питона :)

Всем привет!

Если у кого есть, поделитесь плиз скриптом в Питоне для расчета тетты у коллов (по Б-Ш).

У меня почему-то результат неверный, в инете варианты кодов тоже дают ошибочные ответы…
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
655
12 комментариев

import numpy as np
from scipy.stats import norm

def black_scholes_theta(S, K, T, r, sigma, option_type):
d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
d2 = d1 — sigma * np.sqrt(T)

if option_type == 'call':
theta = — (S * norm.pdf(d1) * sigma) / (2 * np.sqrt(T)) — r * K * np.exp(-r * T) * norm.cdf(d2)
elif option_type == 'put':
theta = — (S * norm.pdf(d1) * sigma) / (2 * np.sqrt(T)) + r * K * np.exp(-r * T) * norm.cdf(-d2)
else:
raise ValueError(«Invalid option type. Use 'call' or 'put'.»)

return theta

# Параметры опциона
S = 100 # Текущая цена акции
K = 100 # Цена страйк
T = 1 # Срок до экспирации (в годах)
r = 0.05 # Безрисковая процентная ставка
sigma = 0.2 # Волатильность акции

option_type = 'call' # Тип опциона: 'call' (колл) или 'put' (пут)

theta = black_scholes_theta(S, K, T, r, sigma, option_type)
print(f«Theoretical Theta for the {option_type} option: {theta:.4f}»)

Это чатГПТ выжал на твой коммент. Но тут вставляется без отступов..

avatar
Иван-дурак, уже пробовал — результат не совпадает с калькуляторами
avatar
Для теты нет, но есть вот такой:
def InsKline1m(self, sd):        # thname = 'kline'        """ kl = {'stream': 'btcusdt@kline_1m', 'data': {'e': 'kline', 'E': 1692194018649, 's': 'BTCUSDT',        'k': {'t': 1692193980000, 'T': 1692194039999, 's': 'BTCUSDT', 'i': '1m', 'f': 4009649234, 'L': 4009650704, 'o': '29087.10',        'c': '29094.90', 'h': '29095.20', 'l': '29087.10', 'v': '148.002', 'n': 1471, 'x': False, 'q': '4305614.76410', 'V': '88.941',        'Q': '2587451.86430', 'B': '0'}}}        """        ""«if threading.get_ident() != self.threads[thname]['thread_id']:             # print('aaaa ',threading.get_ident())             self.threads[thname]['thread_id'] = threading.get_ident()             self.OpenDB(thname)        „“»        dt = self.ConvertToDTime(sd['data']['E'])        var =   (sd['data']['E'],sd['data']['s'],dt,sd['data']['k']['t'],sd['data']['k']['T'],sd['data']['k']['f'],sd['data']['k']['L'],                 sd['data']['k']['o'],sd['data']['k']['c'],sd['data']['k']['h'],sd['data']['k']['l'],sd['data']['k']['v'],                 sd['data']['k']['n'],sd['data']['k']['x'],sd['data']['k']['q'],sd['data']['k']['V'],sd['data']['k']['Q']) #17        sql2 = '(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'        sql1 = 'insert into Kline1m (E,Symbol,dtime,tb,tc,f,L,open,close,high,low,vol,n,x,q,V,Qp) values' + sql2        begin = time.monotonic_ns()        self.cursor.execute(sql1, var)        self.connect.commit()        if sd['data']['k']['x']:            dt = self.ConvertToDTime(sd['data']['k']['t'])            print('dt ', dt)            var =   (sd['data']['s'],dt,sd['data']['k']['t'],sd['data']['k']['T'],sd['data']['k']['o'],                     sd['data']['k']['c'],sd['data']['k']['h'],sd['data']['k']['l'],sd['data']['k']['v'],                     sd['data']['k']['n'],sd['data']['k']['q'],sd['data']['k']['V'],sd['data']['k']['Q']) #13            sql2 = '(?,?,?,?,?,?,?,?,?,?,?,?,?)'            sql1 = 'insert into Kline_1mc (Symbol,dtime,tb,tc,open,close,high,low,vol,n,q,V,Qp) values' + sql2            self.cursor.execute(sql1, var)            self.connect.commit()        Tq = (time.monotonic_ns() — begin)/1000        print('Time of record ', Tq)
Сорри, форматирование слетело.)
avatar
3Qu, вах! Это прям тот самый код Грааля? )
avatar
Врач-бондиатОр, одна из функций кода Грааля.))
avatar
разделите на 365 и будет Вам счастье
avatar
_sg_, а результат какого кода делить?
avatar

Врач-бондиатОр,

последняя строка

return theta / 365.0
avatar
_sg_, спасибо, попробую еще раз
avatar

Читайте на SMART-LAB:
💼 Селигдар: большие планы, небольшие возможности
Золотодобытчик представил обновленную дивидендную политику   Главная деталь — база расчета дивидендов. Она рассчитывается как операционная...
Займер выплатил акционерам более 1,5 млрд рублей дивидендов
Акционеры Займера начали получать дивиденды сразу за IV квартал 2025 года и I квартал 2026 года. Большинство акционеров уже получили дивиденды на...
Фото
«Полюс» без дивидендов. Как это понимать?
Менеджмент золотодобывающей компании «Полюс» намерен представить совету директоров рекомендацию приостановить дивидендные выплаты до 2030...
Фото
Сетевые компании. Изменение целевых цен и смена рейтинга!
Я последнее время наблюдаю такую тенденцию — у компании дивидендный гэп, но акции продолжают отвесно падать, это и произошло с сетевыми...

теги блога Врач-бондиатОр

....все тэги



UPDONW
Новый дизайн