Files
StockBackTester/설계.txt

48 lines
12 KiB
Plaintext

주식 단타/스윙/중장기 투자를 위한 매수 타이밍을 포착하는 프로그램을 만드려고 한다.
이 프로그램은 한국과 미국의 주식 중 현재 시가총액기준 순서로 분봉/일봉/주봉/월봉 주가 히스토리를 분석 후 프로그램에서 구현된 매수조건을 충족하면 해당 종목이 결과로 출력된다.
이를 위해 필요한 데이터를 읽어와야한다.
매수조건 로직에서 이평선을 기준으로 매수타이밍을 판단하기 때문에 이평선 데이터도 필요하지만, 아마 읽어올수없기 때문에 계산이 필요하다.
만약 일봉으로 지난 2년간의 주가 히스토리를 분석한다면 3년간의 주가 데이터를 읽어와서 이평선을 계산하는 로직이 필요하다.
* 프로그램 이름 : finder"
* 개발 언어 : 파이썬 3.12.10 버전
* 개발 환경 : 윈도우 11
* 필요 기능 :
- 현재 한국과 미국의 주식 중 시가총액 기준 순서로 종목을 찾아와야한다.
- 종목을 찾아올때 몇위부터 몇위까지 가져올지는 수정이 용이한 파라미터로 지정되어있어야한다.
- 분봉으로 매수타이밍을 판단할지, 일봉/주봉/월봉으로 판단할지 선택할수있는 파라미터가 있어야한다.
- 이동평균선도 분봉/일봉/주봉/월봉 선택에따라 알맞게 계산이 되어야한다.
- 주요 파라미터(변수)는 수정이 용이해야한다. 옵션을 수정해가면서 테스트하기 위함이다.
- 특정 서버로부터 데이터를 읽어오는게 필수적인데, 너무 자주 읽어오게 되면 서버로부터 내 ip가 일시적으로 차단되거나, 나를 로봇으로 판단해 서버로부터 데이터를 읽어올수없게되는 상황이 예상된다. 이를 방지할수있는 방법이 있다면 적용이 필요하다. 예를 들어 종목 A를 읽어온 후 종목 B의 데이터를 읽어오기전에 sleep와 같이 잠깐의 대기시간을 주는것도 여러 방법중 하나일거같다.
* 메인 로직 :
- 이 프로그램의 주 목적은 미국과 한국의 주식 종목 중 현재 내가 매수해도 될만한 주가인 종목을 찾아주는것이다. "매수해도 될만한 주가"라는 조건이 메인 로직이다.
- 내가 계획중인 매수해도될만한 주가는 역배열인 상태(60일 이평선이 112일 이평선보다 아래인 경우, 112일 이평선이 224일 이평선보다 아래인 경우, 224일 이평선이 448일 이평선보다 아래인 경우, 각 조건은 and 로 설정할수도있고 or 로 설정할수도 있다. 이건 테스트해보면서 결정할 문제이다.)에서 5일 이평선이 20일 이평선을 상승돌파하거나 20일 이평선이 60일 이평선을 상승돌파할때, 이때를 매수조건이 충족된다고 생각한다. 저평가 상태에서 주가가 상승추세로 전환하는 초입에서 매수할 계획이다. 이를 검증하기 위해선 백테스트를 해야하는데 백테스트에 대한 내용은 아래에서 자세히 설명하겠다. 이 백테스트에서 매수조건 충족과 같은 수준으로 중요한 로직은 매도조건로직이다. 매수는 좋은 타이밍에 했더라도 매도를 비정상적으로 하게된다면 백테스트에서 이 매수로직이 좋은지 안좋은지 정상적으로 판단할수없기 때문이다.
- 내가 생각한 매도조건 로직은 매수로직에서 포착한 매수타이밍에서 매수가 들어간다면, 매수타이밍 직전의 고점, 즉 주가가 하락하거나 횡보하면서 보이는 sine 파 곡선의 꼭대기지점인데 이 꼭대기 지점이 매수타이밍 직전의 꼭대기인거다. 주가가 상승추세로 전환해 이평선을 상향돌파했다면 이전 sine파의 꼭대기를 넘어 상승했을것이기 때문에 이 꼭대기가 손절의 기준점이 된다. 매수한 종목을 매도 손절하는 데드라인인거지. 만약 주가가 상승추세로 전환 후 지속적으로 상승한다면 +10% 수익이 발생하면 절반을 익절하고 나머지는 주가의 추세에 따라 매도를 진행한다. 만약 주가가 계속 상승한다면 나머지 절반은 계속 홀딩한다. 그러다가 주가가 상승추세에서 하락추세로 전환된다면(이평선이 하향돌파 한다던지 rsi 지표가 급락하던지, macd 가 하향추세를 가리킬때) 모두 익절하는 로직으로 구현할것이다.
- 매매로직은 까다롭게 설정할수록 포착되는 종목이 적어져 버려지는 기회가 많아 질것이고, 매매로직조건을 너무 여유롭게 설정할 경우 가짜기회가 유입되게 되어 손실을 볼 가능성이 커지게된다. 이를 위해 반복 테스트해가며 조절을 해야하는데 반복테스트를 위한 편의성이 코드에 반영되야한다.
- 매매 로직은 A 방법을 적용했다가 B 방법을 적용했다가 A와 B를 동시에 만족하는 방법을 적용했다가 할수있기 때문에 모듈화 및 수정 적용이 용이해야한다. 추가적인 C 방법도 적용이 편리할수있도록 고려해야한다.
- 메인 로직 요약 : 일단 매수타이밍포착을 위해선 60일이평선이 112일이평선 아래에있고 112일이평선이 224일이평선 아래에있는 주가가 저평가구간에 있는상태를 찾아야해. 이 상태에서는 주가가 하락하거나 횡보하는 상태이지. 그러다가 5일이평선이나 20일 이평선이 60일이평선이나 112일 이평선을 (강하게) 상승돌파를 시작하는 상승추세로 전환하는 초입을 매수지점으로 잡기위한 로직이필요해. 만약 매수지점이 포착됐다면 이후에는 10% 수익시 절반 매도하고 나머지 절반은 상승세가 꺽여서 하락세로 전환하는 초입에서 나머지 절반을 매도하는 로직이 필요해. 만약 저평가구간에서 상승세로 전환하는 초입에 매수를 했는데 주가가 하락해서 마지막 고점을 하향돌파한다면 완전매도하는 매도 전략도 병행해야해.
* 코드를 작성하면서 유의해야할점 :
- 코드에 주석을 최대한 상세하게 달아야한다. (유지/보수성)
- 가독성이 좋아야한다. (유지/보수성)
- 기능별로 모듈화를 해야한다. (유지/보수성)
* 검증 계획 :
- 코드가 어느정도 완성되면 지속적인 매매로직 수정 및 테스트를 많이 할거같다. 그러면 특정 서버로부터 이전 테스트때 읽어온 데이터를 다시 또 읽어오게되는 현상이 불필요하게 발생할것같다. 이를 방지하기 위해 서버로부터 데이터를 읽어올지 아니면 이전에 읽어온 데이터를 내 컴퓨터에 저장한후 이 데이터를 읽어올지를 선택하는 파라미터를 생성해두는게 좋겠다. 이를 위해선 서버로부터 데이터를 읽어오면 내 컴퓨터에 데이터파일로 저장하는 기능과 이를 켜고 끌수있도록 파라미터 생성이 필요하다.
- 백테스트 기능이 필요하다. 매수조건을 충족한 종목을 가상으로 매수한후 매도조건을 총족할때까지 보유해 테스트
- 백테스트 중 매수타이밍이 충족된 종목이 발견될 경우 가상으로 매수하는데 동시에 10개 정도 투자할수있다. (포트폴리오 관리개념)
- 백테스트의 자본금은 1억으로한다.
- 백테스트는 동일한 기간과 동일한 종목으로 매매로직을 변경해가며 수행해야 매매로직의 성과를 비교분석할수있기때문에 필요데이터를 내 컴퓨터에 미리 저장한 후 이 데이터를 가지고 백테스트 수행이 가능해야한다.
* 데이터 :
- 야후 파이낸스 데이터, 한국거래소, 구글파이낸스 정보를 사용하는것을 1차 목표로하고있다. 이 후 만족할만한 결과가 나오면 증권사 API를 이용해 데이터를 읽어오도록 수정할 계획이다.
- yfinance 데이터를 위한 시총 순위 xxx 부터 xxx까지의 티커는 어디가 좋을까? 난 구글파이낸스가 야후파이낸스, 네이버파이낸스 정도만 알고있어서, 너가 적당한 웹사이트를 정해줘야해.
* 참고 :
- 코드 실행을 위해 설치가 필요한 라이브러리가 있으면 알려줘.
- 마지막 고점은 일봉으로 선택해서 분석하고 있다면, 일봉 차트상에서 매수타이밍 직전의 sine 파 꼭대기 지점인데 더 자세히 알려줘야할까? 강하게 상승돌파는 추세를 전환시키는 매수세가 확인되야한다. 양봉이 크게 뜬다고하지. 사실 이부분이 명확하지 않아서 조건을 변경해가면서 테스트해봐야해. 백테스트 매수 금액은 10개 동시투자 가능이니까 각 종목당 총자본의 10%가 되겠지.
- 시가총액 순위로 종목을 분석하지만 몇위부터 몇위까지 분석할건지는 내가 코드에서 수정해서 결정할거니까 파라미터화 시켜줘. 마지막 고점은 내가 생각한게 너한테 제대로 전달이 안된거 같은데. 내가 생각하는 마지막 고점은 주가가 일직선으로 변하지 않자나? 주가가 sine 파 형태로 올라갔다가 내려갔다가를 반복하는데 주가가 하향세면 사인파를 그리면서 이전 사인파의 고점보다는 지금의 사인파 고점이 더 내려가고 마찬가지로 이전 사인파의 저점보다 현재 사인파의 저점이 더 내려가는 흐름이다. 이렇게 사인파를 그리며 주가가 변화하면서 진행되다가 어느순간 주가가 이전 사인파의 고점보다 더 내려가지 않고 오히려 더 올라가는 상향돌파를 하게되면 매수타이밍으로 포착이되는거고 이전 사인파의 고점이 손절가가 되는거다.
- 강하게 상승 돌파의 조건은 제안해준대로 진행해줘. 유의해야할점은 강하게 상승돌파를 판단하는 조건이 더 추가될가능성이 크기때문에 코드 추가편입을 고려해 수정이 용이해야한다는 점이다. 아직은 코드를 만들지말아줘. 더 궁금하거나 결정해야하거나 아리송한점이 있으면 알려주고 내가 생각하는 전략이 효과가 있을지 등등을 이야기해줬으면 좋겠어.
- 기업의 펀더멘털이 실제로 나빠지고 있는 상태에서 매수타이밍으로 포착된 종목은 기업의 최근 1~2년 매출 추이를 종목 출력시 같이 출력해주면 내가 보고 판단하면 될거같아.
- 주가가 하락 추세를 멈추고 바닥을 다지는 횡보 구간에 진입하면, 단기 이평선(5, 20)과 중기 이평선(60)이 자주 꼬이면서 잦은 매수/매도 신호를 발생시킬 수 있는건 '강한 상승 돌파' 조건이 이런 잦은 신호를 걸러주는 필터 역할을 제대로 해야하는데 이건 테스트를 통해 개선해나가야할것같다.
- 이격도 필터 적용 : '매수 신호의 품질'을 조절하는 필터 역할로 이격도 조건을 설정해 가짜 신호를 걸러내는 역할이 필요하다.
- '직전 언덕(피크) 탐지' 알고리즘은 신호처리 라이브러리를 사용하는게 좋겠다. '추세 이탈(나머지 익절)' 알고리즘은 데드크로스와 트레일링스탑로스 둘다 구현한후 둘다 번갈아가며 테스트해보는게 좋겠다. 트레일링스탑로스 비율은 조절가능하게 파라미터화시켜줘.
- 그리고 지금 첨부하는 파일은 이전에 개발해놓은 버전이다. 이 코드 분석해보고 문제를 해결할 실마리가 있다면 참고해보면 좋겠다. 그리고 현재 개발중인 코드에 이전 버전의 장점이라 생각되는 부분을 가져오면 좋겠다.
이렇게 내가 개발하고싶은 프로그램에 대해 설명해봤는데 혹시 추가로 더 필요한 내용이 있다면 물어봐줘. 그리고 지금 당장 코드를 만들지 말고 충분히 협의가 완료된 후 코드를 만들어줘.