问题描述
在此先感谢您的帮助。几个月来,我一直在尝试匹配币安的 EMA/MACD。我尝试了几种方法,但数据从来没有与移动应用程序上显示的交换内容一致。我读到他们使用 TEMA 而不是 EMA 并且 TA-Lib 的 MACD 的实现与交易所匹配。但是,我一直无法弄清楚如何让它在不出错的情况下读取数据帧。我只用 Python 编程几个月,但这一直困扰着我。如果有人可以请告诉我如何解决这个问题。技术版本适用于数据框,但与交换不匹配。我尝试了很多东西,错误范围从没有索引到无法转换。
问候,杰夫
import talib
import btalib
import numpy
import pandas as pd
import requests
import time
import json
import technic as ta
from datetime import datetime
from os import system,name
api_key = ''
api_secret = ''
from binance.client import Client
client = Client(api_key,api_secret)
sym = "TKOUSDT"
while 1 == 1:
data = client.get_historical_klines(sym,Client.KLINE_INTERVAL_5MINUTE,"135 mins ago UTC")
data2 = pd.DataFrame(data,columns = ['timestamp','open','high','low','close','volume','close_time','quote_av','Trades','tb_base_av','tb_quote_av','ignore' ])
clse = data2['close']
# print(clse)
clse2 = clse.to_numpy()
# print(clse2)
clse3 = pd.to_numeric(clse2,downcast='float')
# print(clse3)
# This one works... Sorta... The values do not match the Binance exchange! Was told Binance uses TEMA and that the TA-Lib MACD matches the exchange.
macd1 = ta.tmacd(data2['close'],w_slow=26,w_fast=12,w_signal=9)
print(macd1)
# Will not read the Dataframe
macd,signal,hist = talib.MACD(data2['close'],fastperiod=12,slowperiod=26,signalperiod=9)
# print(macd,hist)
# Will not read the Dataframe
macd2 = btalib.macd(data2['close'],pfast=20,pslow=50,psignal=13)
# print(macd2)
time.sleep(10)
解决方法
将尝试并简化回答 1)“如何让它读取数据帧而不给出错误”,以及 2) 为什么您可能会看到不同的计算。
对于#1,由于某种原因,btalib 没有接受 RangeIndex(尽管在 documentation 中它声明它应该接受)。处理此类数据时,无论如何设置 DatetimeIndex 或 TimedeltaIndex 通常很有用,因此添加并验证 OHLCV 数据类型可以纠正错误。
作为旁注,btalib 将接受整个数据框,只要它包含 Open/open 等列。
import pandas as pd
import talib
import btalib
import technic
from binance.client import Client # pip install python-binance
api_key = ''
api_secret = ''
client = Client(api_key,api_secret)
sym = "TKOUSDT"
client_columns = ['timestamp','open','high','low','close','volume','close_time','quote_av','trades','tb_base_av','tb_quote_av','ignore']
data = client.get_historical_klines(sym,Client.KLINE_INTERVAL_1MINUTE,"135 mins ago UTC")
data2 = pd.DataFrame(data,columns=client_columns)
# set time index
data2['timestamp'] = pd.to_timedelta(data2['timestamp'])
data2.set_index('timestamp',inplace=True)
# validate data types for ohlcv columns
ohlcv_columns = ['open','volume']
data2[ohlcv_columns] = data2[ohlcv_columns].astype('float')
# calculate
technic_macd = technic.tmacd(data2['close'],w_slow=26,w_fast=12,w_signal=9)
talib_macd = pd.concat(talib.MACD(data2['close'],fastperiod=12,slowperiod=26,signalperiod=9),axis=1)
btalib_macd = btalib.macd(data2,pfast=12,pslow=26,psignal=9).df
对于 #2,不同的计算基于方法论,其中 btalib 尝试纠正 TA-Lib 的问题(参见 here,其中 MACD 是示例之一)。与 Binance 的差异将取决于 Binance 使用的方法/库。