데이터분석/TradeOptimizer

트레이드 전략 - 위꼬리가 긴 하루 #3

스윗보스 2022. 12. 2. 14:59

트레이드 전략 - 위꼬리가 긴 하루 #3

위꼬리가 긴 하루, 세 번째입니다.

이번에는 앞에서 구한 2020년 10월의 트레이드 데이터를 집계처리합니다.
데이터 집계를 통해, 승리할 확률과, 승리했을때의 수익률을 구할 수 있습니다. 반대로 패배의 확률도 알 수 있죠. 데이터 집계를 통해 TE(Trading Edge)를 구할 수 있으며, 이를 통해 과연 사용할 만한 전략인지 고민해볼 수 있습니다.

설명에 앞서.. 또 한 번 거듭 말씀드립니다.
여기서 소개하는 트레이드 전략은 매우 위험하며, 절대 주식 투자나 종목 매매를 권장하는 글이 아닙니다. 기술적인 설명을 위한 글이며, 이 글을 참고해 발생한 투자 손실에는 그 누구도 절대 책임지지 않습니다.

먼저 승리와 패배를 정의해야 합니다. 아래와 같이 정의합니다.

  • 승리: 매도시 1% 이상 수익
  • 패배: 매도시 1% 미만 수익 또는 손실


아래와 같이 SQL을 구현합니다. 앞에 글에서 사용한 SQL을 그대로, WITH R01 AS로 묶은 다음에,
R01에 대해 집계처리하면 됩니다. 집계 처리 과정에서 CASE를 사용해 승리와 패배를 구분합니다.

WITH R01 AS(
    SELECT T2.STK_CD ,T2.DT BUY_DT ,T2.C_PRC BUY_PRC ,T2.H_L ,T2.UP_TAIL ,T2.H_L_CHG ,T2.UP_TAIL_RT
           ,T3.DT SELL_DT ,T3.C_PRC SELL_PRC
           ,ROUND((T3.C_PRC - T2.C_PRC) / T2.C_PRC * 100,2) PROF_RT # 3일후 매도시 수익률
    FROM   (
            SELECT T1.STK_CD
                   ,T1.DT
                   ,T1.C_PRC
                   ,T1.H_PRC - T1.L_PRC H_L # 고가-저가 길이
                   ,T1.H_PRC - GREATEST(T1.C_PRC,T1.O_PRC) UP_TAIL # 위꼬리 길이
                   ,ROUND((T1.H_PRC - T1.L_PRC) / T1.L_PRC * 100,2) H_L_CHG # 위꼬리 등락률
                   ,ROUND((T1.H_PRC - GREATEST(T1.C_PRC,T1.O_PRC))
                                  / (T1.H_PRC - T1.L_PRC) * 100,2) UP_TAIL_RT # 위꼬리 비율
                   ,T1.STK_DT_NO # --> 종목별일자 순번
            FROM   MYSTKDB.HISTORY_DT T1
            WHERE  1=1
            AND    T1.DT >= STR_TO_DATE('20201001','%Y%m%d')
            AND    T1.DT <  STR_TO_DATE('20201101','%Y%m%d')
            ) T2
            INNER JOIN MYSTKDB.HISTORY_DT T3 # 위꼬리 발생 3일 후 주가 데이터를 조인
               ON (T3.STK_CD = T2.STK_CD AND T3.STK_DT_NO = T2.STK_DT_NO + 3)
    WHERE   T2.H_L_CHG >= 10 # 고가-저가 등락률이 10% 이상
    AND     T2.UP_TAIL_RT >= 90 # 위꼬리 비율이 90% 이상
    ORDER BY PROF_RT DESC
    )
SELECT  COUNT(*) TRD_CNT
        ,SUM(CASE WHEN T1.PROF_RT >= 1 THEN 1 END) W_CNT
        ,ROUND(AVG(CASE WHEN T1.PROF_RT >= 1 THEN T1.PROF_RT END),2) W_PROF_RT
        ,ROUND(SUM(CASE WHEN T1.PROF_RT >= 1 THEN 1 END) / COUNT(*) * 100, 2) W_RT
        ,SUM(CASE WHEN T1.PROF_RT < 1 THEN 1 END) L_CNT
        ,ROUND(AVG(CASE WHEN T1.PROF_RT < 1 THEN T1.PROF_RT END),2) L_PROF_RT
        ,ROUND(SUM(CASE WHEN T1.PROF_RT < 1 THEN 1 END) / COUNT(*) * 100, 2) L_RT
FROM    R01 T1
;

TRD_CNT   W_CNT   W_PROF_RT   W_RT    L_CNT   L_PROF_RT   L_RT    
--------- ------- ----------- ------- ------- ----------- ------- 
28        10      7.17        35.71   18      -4.91       64.29


위 SQL을 통해 얻은 결과의 정보를 정리해보면 아래와 같습니다.

  • TRD_CNT: 매매 횟수
  • W_CNT: 승리 횟수
  • W_PROF_RT: 승리시 평균 수익률
  • W_RT: 승률
  • L_CNT: 패패 횟수
  • L_PROF_RT: 패배시 평균 수익률
  • L_RT: 패율

위 결과를 통해, 승리시 평균적으로 7.17%의 수익이 났으며, 승률이 35.71%인 것을 알 수 있습니다.
반대로 패배시 평균 수익은 -4.91%이며, 패배할 확률이 64.29%나 됩니다.
이 내용을 가지고 '터틀 트레이딩'에서 설명하는 TE(Trading Edge)를 구해보면 아래와 같습니다.

  • TE = (승리시 평균수익 * 승률) - (절댓값(패배시 평균 수익) * 패율)
  • TE = (7.17 * 35.71) - (ABS(4.91) * 64.29) = -59.62


TE가 마이너스(-59.62)라는 것은 트레이드를 할 수록 손해볼 확률이 높다는 뜻입니다.
하지만, 저희는 단지 2020년 10월에 대해서만 TE를 산출했습니다.
그러므로 가능한 많은 데이터에 위꼬리 전략을 적용해 TE를 구해볼 필요가 있습니다.
이와 관련해서는 다음 글에서 살펴보도록 하겠습니다.

끝으로, TE까지 구하는 SQL을 만들어보면 아래와 같습니다. 기존의 집계한 데이터를 한 단계 밑으로 인라인 뷰 처리한 후에 TE 고식을 적용합니다.

WITH R01 AS(
    SELECT T2.STK_CD ,T2.DT BUY_DT ,T2.C_PRC BUY_PRC ,T2.H_L ,T2.UP_TAIL ,T2.H_L_CHG ,T2.UP_TAIL_RT
           ,T3.DT SELL_DT ,T3.C_PRC SELL_PRC
           ,ROUND((T3.C_PRC - T2.C_PRC) / T2.C_PRC * 100,2) PROF_RT # 3일후 매도시 수익률
    FROM   (
            SELECT T1.STK_CD
                   ,T1.DT
                   ,T1.C_PRC
                   ,T1.H_PRC - T1.L_PRC H_L # 고가-저가 길이
                   ,T1.H_PRC - GREATEST(T1.C_PRC,T1.O_PRC) UP_TAIL # 위꼬리 길이
                   ,ROUND((T1.H_PRC - T1.L_PRC) / T1.L_PRC * 100,2) H_L_CHG # 위꼬리 등락률
                   ,ROUND((T1.H_PRC - GREATEST(T1.C_PRC,T1.O_PRC))
                                  / (T1.H_PRC - T1.L_PRC) * 100,2) UP_TAIL_RT # 위꼬리 비율
                   ,T1.STK_DT_NO # --> 종목별일자 순번
            FROM   MYSTKDB.HISTORY_DT T1
            WHERE  1=1
            AND    T1.DT >= STR_TO_DATE('20201001','%Y%m%d')
            AND    T1.DT <  STR_TO_DATE('20201101','%Y%m%d')
            ) T2
            INNER JOIN MYSTKDB.HISTORY_DT T3 # 위꼬리 발생 3일 후 주가 데이터를 조인
               ON (T3.STK_CD = T2.STK_CD AND T3.STK_DT_NO = T2.STK_DT_NO + 3)
    WHERE   T2.H_L_CHG >= 10 # 고가-저가 등락률이 10% 이상
    AND     T2.UP_TAIL_RT >= 90 # 위꼬리 비율이 90% 이상
    ORDER BY PROF_RT DESC
    )
SELECT  T2.*
        ,ROUND((T2.W_PROF_RT * T2.W_RT) - (ABS(T2.L_PROF_RT)* T2.L_RT),2) TE
FROM    (
		SELECT  COUNT(*) TRD_CNT
				,SUM(CASE WHEN T1.PROF_RT >= 1 THEN 1 END) W_CNT
				,ROUND(AVG(CASE WHEN T1.PROF_RT >= 1 THEN T1.PROF_RT END),2) W_PROF_RT
				,ROUND(SUM(CASE WHEN T1.PROF_RT >= 1 THEN 1 END) / COUNT(*) * 100, 2) W_RT
				,SUM(CASE WHEN T1.PROF_RT < 1 THEN 1 END) L_CNT
				,ROUND(AVG(CASE WHEN T1.PROF_RT < 1 THEN T1.PROF_RT END),2) L_PROF_RT
				,ROUND(SUM(CASE WHEN T1.PROF_RT < 1 THEN 1 END) / COUNT(*) * 100, 2) L_RT
		FROM    R01 T1
		) T2
;

TRD_CNT   W_CNT   W_PROF_RT   W_RT    L_CNT   L_PROF_RT   L_RT    TE       
--------- ------- ----------- ------- ------- ----------- ------- -------- 
28        10      7.17        35.71   18      -4.91       64.29   -59.62


감사합니다.