바이낸스 api를 통해 BTCUSDT의 5분봉 데이터를 받아와 파동의 마지막을 출력하는 코드입니다
EX) 현재 파동: 1 <- 상승장 첫 번째 파동을 의미
EX) 현재 파동: -6 <- 하락장 여섯 번째 파동을 의미
import pandas as pd
import plotly.graph_objects as go
import numpy as np
from binance.client import Client
from binance.enums import *
# 바이낸스 API 인증 정보 입력
api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
api_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# 바이낸스 API 클라이언트 생성
client = Client(api_key, api_secret)
# BTCUSDT 데이터 받아오기 - 5분봉
klines = client.futures_klines(symbol='BTCUSDT', interval=Client.KLINE_INTERVAL_5MINUTE)
# 데이터프레임 생성
df = pd.DataFrame(klines, columns=['Open time', 'Open', 'High', 'Low', 'Close', 'Volume', 'Close time', 'Quote asset volume', 'Number of trades', 'Taker buy base asset volume', 'Taker buy quote asset volume', 'Ignore'])
# 필요한 칼럼만 추출
df = df[['Open time', 'Open', 'High', 'Low', 'Close']]
# 데이터 타입 변경
df['Open time'] = pd.to_datetime(df['Open time'], unit='ms')
df['Open'] = df['Open'].astype(float)
df['High'] = df['High'].astype(float)
df['Low'] = df['Low'].astype(float)
df['Close'] = df['Close'].astype(float)
# 날짜 칼럼을 인덱스로 설정
df.set_index('Open time', inplace=True)
# 엘리어트 파동 분석 함수 정의
def elliot_wave_analysis(data, wave):
# 추세선 계산
ema_20 = data['Close'].ewm(span=20, adjust=False).mean()
ema_50 = data['Close'].ewm(span=50, adjust=False).mean()
ema_200 = data['Close'].ewm(span=200, adjust=False).mean()
# 파동 분석을 위한 이동평균선 계산
ema_8 = data['Close'].ewm(span=8, adjust=False).mean()
ema_34 = data['Close'].ewm(span=34, adjust=False).mean()
# 파동 시작점 찾기 위한 필터링 함수 정의
def find_start_points(wave):
peak = np.argmax(wave)
start_points = []
for i in range(1, peak+1):
if wave[i] < 0 and wave[i-1] > 0:
start_points.append(i)
return start_points
# 파동 분석 결과를 저장할 리스트 초기화
analysis = []
# 파동 분석 수행
for i in range(1, len(wave)):
wave_data = wave[:i+1]
start_points = find_start_points(wave_data)
for j in range(len(start_points)-1):
start = start_points[j]
end = start_points[j+1]-1
if end - start < 2:
continue
wave_type = '상승파동' if wave[end] > wave[start] else '하락파동'
analysis.append((start, end, wave_type))
# 현재 파동
wave = []
for i in range(len(data)):
if i < 2:
wave.append(0)
else:
# 파동 종류 판단을 위한 고가와 저가 계산
high = max(data['High'][i-2:i+1])
low = min(data['Low'][i-2:i+1])
if high == data['High'][i-1]:
if low == data['Low'][i-1]:
wave.append(wave[-1])
else:
wave.append(wave[-1]-1)
elif low == data['Low'][i-1]:
wave.append(wave[-1]+1)
else:
wave.append(wave[-1])
current_wave = wave[-1]
# 분석 결과 출력
if current_wave == 0:
print('파동 분석 불가')
else:
print('과거 ~ 현재까지 파동 분석 결과')
print('---------------------------')
for i in range(len(analysis)):
start_idx = analysis[i][0]
end_idx = analysis[i][1]
wave_type = analysis[i][2]
if end_idx >= len(data):
continue
print(f'{i+1}번째 {wave_type} 파동: {data.index[start_idx]} ~ {data.index[end_idx]}, {end_idx-start_idx+1}일')
print(f'현재 파동: {current_wave}')
elliot_wave_analysis(df, df['Close'].rolling(window=34).mean())
반응형