2. 해외선물/2-6. 기타자료 (파이썬 함수 등)

(파이썬) 엑셀 내용을 파이썬에서 출력하기 (1) openpyxl 활용 필요성

봄이오네 2023. 11. 13. 08:08
반응형

 

목 차
1. 들어가며
2. 사전설명
 1) 활용될 라이브러리는 openpyxl
 2) 진입 알고리즘 형태
3. openpyxl 활용의 필요성
4. 마치며

 

 

1. 들어가며

해외선물 알고리즘의 승/패를 엑셀로 계산한후 코드로 작성해야 하는 경우가 있다. 패턴 1개를 코드로 작성하는 것은 간단하다. 다만, 유사한 패턴을 여러개 작성해야 할때, 일일히 작성해 주어야 할까? 일정 명령어가 반복되는게 눈에 보이는데 일일히 작성하려면 귀찮기도 하고, 파이썬에서 코드 작성이 생각보다 오래 걸린다.

 

이 글은 필자처럼 "반복되는 명령어나 패턴"은 바로바로 파이참에서 코드로 출력하고자 하는 사람들에게 유용할 것이라 생각된다. 처음에는 관심이 없거나 생소하게 느껴질 수 있겠지만, 코드를 많이 작성하다보면 언젠가는 그 필요성을 인지하게 된다. "이런 단순하고 반복적인 일은 코드로 만들자"라고 생각하게 된다는 것이다.

 

인터넷 검색을 하면, 엑셀의 내용을 파이참에 가져오는 내용은 많다. 필자는 그런 내용에 더해서, 우리가 향후 어떻게 "엑셀내용의 파이썬 출력"할지에 대해 알아보자가 한다.

 

알고리즘을 찾는 사람들에겐 "엑셀의 파이썬 출력"의 내용이 당장 급한 내용은 아닐 것이다. 이렇게 엑셀데이터를 파이썬에서 출력할 수 있다는 정도만 알아두자.

 


2. 사전설명

1) 활용될 라이브러리는 openpyxl

우리가 활용할 라이브러리는 openpyxl이다. 판다스(pandas)를 통해서도 엑셀 데이터를 가져올 수 있지만, 여기서는 openpyxl의 라이브러를 활용해보자.

  • 활용 형태 : import openpyxl
  • 활용 방법 : 경로(dir) 지정한 엑셀 파일 활성화된 내용을 파이참에 가져온다.

 

2) 진입 알고리즘 형태

알고리즘의 형태는 if / elif 문으로 구성된다.

예를들어 현재가격의 rsi이 30보다 작고, 몸통길이가 10 이상을 나타내는 코드를 작성한다고 하면,

if self.rsi_current_0 <= 30 and \
    self.close_price_0 - self.open_price_0 >= 10:
    print("long 진입 주문을 하라")

 

위의 코드와 같이 구성될 것이다. 위의 형태를 확인해보자. 1줄의 if문 다음에 현재가격의 rsi가 30이하 이고(and), 몸통길이(종가-시가)가 10이상이면, "매수"하라는 코드이다. 1줄의 and 뒤에서 엔터(enter)을 누르면 역슬레시(\)가 나오면서 1줄과 2줄이 연결된다. 2줄 끝에는 콜론(:)을 붙여주어 if 문이 끝났다는 것을 말해준다.

 

물론 위의 코드가 실행되려면, 미리 현재가격의 rsi, 현재가격의 종가와 시가를 정의해두고, 알고리즘에서 활용될 수 있도록 미리 계산하여 메모리에 저장해 두어야 하는 것은 당연하다.

 


3. openpyxl 활용의 필요성

필자는 알고리즘을 공개할 생각은 없다. 다만, 진입 알고리즘 관련하여 여러가지를 설정해야 한다. 단순히 rsi와 몸통길이만으로 "내 피같은 투자금"을 두손모아 간절히 수익이 바라는 심정으로 진입을 할 수는 없다. 보다 정교한 상황에서 진입 알고리즘 적용 여부를 결정해야 한다.

 

openpyxl는 단순히 엑셀에서 파이참으로 데이터를 옮겨주는 것에 한정되지 않는다. 알고리즘을 만들다보면, 유사한 명령어(단어)가 지속적으로 쓰이는 것을 알 수 있다.

 

위에서 설명한 rsi 30이하 + 몸통길이 10이상을 진입 알고리즘으로 설정했다고 가정하자. 다른 알고리즘 조합은 없을까?

if self.rsi_current_0 <= 30 and \
    self.close_price_0 - self.open_price_0 >= 10:
    print("롱 주문하라")
    
elif 25 <= self.rsi_current_0 <= 27 and \
    self.close_price_0 - self.open_price_0 >= 15:
    print("숏 주문하라")

 

물론 엑셀에서 승률을 계산해보아야 하겠지만, rsi가 25~27 + 몸통길이 15이상일 때 short으로 진입하면 수입이 난다고 가정했을때, 또다시 코드를 만들것인가? 위의 코드에서 반복되는 것은 2가지(현재가의 rsi, 몸통길이)이다. 각각에 명령어에  숫자만 바뀌는 것을 알 수 있다. 이렇듯 필자는 알고리즘에 적용할 명령어와 숫자를 엑셀을 통해 계속 바꾸어보면서 승률을 계산하고 있다.

 

또다른 예를 들어보자.

필자의 경우 5~1분까지의 패턴의 길이/윗꼬리/아랫꼬리에 따라 알고리즘을 만들어서 자동매매를 돌려보았다. 뭐, 결론은 막대한 손실이었다. 그때 느낀건, 해선은 수도없이 포지션을 바꾸는데, 내가 엑셀로 계산한 승률 및 "숫자"가 시장에 영향을 받지 않고, 언제나 수익을 제공할 것인가? 전고점을 돌파하지 못하고 아래로 떨어질 것으로 예상하고 진입했는데, 말도 안되는 거래량을 수반하여 전고점을 힘있게 돌파하는 모습을 수도없이 보았다. 그때마다 계좌는 계속 손실이 나고 답답한 마음이 커진것 같다.

 

무슨 이야기를 하고 싶나?

알고리즘 하나를 만들어야겠다고 생각했고 여러 명령어(rsi, 몸통길이 등)를 사용하여 진입 알고리즘을 설정하고자 한다면, 명령어에 적용될 숫자를 세분할 필요가 있다. 바꾸어 이야기하면, rsi 30이하라고 해서 반드시 "롱"진입을 할 필요는 없다는 것이다. 예를 들어 rsi가 29이고 양봉몸통길이가 5이상일 때 얼마든지 수익이 날 수도 있다.(필자는 예시를 든 것이다. rsi < 29, 몸통길이 5이상이 수익이 난다는 보장은 없다)

 

long / short 든 수익이 난 구간이 있으면 세분하여 각각의 숫자를 확정할 필요가 있는 것이다. 이때, 세분된 명령어가 반복이 되었을때는 엑셀로 만든 데이터 조합을 openpyxl을 통해 파이썬으로 출력해서, 나의 자동매매 시스템에서 구축할 필요가 있는 것이다.

 


4. 마치며

나중에 이글을 확인하는 사용자가, 본인만의 알고리즘을 만들고 싶을때는 반드시 엑셀에서 미리 승률을 구해보도록 하자. 대부분의 조합이 45% ~ 55%의 구간내에서 승률을 기록할 것이다.

 

필자의 경우에도 여러 조합으로 엑셀을 돌려보고 있다. rsi 70~73 구간일 때, 몸통길이 혹은 아랫꼬리 길이는 얼마나 수익이 날까? 엑셀에 필터를 걸고 계속 승률을 구하고 있다. 

 

다음글부터 엑셀에서 데이터를 받아와서, 파이썬에서 출력하는 방법을 알아보자.

반응형