Python 끄적/가상화폐 자동화 프로그램

#8.비트코인 선물 자동구매 프로그램 - 선물1분봉 + RSI/MACD/이평선 => 엑셀 파일로 출력

슈슈차차아빠 2023. 3. 27. 21:33
반응형

1. 라이브러리 import 하기

import pandas as pd
import talib
from binance.client import Client
from datetime import datetime

import pandas as pd 
 Python에서 Pandas 라이브러리를 불러오는 구문입니다. 여기서 pd는 약어로 Pandas를 의미하며, Python 데이터 분석 커뮤니티에서 널리 사용되는 관례입니다.
Pandas를 불러오고 pd라는 별칭을 지정한 후에는 pd.를 접두어로 사용하여 Pandas 라이브러리의 함수 및 클래스를 사용할 수 있습니다. 예를 들어, pd.DataFrame()은 Pandas DataFrame 객체를 생성하는 데 사용됩니다.

import talib
Python을 비롯한 다양한 프로그래밍 언어에서 기술적 분석 지표를 계산할 수 있는 오픈소스 라이브러리입니다. 이 라이브러리는 다양한 주식, 선물, 지수, 환율 등의 금융상품에 대해 기술적 분석을 수행할 수 있도록 많은 함수와 지표를 제공합니다.
TA-Lib은 이동평균, 볼린저 밴드, 상대강도지수(RSI), 스토캐스틱, MACD 등의 대표적인 기술적 분석 지표를 제공하며, 이를 통해 다양한 차트 패턴 및 추세 전환 신호를 탐지할 수 있습니다

from binance.client import Client
Binance API를 사용하기 위한 Python 라이브러리인 python-binance에서 Client 클래스를 불러오는 구문입니다.
Binance는 암호화폐 거래소 중 하나로, API를 통해 다양한 기능을 제공합니다. python-binance은 Binance API를 활용할 수 있도록 제공되는 라이브러리로, Client 클래스를 통해 Binance API에 연결하고 거래, 주문 등의 작업을 수행할 수 있습니다.
 
from datetime import datetime
datetime 모듈에서 datetime 클래스를 불러오는 구문입니다.datetime 모듈은 Python에서 날짜와 시간을 다루기 위한 기능을 제공합니다.
이 모듈을 사용하면 날짜와 시간에 관련된 다양한 작업을 수행할 수 있습니다. from datetime import datetime을 실행한 후에는 datetime 클래스를 사용할 수 있습니다. 이 클래스를 사용하여 현재 날짜와 시간을 얻을 수 있으며, 날짜와 시간을 문자열로 표현하는 등 다양한 작업을 수행할 수 있습니다.

 

 

2.binance.client 모듈에서 Client 클래스를 인스턴스화

api_key = '-----'
api_secret = '----'

client = Client(api_key, api_secret)

클래스를 인스턴스화한다는 것은, 클래스를 사용하여 실제 객체를 생성하는 것을 말합니다. 클래스는 객체를 생성하기 위한 일종의 틀이며, 이 틀을 사용하여 객체를 생성합니다. 이렇게 생성된 객체를 우리는 '인스턴스(instance)'라고 합니다.


클래스는 객체의 속성과 동작을 정의하며, 객체는 클래스에서 정의된 속성과 동작을 가지고 있습니다. 객체는 클래스에서 정의된 속성과 동작에 대한 구체적인 값들을 가지며, 이 값들은 객체마다 서로 다를 수 있습니다.


클래스를 인스턴스화하려면, 클래스 이름 뒤에 괄호를 붙이고 필요한 매개변수를 전달해야 합니다. 예를 들어, Client 클래스를 인스턴스화하려면 다음과 같은 코드를 사용할 수 있습니다.

 

위 코드에서 Client(api_key, api_secret)는 Client 클래스의 인스턴스를 생성하는 코드입니다. 생성된 client 객체는 Client 클래스에서 정의된 메서드를 호출하여 다양한 작업을 수행할 수 있습니다.

 

3.futures_historical_klines

 
symbol = 'BTCUSDT'
interval = Client.KLINE_INTERVAL_1MINUTE

start_time = datetime(2022, 1, 1)  # 시작 시간
end_time = datetime(2022, 3, 1)  # 종료 시간

klines = client.futures_historical_klines(symbol, interval, start_time.strftime("%d %b %Y %H:%M:%S"), end_time.strftime("%d %b %Y %H:%M:%S"))

 symbol 변수에 지정된 가상화폐의 선물 시장에서 interval 변수에 지정된 간격으로 start_time 변수와 end_time 변수에 지정된 기간 동안 거래 내역(Kline data)을 조회하는 코드입니다.

client.futures_historical_klines() 메서드는 Binance API를 사용하여 선물 시장에서 과거 거래 내역을 조회할 때 사용됩니다. 이 메서드는 symbol, interval, start_time, end_time 인자를 받습니다.

 - symbol: 조회하려는 가상화폐의 심볼을 지정합니다. 이 코드에서는 'BTCUSDT'를 지정합니다.
 - interval: 조회하려는 간격을 지정합니다. 1분 간격으로 조회하려면 Client.KLINE_INTERVAL_1MINUTE를 사용합니다.
 - start_time: 조회를 시작할 시간을 지정합니다.  datetime 모듈을 사용하여 2022년 1월 1일을 시작 시간으로 지정합니다.
 - end_time: 조회를 종료할 시간을 지정합니다.  datetime 모듈을 사용하여 2022년 3월 1일을 종료 시간으로 지정합니다.

 

위 코드에서 strftime() 메서드는 datetime 객체를 문자열로 변환하는 메서드입니다. Binance API는 시간을 dd MMM yyyy hh:mm:ss 형식으로 요구하므로, strftime() 메서드를 사용하여 datetime 객체를 해당 형식의 문자열로 변환합니다.

마지막으로, klines 변수에는 조회한 거래 내역이 리스트 형태로 저장됩니다. 리스트의 각 요소는 각각 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로 이루어진 거래 내역 데이터입니다.

4.Pandas의 DataFrame으로 변환

df = pd.DataFrame(klines, columns=['timestamp', '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['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')  # 타임스탬프를 datetime으로 변환
df.set_index('timestamp', inplace=True)  # timestamp를 인덱스로 설정

'klines' 리스트를 Pandas의 DataFrame으로 변환하고, 변환한 데이터프레임에서 timestamp 컬럼을 datetime 형식으로 변환한 후 인덱스로 설정하는 코드입니다.

pd.DataFrame(klines, columns = ['timestamp', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_asset_volume', 'number_of_trades', 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'])은 klines 리스트를 12개의 컬럼으로 이루어진 데이터프레임으로 변환합니다.

이 컬럼들은 각각 timestamp, 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['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')은 데이터프레임의 timestamp 컬럼을 밀리초(millisecond) 단위의 정수형식에서 datetime 형식으로 변환합니다.


마지막으로 df.set_index('timestamp', inplace=True)은 데이터프레임의 인덱스를 timestamp 컬럼으로 설정합니다. 따라서 이후 데이터프레임에서는 timestamp가 행 인덱스로 사용됩니다.

 

5.RSI / MACD / 이동평균(MA) 계산하기

# RSI 계산
rsi_period = 14
df['rsi'] = talib.RSI(df['close'], rsi_period)

# MACD 계산
macd_fast_period = 12
macd_slow_period = 26
macd_signal_period = 9
df['macd'], df['macd_signal'], df['macd_hist'] = talib.MACD(df['close'], fastperiod=macd_fast_period, slowperiod=macd_slow_period, signalperiod=macd_signal_period)

# 이동평균(MA) 계산
ma_period = 20
df['ma'] = talib.SMA(df['close'], ma_period)

talib 라이브러리를 사용하여 DataFrame df에 대해 RSI, MACD, 이동평균(MA)을 계산하는 코드입니다.

rsi_period 변수를 이용하여 14일 기간의 RSI를 계산합니다. talib.RSI(df['close'], rsi_period)은 df 데이터프레임의 close 컬럼에 대해 rsi_period 기간 동안의 RSI 값을 계산하여 새로운 rsi 컬럼으로 추가합니다.

macd_fast_period, macd_slow_period, macd_signal_period 변수를 이용하여 MACD를 계산합니다.  talib.MACD(df['close'], fastperiod=macd_fast_period, slowperiod=macd_slow_period, signalperiod=macd_signal_period)은 df 데이터프레임의 close 컬럼에 대해 macd_fast_period, macd_slow_period, macd_signal_period 기간 동안의 MACD 값을 계산합니다. 계산된 MACD 값은 새로운 macd 컬럼으로, MACD 신호값은 macd_signal 컬럼으로, MACD 히스토그램값은 macd_hist 컬럼으로 추가됩니다.

ma_period 변수를 이용하여 20일 기간의 이동평균(MA)를 계산합니다. talib.SMA(df['close'], ma_period)은 df 데이터프레임의 close 컬럼에 대해 ma_period 기간 동안의 이동평균 값을 계산하여 새로운 ma 컬럼으로 추가합니다.

 

 

6.엑셀파일로 출력

# 결과를 엑셀 파일로 출력
df.to_excel('binance_data.xlsx')

위 코드는 DataFrame df를 binance_data.xlsx라는 이름의 엑셀 파일로 출력하는 코드입니다. df.to_excel('binance_data.xlsx')은 df 데이터프레임을 엑셀 파일로 출력합니다. 파일 이름은 binance_data.xlsx로 지정됩니다. 출력된 엑셀 파일에는 timestamp, open, high, low, close, volume, close_time, quote_asset_volume, number_of_trades, taker_buy_base_asset_volume, taker_buy_quote_asset_volume, ignore, rsi, macd, macd_signal, macd_hist, ma 컬럼들이 포함됩니다.

 

7.코드 출력 결과 ( Total Code )

import pandas as pd
import talib
from binance.client import Client
from datetime import datetime

api_key = '----'
api_secret = '----'

client = Client(api_key, api_secret)

symbol = 'BTCUSDT'
interval = Client.KLINE_INTERVAL_1MINUTE

start_time = datetime(2022, 1, 1)  # 시작 시간
end_time = datetime(2022, 3, 1)  # 종료 시간

klines = client.futures_historical_klines(symbol, interval, start_time.strftime("%d %b %Y %H:%M:%S"), end_time.strftime("%d %b %Y %H:%M:%S"))

df = pd.DataFrame(klines, columns=['timestamp', '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['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')  # 타임스탬프를 datetime으로 변환
df.set_index('timestamp', inplace=True)  # timestamp를 인덱스로 설정

# RSI 계산
rsi_period = 14
df['rsi'] = talib.RSI(df['close'], rsi_period)

# MACD 계산
macd_fast_period = 12
macd_slow_period = 26
macd_signal_period = 9
df['macd'], df['macd_signal'], df['macd_hist'] = talib.MACD(df['close'], fastperiod=macd_fast_period, slowperiod=macd_slow_period, signalperiod=macd_signal_period)

# 이동평균(MA) 계산
ma_period = 20
df['ma'] = talib.SMA(df['close'], ma_period)

# 결과를 엑셀 파일로 출력
df.to_excel('binance_data.xlsx')

 

출력 결과 같이 잘나옵니다!!

파일로도 잘 출력 되었습니다 !!

반응형