2021. 6. 13. 20:51ㆍFinancial Analysis
또다른 트레이딩 전략으로 주식 현황을 보다 앞서서 예측할 수 있는 '반전 매매 기법'을 구현해보자.
반전 매매 기법의 지표 중 하나인 일중 강도(Intraday Intensity)이다.
What is the Intraday Intensity Index
The Intraday Intensity Index is a volume based technical indicator that integrates volume with a security’s price. Traders can use the Intraday Intensity Index to follow how intraday highs and lows are moving with volume in comparison to the previous day’s closing price.
일중 강도(II)는 거래량과 가격을 통합한 지표로서, 주식 종목의 자금 흐름을 나타낸다.
- 일중 강도 = {(2 * 종가 - 고가 - 저가) / (고가 - 저가)} *거래량
- 일중 강도율 = (21일 간의 일중 강도 합 / 21일간의 거래량 합) * 100
일중 강도율은 종가가 거래 범위 천정권에 가까우면 1, 중간이면 0, 바닥권에 가까우면 -1에 근접한 값을 나타낸다.
반전 매매 기법에서는 주가가 하단 밴드에 가까우면서 일중 강도율이 양수(+)이면 매수하고
그에 반대(주가 ≒ 상단밴드 & 일중 강도율 < 0)되면 매도하는 전략이다.
import matplotlib.pyplot as plt
class reversalStrading():
def __init__(self, company, start_date):
###자동 매매를 위한 변수 공간
def calc_II(self, df):
df['II'] = (2*df['close'] - df['high'] - df['low']) / (df['high'] - df['low']) *df['volume']
df['IIP21'] = df['II'].rolling(window=21).sum()/df['volume'].rolling(window=21).sum()*100
df = df.dropna()
return df
def show_II_chart(self, df):
plt.bar(df.index, df['IIP21'], color='g', label = 'II% 21days')
plt.grid(linestyle='dotted')
plt.legend(loc='best')
볼린저 밴드 모듈에서 데이터프레임을 가져와서 일중강도와 일중강도율을 계산하는 함수와, 일중 강도 차트를 그리는 함수를
구현하였다. 이를 기반으로 매매를 진행하는 코드를 구현하자.
def __init__(self, company, start_date):
self.buy_tim = []
self.sell_tim = []
self.account = 1000000
self.stock = 0
self.profit = 0
.
.
.
def rev_trading(self, df):
for i in range(0, len(df.close)):
if df.PB.values[i] < 0.05 and df.IIP21.values[i] > 0:
self.buy_tim.append(df.index.values[i])
self.account -= df.close.values[i] * 1
self.stock += 1
print(f"[{df.index.values[i]}] 체결완료 - 매수가 : {df.close.values[i]} (원)"
f" | 체결 수량 : 1 | 총 {self.stock} 주")
if df.PB.values[i] > 0.95 and df.IIP21.values[i] < 0:
self.sell_tim.append(df.index.values[i])
if self.stock == 0:
continue
print(f"[{df.index.values[i]}] 체결완료 - 매도가 : {df.close.values[i]} (원)"
f" | 체결 수량 : {self.stock} 주")
self.account += df.close.values[i] * self.stock
self.stock = 0
if i == len(df.close)-1:
if self.stock == 0:
self.profit = self.account - 1000000
print('반전 매매 기법 총수익률 : ', self.profit, " (원)")
continue
print(f"[{df.index.values[i]}] 체결완료 - 매도가 : {df.close.values[i]} (원)"
f" | 체결 수량 : {self.stock} 주")
self.account += df.close.values[i] * self.stock
self.stock = 0
self.profit = self.account - 1000000
print('반전 매매 기법 총수익률 : ', self.profit," (원)")
def show_rev_trading_chart(self, df):
plt.plot(self.buy_tim, df.loc[self.buy_tim]['close'], 'r^')
plt.plot(self.sell_tim, df.loc[self.sell_tim]['close'], 'bv')
plt.grid(linestyle='dotted')
plt.legend(loc='best')
plt.xticks(rotation=45)
if df.PB.values[i] < 0.05 and df.IIP21.values[i] > 0:
self.buy_tim.append(df.index.values[i])
__init__ 함수에 가상 매매를 위한 변수를 추가해주고, %b가 0.05 미만(하단 밴드를 두드릴 때)임과 동시에 일중 강도율이
1을 넘어설 경우 매수를 진행한다.
if df.PB.values[i] > 0.95 and df.IIP21.values[i] < 0:
self.sell_tim.append(df.index.values[i])
반대로 %b가 1에 매우 근접하며 일중강도율이 0 미만일 경우 매수한다.
그리고 반전 매매 기법에 따른 매수 매도 시그널을 표시한 차트를 출력하는 함수도 추가한다.
company = "SK하이닉스"
start_date = '2018-06-01'
bB = bollingerBand()
df = bB.get_bollinger_band(company, start_date)
tf = trading_following(company, start_date)
df = tf.calc_mfi()
tf.trading_follow(df)
rt = reversalStrading(company, start_date)
df = rt.calc_II(df)
rt.rev_trading(df)
plt.subplot(3, 1, 1)
bB.show_bollinger_chart(df,company)
rt.show_rev_trading_chart(df)
plt.subplot(3, 1, 2)
bB.show_pb_chart(df, 100)
tf.show_MFI_chart(df)
plt.subplot(3, 1, 3)
rt.show_II_chart(df)
plt.tight_layout()
plt.show()
매수 시그널은 별로 나오지 않고, 매도 시그널만 많이 나온다. 아무래도 rev_trading 함수에 구현된 매수 조건에 만족하기가
어렵기 때문이다.
[2020-09-24] 체결완료 - 매수가 : 84300 (원) | 체결 수량 : 1 | 총 12 주
[2020-11-02] 체결완료 - 매도가 : 79600 (원) | 체결 수량 : 12 주
[2020-11-16] 체결완료 - 매수가 : 98000 (원) | 체결 수량 : 1 | 총 1 주
[2020-11-17] 체결완료 - 매수가 : 98100 (원) | 체결 수량 : 1 | 총 2 주
[2020-11-18] 체결완료 - 매수가 : 98000 (원) | 체결 수량 : 1 | 총 3 주
[2020-11-19] 체결완료 - 매수가 : 98200 (원) | 체결 수량 : 1 | 총 4 주
[2020-11-20] 체결완료 - 매수가 : 96800 (원) | 체결 수량 : 1 | 총 5 주
[2020-11-23] 체결완료 - 매수가 : 100000 (원) | 체결 수량 : 1 | 총 6 주
[2020-11-24] 체결완료 - 매수가 : 98600 (원) | 체결 수량 : 1 | 총 7 주
[2020-12-02] 체결완료 - 매수가 : 109000 (원) | 체결 수량 : 1 | 총 8 주
[2020-12-03] 체결완료 - 매수가 : 111500 (원) | 체결 수량 : 1 | 총 9 주
[2020-12-04] 체결완료 - 매수가 : 115000 (원) | 체결 수량 : 1 | 총 10 주
[2020-12-07] 체결완료 - 매수가 : 118000 (원) | 체결 수량 : 1 | 총 11 주
[2020-12-09] 체결완료 - 매수가 : 120500 (원) | 체결 수량 : 1 | 총 12 주
[2021-06-03] 체결완료 - 매수가 : 129000 (원) | 체결 수량 : 1 | 총 13 주
[2021-06-11] 체결완료 - 매도가 : 128000 (원) | 체결 수량 : 13 주
추세 추종 매매 기법 총수익률 : 105600 (원)
[2018-12-06] 체결완료 - 매수가 : 66000 (원) | 체결 수량 : 1 | 총 1 주
[2018-12-10] 체결완료 - 매수가 : 65500 (원) | 체결 수량 : 1 | 총 2 주
[2019-06-26] 체결완료 - 매도가 : 68900 (원) | 체결 수량 : 2 주
[2019-08-06] 체결완료 - 매수가 : 72000 (원) | 체결 수량 : 1 | 총 1 주
[2019-09-04] 체결완료 - 매도가 : 80000 (원) | 체결 수량 : 1 주
반전 매매 기법 총수익률 : 14300 (원)
추세 추종 매매 기법과 반전 매매 기법의 수익률 차이를 비교해보았다.
트레이딩 전략에 따라 매수/매도 시그널을 상이하게 판단하기 때문에 여러 전략을 적절히 배합하는 것이 중요하다.
'Financial Analysis' 카테고리의 다른 글
5-2. [트레이딩 전략 구현] 심리투자 법칙 : 삼중창매매시스템 (3) | 2021.06.19 |
---|---|
5-1. [트레이딩 전략 구현] 심리투자 법칙 : 시장지표 (0) | 2021.06.14 |
4-2. [트레이딩 전략 구현] 볼린저 밴드 매매 기법 : 추세 추정 매매 기법 (0) | 2021.06.13 |
4-2. [트레이딩 전략 구현] 볼린저 밴드 지표 : %b, 밴드폭(bandwidth) (0) | 2021.06.13 |
4-1. [트레이딩 전략 구현] 볼린저 밴드 지표 (0) | 2021.06.13 |