Skip to content

Instantly share code, notes, and snippets.

@sjquant
Last active October 14, 2023 00:16
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sjquant/e7a05cfa69abf9c5484c089c829905d8 to your computer and use it in GitHub Desktop.
Save sjquant/e7a05cfa69abf9c5484c089c829905d8 to your computer and use it in GitHub Desktop.
알파퀀트 튜토리얼

알고리즘 투자의 시작, 알파퀀트

왜 개인투자자들은 주식투자로 돈을 벌기 힘들까요? 기관, 외국인 투자자들에 비해 정보가 부족해서일까요? 그럴 수도 있겠지만 가장 큰 이유는 아무런 원칙과 검증없이 감에만 의존한 투자 때문입니다. 현재까지 나온 여러 논문과 자료들이 이를 뒷받침 해주고 있습니다.

반대로 생각하면 개인투자자들도 원칙있는 투자, 그리고 검증을 통한 투자를 시작하면 높은 수익을 올릴 수 있다는 의미입니다. 데이터에 기반하여 전략을 만들고, 이를 실제 과거기간에 테스트 해보고 실제 투자에 적용할 수 있다면 개인투자자들도 얼마든지 기관, 외국인 이상의 수익을 낼 수 있습니다.

하지만, 기존에는 개인투자자들이 필요한 데이터를 모으고, 시뮬레이션 시스템을 갖추기도 어려웠습니다. 알파퀀트는 이러한 복잡한 준비없이 알고리즘 제작에만 몰두할 수 있는 환경을 제공합니다. 현재 가장 쉽고 인기있는 프로그래밍 언어인 파이썬을 활용해 알고리즘을 제작해보세요. 알파퀀트는 필요한 데이터 및 시뮬레이션 시스템, 실전매매 시스템을 제공합니다. 파이썬을 모르시더라도 너무 걱정하지 마세요. 알파퀀트가 예제를 통해 쉽게 알려드립니다.

알파퀀트와 함께라면 당신도 알고리즘 투자자가 될 수 있습니다. 지금 시작해보세요.

알파퀀트 시작하기

안녕하세요 알파퀀트입니다! 알파퀀트를 사용하기 위해 설치부터 간단한 알고리즘 작성까지 알아봅시다.

알파퀀트 다운로드 및 설치하기

알파퀀트 다운로드 하러가기

알파퀀트 설치하기

다운로드가 끝나면 AlphaQuantSetup.exe파일을 실행시켜주세요. 다음과 같이 알파퀀트 설치가 진행됩니다.

알파퀀트 실행 및 로그인

알파퀀트 설치가 끝났다면 알파퀀트를 실행시켜봅시다.

알파퀀트 아이콘

위와 같은 모양의 아이콘을 실행시키면 알파퀀트가 실행됩니다.

알파퀀트를 이용하기 위해서는 로그인이 필요합니다. 회원가입을 통해 아이디를 만들어줍시다!

회원가입

로그인을 해주시면 아래와 같은 화면이 나옵니다.

알파퀀트 메인 화면

기본적으로 알파퀀트는 왼쪽의 메인 탭을 통해 에디터, 백테스팅, 트레이딩, 라이브러리, 환경설정 5가지 메인 기능을 제공합니다. 그리고, 각 메인탭의 우측에는 메인탭을 세부적으로 컨트롤할 수 있는 서브탭이 존재합니다. 각 탭을 한번씩 둘러보시는 것을 권해드립니다!

백테스팅 알고리즘 만들기

알고리즘 폴더 및 알고리즘 파일 생성하기

간단한 백테스팅 알고리즘을 만들어봅시다! 에디터탭의 알고리즘 세부탭에서는 알고리즘 폴더 또는 파일을 생성 및 관리할 수 있습니다.

우선 플러스 버튼을 눌러 알고리즘 폴더를 만들어줍니다.

알고리즘폴더생성

해당 알고리즘 폴더를 '더블클릭'하면 해당 폴더에 속한 알고리즘들을 볼 수 있습니다. 물론, 저희는 아무런 알고리즘을 만들지 않았기 때문에 해당 폴더가 비어있습니다.

골든크로스라는 이름의 알고리즘을 생성합니다. 알고리즘 유형은 백테스팅으로 선택합니다.

알고리즘 생성

만들어진 알고리즘을 더블클릭하면 아래와 같이 메인화면에 코드를 작성할 수 있는 창이 나타납니다. 알파퀀트는 백테스팅을 할 수 있는 기본 템플릿을 제공합니다. 여러분들을 기본적인 파이썬 지식만 있으시면 알파퀀트를 충분히 이용할 수 있습니다.

코드 에디터

간단한 백테스팅 알고리즘 작성하기

이제 간단한 백테스팅 알고리즘을 작성해봅시다! 현대차*골든크로스 상태일 때 20주 매수하고,*데드크로스 상태일 때 *20주 매도*하는 전략을 만들어보겠습니다.

*골든크로스란 단기 이동평균선 (여기서는 5일)이 장기 이동평균선 (여기서는 20일)을 상향돌파하는 순간 의미한다.

*데드크로스란 골든크로스의 반대로 단기 이동평균선이 장기 이동평균선을 하향돌파하는 순간을 의미한다.

class MyTrader(Trader):

    def initialize(self):
        # 시뮬레이션이 시작될 때 최초에 실행되는 함수입니다.
        # 주로 전략에 사용되는 종목이나 알고리즘을 등록할 때 사용됩니다.

        # 현대차(005380)를 `stock`으로 사용
        self.stock = stock('005380')

        # 알고리즘 등록
        # `my_algorithm`을 매일 실행한다.
        self.register_algorithm(self.my_algorithm, date_rule='every_day')

    def my_algorithm(self):
        # 메인 로직 함수
        # `initialize`에서 등록한다.
        # 5일 이동평균선과 20일 이동평균선
        ma5 = self.stock.history('close', 5).mean()
        ma20 = self.stock.history('close', 20).mean()

        # 5일 이동평균선이 20일 이동평균선보다 크고, 현재 매수한 종목이 없다면
        if ma5 > ma20 and self.positions.long_count == 0:
            # 현대차 20주 매수
            self.order(self.stock, 20)

        # 5일 이동평균선이 20일 이동평균선보다 작고, 현재 매수한 종목이 있다면
        elif ma5 < ma20 and self.positions.long_count > 0:
            # 현대차 20주 매도
            self.order(self.stock, -20)

코드 해설

코드를 하나하나씩 설명해보겠습니다. 위의 코드를 이해하신 분은 그냥 건너뛰셔도 됩니다.

우선 시뮬레이션이 시작될 때 최초로 실행되는 함수인 MyTraderinitialize를 살펴보겠습니다.

우선 먼저 알아둘 함수는 stock 함수입니다. 특정한 종목을 사용하고 싶으시다면 stock(해당종목코드)를 이용하시면 해당 종목과 관련된 Stock 객체를 리턴합니다. 아래의 코드는 현대차('005380')을 종목으로 이용하기 위해 MyT를aderstock이라는 변수에 해당종목을 등록하는 코드입니다.

self.stock = stock('005380')

다음으로 사용된 함수는 MyTrader.register_algorithm입니다. 이 함수는 알고리즘을 등록하는 함수입니다. 첫 번째 인자로는 사용될 로직 함수가, 두 번째 인자로는 date_rule 즉, 해당 알고리즘을 실행시킬 주기를 입력해주게 됩니다. 아래와 같이 매일 실행하는 알고리즘이라면 every_day를 넣어주면 됩니다. 매달 첫 째날에 실행하는 알고리즘이라면 month_start를 넣어주면 됩니다.

self.register_algorithm(self.my_algorithm, date_rule='every_day')

다음으로는 메인 로직 함수인 MyTradermy_algorithm 함수를 살펴보겠습니다. 사실 이 함수의 이름은 중요하지 않습니다. MyTraderregister_algorithm에서 사용되는 첫번째 인자와 동일하기만 하면 됩니다. 예를들어 아래와 같이 사용할 수 있습니다.

class MyTrader(Trader):

    def initialize(self):
        self.register_algorithm(self.your_algorithm)

    def your_algorithm(self):
        pass

stock(종목코드)로 리턴된 *Stock 객체는 history 함수를 사용할 수 있습니다. 이 함수는 과거 n일 간의 특정 데이터를 반환합니다. 첫 번째 인자로 데이터명, 두 번째 인자로 n일에 대한 값을 넣어줍니다. 즉, 아래의 코드는 5일/20일간의 종가를 리턴하고, 이 값들의 평균을 구한다는 의미입니다.

해당 평균을 ma5ma20에 담아줍니다.

*Stock클래스 더 자세히 알아보기

ma5 = self.stock.history('close', 5).mean()
ma20 = self.stock.history('close', 20).mean()

다음의 코드는 조금 어렵게 느껴지실 수 있지만, 굉장히 쉽습니다. MyTrader 클래스는 positions라는 상태를 가지고 있습니다. positions는 트레이더가 가지고 있는 개별 종목들에 대한 정보 (quantity, cost_per_share, ...) 및 이러한 포지션의 전반적인 정보 (long_count,및 short_count, long_value, ...) 를 가지고 있습니다.

또한 MyTrader 클래스는 주문을 위한 함수인 order 함수를 가지고 있습니다. 첫 번째 인자로는 주문하려는 주식 종목, 두 번째 인자로는 주문 수량을 넣어줍니다. 매수를 하기위해서는 +, 매도를 하기위해서는 -값을 넣어주면 됩니다.

즉, 아래의 코드는 ma5가 ma20 보다 크면서 현재 매수 포지션이 0일 때 self.stock(현대차)를 20주 매수한다는 의미입니다.

if ma5 > ma20 and self.positions.long_count == 0:
    self.order(self.stock, 20)

반대로 아래 코드보다 ma5가 ma20보다 작으면서 현재의 매수 포지션이 0보다 클 때, 20주를 매도한다는 의미입니다.

elif ma5 < ma20 and self.positions.long_count > 0:
    # 현대차 20주 매도
    self.order(self.stock, -20)

그렇다면 해당 알고리즘은 과거에 어떤 성과를 보였는지 알아봅시다.

백테스팅 알고리즘 실행하기

만들어진 알고리즘은 코드 작성창의 우착상단에 있는 실행 아이콘을 클릭하면 실제 과거 데이터를 활용해 시뮬레이션을 해볼 수 있습니다. 실행 아이콘을 누르면 세부탭이 백테스팅탭으로 넘어가면서 시뮬레이션이 진행되고, 시뮬레이션이 모두 끝나면 시뮬레이션의 결과가 성과요약에 나타납니다.

시뮬레이션 결과

결과를 확인해보니, 이 알고리즘은 실전에 활용해서는 안되겠다는 것을 확인할 수 있습니다. 누적수익률이 우하향함은 물론, 매매승률 또한 27%밖에 되지 않습니다.

결과를 보다 자세히 분석하고 싶으시다면 전체보기 아이콘을 클릭합니다. 메인탭이 백테스팅 탭으로 이동하면서, 자세한 결과를 보여줍니다. 벤치마크 수익률인 코스피, 코스닥과 전략의 성과를 비교할수도 있고, 거래내역을 확인할 수도 있습니다.

백테스팅 상세

이렇게 간단한 알고리즘을 만들어보았습니다! 시작하기에서 배운 내용을 토대로, 직접 여러 알고리즘을 만들어봅시다.

직접 알고리즘을 만들어서 테스팅 해보셨나요? 그렇다면, 더 멋진 알고리즘을 만들기 위해 다음 튜토리얼을 진행해봅시다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment