이더리움 차트 데이터 가져오기
바이낸스가 제공하는 API를 이용하여 이더리움 차트 데이터를 가져오자. 다음 파이썬 코드를 사용하면 이더리움 차트 데이터를 가져올 수 있다.
import requests
import pandas as pd
# Define the API endpoint URL
url = "https://api.binance.com/api/v3/klines?symbol=ETHUSDT&interval=1d&limit=100"
# Send a GET request to the API endpoint and retrieve the data
response = requests.get(url)
data = response.json()
# Convert the data into a pandas DataFrame
df = pd.DataFrame(data, 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"])
# Print the data
print(df.head())
위 코드는 바이낸스에서 ETHUSDT 거래 쌍에 대한 최근 100개의 일봉 캔들을 조회하여 가져온다. 결과 데이터는 분석을 위해 json 형태의 데이터를 pandas의 DataFrame 형식으로 변환한다.
데이터를 csv 파일로 저장하기
그다음 가져온 데이터를 csv 파일로 저장하자. 차트 데이터를 매번 API에서 가져오는 것보다 csv 파일에서 읽어오는 것이 더 간편하다. 그리고 csv 파일을 직접 열어서 내가 눈으로 파악할 수 있기 때문이다.
dataframe를 csv 파일로 저장하는 방법은 매우 간단하다.
# Save the DataFrame as a CSV file
df.to_csv("eth.csv") # Save Ethereum data to a CSV file
그리고 csv파일을 엑셀에서 열어보면 다음과 같이 저장되어 있다.
볼린저 밴드 상승 돌파 전략 테스트하기
당일 종가가 볼린저 밴드 상단을 돌파했을 때 매수하고, 볼린저 밴드 하단을 벗어나면 매도하는 전략이다. 이 전략을 코드로 작성하여 테스트해보자.
다음은 ChatGPT가 작성해 준 코드이고, 오류 없이 완벽하게 동작한다. 참고로 코드 내에 있는 주석도 ChatGPT가 작성했다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def bollinger_bands(df, window, num_std):
"""
주어진 데이터프레임, 창 크기, 표준편차 수에 대한 볼린저 밴드를 계산합니다.
위쪽, 중간, 아래쪽 밴드 열이 있는 데이터 프레임을 반환합니다.
"""
# 이동 평균 계산(중간 밴드)
rolling_mean = df['Close'].rolling(window=window).mean()
# 이동 표준 편차 계산
rolling_std = df['Close'].rolling(window=window).std()
# 이동 평균에 이동 표준 편차를 더하여 상위 구간을 계산합니다.
upper_band = rolling_mean + (rolling_std * num_std)
# 이동 평균에서 이동 표준 편차를 빼서 하위 구간을 계산합니다.
lower_band = rolling_mean - (rolling_std * num_std)
# 종가, 상위 밴드, 하위 밴드 및 이동 평균이 포함된 데이터 프레임을 반환합니다.
return pd.DataFrame({'Close': df['Close'],
'Upper Band': upper_band,
'Lower Band': lower_band,
'Rolling Mean': rolling_mean})
def bollinger_bands_strategy(df):
"""
볼린저 밴드 상향 돌파 전략을 테스트합니다.
매수 및 매도 신호가 있는 데이터 프레임을 반환합니다.
"""
# 볼린저 밴드 계산
bb = bollinger_bands(df, 20, 2)
# 기본값이 0인 신호 컬럼을 만듭니다.
bb['Signal'] = 0.0
# 종가가 상위 밴드보다 크면 신호를 1로 설정합니다.
bb.loc[(bb['Close'] > bb['Upper Band']), 'Signal'] = 1.0
# 종가가 하위 밴드보다 작으면 신호를 -1로 설정합니다.
bb.loc[(bb['Close'] < bb['Lower Band']), 'Signal'] = -1.0
# 신호의 차이를 취하여 매수 및 매도 신호 생성합니다.
bb['Position'] = bb['Signal'].diff()
# 차이가 1이면 포지션을 "매수"로 설정합니다.
bb.loc[(bb['Position'] == 1.0), 'Position'] = 'Buy'
# 차이가 -1이면 포지션을 "매도"로 설정합니다.
bb.loc[(bb['Position'] == -1.0), 'Position'] = 'Sell'
# 차이가 0이면 위치를 NaN으로 설정합니다.
bb.loc[(bb['Position'] == 0.0), 'Position'] = np.nan
# 매수 및 매도 신호가 포함된 데이터 프레임을 반환합니다.
return bb
# 판다 데이터 프레임에 데이터 로드
df = pd.read_csv('eth.csv', index_col=0)
# 볼린저 밴드 상승 돌파 전략 테스트
bb_strategy = bollinger_bands_strategy(df)
# Plot the strategy results
plt.figure(figsize=(12, 8))
plt.plot(bb_strategy['Close'], label='Close Price')
plt.plot(bb_strategy['Upper Band'], label='Upper Band', color='red', linestyle='--')
plt.plot(bb_strategy['Lower Band'], label='Lower Band', color='green', linestyle='--')
plt.plot(bb_strategy['Rolling Mean'], label='Rolling Mean', color='black', linestyle=':')
plt.scatter(bb_strategy.loc[bb_strategy['Position'] == 'Buy'].index, bb_strategy.loc[bb_strategy['Position'] == 'Buy', 'Close'],
marker='^', color='green', label='Buy')
plt.scatter(bb_strategy.loc[bb_strategy['Position'] == 'Sell'].index,
bb_strategy.loc[bb_strategy['Position'] == 'Sell', 'Close'],
marker='v', color='red', label='Sell')
plt.title("Bollinger Bands Upward Breakout Strategy")
plt.xlabel("Date")
plt.ylabel("Price")
plt.legend()
plt.show()
수익률 계산하기
# 수익률 계산
bb_strategy['Returns'] = (bb_strategy['Close'] / bb_strategy['Close'].shift(1)) - 1
# 누적 수익률 계산
bb_strategy['Cumulative Returns'] = (1 + bb_strategy['Returns']).cumprod() - 1
# 총 수익률 및 거래당 평균 수익률 계산하기
total_return = bb_strategy['Cumulative Returns'].iloc[-1]
average_return = bb_strategy['Returns'].mean()
# 총 수익률 및 거래당 평균 수익률 출력
print(f'Total Return: {total_return:.2f}')
print(f'Average Return per Trade: {average_return:.2f}')
위 코드를 실행하면 수익률은 다음과 같이 출력된다.
Total Return: -0.05
Average Return per Trade: 0.00
볼린저 밴드 상승 돌파 전략 테스트 결과 수익률은 -5%
이다.
내 생각에는 차트를 살펴보니 매도 시그널이 잘못된 것 같다. 매도 전략을 수정해야 할 것 같다.
볼린저 밴드 상향 돌파 20일 보유 전략
볼린저 밴드 전략을 수정하여 다시 테스트해보자.
이번에는 당일 종가가 볼린저 밴드 상단을 돌파했을 때 매수하고, 20일간 보유하다가 매도하는 전략이다.
아래 코드를 작성하고 실행한다.
bb = bollinger_bands(df, 20, 2)
total_profit = 0
trade_count = 0
for i in range(20, len(bb) - 20):
today_price = bb.iloc[i]['Close']
today_bb_upper = bb.iloc[i]['Upper Band']
# 볼린저 밴드 상향 돌파 전략 조건 : 당일 주가 > 당일 볼린저 밴드 상단
if today_price > today_bb_upper:
sell_price = bb.iloc[i + 20]['Close']
profit = (sell_price / today_price) * 100 - 100
total_profit += profit # 총 수익률을 누적한다.
trade_count += 1 # 거래 횟수를 체크한다.
avg_trade_profit = total_profit / trade_count if trade_count > 0 else 0
print("Total Profit: {:.2f}%".format(total_profit))
print("Average Trade Profit: {:.2f}%".format(avg_trade_profit))
위 코드를 실행하면 아래 결과가 출력된다.
Total Profit: 174.87%
Average Trade Profit: 15.90%
총 수익률은 174.87%
이고 평균 매매당 수익률은 15.90%
이다.
언제 매수하는지 알기 쉽게 이번에도 차트를 그려보자.
# Plot the strategy results
plt.figure(figsize=(12, 8))
plt.plot(bb['Close'], label='Close Price')
plt.plot(bb['Upper Band'], label='Upper Band', color='red', linestyle='--')
plt.plot(bb['Lower Band'], label='Lower Band', color='green', linestyle='--')
plt.plot(bb['Rolling Mean'], label='Rolling Mean', color='black', linestyle=':')
plt.scatter(trade_index, bb.iloc[trade_index]['Close'], marker='^', color='green', label='Buy')
plt.title("Bollinger Bands Upward Breakout Strategy")
plt.xlabel("Date")
plt.ylabel("Price")
plt.legend()
plt.show()
상승장일 때 계속해서 매수하는 것을 알 수 있다.
볼린저 밴드 스퀴즈 전략
볼린저 밴드 스퀴즈는 주식의 변동성이 상대적으로 낮고 볼린저 밴드가 조여졌을 때 발생한다. 그리고 주가가 이 스퀴즈에서 벗어나면 추세 반전 또는 다가오는 변동성 확대 기간을 나타내는 지표인 경우가 많다.
위 코드는 임곗값 0.01을 기준으로 상한 밴드와 하한 밴드 사이의 거리를 비교하여 볼린저 밴드 스퀴즈를 확인한다. 거리가 임곗값보다 작으면 스퀴즈가 발생한 것으로 간주한다. 그런 다음 가격이 상단 밴드 위로 교차하면 코드가 “매수” 신호를 생성하고 하단 밴드 아래로 교차하면 “매도” 신호를 생성한다.
ChatGPT가 알려주는 다양한 전략들을 백테스트 해보면서 나만의 전략을 연구해야겠다.
or
[카카오페이로 후원하기] [토스페이로 후원하기]
'개발 > 파이썬 자동매매' 카테고리의 다른 글
암호화폐 투자 시 고려해야 할 주요 지표 (1) | 2023.02.27 |
---|---|
(파이썬 자동매매) MACD(Moving Average Convergence Divergence) (2) | 2023.02.15 |
(파이썬 자동매매) 볼린저 밴드(Bollinger Bands) (0) | 2023.02.10 |
(파이썬) 바이낸스 비트코인 이동평균선 돌파 전략 백테스팅 (2) | 2023.02.07 |
(파이썬) 바이낸스 비트코인 이동평균선 그리기 (0) | 2023.02.07 |