오늘은 트레이딩뷰에서 내가 만든 지표로 백테스트를 진행하고 승률을 확인 후, 롱/숏 시그널을 파이썬으로 보내서 자동 매매를 해보는 파이프라인을 구축해보도록하겠다.
지난 단계에서는 파이썬 선물매매 스크립트 모듈화까지 진행해보았다.
함수와 전략클래스를 다른 파일로 모듈화하여 관리하기 편하게 만들었다.
그런데 한 가지 문제점은 서버코드에서는 웹훅메시지가 모듈화했을 때 모듈파일로부터 변수가 잘 받아져왔는데, 다른 파일에서는 해당 웹훅메시지를 담은 변수가 None값이 되었다. 오늘은 이유와 해결까지 추가로 병행해보았다.
< 지난 포스팅 >
https://jayindustry.tistory.com/76
#10 [바이낸스 선물] 모듈화, 파일관리
오늘은 모듈화와 코드파일 관리로 트레이딩봇 사용시, 더 체계적으로 코드와 데이터를 관리할 수 있게 만들어보았다. 그리고 웹훅메시지를 모듈을 이용하여 가져왔다. 저번 단계까지는 라우터
jayindustry.tistory.com
[ 개요 ]
1. 트레이딩뷰 내 전략 백테스트
2. 웹훅메시지 변수 None값 해결하기
3. 트레이딩뷰 롱/숏시그널과 연동하여 자동 롱/숏 진입하기
[ 내용 ]
1. 트레이딩뷰 내 전략 백테스트
나의 전략은 크게 두 파트로 나뉜다.
조건 1. 비트코인 대장주 추세에 따른 롱/숏 스위칭
조건 2. 지표를 복합적으로 활용한 롱 시그널
조건 1.
먼저 비트코인이 안정적으로 횡보하거나 상승장 + 비트코인 도미넌스가 낮아지거나 횡보할 땐
"롱"포지션,
그 반대엔 "숏"포지션만 들어간다.
양방향매매는 아직 안해봤지만 점차 실력이 늘어나면 이 전략도 고려해보려고 한다.
조건2.
트레이딩뷰에서는 전세계사람들의 다양한 지표들을 공유할 수 있다.
이들의 지표들을 복합적으로 섞어 나만의 지표를 만들 수 있다.
나의 전략_1 에서 활용된 지표리스트는 다음과 같다.
진입조건)
여기서 1), 6) 지표가 롱 시그널이 뜨고, 5) MFT가 50이하이면 롱 포지션을 진입하고
그 반대엔 숏포지션을 진입한다.
종료조건)
그리고 수익률이 0.15%초과 + MFT가 70이 초과되면 롱포지션을 종료하고
만약 수익률이 0.4%가 넘어가면 종료하는 두 가지 TakeProfit조건을 추가하였다.
StopLoss는 -0.5%의 손실률이 넘어가면 종료하기로 했다.
( 트레이딩뷰는 PindScript 언어를 지원하여 파이썬을 주로 사용하는 나에겐 아직은 어려운 부분이 있다. )
백테스팅 결과
이건 20000불 기준, BTC/USDT 5분봉 결과이다.
34일에 걸친 백테스팅 결과이다.
다른 알트들도 5%~ 25%정도의 준수한 수익률을 보였다.
아래는 AAVE코인 백테스팅 결과이다.
[ 분석 ]
약 34~40일의 짧은 기간의 데이터라 승률에 대한 정확도는 떨어질 것이다.
상승장에 롱포지션만 진입해서 그나마 준수하게 나온 것 같다.
여기서 숏포지션을 추가하면 50%이하로 낮게 나온다.
승률이 60~70%가 되었다고 이게 실제 승률은 아니다.
절대 자만해서는 안된다.
시장이 변동할때마다 언제든 30%로 곤두박질 칠 수 있고,
여기서의 백테스팅은 실제시장 매매의 승률과 많이 다르다고 한다.
백테스팅은 백테스팅일뿐..!
2. 웹훅메시지 변수 None값 해결하기
문제점
저번 포스팅에서의 피드백 내용 중, 서버에서 모듈파일로 메시지를 보내 변수로 저장 후, 그 모듈의 메시지변수를 다른 스크립트로 가져왔을 때 None값이 떴다.
이상하게 서버에서 모듈파일의 메시지변수로 저장후 다시 서버로 가져와 출력하면 제대로 메시지가 나왔는데, 다른 스크립트에서 가져다쓸땐 None값이 나왔다.
원인를 분석하고 해결방법을 모색해보았다.
원인
스크립트는 총 3개이다.
Flask 서버와 bot_module(웹훅메시지,지표함수를 포함한 모듈), 실행 스크립트
파이썬에서는 각 스크립트 또는 프로세스가 모듈의 '별도 인스턴스'를 가지는데,
이는 각 프로세스가 모듈의 복사본을 별도로 유지한다는 의미이다.
Flask 서버가 동작하는 프로세스와 실행 스크립트에서 bot_module을 사용하는데,
이 두 프로세스는 bot_module이라는 동일한 모듈을 사용하더라도 서로 다른 인스턴스를 갖게 된다.
즉, 서로 다른 인스턴스를 가진다는것이다.
따라서 모듈화를 할 땐, 아래와 같은 특성을 지닌다.
독립적인 메모리 공간
각 프로세스는 자체 메모리 공간을 가지고 있으며, 한 프로세스에서 모듈의 변수나 객체를 수정해도 다른 프로세스의 해당 모듈에는 영향을 주지 않습니다.
변수 및 객체의 독립성
예를 들어, Flask 서버에서 bot_module의 특정 변수를 변경하면, 그 변경사항은 Flask 서버 내에서만 적용된다.
다른 스크립트에서 실행되는 bot_module 인스턴스는 이 변경사항을 반영하지 않는다.
이로 인해, 서로 다른 프로세스 간에 데이터를 공유하고자 할 때 문제가 발생합니다. 이 문제를 해결하기 위해서는 공유 데이터베이스, 파일 시스템, 또는 메모리 내 데이터 공유 메커니즘(예: Redis)과 같은 방법을 사용하여 데이터를 공유해야 합니다. 이러한 방법을 사용하면 서로 다른 프로세스 간에 데이터를 동기화하고 공유할 수 있습니다.
[ 해결방안 ]
두 가지 해결방안을 모색해보았다.
1. 자동매매 실행 스크립트에서 requests모듈을 이용하여 서버스크립트의 변수를 가져오는 방법
2. bot_module의 변수의 내용을 csv파일에 임시저장 후 불러다가 사용하는 방법, 혹은 서버코드에서 로그파일에 메시지가 저장되니까 그 로그파일의 최신메시지를 읽어오는 방법.
저장메모리나 데이터베이스를 사용하지 않고 최신메시지를 신속히 전달 받기위해 1번방법 위주로 해결을 해보려고 한다.
먼저 서버코드에서 다른스크립트로 메시지 Data를 던져주는 api 엔드포인트 함수를 만든다.
매매 실행스크립트에서 requests.get메서드로 저 current_data변수를 받아온다.
이 때 서버,클라이언트 코드가 하나의 로컬환경에 있으니,
url은 주석처럼 외부Ip:외부포트 혹은 내부ip:내부포트로 접근 가능하다.
[ 결과 ]
서버코드에서의 결과 ( 웹훅메시지를 받고 다른 스크립트로 출력 )
클라이언트 스크립트에서 결과 (매매 실행 스크립트)
트레이딩 뷰에서 test244 라고 웹훅 메시지를 보냈는데 파이썬 서버,클라이언트 스크립트로 모두 잘 전달되어 들어왔다.
(단, 내부ip는 내 노트북 와이파이를 다른 와이파이로 연결해제 및 연결해버리면 변동될 수 있다.)
3. 트레이딩뷰 롱/숏시그널과 연동하여 자동 롱/숏 진입하기
이제 전체적인 파이프라인이 거의 완성되어간다.
이제 다음 단계에서 롱/숏 시그널을 받아 해당 메시지에 따라 내가 만든 자동매매를 실행시킨다.
'프로젝트 > [퀀트]자동트레이딩' 카테고리의 다른 글
#13 [바이낸스 선물] 에러해결 및 코드수정 (1) | 2023.11.29 |
---|---|
#12 [바이낸스선물] 트레이딩뷰 시그널연동하여 매매하기, API key 보호 (1) | 2023.11.22 |
#10 [바이낸스 선물] 모듈화, 파일관리 (1) | 2023.11.19 |
#9 [바이낸스 선물]Flask서버,웹훅 문제해결 (2) | 2023.11.17 |
#8 [바이낸스 선물]Flask서버생성,웹훅,포트포워딩 (0) | 2023.11.15 |