국내 대형주 · 삼성전자 · 익절 · 실측 재현 페이지

수익 난 대형주,
그날 바로 팔까 꺾일 때 팔까

2007년 말 코스피 시가총액 상위 40개 종목(그 뒤 상장폐지·합병된 종목 포함)을 2008년부터 매달 샀다고 치고, 산 값보다 30% 오른 첫 날을 모두 모았습니다. 그날 계좌를 1,000만원으로 놓고 세 가지를 견줍니다. ① 바로 — 그날 종가에 팔아 KODEX200(코스피200 ETF)으로 옮긴다 ② 꺾이면 — 그 뒤 가장 높았던 종가보다 20% 내려간 날 종가에 팔아 KODEX200으로 옮긴다 ③ 그대로 — 3년 들고 간다 셋 다 750거래일(약 3년) 뒤 같은 날 종가로 평가합니다.

1333 / 207730% 오른 날 2077번 중 3년 뒤 바로 판 쪽이 꺾이면 판 쪽보다 더 남은 횟수 — 세 번 중 두 번 가까이
4,131만원삼성전자 2023년 5월 30일(30% 오른 날) — 바로 판 사람의 3년 뒤. 꺾일 때(2024-09-04, 그날 계좌 992만원) 판 사람은 3,950만원, 그냥 둔 사람은 4,623만원
275 / 5792020년 이후 30% 오른 날만 세면 바로 쪽이 더 남은 횟수 — 최근은 반대였습니다

오늘 드리는 것 — 기준 한 줄

상황할 일
산 대형주가 30% 올랐고, 팔 생각이 있다꺾이길 기다리지 말고 그날 팔아 코스피200 ETF로 옮긴다
판 돈현금으로 두지 않는다 — 현금(이자 0)으로 두면 꺾이면 쪽 2077번 중 1323번이 3년 뒤 1,000만원 아래
팔지 말지 자체이 페이지의 질문이 아닙니다 — 그냥 둔 쪽이 가장 많이 남은 때도 많습니다(아래 한계)

다 모아 보면

한계 — 먼저 읽어 주세요

받아가기

돌리는 법: zip 을 풀고 python run_profitsell.py

그대로 돌린 출력

== 국내 · 2007년 말 시가총액 상위 40 (판 돈 → KODEX200)
30% 오른 날 2077번 · 종목 40개 · 첫 2008-02-15 · 끝 2023-08-23
3년 뒤 바로 판 쪽이 꺾이면 판 쪽보다 더 남은 것 1333번
꺾여서 판 것 2059번 · 판 날 계좌가 이미 1,000만원보다 적었던 것 1315번
3년 뒤 1,000만원보다 줄어든 것: 그대로 1069번 · 꺾이면 792번 · 바로 611번
단순 평균(1,000만원 기준): 그대로 1,176만원 · 바로 1,244만원 · 꺾이면 1,243만원
덜 남은 쪽 열 번에 한 번꼴 경계(하위 10%): 그대로 546만원 · 바로 918만원 · 꺾이면 813만원
종목마다 첫 사건만: 40개 중 32개 바로 승
  꺾임 기준 10%: 바로 쪽이 더 남은 것 1403번
  꺾임 기준 15%: 바로 쪽이 더 남은 것 1371번
  꺾임 기준 25%: 바로 쪽이 더 남은 것 1316번
  20% 오른 날(꺾임 20%): 2735번 중 바로 쪽이 더 남은 것 1804번
  50% 오른 날(꺾임 20%): 1320번 중 바로 쪽이 더 남은 것 865번
2020년 이후 30% 오른 날 579번 중 바로 쪽이 더 남은 것 275번 · 줄어든 것 바로 275번 · 꺾이면 229번
판 돈을 현금(이자 0)으로 두면: 꺾이면 쪽 3년 뒤 1,000만원 아래 1323번
삼성전자만: 30% 오른 날 77번 · 바로 쪽이 더 남은 것 41번 · 셋 중 그냥 둔 쪽이 가장 많이 남은 것 63번
삼성전자(005930) — 30% 오른 날 전부:
  2008-04-28 → 꺾여 판 날 2008-07-08(그날 계좌 829만원) · 3년 뒤 2011-04-13: 바로 1,250만원 · 꺾이면 1,231만원 · 그대로 1,302만원
  2008-05-15 → 꺾여 판 날 2008-07-08(그날 계좌 777만원) · 3년 뒤 2011-05-02: 바로 1,274만원 · 꺾이면 1,216만원 · 그대로 1,262만원
  2009-09-22 → 꺾여 판 날 2011-06-20(그날 계좌 990만원) · 3년 뒤 2012-09-21: 바로 1,213만원 · 꺾이면 990만원 · 그대로 1,621만원
  2009-08-05 → 꺾여 판 날 2011-06-20(그날 계좌 1,115만원) · 3년 뒤 2012-08-03: 바로 1,254만원 · 꺾이면 1,039만원 · 그대로 1,742만원
  2009-07-08 → 꺾여 판 날 2011-06-20(그날 계좌 1,248만원) · 3년 뒤 2012-07-06: 바로 1,377만원 · 꺾이면 1,161만원 · 그대로 1,821만원
  2009-07-20 → 꺾여 판 날 2011-06-20(그날 계좌 1,184만원) · 3년 뒤 2012-07-18: 바로 1,277만원 · 꺾이면 1,066만원 · 그대로 1,718만원
  2009-07-15 → 꺾여 판 날 2011-06-20(그날 계좌 1,227만원) · 3년 뒤 2012-07-13: 바로 1,347만원 · 꺾이면 1,113만원 · 그대로 1,757만원
  2009-04-23 → 꺾여 판 날 2011-06-20(그날 계좌 1,304만원) · 3년 뒤 2012-04-20: 바로 1,551만원 · 꺾이면 1,300만원 · 그대로 2,101만원
  2009-04-10 → 꺾여 판 날 2011-06-20(그날 계좌 1,356만원) · 3년 뒤 2012-04-06: 바로 1,634만원 · 꺾이면 1,389만원 · 그대로 2,270만원
  2009-08-21 → 꺾여 판 날 2011-06-20(그날 계좌 1,079만원) · 3년 뒤 2012-08-22: 바로 1,289만원 · 꺾이면 1,052만원 · 그대로 1,715만원
  2009-08-04 → 꺾여 판 날 2011-06-20(그날 계좌 1,127만원) · 3년 뒤 2012-08-02: 바로 1,266만원 · 꺾이면 1,065만원 · 그대로 1,790만원
  2009-09-01 → 꺾여 판 날 2011-06-20(그날 계좌 1,023만원) · 3년 뒤 2012-08-31: 바로 1,223만원 · 꺾이면 972만원 · 그대로 1,585만원
  2010-12-09 → 꺾여 판 날 2011-06-20(그날 계좌 877만원) · 3년 뒤 2013-12-17: 바로 1,016만원 · 꺾이면 868만원 · 그대로 1,547만원
  2011-01-28 → 꺾여 판 날 2011-06-20(그날 계좌 792만원) · 3년 뒤 2014-02-11: 바로 926만원 · 꺾이면 767만원 · 그대로 1,326만원
  2010-12-10 → 꺾여 판 날 2011-06-20(그날 계좌 875만원) · 3년 뒤 2013-12-18: 바로 1,022만원 · 꺾이면 871만원 · 그대로 1,550만원
  2010-12-29 → 꺾여 판 날 2011-06-20(그날 계좌 847만원) · 3년 뒤 2014-01-09: 바로 968만원 · 꺾이면 831만원 · 그대로 1,378만원
  2011-12-01 → 꺾여 판 날 2012-07-09(그날 계좌 1,054만원) · 3년 뒤 2014-12-15: 바로 1,000만원 · 꺾이면 1,086만원 · 그대로 1,210만원
  2011-01-19 → 꺾여 판 날 2011-06-20(그날 계좌 802만원) · 3년 뒤 2014-01-29: 바로 932만원 · 꺾이면 783만원 · 그대로 1,311만원
  2012-01-03 → 꺾여 판 날 2012-07-09(그날 계좌 1,019만원) · 3년 뒤 2015-01-19: 바로 1,018만원 · 꺾이면 1,057만원 · 그대로 1,253만원
  2011-01-18 → 꺾여 판 날 2011-06-20(그날 계좌 826만원) · 3년 뒤 2014-01-28: 바로 931만원 · 꺾이면 797만원 · 그대로 1,352만원
  2012-03-14 → 꺾여 판 날 2012-07-09(그날 계좌 901만원) · 3년 뒤 2015-03-31: 바로 972만원 · 꺾이면 977만원 · 그대로 1,189만원
  2012-03-26 → 꺾여 판 날 2012-07-09(그날 계좌 884만원) · 3년 뒤 2015-04-10: 바로 998만원 · 꺾이면 973만원 · 그대로 1,205만원
  2012-02-22 → 꺾여 판 날 2012-07-09(그날 계좌 941만원) · 3년 뒤 2015-03-11: 바로 967만원 · 꺾이면 1,001만원 · 그대로 1,270만원
  2012-03-09 → 꺾여 판 날 2012-07-09(그날 계좌 916만원) · 3년 뒤 2015-03-26: 바로 989만원 · 꺾이면 992만원 · 그대로 1,191만원
  2012-02-29 → 꺾여 판 날 2012-07-09(그날 계좌 934만원) · 3년 뒤 2015-03-18: 바로 991만원 · 꺾이면 1,019만원 · 그대로 1,285만원
  2012-02-21 → 꺾여 판 날 2012-07-09(그날 계좌 955만원) · 3년 뒤 2015-03-10: 바로 966만원 · 꺾이면 1,015만원 · 그대로 1,242만원
  2012-01-25 → 꺾여 판 날 2012-07-09(그날 계좌 1,011만원) · 3년 뒤 2015-02-06: 바로 990만원 · 꺾이면 1,067만원 · 그대로 1,270만원
  2012-02-15 → 꺾여 판 날 2012-07-09(그날 계좌 992만원) · 3년 뒤 2015-03-04: 바로 977만원 · 꺾이면 1,064만원 · 그대로 1,306만원
  2011-11-04 → 꺾여 판 날 2012-07-09(그날 계좌 1,126만원) · 3년 뒤 2014-11-18: 바로 1,014만원 · 꺾이면 1,178만원 · 그대로 1,239만원
  2011-12-12 → 꺾여 판 날 2012-07-09(그날 계좌 1,044만원) · 3년 뒤 2014-12-24: 바로 1,027만원 · 꺾이면 1,090만원 · 그대로 1,265만원
  2012-03-27 → 꺾여 판 날 2012-07-09(그날 계좌 859만원) · 3년 뒤 2015-04-13: 바로 995만원 · 꺾이면 953만원 · 그대로 1,163만원
  2012-04-30 → 꺾여 판 날 2012-07-09(그날 계좌 810만원) · 3년 뒤 2015-05-18: 바로 1,010만원 · 꺾이면 895만원 · 그대로 979만원
  2012-05-02 → 꺾여 판 날 2012-07-09(그날 계좌 799만원) · 3년 뒤 2015-05-19: 바로 1,006만원 · 꺾이면 886만원 · 그대로 979만원
  2013-01-02 → 꺾여 판 날 2013-07-08(그날 계좌 778만원) · 3년 뒤 2016-01-15: 바로 882만원 · 꺾이면 785만원 · 그대로 749만원
  2012-12-13 → 꺾여 판 날 2013-07-08(그날 계좌 804만원) · 3년 뒤 2015-12-30: 바로 943만원 · 꺾이면 847만원 · 그대로 861만원
  2016-08-01 → 꺾여 판 날 2018-02-09(그날 계좌 1,474만원) · 3년 뒤 2019-08-27: 바로 1,057만원 · 꺾이면 1,253만원 · 그대로 1,522만원
  2015-03-17 → 꺾여 판 날 2015-07-31(그날 계좌 792만원) · 3년 뒤 2018-04-04: 바로 1,258만원 · 꺾이면 1,058만원 · 그대로 1,661만원
  2016-08-18 → 꺾여 판 날 2018-02-09(그날 계좌 1,409만원) · 3년 뒤 2019-09-16: 바로 1,117만원 · 꺾이면 1,284만원 · 그대로 1,556만원
  2016-10-07 → 꺾여 판 날 2018-02-09(그날 계좌 1,355만원) · 3년 뒤 2019-11-01: 바로 1,139만원 · 꺾이면 1,269만원 · 그대로 1,638만원
  2016-12-01 → 꺾여 판 날 2018-02-09(그날 계좌 1,321만원) · 3년 뒤 2019-12-27: 바로 1,244만원 · 꺾이면 1,327만원 · 그대로 1,775만원
  2016-12-29 → 꺾여 판 날 2018-02-09(그날 계좌 1,263만원) · 3년 뒤 2020-01-30: 바로 1,176만원 · 꺾이면 1,241만원 · 그대로 1,717만원
  2016-12-08 → 꺾여 판 날 2018-02-09(그날 계좌 1,291만원) · 3년 뒤 2020-01-07: 바로 1,201만원 · 꺾이면 1,282만원 · 그대로 1,712만원
  2016-08-19 → 꺾여 판 날 2018-02-09(그날 계좌 1,380만원) · 3년 뒤 2019-09-17: 바로 1,114만원 · 꺾이면 1,256만원 · 그대로 1,517만원
  2016-07-15 → 꺾여 판 날 2018-02-09(그날 계좌 1,522만원) · 3년 뒤 2019-08-09: 바로 1,079만원 · 꺾이면 1,304만원 · 그대로 1,540만원
  2016-06-07 → 꺾여 판 날 2018-02-09(그날 계좌 1,654만원) · 3년 뒤 2019-07-02: 바로 1,180만원 · 꺾이면 1,531만원 · 그대로 1,794만원
  2016-07-01 → 꺾여 판 날 2018-02-09(그날 계좌 1,576만원) · 3년 뒤 2019-07-26: 바로 1,170만원 · 꺾이면 1,440만원 · 그대로 1,743만원
  2016-12-07 → 꺾여 판 날 2018-02-09(그날 계좌 1,304만원) · 3년 뒤 2020-01-06: 바로 1,209만원 · 꺾이면 1,282만원 · 그대로 1,721만원
  2016-10-06 → 꺾여 판 날 2018-02-09(그날 계좌 1,367만원) · 3년 뒤 2019-10-31: 바로 1,127만원 · 꺾이면 1,271만원 · 그대로 1,627만원
  2016-11-30 → 꺾여 판 날 2018-02-09(그날 계좌 1,324만원) · 3년 뒤 2019-12-26: 바로 1,227만원 · 꺾이면 1,311만원 · 그대로 1,732만원
  2017-01-11 → 꺾여 판 날 2018-02-09(그날 계좌 1,189만원) · 3년 뒤 2020-02-11: 바로 1,182만원 · 꺾이면 1,213만원 · 그대로 1,693만원
  2017-03-07 → 꺾여 판 날 2018-02-09(그날 계좌 1,132만원) · 3년 뒤 2020-04-01: 바로 884만원 · 꺾이면 875만원 · 그대로 1,242만원
  2017-03-14 → 꺾여 판 날 2018-02-09(그날 계좌 1,100만원) · 3년 뒤 2020-04-08: 바로 926만원 · 꺾이면 910만원 · 그대로 1,281만원
  2017-03-17 → 꺾여 판 날 2018-02-09(그날 계좌 1,073만원) · 3년 뒤 2020-04-13: 바로 921만원 · 꺾이면 894만원 · 그대로 1,242만원
  2017-05-02 → 꺾여 판 날 2018-02-09(그날 계좌 1,010만원) · 3년 뒤 2020-06-01: 바로 1,000만원 · 꺾이면 944만원 · 그대로 1,239만원
  2017-05-08 → 꺾여 판 날 2018-02-09(그날 계좌 965만원) · 3년 뒤 2020-06-03: 바로 1,010만원 · 꺾이면 945만원 · 그대로 1,259만원
  2017-07-13 → 꺾여 판 날 2018-02-09(그날 계좌 894만원) · 3년 뒤 2020-08-06: 바로 1,039만원 · 꺾이면 954만원 · 그대로 1,251만원
  2017-09-18 → 꺾여 판 날 2018-02-09(그날 계좌 862만원) · 3년 뒤 2020-10-16: 바로 1,037만원 · 꺾이면 923만원 · 그대로 1,244만원
  2017-10-11 → 꺾여 판 날 2018-02-09(그날 계좌 825만원) · 3년 뒤 2020-10-30: 바로 981만원 · 꺾이면 855만원 · 그대로 1,133만원
  2020-01-17 → 꺾여 판 날 2020-03-16(그날 계좌 798만원) · 3년 뒤 2023-02-02: 바로 1,138만원 · 꺾이면 1,178만원 · 그대로 1,131만원
  2019-12-17 → 꺾여 판 날 2020-03-16(그날 계좌 868만원) · 3년 뒤 2023-01-03: 바로 1,061만원 · 꺾이면 1,145만원 · 그대로 1,073만원
  2020-01-13 → 꺾여 판 날 2020-03-16(그날 계좌 815만원) · 3년 뒤 2023-01-27: 바로 1,162만원 · 꺾이면 1,216만원 · 그대로 1,175만원
  2020-01-08 → 꺾여 판 날 2020-03-16(그날 계좌 861만원) · 3년 뒤 2023-01-20: 바로 1,160만원 · 꺾이면 1,237만원 · 그대로 1,187만원
  2020-01-09 → 꺾여 판 날 2020-03-16(그날 계좌 834만원) · 3년 뒤 2023-01-25: 바로 1,159만원 · 꺾이면 1,218만원 · 그대로 1,179만원
  2020-01-10 → 꺾여 판 날 2020-03-16(그날 계좌 822만원) · 3년 뒤 2023-01-26: 바로 1,165만원 · 꺾이면 1,216만원 · 그대로 1,170만원
  2019-11-06 → 꺾여 판 날 2020-03-16(그날 계좌 923만원) · 3년 뒤 2022-11-22: 바로 1,166만원 · 꺾이면 1,294만원 · 그대로 1,241만원
  2019-12-13 → 꺾여 판 날 2020-03-16(그날 계좌 900만원) · 3년 뒤 2022-12-29: 바로 1,082만원 · 꺾이면 1,194만원 · 그대로 1,110만원
  2019-10-14 → 꺾여 판 날 2020-03-16(그날 계좌 984만원) · 3년 뒤 2022-10-28: 바로 1,142만원 · 꺾이면 1,303만원 · 그대로 1,251만원
  2020-11-13 → 꺾여 판 날 2021-10-06(그날 계좌 1,172만원) · 3년 뒤 2023-11-30: 바로 1,081만원 · 꺾이면 1,083만원 · 그대로 1,252만원
  2020-11-16 → 꺾여 판 날 2021-10-06(그날 계좌 1,118만원) · 3년 뒤 2023-12-01: 바로 1,046만원 · 꺾이면 1,020만원 · 그대로 1,180만원
  2020-12-04 → 꺾여 판 날 2021-10-06(그날 계좌 1,036만원) · 3년 뒤 2023-12-21: 바로 1,007만원 · 꺾이면 985만원 · 그대로 1,140만원
  2020-12-07 → 꺾여 판 날 2021-10-06(그날 계좌 1,016만원) · 3년 뒤 2023-12-22: 바로 1,005만원 · 꺾이면 969만원 · 그대로 1,132만원
  2020-09-10 → 꺾여 판 날 2021-10-06(그날 계좌 1,259만원) · 3년 뒤 2023-09-26: 바로 1,097만원 · 꺾이면 1,119만원 · 그대로 1,267만원
  2020-11-26 → 꺾여 판 날 2021-10-06(그날 계좌 1,090만원) · 3년 뒤 2023-12-13: 바로 1,018만원 · 꺾이면 1,000만원 · 그대로 1,164만원
  2020-12-09 → 꺾여 판 날 2021-10-06(그날 계좌 1,003만원) · 3년 뒤 2023-12-27: 바로 1,013만원 · 꺾이면 970만원 · 그대로 1,153만원
  2020-12-24 → 꺾여 판 날 2021-10-06(그날 계좌 952만원) · 3년 뒤 2024-01-15: 바로 958만원 · 꺾이면 886만원 · 그대로 1,037만원
  2021-01-08 → 꺾여 판 날 2021-10-06(그날 계좌 814만원) · 3년 뒤 2024-01-25: 바로 820만원 · 꺾이면 746만원 · 그대로 889만원
  2023-05-30 → 꺾여 판 날 2024-09-04(그날 계좌 992만원) · 3년 뒤 2026-07-01: 바로 4,131만원 · 꺾이면 3,950만원 · 그대로 4,623만원
== 미국 · 대형주 30 (판 돈 → SPY)
30% 오른 날 2045번 · 종목 30개 · 첫 2008-05-05 · 끝 2023-09-14
3년 뒤 바로 판 쪽이 꺾이면 판 쪽보다 더 남은 것 1279번
꺾여서 판 것 1530번 · 판 날 계좌가 이미 1,000만원보다 적었던 것 932번
3년 뒤 1,000만원보다 줄어든 것: 그대로 337번 · 꺾이면 95번 · 바로 2번
단순 평균(1,000만원 기준): 그대로 1,401만원 · 바로 1,437만원 · 꺾이면 1,423만원
덜 남은 쪽 열 번에 한 번꼴 경계(하위 10%): 그대로 893만원 · 바로 1,293만원 · 꺾이면 1,076만원
종목마다 첫 사건만: 30개 중 19개 바로 승
끝.

코드 전문

# -*- coding: utf-8 -*-
"""수익 난 대형주 — 그날 바로 팔까, 고점에서 꺾일 때 팔까 (AlgoLab · 2026-10-28)

돌리는 법: 이 파일 옆에 data_profitsell/ 폴더를 두고  python run_profitsell.py
표준 라이브러리만 씁니다. 가격 자료는 2026-10-02 까지 얼려 둔 일봉 종가(날짜·종가)입니다.
  u2007/  2007-12-28 실제 코스피 시가총액 상위 40종(상장 유지 = 야후 수정종가 · 상장폐지·합병 6종 = 네이버 종가 + 후신 이음)
  us30/   2005년 무렵 미국 시가총액 상위 30종(야후 수정종가) · index/ KODEX200(2009-04 이전 네이버 종가 이음) · SPY

30% 오른 날 : 2008-01 부터 매달 첫 거래일에 산 종목이, 산 뒤 500거래일(약 2년) 안에 처음으로
              종가가 산 값의 1.3배 이상이 된 날 t. 그날 계좌 = 1,000만원. (같은 날이 여러 달에서 나오면 한 번만 센다)
바로        : t 종가에 팔아 지수 ETF(KODEX200 / SPY)로 옮긴다
꺾이면      : t 뒤 가장 높았던 종가보다 20% 이상 내려간 첫 날 종가에 팔아 지수 ETF로 옮긴다(3년 안에 안 꺾이면 그대로)
그대로      : 3년 들고 간다
평가        : 셋 다 t + 750거래일(약 3년) 종가로 같은 날 평가 · 옮길 때 비용 국내 0.4% · 미국 0.2% · 세금 없음
국내 종목은 하루 ±31% 넘는 등락을 액면분할 오류로 보고 0 으로 지운다.
"""
import csv
import math
import os

HERE = os.path.dirname(os.path.abspath(__file__))
D = os.path.join(HERE, "data_profitsell")
H, WIN, BUY0 = 750, 500, "2008-01-01"
US = "XOM GE MSFT C BAC WMT JNJ PFE AIG MO PG JPM IBM INTC CVX WFC KO CSCO GOOG VZ AMGN PEP HD COP HPQ UPS T ORCL QCOM MRK".split()


def load(path, clean):
    d, c = [], []
    for r in csv.reader(open(path, encoding="utf-8")):
        if r and r[0][:1].isdigit():
            v = float(r[1])
            if clean and v <= 0:
                continue
            d.append(r[0]); c.append(v)
    if clean:
        x, p = [c[0]], 1.0              # 누적곱을 먼저 하고 첫 값을 곱한다(연구 코드 numpy 와 반올림 순서까지 같게)
        for i in range(1, len(c)):
            g = c[i] / c[i - 1] - 1
            p *= 1 + (0.0 if abs(g) > 0.31 else g)
            x.append(c[0] * p)
        c = x
    return d, c


def idx_at(xd, xc, day):
    lo, hi = 0, len(xd)
    while lo < hi:                      # 그 날짜 이하의 마지막 지수 종가
        m = (lo + hi) // 2
        if xd[m] <= day:
            lo = m + 1
        else:
            hi = m
    return xc[lo - 1]


def events(names, folder, index_file, cost, X, clean):
    xd, xc = load(index_file, False)
    out = []
    for nm in names:
        d, c = load(os.path.join(folder, nm + ".csv"), clean)
        months = {}
        for i, di in enumerate(d):
            if di >= BUY0 and di[:7] not in months:
                months[di[:7]] = i
        seen = set()
        for ym, b in months.items():
            lim = min(len(c), b + WIN)
            t = next((j for j in range(b + 1, lim) if c[j] >= (1 + X) * c[b]), None)
            if t is None or t + H >= len(c) or (nm, t) in seen or d[t] < xd[0] or d[t + H] > xd[-1]:
                continue
            seen.add((nm, t))
            seg = c[t:t + H + 1]
            ix = [idx_at(xd, xc, dd) for dd in d[t:t + H + 1]]
            out.append({"code": nm, "t": d[t], "dates": d[t:t + H + 1], "seg": seg, "ix": ix, "cost": cost})
    return out


def trail_delay(seg, Y):
    pk = seg[0]
    for k in range(1, len(seg)):
        pk = max(pk, seg[k])
        if seg[k] <= (1 - Y) * pk:
            return k
    return None


def value(e, delay, to="idx"):
    seg, ix, cost = e["seg"], e["ix"], e["cost"]
    if delay is None:
        return seg[-1] / seg[0]
    v = seg[delay] / seg[0]
    if to == "idx":
        return v * ix[-1] / ix[delay] * (1 - cost)
    return v * (1 - cost / 2)


def q(a, p):
    s = sorted(a); k = (len(s) - 1) * p; f = math.floor(k)
    return s[f] if f == k else s[f] + (s[f + 1] - s[f]) * (k - f)


def won(x):
    return f"{round(x * 1000):,}만원"


def cell(evs, Y):
    hold = [value(e, None) for e in evs]
    now = [value(e, 0) for e in evs]
    dl = [trail_delay(e["seg"], Y) for e in evs]
    tr = [value(e, x) for e, x in zip(evs, dl)]
    return hold, now, dl, tr


def report(name, names, folder, index_file, cost, clean, kr):
    print(f"== {name}")
    evs = events(names, folder, index_file, cost, 0.30, clean)
    hold, now, dl, tr = cell(evs, 0.20)
    n = len(evs)
    print(f"30% 오른 날 {n}번 · 종목 {len({e['code'] for e in evs})}개 · 첫 {min(e['t'] for e in evs)} · 끝 {max(e['t'] for e in evs)}")
    print(f"3년 뒤 바로 판 쪽이 꺾이면 판 쪽보다 더 남은 것 {sum(a > b for a, b in zip(now, tr))}번")
    sold = [e["seg"][x] / e["seg"][0] for e, x in zip(evs, dl) if x is not None]
    print(f"꺾여서 판 것 {len(sold)}번 · 판 날 계좌가 이미 1,000만원보다 적었던 것 {sum(s < 1 for s in sold)}번")
    print(f"3년 뒤 1,000만원보다 줄어든 것: 그대로 {sum(h < 1 for h in hold)}번 · 꺾이면 {sum(t < 1 for t in tr)}번 · 바로 {sum(x < 1 for x in now)}번")
    print(f"단순 평균(1,000만원 기준): 그대로 {won(sum(hold) / n)} · 바로 {won(sum(now) / n)} · 꺾이면 {won(sum(tr) / n)}")
    print(f"덜 남은 쪽 열 번에 한 번꼴 경계(하위 10%): 그대로 {won(q(hold, .1))} · 바로 {won(q(now, .1))} · 꺾이면 {won(q(tr, .1))}")
    first = {}
    for i, e in enumerate(evs):
        first.setdefault(e["code"], i)
    print(f"종목마다 첫 사건만: {len(first)}개 중 {sum(now[i] > tr[i] for i in first.values())}개 바로 승")
    if not kr:
        return
    for Y in (0.10, 0.15, 0.25):
        _, n2, _, t2 = cell(evs, Y)
        print(f"  꺾임 기준 {int(Y * 100)}%: 바로 쪽이 더 남은 것 {sum(a > b for a, b in zip(n2, t2))}번")
    for X in (0.20, 0.50):
        ev2 = events(names, folder, index_file, cost, X, clean)
        _, n2, _, t2 = cell(ev2, 0.20)
        print(f"  {int(X * 100)}% 오른 날(꺾임 20%): {len(ev2)}번 중 바로 쪽이 더 남은 것 {sum(a > b for a, b in zip(n2, t2))}번")
    rec = [i for i, e in enumerate(evs) if e["t"] >= "2020-01-01"]
    print(f"2020년 이후 30% 오른 날 {len(rec)}번 중 바로 쪽이 더 남은 것 {sum(now[i] > tr[i] for i in rec)}번 · "
          f"줄어든 것 바로 {sum(now[i] < 1 for i in rec)}번 · 꺾이면 {sum(tr[i] < 1 for i in rec)}번")
    cash = [value(e, x, 'cash') for e, x in zip(evs, dl)]
    print(f"판 돈을 현금(이자 0)으로 두면: 꺾이면 쪽 3년 뒤 1,000만원 아래 {sum(c < 1 for c in cash)}번")
    ss = [i for i, e in enumerate(evs) if e["code"] == "005930"]
    print(f"삼성전자만: 30% 오른 날 {len(ss)}번 · 바로 쪽이 더 남은 것 {sum(now[i] > tr[i] for i in ss)}번 · "
          f"셋 중 그냥 둔 쪽이 가장 많이 남은 것 {sum(hold[i] > max(now[i], tr[i]) for i in ss)}번")
    print("삼성전자(005930) — 30% 오른 날 전부:")
    for i, e in enumerate(evs):
        if e["code"] == "005930":
            x = dl[i]
            sd = e["dates"][x] if x is not None else "안 꺾임"
            sv = won(e["seg"][x] / e["seg"][0]) if x is not None else "-"
            print(f"  {e['t']} → 꺾여 판 날 {sd}(그날 계좌 {sv}) · 3년 뒤 {e['dates'][-1]}: 바로 {won(now[i])} · 꺾이면 {won(tr[i])} · 그대로 {won(hold[i])}")


if __name__ == "__main__":
    kr = sorted(f[:-4] for f in os.listdir(os.path.join(D, "u2007")) if f.endswith(".csv"))
    report("국내 · 2007년 말 시가총액 상위 40 (판 돈 → KODEX200)", kr, os.path.join(D, "u2007"),
           os.path.join(D, "index", "KODEX200.csv"), 0.004, True, True)
    report("미국 · 대형주 30 (판 돈 → SPY)", US, os.path.join(D, "us30"), os.path.join(D, "index", "SPY.csv"), 0.002, False, False)
    print("끝.")

알고랩 Strategy Lab — 전략을 검증하고, 검증한 것만 자동매매로 옮깁니다. 오른 주식을 정해 둔 날 팔고 옮기는 일은 사람보다 규칙이 잘합니다. 알고랩 자동매매 살펴보기 · 전략 검증 전체 보기

과거 데이터를 돌려 본 결과이며 미래 수익을 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.