6 Thu
[가상 화폐 자동 매매 프로그램] 구현 1
구현
구현에서는 분석을 통한 구매와 12시간 뒤 판매를 다룰 것이다.
구현1 : 분석
아직까지는 수동 구매이다.
구현2 : 구매 및 판매
구현3 : 시스템 시간대 설정
라이브러리 선언
1 : upbit 함수들을 사용하기 위한 pyupbit
2 : data를 조작하기 위한 pandas
3 : time.sleep()을 위한 time
0.1초 동안 쉬게하여 의도하지 않은 충돌 발생 확률을 줄인다.
기본 변수 설정
1-2 : upbit API를 인증하여 자신의 access와 secret code를 얻는다.
단순 조회가 아닌 주문작업을 필요로 할 때는 IP주소를 등록해야 한다. 이는 네이버에
내 IP
를 검색 후 확인 가능
4-5 : dataframe의 column이 모두 출력되도록 그리고 한 줄로 출력되도록 설정한다
7 : 현재 내 잔고 정보 획득
9 : 거래할 시간
반드시 이 시간 이후에 거래해야 한다.
만약 거래 시간이 12시라면 11시 55분이 아니라 12시 5분에 거래해야 한다.
10 : 이동평균 점수 가중치
11 : 현재 원화로 업비트에 상장되어있는 코인 이름을 모두 불러온다
24시간 화폐 정보 조회 함수
정보 조회
4-10 : 화폐의 3주간의 정보를 가져온다.
interval이
minute60
이고 count가24*7
이므로 한번의get_ohlcv
로 1주일의 정보를 얻는다. 반복문이 3번 돌으므로 3주의 정보 획득1주씩 얻은 정보를 dfs 리스트에 쌓는다.
이 때
to=date
는 이 시점 이전까지의 정보를 가져오라는 의미.df.index[0]
가 현재까지 가져온 정보 중 가장 오래된 정보이므로 이 인덱스의 날짜를date
로 선언한다.
dataframe 조작 : 거래량, 최고가, 최저가, 시가, 변동률, 노이즈
1-3 : 데이터의 인덱스가 날짜로 되어있는데 이를 컬럼으로 가져온다.
원하는 시간만을 보기 위해 컬럼을 조작해야 하는데 이 값이 인덱스에 있기 때문에 컬럼으로 이동시킨다.
이후, 인덱스는 단순히 0부터 시작하는 순서
5 : 각 날짜의 시간 정보를 따로
hour
column 으로 추가현재
datetime
column 은YY-MM-DD HH-mm-ss
의 형태로 있다.이후에 원하는 시간만을 보기 위해
hour
를 따로 빼둔다.
6-8 : 오후 거래량, 오후 수익률, 오전 거래량을 구한다.
이 때 인덱스에 대해 -13 부터 -2 까지의 값을 다룬다.
-1의 값은 현재 값인데 이 값은 온전히 채워지지 않은 값이므로 제외한다.
만약 현재가 12시 5분이면
df['volume'].iloc[-1]
의 값은 5분간 얻어진 거래량이다. 이 값을 비교할 수는 없다.
dataframe 조작 : 3, 5, 10, 20일 이동평균, 20일 노이즈 평균, 거래 조건
1 : 원하는 거래 시간에 해당하는 데이터만 필터링 한다
2 : 현재 가격을 조회한다.
df['close'].iloc[-2]
와 동일한 부분이다.
4-8 : 3, 5, 10, 20일에 대한 이동평균선을 구하고 현재 가격보다 높다면 사전에 명시한 가중치 점수를 곱해 이동평균선 점수를 얻는다.
3, 5, 10, 20일에 대해 [1.10, 1.05, 0.95, 0.90] 이다. 사실 큰 의미가 있지는 않다. 단지, 현제 추세를 좀 더 반영하고자 하는 차이이다. 금액은 큰 차이가 없으며 추천 순위가 달라진다.
이동평균에 대한 정의가 많이들 다른 것 같은데 본인은 이동평균 정의를 어제까지를 기준으로 뒀다. 즉, 현재 오늘은 이동평균값과 상관이 없다. (난 당연히 이게 맞다고 생각했는데 오늘 날짜까지 평균을 내는 사람들이 있더라...)
10 : 1일 노이즈에 대해 20일치 평균을 구한다.
12 : 목표가격을 구한다.
구매하고자 하는 가격이 아니라 이 가격보다 현재가격이 더 높을 때 구매한다.
어떻게 보면 구매하고자 하는 가격의 최소가격이라고 볼 수도 있겠다.
13 : 구매 조건을 선언한다.
15 : 최종적으로 얻은 정보를 반환한다.
컬럼은 다음과 같이
'ticker', 'condition', 'noise20', 'ma_score', 'prev_range', 'cur_price', 'target_price'
로 정의한다.
1-4 : 모든 화폐의 정보를 얻은 뒤에 하나로 종합한다.
5 : 노이즈가 작은 순서대로, 그다음은 이동평균선 점수가 높은 순으로 정렬한다.
6 : 이후, 구매 가능한 코인들만 볼 수 있도록 필터링 한다.
7- 8 : 이 결과를 출력하고 엑셀 파일로도 저장한다.
간단한 결과
5일 동안 이 코드를 돌렸다. 0시 매수 12시 매도를 반드시 지키면서! (최근은 아니고 3주 정도 전에 돌렸다)
참고로 상위 화폐 5개에 대한 1년 백테스팅 결과도 같이 출력하게 했는데 단지 참고용이었고 생각보다 구매 결정에 있어 크게 영향력있지는 않았다.
백테스팅 코드는 실전 거래 코드와 많이 비슷하다.
다룰지는 고민중...
5번의 거래동안 승률은 94.4%
총 18개의 화폐를 구매했으며 이 중 17개의 화폐가 수익을 내었다.
최대 5개까지 구매했었고 최소 2개 까지 구매했다. 갯수는 내가 정한게 아니라, 노이즈 수치에 따라..
승률이 좀 말도 안되긴 하는데... 표본이 너무 적어서, 그리고 현재 시기가 상승장이라 운이 좋아서 라고 생각한다. (막 상승장은 아닌 것 같은데,,, ㅎㅎ)
생각보다 알트코인 보다는 비트코인에스브이나 이더리움같은 코인들에서 수익이 났다.
금액 변동은 120만원에서 185만원으로 54% 정도의 수익을 냈다.
한달 내내 이정도 수익을 지속하면 한달 뒤에는 462%의 수익을 내게 된다... (과연??)
전략은 진짜 잘 지켰다. 웨이브가 노이즈가 너무 커서 걸렀는데 다음날 30%가 올라있음에도 크게 배아프지 않았다. (조금은 아팠다는 뜻...)
추후 계획
현재는 0시에만 매수하는데, 이를 21, 22, 23시까지도 매수하고 싶다. 그렇다면 매도시각은 9, 10, 11, 12시가 되겠지.
백테스팅을 본격적으로 해보려고 한다. 24개의 시간 별로 전체 코인의 평균 수익률, 수익률 TOP 10 (with MDD) 을 구하려고 한다.
데이터 양이 워낙 방대해서 좀 무섭다
또, 현재는 거래 조건이 매우 타이트한데 이를 하나씩 풀은 결과도 백테스팅 할 계획.
하나씩 풀을 조건들
오후 수익률 > 0
오후 거래량 > 오전 거래량
또, 이 조건들을 풀면 목표 변동성을 다시 설정해야 한다.
지금은 조건이 워낙 까다로워서 목표 변동성을 딱히 설정하지 않았다. (욕심이 좀 나서 설정하지 않았다)
만약 조건들이 없어진다면 적정한 수치를 정해야 할 듯 싶다.
Last updated
Was this helpful?