반응형
이번에는 전 게시물에서 만든 함수들을 모두 합쳐보겠습니다.
import pandas as pd
import numpy as np
import ccxt
import FinanceDataReader as fdr
import math
from datetime import datetime, timedelta
from scipy.stats import norm
# 바이낸스 객체 생성
binance = ccxt.binance({
'rateLimit': 365,
'enableRateLimit': True,
})
#로그 변동성 계산 함수
def get_sigma():
# Get the historical ticker data for Bitcoin
ohlcv = binance.fetch_ohlcv('BTC/USDT', timeframe='1d')
# Convert the data to a pandas DataFrame
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
# Calculate the log returns
df['log_return'] = np.log(df['close'] / df['close'].shift(1))
# Calculate the volatility
log_volatility = df['log_return'].std() * np.sqrt(365) #std는 표준편차
return log_volatility
#sigma
#-------------------------------------------------------
# 시장 정보 얻기
def get_s():
markets = binance.load_markets()
# 비트코인 무기한 선물 시장 정보
btc_futures = binance.market('BTC/USDT')
# 시장의 현재 가격 얻기
price = binance.fetch_ticker(btc_futures['symbol'])['last']
return price
#s는 현재 비트코인 가격
#-------------------------------------------------------
def get_r():
df2 = fdr.DataReader('FRED:FEDFUNDS', data_source='fred')
r = df2.tail(1)
r = 0.01*r.values[0][0]
return r
#r은 무위험 수익률(미국 FED 기준)
#-------------------------------------------------------
def get_K_call_put():
# Define the input date string
date_string = 'BTC/USD:BTC-230929-14000-C'
# Split the string by '-'
date_string_split = date_string.split("-")
# Extract the date string from the list
date_string = date_string_split[1]
# Convert the date string to a datetime object
date_object = datetime.strptime(date_string, "%y%m%d")
return date_string_split, date_object
#예시 상품의 티커에서 만기일, 콜 풋, 행사 가격 데이터를 분리한다
#----------------------------------------------------------
def get_T():
now = datetime.now()
now = now + timedelta(days=1)
print("현재 + 1 :", now)
a,b = get_K_call_put()
date_diff = b - now
print("차이 :", date_diff.total_seconds)
seconds_in_year = 365.2425 * 24 * 60 * 60
years = date_diff.total_seconds() / seconds_in_year
print("years :",years)
return years
#T는 현 시점에서 만기까지 남은 시간
#-------------------------------------------------------
def black_scholes(sigma, S, K, T, r, call_put):
print(sigma,S,r,T,K)
K = float(K)
S = float(S)
r = float(r)
T = float(T)
d1 = (math.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
if call_put == 'C':
return S * norm.cdf(d1) - K * math.exp(-r * T) * norm.cdf(d2)
elif call_put == 'P':
return K * math.exp(-r * T) * norm.cdf(-d2) - S * norm.cdf(-d1)
#구한 모든 변수를 넣을 블랙-숄츠 방정식 함수
#-----------------------------------------------------
sigma = get_sigma()
s = get_s()
K_data, K_data_useless = get_K_call_put()
K = K_data[2]
T = get_T()
r = get_r()
call_put = K_data[3]
result = black_scholes(sigma=sigma, S=s, K=K, T= T, r=r, call_put=call_put)
print(result)
완성했습니다.
실행 결과를 보며 코드가 정상 작동하는지 봅시다.
즉 현재 비트코인 가격과 날짜 기준으로
9월 29일에 $14000로 선물을 매수할 수 있는 권리는
블랙숄츠 방정식에 따르면, 약 $9883 인것 입니다.
Deribit 거래소에서도 확인해봅시다.
행 전체가 파란색으로 하이라이트 된 부분을 보면,
Mark(이론가와의 차이)가 63.28인것을 볼 수 있습니다.
즉, 현재 이론가와 약 63% 차이나는 가격으로
해당 상품이 거래되고 있다는 뜻이죠.
게시물 작성 당시 0.2865*22620.57,
약 $6,480로 해당 상품이 거래되고 있었으므로
제가 계산한 이론가 $9883과 65% 차이납니다.
결론적으로 거래소 이론가와 제가 직접 구한 이론가가
2% 내의 차이를 보인것이죠.
옵션상품의 이론가를 구하는 것이
커버드 콜 전략을 수행하는 데에 필수적이진 않지만,
옵션 거래 정보를 다루는 방법을 간접적으로 알기 위해
이번 프로젝트를 진행해보았습니다.
다음번부턴 커버드 콜 ETF의 원리를 공부해보며,
코드로 직접 이를 구현해보겠습니다.
반응형
'코딩 공부 > python' 카테고리의 다른 글
온체인 데이터를 이용한 지표 웹사이트 쉽게 만들기(2) (0) | 2023.02.06 |
---|---|
온체인 데이터를 이용한 지표 웹사이트 쉽게 만들기(1) (0) | 2023.02.04 |
ChatGPT와 함께 커버드 콜 전략 자동실행 알고리즘 짜기 (3) (0) | 2023.01.24 |
ChatGPT와 함께 커버드 콜 전략 자동실행 알고리즘 짜기 (2) (0) | 2023.01.24 |
ChatGPT와 함께 커버드 콜 전략 자동실행 알고리즘 짜기 (0) | 2023.01.22 |
댓글