본문 바로가기
코딩 공부/python

ChatGPT와 함께 커버드 콜 전략 자동실행 알고리즘 짜기 (4)

by Camel_coding_food 2023. 1. 25.
반응형

다들 그렇죠?

 

이번에는 전 게시물에서 만든 함수들을 모두 합쳐보겠습니다.

 

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)

완성했습니다.

 


실행 결과를 보며 코드가 정상 작동하는지 봅시다.

 

 

맨 아래 숫자 9883. ~~~

즉 현재 비트코인 가격과 날짜 기준으로 

9월 29일에 $14000로 선물을 매수할 수 있는 권리는 

블랙숄츠 방정식에 따르면, 약 $9883 인것 입니다.

 

 Deribit 거래소에서도 확인해봅시다.

 

 

숫자가 많은데, 신경 안쓰셔도 됩니다.

 

행 전체가 파란색으로 하이라이트 된 부분을 보면,

Mark(이론가와의 차이)가 63.28인것을 볼 수 있습니다.

 

즉, 현재 이론가와 약 63% 차이나는 가격으로

해당 상품이 거래되고 있다는 뜻이죠.

 

 

게시물 작성 당시 0.2865*22620.57,

약 $6,480로 해당 상품이 거래되고 있었으므로

제가 계산한 이론가 $9883과 65% 차이납니다.

 

결론적으로 거래소 이론가와 제가 직접 구한 이론가가

2% 내의 차이를 보인것이죠.

 


 

 

옵션상품의 이론가를 구하는 것이

커버드 콜 전략을 수행하는 데에 필수적이진 않지만,

옵션 거래 정보를 다루는 방법을 간접적으로 알기 위해

이번 프로젝트를 진행해보았습니다.

 

다음번부턴 커버드 콜 ETF의 원리를 공부해보며,

코드로 직접 이를 구현해보겠습니다.

반응형

댓글