선물 옵션가격을 예측하는 각종지표를 활용하여 변수로 사용하는 함수
from scipy.stats import norm
def predict_futures_option_price(futures_price, strike_price, time_to_expiry, risk_free_rate,
historical_vol, implied_vol, weight_implied=0.7,
rsi=None, macd=None):
"""
선물 옵션가격 예측 함수 (콜 옵션 기준)
Parameters:
- futures_price: 현재 선물 가격
- strike_price: 옵션의 행사가격
- time_to_expiry: 만기까지 남은 시간 (연 단위)
- risk_free_rate: 무위험 이자율 (연 단위)
- historical_vol: 역사적 변동성 (연 단위)
- implied_vol: 암시적 변동성 (연 단위)
- weight_implied: 암시적 변동성이 차지하는 비중 (0~1, 기본값 0.7)
- rsi: 상대강도지수 (Optional, 기술적 조정용)
- macd: MACD 값 (Optional, 기술적 조정용)
Returns:
- option_price: 예측된 콜 옵션 가격
"""
# 1. 효과적 변동성 계산: 암시적 변동성과 역사적 변동성의 가중 평균
effective_vol = weight_implied * implied_vol + (1 - weight_implied) * historical_vol
# 2. Black 모델(선물 옵션 버전)을 이용한 기본 옵션가격 산출
d1 = (math.log(futures_price / strike_price) + 0.5 * effective_vol**2 * time_to_expiry) / (effective_vol * math.sqrt(time_to_expiry))
d2 = d1 - effective_vol * math.sqrt(time_to_expiry)
base_price = math.exp(-risk_free_rate * time_to_expiry) * (futures_price * norm.cdf(d1) - strike_price * norm.cdf(d2))
# 3. 기술적 지표(RSI, MACD)를 활용한 가격 조정 (가중치는 예시)
adjustment = 1.0
if rsi is not None:
# RSI 30 이하이면 과매도 신호로 약간 상승 효과, 70 이상이면 과매수 신호로 약간 하락 효과 적용
if rsi < 30:
adjustment += 0.02 # 약 2% 상승 조정
elif rsi > 70:
adjustment -= 0.02 # 약 2% 하락 조정
if macd is not None:
# MACD가 양수이면 상승 모멘텀, 음수이면 하락 모멘텀을 반영 (예: 0.01 배율 적용)
adjustment += 0.01 * macd
# 최종 옵션가격 산출
option_price = base_price * adjustment
return option_price
# 예시: 함수 사용
if __name__ == "__main__":
price = predict_futures_option_price(
futures_price=100.0,
strike_price=105.0,
time_to_expiry=0.5,
risk_free_rate=0.02,
historical_vol=0.25,
implied_vol=0.30,
weight_implied=0.7,
rsi=28,
macd=0.5
)
print("예측된 옵션가격:", price)
이 함수는 기본적으로 선물 옵션의 가격을 Black 모델을 사용해 계산하며, 암시적 및 역사적 변동성의 가중 평균을 효과적 변동성으로 산출합니다. 추가적으로 RSI와 MACD 같은 기술적 지표를 간단한 가중치 조정을 통해 반영하여 옵션 가격에 약간의 조정을 적용합니다.
물론 실제 적용 시에는 각 지표의 가중치나 조정 계수는 데이터 분석 및 백테스트를 통해 최적화할 필요가 있습니다.
주식 가격을 예측하기 위해 다양한 지표를 활용하여 변수를 입력받아 예측하는 함수를 Python으로 구현할 수 있습니다. 아래는 기술적 지표와 기본적 지표를 모두 고려한 예측 함수의 예시입니다.
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
def predict_stock_price(data):
"""
주식 가격을 예측하는 함수
Parameters:
- data: DataFrame, 주식의 과거 데이터와 다양한 지표를 포함한 데이터프레임
필요한 열: ['Close', 'Volume', 'PER', 'PBR', 'RSI', 'MACD', 'OBV', 'News_Sentiment']
Returns:
- predicted_price: float, 예측된 다음 날의 주가
"""
# 필요한 열이 모두 있는지 확인
required_columns = ['Close', 'Volume', 'PER', 'PBR', 'RSI', 'MACD', 'OBV', 'News_Sentiment']
for col in required_columns:
if col not in data.columns:
raise ValueError(f"데이터프레임에 '{col}' 열이 필요합니다.")
# 결측치 처리
data = data.dropna()
# 피처와 타겟 변수 정의
X = data[required_columns[1:]] # 'Close'를 제외한 나머지 열을 피처로 사용
y = data['Close'] # 'Close' 열을 타겟 변수로 사용
# 데이터 스케일링
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 모델 학습
model = LinearRegression()
model.fit(X_scaled, y)
# 가장 최근 데이터로 다음 날 주가 예측
latest_data = X_scaled[-1].reshape(1, -1)
predicted_price = model.predict(latest_data)[0]
return predicted_price
# 사용 예시
if __name__ == "__main__":
# 예시 데이터 생성
data = pd.DataFrame({
'Close': np.random.rand(100) * 100000, # 종가
'Volume': np.random.rand(100) * 1000000, # 거래량
'PER': np.random.rand(100) * 15, # 주가수익비율
'PBR': np.random.rand(100) * 3, # 주가순자산비율
'RSI': np.random.rand(100) * 100, # 상대강도지수
'MACD': np.random.rand(100) * 2 - 1, # 이동평균수렴·발산지수
'OBV': np.random.rand(100) * 1000000, # 거래량지표
'News_Sentiment': np.random.rand(100) * 2 - 1 # 뉴스 감성 지수
})
predicted_price = predict_stock_price(data)
print(f"예측된 다음 날 주가: {predicted_price:.2f}원")
이 함수는 주식의 종가(Close), 거래량(Volume), 주가수익비율(PER), 주가순자산비율(PBR), 상대강도지수(RSI), 이동평균수렴·발산지수(MACD), 거래량지표(OBV), 뉴스 감성 지수(News_Sentiment) 등의 지표를 입력으로 받아 다음 날의 주가를 예측합니다. 모델로는 선형 회귀(LinearRegression)를 사용하였으며, 입력 데이터는 표준화(StandardScaler)를 통해 스케일링하였습니다.
실제 적용 시에는 더 많은 데이터와 다양한 지표를 수집하고, 복잡한 모델(예: LSTM, GRU 등)을 활용하여 예측 정확도를 높일 수 있습니다. 또한, 뉴스 감성 지수는 자연어 처리 기법을 통해 뉴스 헤드라인이나 본문의 감성 분석을 수행하여 산출할 수 있습니다.
주가 예측은 매우 복잡한 작업으로, 다양한 요인과 불확실성이 존재하므로, 예측 결과를 투자 결정의 유일한 기준으로 삼기보다는 참고 자료로 활용하시기 바랍니다.
더 자세한 주가 예측에 필요한 핵심 변수에 대한 논의는 아래 영상을 참고하시기 바랍니다.