< 4. 변동성 돌파 전략과 노이즈 상관 분석 - 상관 분석 >


1. 개요

2. 노이즈 계산

3. 평균 노이즈 계산


해당 포스트를 읽기 전에 위 포스트를 읽길 추천한다.


이번 포스트에서는 지난 포스트에서 계산했던 평균 노이즈 값들과 변동성 돌파 전략 매매의 수익율의 상관 관계를 분석할 것이다. 변동성 돌파 매매의 매수/매도 알고리즘 아래와 같다.


매수 : ( 전일 고가 - 전일 저가 ) * Scope + 시초가 <= 현재가   [ Scope : 0.2 ~ 1.4 (0.1 간격) ]

* ( 전일 고가 - 전일 저가 )가 0 이상이어야 함.

매도 :  다음 날 시초가


알고리즘에서 Scope 값이 중요하다. Scope 값은 각 종목의 구간을 6개월 단위로 쪼개 이전 단위에서 가장 많은 수익율을 주는 값을 다음 단위의 Scope 값으로 했다. 이에 대한 설명은 아래에 링크했다. 


"파이썬을 이용한 주식 변동성 돌파 전략 분석을 위한 최적화 변수 계산"


필자가 포스팅하지 않았지만 3/6/9/12/24 단위 Scope 또는 특정 상수 Scope 값으로 모두 백테스팅 해본 결과 6개월 단위 Scope 값이 가장 수익율이 높았다. 


변동성 돌파 매매의 수익율과 평균 노이즈 값의 상관 관계 분석 코드에 대해 알아보자. 추가로 해당 데이터의 분포를 알기 위해 산점도를 그리는 코드도 추가했다. 


먼저 DB 관련 코드이다. "select_noise_profit_data()" 가 수익율과 평균 노이즈 값 데이터를 불러온다.

from sqlalchemy import create_engine import pymysql pymysql.install_as_MySQLdb() import pandas as pd import logging as log class StockDB(object): # 싱글톤 패턴 _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = object.__new__(cls) return cls._instance return cls._instance def __init__(self, password): log.info("Connecting database.....") try: self.engine = create_engine("mysql+mysqldb://root:"+password+"@localhost/stock", encoding='utf-8') self.conn = pymysql.connect(host='localhost', user='root', password=password, db='stock', charset='utf8') self.cursor = self.conn.cursor() except Exception as e: log.warning("Connecting database Error : {}".format(repr(e))) def select_noise_profit_data(self, market, profit_type, noise_type): log.info("Selecting market all data....") sql = "select pft.Profit, Nos.Noise from " \ "(select Code, Date, Profit from "+market+"_profit_"+profit_type+") as pft " \ "join (select * from "+market+"_noise_"+noise_type+") as Nos on pft.Code=Nos.Code and pft.Date=Nos.Date;" try: data = pd.read_sql(sql, self.conn) except Exception as e: log.info("Selecting market all data Error : {}".format(repr(e))) return data


다음은 수익율과 평균 노이즈 값을 불러오는 데 사용한 sql 문이다. 코스피 종목들의 변동성 돌파 매매 수익율 테이블과 6개월 평균 노이즈 값 테이블을 조인한다. 조인 조건은 코드와 일자다. 따라서 각 수익율 데이터에 노이즈값이 붙여진다. 

select pft.Profit, Nos.Noise, pft.Code, pft.Date from 
(select Code, Date, Profit from kospi_profit_6) as pft join 
(select * from kospi_noise_6) 
as Nos on pft.Code=Nos.Code and pft.Date=Nos.Date;


다음은 DB에서 불러온 데이터로 상관 관계를 계산하고 데이터 분포를 산점도로 출력하는 코드이다. corr() 메서드가 상관 관계를 계산한다. market과 profit_type, noise_type을 각 60, 40으로 하면 코스피 종목들의 변동성 돌파 매매 수익율과 40일 평균 노이즈 값을 대상으로 연산을 수행한다. 변동성 돌파 매매의 Scope는 6개월 단위 최적 값으로 한다. 

import logging as log
import pandas as pd
import StockDB as db
import sys
import matplotlib.pyplot as plt

log.basicConfig(stream=sys.stdout, level=log.DEBUG)

market = "kosdaq"
profit_type = "6"
noise_type = "40"



dB = db.StockDB("qhdks12#$")

data = dB.select_noise_profit_data(market, profit_type, noise_type)

print(data.corr())

plt.scatter(data['Noise'],data['Profit'])
plt.xlabel("Noise")
plt.ylabel("Profit")
plt.show()


아래는 결과로 나온 산점도다.  

상관성은 -00458이 나왔다. 전혀 상관성이 없다. -0.1도 안 된다. 그런데 생각해 보면 당연한 것이였다. 혹시 몰라서 이전 포스트에서 구했던 평균 노이즈 값에 대해 모두 계산해 봤고 코스피, 코스닥 종목에 대해서 각각 적용했다. 결과는 똑같았다. 기초적인 상관 분석은 x와 y 두 변수 사이에 비례 관계를 파악한다. 그런데 노이즈 값과 수익율 사이에 비례 관계가 있을까? 애초에 주가가 얼마나 올라갈 지 특정 값으로 예측한다는 건 불가능했다. 


최종 결과, 변동성 돌파 매매 수익율과 평균 노이즈 값 사이에 뚜렷한 상관관계는 전혀 보이지 않았다. 


그렇다고 변동성 돌파 매매 하는 데 노이즈 값이 전혀 상관 없을까? 그래서 특정 노이즈 값에 따라 그날 주식이 양봉일지 음봉일지 조금의 경향성이 있지 않을까 하는 약간의 희망을 가지고 이를 분석해볼 예정이다. 결과는 다음 포스트에 코드와 함께 게재하겠다.




참고로 필자는 컴퓨터 공학과를 재학 중인 대학생입니다. 따라서 코드가 완벽할 수 없습니다. 알고리즘이나 코드가 비효율적이거나 오류가 있다면 댓글 달아주세요..

+ Recent posts