pip install python-binance pandas numpy
먼저, 아래 코드를 실행하기 위한 패키지를 설치합니다.
1. 피어슨 상관계수로 비슷한 심볼(코인)을 찾는 방법
import pandas as pd
import numpy as np
from binance import Client
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
client = Client(api_key, api_secret)
# 선물 거래 가능한 심볼 가져오기
symbols = [s['symbol'] for s in client.get_futures_exchange_info()['symbols']]
def calculate_similarity(symbol):
# 차트 데이터 가져오기
klines = client.get_historical_klines(symbol, Client.KLINE_INTERVAL_1HOUR, '1 day ago UTC')
if len(klines) == 0:
return None
# 데이터 프레임으로 변환
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.astype({'close': 'float', 'volume': 'float'})
# 거래량과 가격 변화 계산
volume = df['volume']
price_change = df['close'].pct_change().dropna()
# 피어슨 상관 계수 계산
similarity = np.corrcoef(volume, price_change)[0, 1]
return similarity
symbol_similarities = []
# 각 심볼의 상관 계수 계산
for symbol in symbols:
similarity = calculate_similarity(symbol)
if similarity is not None:
symbol_similarities.append((symbol, similarity))
# 상관 계수를 기준으로 내림차순 정렬
symbol_similarities.sort(key=lambda x: x[1], reverse=True)
# 상위 5개의 심볼 출력
top_5_symbols = [symbol for symbol, similarity in symbol_similarities[:5]]
print(top_5_symbols)
상관 계수는 -1부터 1까지의 값을 가지며, 높은 값일수록 거래량과 가격 변화가 비슷한 패턴을 보여줍니다. 이 코드에서는 상관 계수가 높은 순서대로 심볼을 정렬하고, 상위 5개의 심볼을 선택하여 출력합니다. 이렇게 선택된 5개의 심볼은 거래량과 차트 움직임이 비슷한 순서로 정렬되어 있습니다.
참고로, 이 코드는 과거 1일간의 1시간 차트 데이터를 기준으로 상관 계수를 계산합니다. 필요에 따라 Client.KLINE_INTERVAL_1HOUR와 '1 day ago UTC' 부분을 변경하여 다른 시간 간격의 차트 데이터를 사용할 수 있습니다.
또한, 상관 계수를 계산할 때 사용하는 데이터 기간이 짧으면 결과의 정확도가 떨어질 수 있습니다. 따라서 필요에 따라 더 긴 기간의 차트 데이터를 사용하여 상관 계수를 계산할 수 있습니다.
이 프로그램을 사용하여 선물 거래가 가능한 심볼 중 거래량과 차트 움직임이 비슷한 심볼 5개를 찾을 수 있습니다. 이를 바탕으로 추가적인 분석이나 전략을 개발할 수 있습니다.
피어슨 상관계수와 텐서플로우를 이용한 방법은 각각 다른 접근 방식을 사용하여 거래량과 가격 변동이 비슷한 심볼을 찾습니다. 이 두 가지 방식의 신뢰도를 비교하는 것은 직접적으로 비교하기 어렵습니다. 그 이유는 다음과 같습니다.
1. 피어슨 상관계수는 단순한 통계적 방법을 사용하여 두 변수(거래량과 가격 변동) 사이의 선형 상관관계를 측정합니다. 상관계수가 높을수록 두 변수가 비슷한 패턴을 보여줍니다. 이 방법은 간단하고 빠르게 계산할 수 있으며, 결과를 해석하기 쉽습니다.
2. 텐서플로우를 사용하는 방법은 딥러닝 모델(예: 시계열 예측 모델, LSTM, GRU 등)을 이용하여 거래량과 가격 변동 패턴을 학습하고, 이를 기반으로 비슷한 심볼을 찾습니다. 이 방법은 더 복잡한 패턴을 포착할 수 있으며, 피어슨 상관계수로 찾기 어려운 비선형 관계까지 고려할 수 있습니다. 하지만, 이 방법은 모델 학습에 시간이 오래 걸리고, 결과를 해석하기 어렵습니다.
결론적으로, 어떤 방법이 더 신뢰도가 높은지는 상황과 목적에 따라 다릅니다. 피어슨 상관계수 방법은 빠르고 간단한 분석을 원할 때 유용하며, 텐서플로우를 이용한 방법은 더 복잡한 패턴을 찾고자 할 때 적합합니다. 이 두 방법을 모두 시도해 보고, 어떤 방법이 거래 전략에 더 적합한지 판단하는 것이 좋습니다.
2. 텐서플로우로 거래량과 가격 움직임이 비슷한 심볼 찾는 방법
pip install python-binance pandas numpy tensorflow
* 위 명령어를 실행해 텐서플로우를 설치해야 합니다.
텐서플로우를 사용하여 거래량과 가격 변동 패턴이 비슷한 심볼을 찾기 위해, 시계열 데이터를 처리할 수 있는 LSTM(Long Short-Term Memory) 모델을 사용하겠습니다.
import pandas as pd
import numpy as np
import tensorflow as tf
from binance import Client
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
client = Client(api_key, api_secret)
# 선물 거래 가능한 심볼 가져오기
symbols = [s['symbol'] for s in client.get_futures_exchange_info()['symbols']]
def preprocess_data(symbol):
klines = client.get_historical_klines(symbol, Client.KLINE_INTERVAL_1HOUR, '10 days ago UTC')
if len(klines) == 0:
return None
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.astype({'close': 'float', 'volume': 'float'})
volume = df['volume'].values.reshape(-1, 1)
price_change = df['close'].pct_change().dropna().values.reshape(-1, 1)
scaler = MinMaxScaler()
volume_scaled = scaler.fit_transform(volume)
price_change_scaled = scaler.fit_transform(price_change)
return volume_scaled, price_change_scaled
def build_model():
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(None, 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
return model
symbol_data = []
for symbol in symbols:
data = preprocess_data(symbol)
if data is not None:
symbol_data.append((symbol, data))
reference_symbol = symbol_data[0][0]
reference_data = symbol_data[0][1]
model = build_model()
model.fit(reference_data[0][:-1], reference_data[1][1:], epochs=100, verbose=0)
symbol_errors = []
for symbol, data in symbol_data[1:]:
predictions = model.predict(data[0][:-1])
mse = tf.keras.losses.MeanSquaredError()
error = mse(data[1][1:], predictions).numpy()
symbol_errors.append((symbol, error))
symbol_errors.sort(key=lambda x: x[1])
top_5_symbols = [reference_symbol] + [symbol for symbol, error in symbol_errors[:4]]
print(top_5_symbols)