장대양봉, 많이 사는 주식을 따라사면 얼마나 벌까?

작성자: [관리자] 하얀설표

2025.04.20 17:36 (KST) 작성됨

2025.05.23 13:20 (KST) 수정됨






(05.23) 수정됨.

추세추종

주식시장이 내렸다고 하더라도 오르는 주식을 오르고, 주식시장이 상승세라고 하더라도 내리는 주식은 내려간다.

그렇다면 오르는 주식만 골라서 따라산다면 어떻게 될까?

 

테스트해보자

먼저 다음과 같이 종목별 주식 시세 데이터를 가져오고, 루프를 돌리며 로직을 대입할 코드를 만들었다.

거래량이 없는 날의 데이터는 거래정지일 가능성이 있으니 제외한다.

상한가(30%) 또는 하한가(-30%)인 경우에도 매수나 매도가 어려우니 별도로 전달한다.

 

상하한가의 최대폭이 15%에서 30%로 확대된 것은 2015년이니 2015년 이전 데이터에는 적용할 수 없다.

from datetime import datetime

from tqdm import tqdm

from .logic import Logic


data = {주식 시세 데이터 가져오기}

code_log: dict[str, dict] = {}
for code, price_list in tqdm(data.items(), desc='로직 적용'):
    L = Logic()
    stat = 'watch'
    code_log[code] = {}
    for i in price_list:
        if not i['volume']:
            continue

        signal = L.check(
            Open=i['open'],
            high=i['high'],
            low=i['low'],
            close=i['close'],
            volume=i['volume'],
            rate=i['rate'],
            is_upper=(28 < i['rate']),
            is_lower=(i['rate'] < -28),
        )
        if stat != 'hold'and signal == 'buy':
            stat = 'hold'
            key = i['date']
            code_log[code][key] = {'매수일': key, '매수가격': i['close'], '매도일': '', '매도가격': 0, '수익률': 0}
        elif stat == 'hold' and signal == 'sell':
            stat = 'watch'
            code_log[code][key]['매도일'] = i['date']
            code_log[code][key]['매도가격'] = i['close']
            code_log[code][key]['수익률'] = round(
                (i['close'] - code_log[code][key]['매수가격']) * 100 / code_log[code][key]['매수가격'],
                2
            )

result: dict[str, list[str, any]] = {}
for k, v in code_log.items():
    value = [i for i in v.values() if i['매도가격']]
    if value:
        result[k] = value


rate_take = []
rate_cut = []
for n, (code, v) in enumerate(result.items(), 1):
    print(f'{n}. {code}')
    for n, i in enumerate(v, 1):
        print(f'    {n}. {i}')

        if i['매도가격']:
            if 0 < i['수익률']:
                rate_take.append(i['수익률'])
            else:
                rate_cut.append(i['수익률'])

count_take = len(rate_take)
count_cut = len(rate_cut)

text= f"""
이익을 본 횟수 : {count_take:,}
평균 이익률 : {round(sum(rate_take) / count_take, 2)}%
최대 이익률 : {max(rate_take)}%

손실을 본 횟수 : {count_cut:,}
평균 손실률 : {round(sum(rate_cut) / count_cut, 2)}%
최대 손실률 : {min(rate_cut)}%

성공률 : {round(count_take * 100 / (count_take + count_cut), 2)}%
"""
print(text)

 

조건 1

간단하게 등락률 20% 이상, 거래량 1천만 주 이상인 종목을 매수하고 손실이 10%가 넘으면 손절, 이익이 20%가 넘으면 익절을 하도록 해보았다.

class Logic:
    """
    등락률 20% 이상인 경우 매수 신호를, 기준에 맞춰 매도 신호를 보냅니다.
    """
    price_take = 0
    price_cut = 0

    def need_buy(self, Open, high, low, close, volume, rate, is_upper, is_lower):
        if Open < close:
            # 매수
            if not is_upper and 20 <= rate and 10_000_000 <= volume:
                return True
        return

    def need_sell(self, Open, high, low, close, volume, rate, is_upper, is_lower):
        # 손절
        if not is_lower and self.price_cut and close < self.price_cut:
            return True
        # 익절
        if self.price_take and self.price_take < close:
            return True
        return

    def check(self, Open, high, low, close, volume, rate, is_upper=False, is_lower=False):
        args = (Open, high, low, close, volume, rate, is_upper, is_lower)
        if (
            not is_lower
            and self.need_sell(*args)
        ):
            self.price_cut = 0
            self.price_take = 0
            return 'sell'
        if (
            # 상한가가 아닐 것(매수가 가능할 것)
            not is_upper
            and self.need_buy(*args)
        ):
            self.price_cut = round(close * 0.9)
            self.price_take = round(close * 1.2)
            return 'buy'
        return

 

조건 1 결과

대참사가 났다.

전체 거래는 3천 회 정도가 나왔는데, 이익을 본 횟수가 그 절반도 되지 않았다.

>>
...
1211. 212710
    1. {'매수일': '2025-02-12', '매수가격': 22500, '매도일': '2025-02-14', '매도가격': 16930, '수익률': -24.76}
1212. 303810
    1. {'매수일': '2025-02-18', '매수가격': 15330, '매도일': '2025-02-24', '매도가격': 13070, '수익률': -14.74}
1213. 463480
    1. {'매수일': '2025-02-20', '매수가격': 17610, '매도일': '2025-02-21', '매도가격': 21000, '수익률': 19.25}
    2. {'매수일': '2025-03-05', '매수가격': 13280, '매도일': '2025-03-06', '매도가격': 11220, '수익률': -15.51}
1214. 031210
    1. {'매수일': '2025-03-14', '매수가격': 32000, '매도일': '2025-03-19', '매도가격': 37400, '수익률': 16.88}
1215. 098070
    1. {'매수일': '2025-03-20', '매수가격': 26400, '매도일': '2025-03-21', '매도가격': 30450, '수익률': 15.34}
1216. 444530
    1. {'매수일': '2025-04-16', '매수가격': 15660, '매도일': '2025-05-12', '매도가격': 13650, '수익률': -12.84}
1217. 462860
    1. {'매수일': '2025-04-28', '매수가격': 3875, '매도일': '2025-04-29', '매도가격': 4725, '수익률': 21.94}
1218. 448900
    1. {'매수일': '2025-04-04', '매수가격': 16100, '매도일': '2025-04-07', '매도가격': 13870, '수익률': -13.85}
1219. 459510
    1. {'매수일': '2025-05-14', '매수가격': 25050, '매도일': '', '매도가격': 0, '수익률': 0}
1220. 136150
    1. {'매수일': '2025-05-09', '매수가격': 35900, '매도일': '2025-05-13', '매도가격': 30700, '수익률': -14.48}
1221. 476040
    1. {'매수일': '2025-05-09', '매수가격': 32000, '매도일': '2025-05-13', '매도가격': 36400, '수익률': 13.75}
    2. {'매수일': '2025-05-16', '매수가격': 45550, '매도일': '', '매도가격': 0, '수익률': 0}

이익을 본 횟수 : 937
평균 이익률 : 17.9%
최대 이익률 : 54.45%

손실을 본 횟수 : 2,015
평균 손실률 : -13.3%
최대 손실률 : -70.72%

성공률 : 31.74%

 

조건 2

이번에는 익절 기준을 20%에서 5%로 낮춰보았다.

class Logic:
    ...
    def check(self, Open, high, low, close, volume, rate, is_upper=False, is_lower=False):
        args = (Open, high, low, close, volume, rate, is_upper, is_lower)
        if (
            not is_lower
            and self.need_sell(*args)
        ):
            self.price_cut = 0
            self.price_take = 0
            return 'sell'
        if (
            # 상한가가 아닐 것(매수가 가능할 것)
            not is_upper
            and self.need_buy(*args)
        ):
            self.price_cut = round(close * 0.9)
            self.price_take = round(close * 1.05)
            return 'buy'
        return

 

조건 2 결과

몽둥이를 정말 짧게 잡도록 했더니, 성공률이 증가했다.

그러나 42%는 성공적이라고 보긴 어렵다.

>>
...
1211. 212710
    1. {'매수일': '2025-02-12', '매수가격': 22500, '매도일': '2025-02-14', '매도가격': 16930, '수익률': -24.76}
1212. 303810
    1. {'매수일': '2025-02-18', '매수가격': 15330, '매도일': '2025-02-19', '매도가격': 14960, '수익률': -2.41}
1213. 463480
    1. {'매수일': '2025-02-20', '매수가격': 17610, '매도일': '2025-02-21', '매도가격': 21000, '수익률': 19.25}
    2. {'매수일': '2025-03-05', '매수가격': 13280, '매도일': '2025-03-06', '매도가격': 11220, '수익률': -15.51}
1214. 031210
    1. {'매수일': '2025-03-14', '매수가격': 32000, '매도일': '2025-03-19', '매도가격': 37400, '수익률': 16.88}
1215. 098070
    1. {'매수일': '2025-03-20', '매수가격': 26400, '매도일': '2025-03-21', '매도가격': 30450, '수익률': 15.34}
1216. 444530
    1. {'매수일': '2025-04-16', '매수가격': 15660, '매도일': '2025-04-17', '매도가격': 16120, '수익률': 2.94}
1217. 462860
    1. {'매수일': '2025-04-28', '매수가격': 3875, '매도일': '2025-04-29', '매도가격': 4725, '수익률': 21.94}
1218. 448900
    1. {'매수일': '2025-04-04', '매수가격': 16100, '매도일': '2025-04-07', '매도가격': 13870, '수익률': -13.85}
1219. 459510
    1. {'매수일': '2025-05-14', '매수가격': 25050, '매도일': '2025-05-16', '매도가격': 24950, '수익률': -0.4}
1220. 136150
    1. {'매수일': '2025-05-09', '매수가격': 35900, '매도일': '2025-05-12', '매도가격': 32600, '수익률': -9.19}
1221. 476040
    1. {'매수일': '2025-05-09', '매수가격': 32000, '매도일': '2025-05-12', '매도가격': 30450, '수익률': -4.84}
    2. {'매수일': '2025-05-16', '매수가격': 45550, '매도일': '', '매도가격': 0, '수익률': 0}

이익을 본 횟수 : 1,290
평균 이익률 : 7.62%
최대 이익률 : 32.77%

손실을 본 횟수 : 1,722
평균 손실률 : -9.65%
최대 손실률 : -70.72%

성공률 : 42.83%

 

조건 1을 기준으로 거래 횟수가 가장 많았던 것들을 일부 뽑아보았다.

이익을 봤을 때와 손실을 봤을 때, 주가가 어떻게 움직였었는지 확인하기 위함이다.

1. 005110
    1. {'매수일': '2015-11-13', '매수가격': 10452, '매도일': '2015-12-09', '매도가격': 13412, '수익률': 28.32}
    2. {'매수일': '2015-12-23', '매수가격': 16484, '매도일': '2016-01-11', '매도가격': 14320, '수익률': -13.13}
    3. {'매수일': '2016-05-16', '매수가격': 21308, '매도일': '2016-05-25', '매도가격': 16920, '수익률': -20.59}
    4. {'매수일': '2016-09-19', '매수가격': 22780, '매도일': '2016-09-22', '매도가격': 20336, '수익률': -10.73}
    5. {'매수일': '2017-08-11', '매수가격': 5608, '매도일': '2017-09-04', '매도가격': 4984, '수익률': -11.13}
    6. {'매수일': '2018-04-16', '매수가격': 10496, '매도일': '2018-04-18', '매도가격': 9324, '수익률': -11.17}
    7. {'매수일': '2019-02-20', '매수가격': 10872, '매도일': '2019-03-04', '매도가격': 9528, '수익률': -12.36}
    8. {'매수일': '2019-03-29', '매수가격': 12192, '매도일': '2019-04-18', '매도가격': 10968, '수익률': -10.04}
    9. {'매수일': '2019-09-16', '매수가격': 12128, '매도일': '2019-10-07', '매도가격': 10324, '수익률': -14.87}
    10. {'매수일': '2020-01-15', '매수가격': 10544, '매도일': '2020-01-28', '매도가격': 9120, '수익률': -13.51}
    11. {'매수일': '2020-03-31', '매수가격': 6612, '매도일': '2020-04-16', '매도가격': 8256, '수익률': 24.86}
    12. {'매수일': '2023-08-18', '매수가격': 1448, '매도일': '2023-09-19', '매도가격': 1300, '수익률': -10.22}
2. 041190
    1. {'매수일': '2017-09-15', '매수가격': 1435, '매도일': '2017-09-18', '매도가격': 1865, '수익률': 29.97}
    2. {'매수일': '2017-09-20', '매수가격': 2350, '매도일': '2017-09-22', '매도가격': 3055, '수익률': 30.0}
    3. {'매수일': '2018-01-09', '매수가격': 7770, '매도일': '2018-01-10', '매도가격': 9500, '수익률': 22.27}
    4. {'매수일': '2019-04-02', '매수가격': 3775, '매도일': '2019-04-30', '매도가격': 3370, '수익률': -10.73}
    5. {'매수일': '2019-10-28', '매수가격': 3205, '매도일': '2019-11-20', '매도가격': 2850, '수익률': -11.08}
    6. {'매수일': '2020-10-19', '매수가격': 2895, '매도일': '2020-10-22', '매도가격': 3850, '수익률': 32.99}
    7. {'매수일': '2020-11-06', '매수가격': 4720, '매도일': '2020-11-11', '매도가격': 4205, '수익률': -10.91}
    8. {'매수일': '2020-11-18', '매수가격': 5290, '매도일': '2020-12-10', '매도가격': 4755, '수익률': -10.11}
    9. {'매수일': '2021-03-18', '매수가격': 7180, '매도일': '2021-03-30', '매도가격': 9640, '수익률': 34.26}
    10. {'매수일': '2021-10-15', '매수가격': 10250, '매도일': '2021-12-20', '매도가격': 9100, '수익률': -11.22}
    11. {'매수일': '2023-12-04', '매수가격': 7350, '매도일': '2023-12-12', '매도가격': 6490, '수익률': -11.7}
    12. {'매수일': '2024-02-15', '매수가격': 8530, '매도일': '2024-03-05', '매도가격': 11210, '수익률': 31.42}
3. 065500
    1. {'매수일': '2017-01-19', '매수가격': 4932, '매도일': '2017-01-24', '매도가격': 4303, '수익률': -12.75}
    2. {'매수일': '2018-03-02', '매수가격': 5398, '매도일': '2018-03-07', '매도가격': 4832, '수익률': -10.49}
    3. {'매수일': '2019-05-08', '매수가격': 2371, '매도일': '2019-05-09', '매도가격': 3081, '수익률': 29.95}
    4. {'매수일': '2020-07-14', '매수가격': 2457, '매도일': '2020-08-07', '매도가격': 3063, '수익률': 24.66}
    5. {'매수일': '2020-09-25', '매수가격': 3755, '매도일': '2020-11-24', '매도가격': 3339, '수익률': -11.08}
    6. {'매수일': '2024-12-13', '매수가격': 6700, '매도일': '2024-12-17', '매도가격': 5850, '수익률': -12.69}
    7. {'매수일': '2024-12-20', '매수가격': 6100, '매도일': '2025-01-16', '매도가격': 5180, '수익률': -15.08}
    8. {'매수일': '2025-01-24', '매수가격': 5150, '매도일': '2025-02-03', '매도가격': 4600, '수익률': -10.68}
    9. {'매수일': '2025-03-17', '매수가격': 9640, '매도일': '2025-03-20', '매도가격': 8640, '수익률': -10.37}
    10. {'매수일': '2025-04-02', '매수가격': 15890, '매도일': '2025-04-04', '매도가격': 13170, '수익률': -17.12}
    11. {'매수일': '2025-04-30', '매수가격': 11650, '매도일': '2025-05-02', '매도가격': 9860, '수익률': -15.36}
    12. {'매수일': '2025-05-07', '매수가격': 12270, '매도일': '2025-05-09', '매도가격': 10620, '수익률': -13.45}
4. 090710
    1. {'매수일': '2017-05-12', '매수가격': 8412, '매도일': '2017-05-24', '매도가격': 7500, '수익률': -10.84}
    2. {'매수일': '2018-04-12', '매수가격': 5000, '매도일': '2018-04-25', '매도가격': 4450, '수익률': -11.0}
    3. {'매수일': '2019-11-13', '매수가격': 3462, '매도일': '2019-11-15', '매도가격': 3025, '수익률': -12.62}
    4. {'매수일': '2020-11-16', '매수가격': 5075, '매도일': '2020-12-07', '매도가격': 4550, '수익률': -10.34}
    5. {'매수일': '2021-12-13', '매수가격': 2335, '매도일': '2022-01-07', '매도가격': 2825, '수익률': 20.99}
    6. {'매수일': '2022-02-08', '매수가격': 2588, '매도일': '2022-02-11', '매도가격': 2275, '수익률': -12.09}
    7. {'매수일': '2022-03-25', '매수가격': 3925, '매도일': '2022-03-28', '매도가격': 4800, '수익률': 22.29}
    8. {'매수일': '2022-04-26', '매수가격': 6875, '매도일': '2022-05-03', '매도가격': 9588, '수익률': 39.46}
    9. {'매수일': '2022-06-02', '매수가격': 12300, '매도일': '2022-06-03', '매도가격': 10962, '수익률': -10.88}
    10. {'매수일': '2023-01-09', '매수가격': 5688, '매도일': '2023-01-25', '매도가격': 7362, '수익률': 29.43}
    11. {'매수일': '2024-03-22', '매수가격': 3465, '매도일': '2024-03-29', '매도가격': 3070, '수익률': -11.4}
    12. {'매수일': '2025-02-10', '매수가격': 2515, '매도일': '2025-02-12', '매도가격': 2205, '수익률': -12.33}
5. 205470
    1. {'매수일': '2020-03-27', '매수가격': 928, '매도일': '2020-04-01', '매도가격': 750, '수익률': -19.18}
    2. {'매수일': '2020-07-10', '매수가격': 3107, '매도일': '2020-08-03', '매도가격': 4353, '수익률': 40.1}
    3. {'매수일': '2021-04-12', '매수가격': 3002, '매도일': '2021-04-21', '매도가격': 4208, '수익률': 40.17}
    4. {'매수일': '2021-09-23', '매수가격': 4851, '매도일': '2021-09-27', '매도가격': 4353, '수익률': -10.27}
    5. {'매수일': '2022-02-03', '매수가격': 9046, '매도일': '2022-02-04', '매도가격': 6673, '수익률': -26.23}
    6. {'매수일': '2022-10-18', '매수가격': 5860, '매도일': '2022-10-20', '매도가격': 5047, '수익률': -13.87}
    7. {'매수일': '2023-01-05', '매수가격': 4353, '매도일': '2023-02-01', '매도가격': 3694, '수익률': -15.14}
    8. {'매수일': '2023-05-23', '매수가격': 3040, '매도일': '2023-06-08', '매도가격': 2700, '수익률': -11.18}
    9. {'매수일': '2023-06-29', '매수가격': 2785, '매도일': '2023-07-05', '매도가격': 2430, '수익률': -12.75}
    10. {'매수일': '2023-08-03', '매수가격': 3075, '매도일': '2023-08-16', '매도가격': 2675, '수익률': -13.01}
    11. {'매수일': '2024-08-06', '매수가격': 2050, '매도일': '2024-08-08', '매도가격': 2615, '수익률': 27.56}
    12. {'매수일': '2024-11-18', '매수가격': 2035, '매도일': '2024-11-22', '매도가격': 1810, '수익률': -11.06}

 

005110, 한창

 

041190, 우리기술투자

 

065500, 오리엔트정공

 

090710, 휴림로봇

 

205470, 휴마시스

 

 

 






추천 (0)


글 목록

댓글을 달 수 없는 게시물입니다.


"분류없음" 카테고리의 #주식 관련 게시물