변동성돌파전략

jh_k·2023년 2월 7일
0

투자전략

목록 보기
6/7
import pandas as pd
df = pd.read_excel("./kospi.xlsx", engine="openpyxl",usecols=[0, 1, 2, 3, 4], index_col="Date")
# 사용할 컬럼은 ['Close','Open','High','Low']
## 변동 파생변수 
df["change"] = df['High'] - df['Low']

## 전일변동
df["전일변동"] = df['change'].shift(1)

## 목표가
df["목표가"] = df["Open"] + df['전일변동'] * 0.5
import numpy as np

# np.where(조건식, 참인경우 결과, 거짓인 경우 결과)
df["수익률"] = np.where(df['High'] >= df['목표가'], df["Close"]/df['목표가'], 1)

# 누적수익률
# 누적곱 -> cumprod()
df['누적수익률'] = df['수익률'].cumprod()
df.tail()

CAGR

누적수익률 ** (1 / (투자기간/365)) - 1
시계열데이터 활용
기간을 구할때는 (마이너스) 사용하면 기간 출력 가능

delta = df.index[-1] - df.index[0]
year = delta.days / 365
CAGR = df['누적수익률'].iloc[-1] ** ( 1 / year ) - 1
print("CAGR : ", CAGR * 100)

CAGR : 7.941722848934263

import matplotlib.pyplot as plt
import platform

plt.rc("font", family="Malgun Gothic")  

plt.figure(figsize=(14, 6))
plt.grid(True, axis='y')
plt.plot(df["누적수익률"], label = '변동성돌파')
plt.plot(df["Close"]/df['Close'].iloc[0]  ,  label="단순보유")
plt.legend()
plt.show()

MDD

## MDD 출력 -> 시각화
df['전고점'] = df['누적수익률'].cummax()
df['DD'] = (1 - df['누적수익률'] / df['전고점']) * 100
plt.figure(figsize=(16, 4))
plt.grid(True, axis='y')
plt.plot(df['DD'] * - 1)
plt.fill_between(df.index, df['DD'] * -1, alpha=0.3)
plt.show()

print("MDD : ", df['DD'].max())

MDD : 27.779726849588627

# 10일치의 이동 평균선 대입
df['MA10'] = df['Close'].rolling(10).mean()
df["매매신호"] = df["Open"] > df['MA10'].shift(1)
df["수익률2"] = np.where(
    (df['매매신호'] == 1) & (df['High'] >= df['목표가']), 
    df['Close'] / df['목표가'], 
    1
)
df['누적수익률2'] = df['수익률2'].cumprod()
df["누적수익률2"].iloc[-1]

2.1876587800244023

plt.figure(figsize=(14, 6))
plt.grid(True, axis='y')
plt.plot(df['누적수익률'], label = "변동성돌파")
plt.plot(df['누적수익률2'], label = '변동성돌파(마켓)')
plt.plot(df['Close'] / df['Close'].iloc[0] , label="단순보유")
plt.legend()
plt.show()

df['전고점2'] = df['누적수익률2'].cummax()
df['DD2'] = (1 - df['누적수익률2'] / df['전고점2']) * 100
df['DD2'].max()

10.556892232762005

plt.figure(figsize=(14, 6))
plt.grid(True, axis='y')
plt.plot(df["DD"] * -1, label="VB")
plt.plot(df['DD2'] * -1, label="VBM")
plt.legend()
plt.show()

profile
Just Enjoy Yourself

0개의 댓글