약 42만원 수익. 지난달 입금총액 기준으로 약 1.2% 수익이다.
현재 유례없는 대폭락이 이어지고 있는데 그 와중에도 수익이 났다는게 신기하다. 보유중인 종목들은 전체 평균 -20%정도인데 어차피 수익이 날때까지 추가매수하며 존버하는 전략이기 때문에 그닥 상관은 없다. 오히려 최악의 컨디션에서 이 전략을 실험할 수 있기 때문에 기대가 되기도 한다.

이제 수동매매는 중지하고 자동매매에 올인하기로 했다.
느리더라도 이게 가장 안전하고 확실한 방법이라고 생각되기 때문이다.

19만원 정도의 수익이 발생했는데, 원래 소액으로 테스트하다가 월말에 자금을 이쪽으로 대부분 옮겼기 때문에 수익금은 큰 의미가 없다. 또한 월급날마다 계속 자금을 충원할 생각이기 때문에 정확한 수익률 산정이 힘든데, 보통 1회 수익에 원금의 0.5% 정도 수익으로 보고 있다.

이번달 수익이 발생한 횟수가 총 6회이므로 약 3% 정도 수익으로 계산하면 될 것 같다.

수익금 : 5696원
수익률 : 2.8%

완전 방치한 것 치고는 괜찮은 수익률인것 같다.


원금이 20만원 이므로 약 1.6% 수익이다. RSI를 기준으로 종목을 수집하고, 해당종목이 매수 기준에 진입하면 매수하는 방식이기 때문에 수익 발생까지 시간이 걸린다. 테스트 용이기는 하나 시드가 너무 적은 것 같기도 하다. 현재는 좀 더 빠른 회전을 위해 3월보다 매도 목표가를 낮췄다.


신용몰빵은 무조건 먼저 지고 들어가는 게임이다. 미수는 말할 것도 없다.

조금의 등락에도 자본금이 크게 요동치는 데다가 결국 크게 오르더라도 당일날 조금이라도 떨어진 상태로 마무리되면 반대매매의 압박때문에 잠도 편하게 못자고, 다음날 결국 손해를 보고 청산하게 된다.

심리적으로 절대 이길 수가 없다.

나는 7년전 처음 들었던 주식강의에서 이 신용몰빵하는 것만 잘못 배운 바람에 많은 손해를 봤다. 신용몰빵 했을 경우 10에 9은 손실을 봤던 것 같다.

그러나 신용과 현금매수를 적절히 섞어서 절대 안전한 종목의 안전한 위치에서만 나눠서 매수하면 강력한 무기가 된다.
물론 이것은 단기 차트매매의 경우이고, 신용매수는 기한이 정해져있고 이자도 발생하기 때문에 장기투자에는 적합하지 않다. 나 또한 현재는 현금매수만 하고 있다.

가급적 신용매수는 사용하지 말고, 반드시 분산투자 분할매수하자.


현재 사용중인 자동매매 알고리즘이 어떻게 하면 최적의 효율을 낼 수 있을지 분석하기 위해 백테스트를 진행했다.

일주일동안 500여 종목에 대한 2~3년치의 일봉 데이터를 쌓고, 현재 매매 알고리즘을 대략적으로 적용할 경우 수익률이 어떻게 나오는지를 다양하게 테스트했다. 물론 백테스트는 백테스트일 뿐, 실제 매매할때 상황과 완벽하게 맞아 떨어지는 것은 아니다. 하지만 구체적인 수치들에 대한 설정이나, 대략적인 수익률이 어느 정도 발생할 지 참고할 수는 있을 것이다.

 

2020년, 2021년 2년치에 대한 백테스트를 진행했다.

각각의 idx는 다음과 같다.

2020년 : 521-274

2021년 : 273-25

 

원금은 2500만원, 1회 매수 50만원, 최대 7분할 매수로 설정했다.

 

각각의 필드명은 다음과 같다.

idx   date   deposit   bought_money   use_money   stock_cnt   multi   oom

 

5% 15종목제한 MA20,60,120증가 이평선간격늘어남60->120 등락률10%이상 변동oom
26 20211230 37778763 37040683 738080 13 55  (2년간 51.1%)

10% 7종목제한
275 20201229 31606330 9250765 22355565 7 19  (26.4%)

타겟10% 10종목제한 최대멀티3
275 20201229 30147942 19636680 10511262 10 40  (20.6%)

10% 15종목제한
275 20201229 28974365 20162335 8812030 15 42  (15.9%)

10% 7종목제한 MA20,60증가
275 20201229 31507067 11318130 20188937 7 23  (26%)

10% 7종목제한 MA20,60,120증가
275 20201229 31361305 10846012 20515293 7 22  (25.4%)

10% 15종목제한 MA20,60,120증가
275 20201229 33072134 21496713 11575421 15 44  (32.3%)

10% 15종목제한
26 20211230 29240633 28762893 477740 15 5   (17%)

10% 15종목제한 이평선간격늘어남60->120
26 20211230 30160910 29815721 345189 15 12  (20.6%)

10% 15종목제한 MA20,60,120증가 이평선간격늘어남60->120
275 20201229 32875908 19595650 13280258 15 40  (31.5%)
26 20211230 31627747 31363168 264579   14 64  (26.5%)

15% 10종목제한 MA20,60,120증가 이평선간격늘어남60->120
26 20211230 29208559 23585850 5622709     10 48  (16.8%)

15% 15종목제한 MA20,60,120증가 이평선간격늘어남60->120 등락률10%이상
275 20201229 34656391 21844459 12811932 15 45  (38%)
26 20211230 33161142 27630642 5530500     15 57  (32%)

15% 15종목제한 MA20,60,120증가 이평선간격늘어남60->120 등락률15% 이상
26 20211230 31879257 29282641 2596616 15 60  (27.5%)

15% 15종목제한 MA20,60,120증가 이평선간격늘어남60->120 등락률10%~15% 사이
26 20211230 32328737 26383206 5945531 12 54  (29.3%)

15% 20종목제한 MA20,60,120증가 이평선간격늘어남60->120
26 20211230 32480633 32351040 129593 20 3   (29.9%)

20% 15종목제한 MA20,60,120증가 이평선간격늘어남60->120
275 20201229 36082559 23053236 13029323 15 47  (44.3%)
26 20211230 32877406 30803132 2074274     15 63  (31.5%)

25% 15종목제한 MA20,60,120증가 이평선간격늘어남60->120 등락률10%이상 변동oom [2년]
274 20201230 37082174 28222214 8859960 15 47 741643 (48.3%)
26 20211230 48814882 48172984 641898 15 59 976297 (31.6%)


이 중에서 현재 채택한 설정은 아래와 같다.


15% 15종목제한 MA20,60,120증가 이평선간격늘어남60->120 등락률10%이상 변동oom [2년]
274 20201230 35728670 28874304 6854366 15 47 714573 (42.9%)
26 20211230 48676602 46605150 2071452 15 54 973532 (36.2%)

 

위까지의 테스트들은 모두 보수적으로 잡기 위해 종가를 기준으로 목표가를 넘었을 때 매도하도록 했다.

채택한 설정을 고가 기준으로 다시 테스트한 결과는 아래와 같다.

 

15% 15종목제한 MA20,60,120증가 이평선간격늘어남60->120 등락률10%이상 변동oom high매도 [2년]
274 20201230 38838997 24360498 14478498 15 39 776779  (55.3%)
26 20211230 58426438 55466610 2959828     15 57 1168528 (50.4%)

 

아래는 테스트 결과를 해석하면서 느낀 부분들이다.

 

추가매수를 적용하는 것이 좋다.

종목수 제한을 거는 편이 좋다.

종목수 제한을 7에서 15로 늘리니 이평선 증가가 의미가 있다. (특히 120)

60-120이평선간격늘어남은 약간의 효과가 있다. 포착종목이 너무 많이 발생하기 때문에 필터링으로서의 의미도 있다.

 

목표가는 기존처럼 짧은것보다 10%이상으로 잡는게 좋다. 특히 2020년 같은 대세 상승장의 경우 목표가는 25% 이상 높을수록 수익률이 높았다. 하지만 2021년의 경우 목표가가 15%일때보다 20%일때가 수익이 줄었다. 2021년은 상반기는 상승이 정점에 달하고 하반기는 하락을 시작한 시기이다. 균형적으로 10~15%가 적당한 것 같다.

 

올해 2022년은 기준금리 인상으로 대세하락이 예상되는 해이다. 백테스트 데이터를 더 쌓아서 대세하락장에 대한 테스트를 진행할 필요가 있다.


이번달엔 한국투자증권 API로 자동매매를 구축해서 지금 소액으로 테스트 중입니다. 개발하면서 몇 가지 난관도 있었는데 그 중 하나가 자동로그인 입니다. 시행착오는 있었지만 증권사에 메일로 문의를 하면 하루 뒤에 답변을 잘 해주는 편이라 무사히 완성했습니다.

자동로그인 기능이 없는지 문의를 했더니 보안때문에 그런 기능은 제공하지 않지만 pywinauto 라는 걸 통해서 직접 구현이 가능하다는 답변을 들었습니다. 덕분에 유용하고 재미있는 모듈을 알게 됐네요. 다른 작업시에도 유용하게 쓸수 있을 것 같아 공유해볼까 합니다.

간단히 말하면 윈도우 프로그램을 실행하고 제어할 수 있는 모듈입니다. 구글에 검색하면 노트패드를 열어서 글자를 입력하는 등의 예시가 나와 있습니다. 이것을 이용해서 한투 eFriend Expert를 실행하고 패스워드를 입력해서 로그인 하는데 성공했습니다.

먼저 pywinauto를 인스톨 해 주세요.

pip install pywinauto


파이썬 파일을 만들고 아래와 같이 코드를 작성해 줍니다. 제 경우는 ExpertLogin.py 라는 파일을 생성했습니다.

from pywinauto import Application  # pywinauto가 import 되어 있으면 API 실행 멈춤. 로그인과 API 실행을 분리해야 함.
from PyQt5.QtTest import *
import psutil

class Main:
    def __init__(self):

        # Check if any chrome process was running or not.
        # import psutil
        # if self.checkIfProcessRunning('chrome'):

        chkHantuRunning = self.checkIfProcessRunning('efexpert')
        if chkHantuRunning:
            print('한투 트레이 아이콘이 실행중입니다. (efexpert) ')
        else:
            # pywinauto를 통한 자동로그인
            # https://pywinauto.readthedocs.io/en/latest/index.html
            # pip install pywinauto
            # from pywinauto import Application
            app = Application(backend="win32").start("C:\eFriend Expert\efriendexpert\efriendexpert.exe")
            dlg = app.window(title_re=".* efriendexpert.exe(32비트)")
            # 실행하면 에러와 함께 dict_keys 값들이 표시됨. 작업관리자 해당 앱의 sub 메뉴에서 확인 가능
            # dict_keys(['Dialog', 'eFriend Expert 로그인', 'eFriend Expert 로그인Dialog'])' => eFriend_Expert_로그인 같이 입력하면 됨.
            QTest.qWait(500)  # 0.5초 시간지연. 안줘도 작동 잘 됨.
            app.eFriend_Expert_로그인.type_keys('자신의 로그인 패스워드 직접입력')
            app.top_window().type_keys("{TAB}")
            QTest.qWait(500)
            app.eFriend_Expert_로그인.type_keys('자신의 공인인증서 패스워드 직접입력')
            app.top_window().type_keys("{ENTER}")

    # 프로그램 작동여부 체크
    def checkIfProcessRunning(self, processName):
        '''
        Check if there is any running process that contains the given name processName.
        '''
        # Iterate over the all the running process
        for proc in psutil.process_iter():
            try:
                # Check if process name contains the given name string.
                if processName.lower() in proc.name().lower():
                    return True
            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                pass
        return False

if __name__ == "__main__":
    Main()


주석에 있는 url로 접속하시면 pywinauto 사용법 가이드를 보실 수 있습니다. 한 가지 주의할점은 pywinauto가 import 되어 있는 파일에서 API TR요청을 하면 멈춰버리더군요. 따라서 로그인 하는 파일과 TR 요청하는 파일은 따로 분리해서 작성하셔야 합니다.

내친 김에 psutil을 사용해서 이미 로그인했으면 중복실행하지 않는 코드도 추가했습니다. 로그인 하는 파일을 분리해서 작성하고, 보통 로그인은 한 번만 실행할테니 굳이 필요하지는 않습니다만 사용하실 분들은 psutil도 인스톨해 주세요.

로그인 시 관리자 권한으로 실행해야 합니다. 파이참으로 실행해 보실거라면 파이참을 관리자권한으로 실행해 주시고, 여기서는 위 파일을 관리자권한으로 실행하는 배치파일을 작성해보겠습니다.

윈도우에서 텍스트 파일을 하나 생성하고 확장자를 bat로 저장해 주세요. 저는 hantuLogin.bat 라는 파일을 작성했습니다. 파일 안에 아래와 같이 코드를 작성해 주세요.

@ECHO ON
title Hantu Login

:: BatchGotAdmin
:------------------------------------- 
REM --> Check for permissions 
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" 

REM --> If error flag set, we do not have admin. 
if '%errorlevel%' NEQ '0' ( 
	echo Requesting administrative privileges... 
	goto UACPrompt 
) else ( goto gotAdmin ) 

:UACPrompt 
	echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
	set params = %*:"="" 
	echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs" 

	"%temp%\getadmin.vbs" 
	del "%temp%\getadmin.vbs" 
	exit /B 
:gotAdmin 
	pushd "%CD%" 
	CD /D "%~dp0" 
:--------------------------------------

c:
cd C:\작성한파일이있는디렉토리경로입력


call activate 아나콘다가상환경이름입력
python ExpertLogin.py


실행하면 아래와 같이 로그인 되는 것을 볼 수 있습니다.

위에서 작성한 배치파일을 윈도우 작업 스케줄러에 등록해서 아침마다 자동 로그인 되도록 하시면 됩니다.

한투API로 개발을 해보니 몇 가지 장단점이 있더군요.

먼저 가장 치명적인 단점은 HTS 종목 조건검색 결과를 가져오는 기능을 제공하지 않습니다. 메일로 건의해 보았지만 제공은 어렵다는 답변을 받았습니다. 할 수 없이 다른 증권사 API에서 검색한 결과를 가져와서 사용하도록 했습니다. 그 외에도 신용 매수시에 자기융자, 유통융자 구분 코드값을 입력해야 하는데 해당 종목의 구분코드값을 조회하는 기능이 없는 등 허술한 부분도 있습니다.

장점은 속도가 무진장 빠릅니다. 요청속도에 사실상 제한이 없습니다. 10msec 이내에 TR을 연속 요청하면 호출제한이 걸린다고 레퍼런스 가이드에 써 있어서 지연시간을 넣긴 했는데 0.01초니 사실상 제한이 없다고 봐도 좋을 듯 합니다.

그럼 유용하게 사용하시고 새해 복 많이 받으세요.

'주식 > 증권사 API 개발' 카테고리의 다른 글

크레온 총매입단가, 수익률 계산방법  (0) 2023.01.26
백테스트 결과  (0) 2022.02.11

+ Recent posts