(2) 편에서 기술한 LW 전략 시뮬레이션 코드를 정리(refactoring)를 해 보겠습니다.

 

우선 class를 만드는 방법을 간단하게 기술하겠습니다. 클래스는 객체지향 언어가 등장하면서 나온 개념입니다. 클래스란 유사한 성질의 객체들을 하나로 그룹화한 것입니다.  쉽게 이야기하면 목적이 유사한 함수들을 모아놓았다고 보셔도 됩니다. 

 

파이썬에서 클래스를 사용하는 방법은 아래와 같습니다.

 

class name() :

  def __init__(self) :

      # 각종 초기화

      self.var1 = 0

  def func1(self) :

      # 함수 1

  def func2(self) :

       # 함수 2

       self.func1() # 함수 1을 부를 때

       self.var1 = 1

 

목적이 유사한 함수를 name이라는 class로 선언한 경우입니다. 여기에서 __init__(self)는 초기화를 위하여 사용되는 함수인데 항상 이름이 __init__이여야 합니다 이외에는 본인이 원하는 함수명을 추가하면 됩니다. 여기에서 self가 문제인데요. 이것도 그냥 외우고 사용하시면 됩니다. self가 사용되는 경우입니다.

 

- class 내 함수의 인자는 항상 self가 먼저 들어가야합니다.

- class 내에서 class내 함수를 부를 때는 항상 self. 으로 시작합니다.

- class 내에서 class내 변수를 사용할 때는 항상 self. 으로 시작합니다.

 

 

다음으로는 import 기능입니다. py 파일 하나에 모든 클래스와 함수가 들어가 있으면 가독성이 떨어집니다. 화면 스크롤을 하면서 소스를 봐야하는데 수 십 페이지면 특정 부분을 찾기가 힘들겠죠. 그래서 class로 만든 경우에는 대부분 별도 파이썬 파일로 분리합니다. 그리고 공통 lib의 경우에도 별도 파이썬으로 분리하면 좋습니다. 다른 프로젝트를 개발할 때 사용할 수 있으니까요.

 

이렇게 분리된 파이썬 파일은 import라는 명령어를 이용하여 불러올 수 있습니다. 

 

전편에 만든 소스를 아래와 같이 파이썬 파일 3개를 추가로 만들었습니다.

 

- my_util.py : file io와 같이 공통적으로 사용하는 함수들

- my_candle.py : candle class

- TR_LW : LW class

 

이렇게 나뉘어진 class 혹은 파일을 사용하는 경우에는 아래와 같이 import를 하면 됩니다.

 

from my_util import *
from my_candle import *
from TR_LW import *

 

기존 프로그램이 총 4개의 파일로 나뉘어졌습니다. 그럼에도 불구하고 simulation 함수의 줄 수가 너무 많습니다. 여기도 손을 좀 보겠습니다. 우선 각종 통계를 위하여 사용하는 변수가 많습니다. 이런 경우에는 통계용 변수를 위한 class를 별도로 만들어 보겠습니다.

 

그냥 class 명 하나 정하고, 사용할 변수들 이동하면 됩니다. 그리고 필요한 함수도 만들면 됩니다.

 

class sim_stat :

  def __init__(self) : # 각종 통계용 변수들 초기화

  def update_stat(self, profit) : # 트레이딩이 완료되었을 때 수익금 update

 

이렇게 클래스로 뽑으면 아래와 같이 함수 한 줄로 대체가 가능합니다. 

 

그리고 거래세 관련 부분, 시뮬레이션 중간 결과 저장하는 부분, 화면에 결과를 출력하는 부분, 결과를 파일에 저장하는 부분도 별도 함수로 뽑았습니다. 역시 복잡한 내용이 사라지고 함수 한 줄로 대체가 됩니다.

 

다음으로는 트레이딩 부분도 좀 더 재사용이 가능하게 변경하였습니다.

현재 LW 로직에서는 일봉을 대상으로 하기 때문에 매수 조건을 만족하면 당일 종가로 매도가 된다고 코딩을 했었습니다.

 

하지만 당일 종가가 아닌 다른 조건에 매도를 할 수도 있기 때문에 아래와 같이 수정하였습니다.

 

if 매수조건 :

   매수

if 사졌다면 :

   if 매도 조건이면 :

      매도 

 

현재와 같이 일봉 기준으로 당일 종가에 판다고 가정하였을 때 TR_LW class에서 매도 조건은 아래과 같이 코딩이 가능합니다.

 

def is_exit_condition(self, candle) :

 

     return candle.close

 

만약 매도 조건을 바꾼다면 이 함수에서만 수정하면 됩니다. 다른 부분은 수정할 필요가 없기 때문에 오류가 날 확률이 줄어들게 됩니다. 

 

여러 변화를 준 코드를 돌려보았습니다. 이전에  만든 프로그램과 결과가 같아야 되겠죠? 같은 결과가 나왔습니다. 이렇게 기존 코드를 수정하는 경우에는 반드시 이전과 결과가 같은지 확인을 해 보아야합니다. 이런 검증 과정도 아주 시간이 많이 걸리는데요. testcase를 이용하면 좀 더 효율적으로 변경한 코드의 정확성을 확인할 수 있습니다. 이 부분도 차후에 소개하도록 하겠습니다.

 

 

전체적인 구조가 많이 변경되었지만 프로그램 내용은 변화가 없기 때문에 이해하는데 큰 문제는 없을 것입니다.

 

아직도 class로 쪼개거나 class로 만들어야 하는 부분이 더 있습니다. 우선은 여기까지만 정리해보도록 하겠습니다.

 

다음에는 현재 개발한 LW 실행 결과를 그래프로 확인하는 과정과 성능을 개선하는 과정을 소개하도록 하겠습니다.

 

 

수정한 소스는 아래 github에 있습니다.

 

github.com/multizone-quant/System_trading_ex/tree/main

 

multizone-quant/System_trading_ex

Contribute to multizone-quant/System_trading_ex development by creating an account on GitHub.

github.com

여기에서 아래 프로그램들을 다운받으시면 됩니다.

반응형

설정

트랙백

댓글