前提・実現したいこと
pythonで以下のサイトを参考にbot作成を勉強中です。(https://www.mamu-trade.com/use-pandas/)
発生している問題・エラーメッセージ
python
1Traceback (most recent call last): 2 File "/Users/tsuyoshi/bot/design_test.py", line 109, in <module> 3 plot(df) 4 File "/Users/tsuyoshi/bot/design_test.py", line 91, in plot 5 plt.plot( df.index, df.close ) # X軸、Y軸の値を指定 6 File "/usr/local/lib/python3.7/site-packages/matplotlib/pyplot.py", line 2796, in plot 7 is not None else {}), **kwargs) 8 File "/usr/local/lib/python3.7/site-packages/matplotlib/axes/_axes.py", line 1667, in plot 9 self.add_line(line) 10 File "/usr/local/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 1902, in add_line 11 self._update_line_limits(line) 12 File "/usr/local/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 1924, in _update_line_limits 13 path = line.get_path() 14 File "/usr/local/lib/python3.7/site-packages/matplotlib/lines.py", line 1027, in get_path 15 self.recache() 16 File "/usr/local/lib/python3.7/site-packages/matplotlib/lines.py", line 670, in recache 17 x = _to_unmasked_float_array(xconv).ravel() 18 File "/usr/local/lib/python3.7/site-packages/matplotlib/cbook/__init__.py", line 1390, in _to_unmasked_float_array 19 return np.asarray(x, float) 20 File "/usr/local/lib/python3.7/site-packages/numpy/core/_asarray.py", line 85, in asarray 21 return array(a, dtype, copy=False, order=order) 22TypeError: float() argument must be a string or a number, not 'Timestamp'
該当のソースコード
apiの部分は消しております。
from datetime import datetime from rich import print import math import pybybit import pandas as pd import numpy as np from tqdm import tqdm from matplotlib import pyplot as plt #--------------------設定項目-------------------- apis = bybit = pybybit.API(*apis, testnet = False) symbol = "BTCUSD" chart_min = 60 # 時間軸(1 3 5 15 30 60 120 240 360 720 ) start = '2021/01/01 09:00' # ローソク足取得開始時刻 get_days = 30 # 取得数[日] csv_path = "./60min_bybit_BTCUSD_2021-01-01 to 2021-01-31.csv" #====================価格データ取得(APIから)=================== def get_price_from_API(chart_min,start): get_start = int(datetime.strptime(start,'%Y/%m/%d %H:%M').timestamp()) # タイムスタンプ変換 price = [] req_times = math.ceil(1440/chart_min*get_days/200) #200*n本のローソク足を取得して、price[]に入れる for o in tqdm(range(req_times), desc = "{}分足データ取得中".format(chart_min)): # ()内の回数だけデータを取得 data = bybit.rest.inverse.public_kline_list( symbol = symbol, interval = chart_min, from_ = get_start ).json() #priceに取得したデータを入れる for i in data["result"]: price.append(i) #200本x足の長さ分だけタイムスタンプを進める get_start += 200*60*chart_min df = pd.DataFrame(price) df.open_time = pd.to_datetime(df.open_time*10**9,) df = df.set_index('open_time').tz_localize('UTC').tz_convert('Asia/Tokyo') df.drop(["symbol","interval","volume","turnover"],axis = 1,inplace=True) df = df.astype('float') return df[:int(1440/chart_min*get_days)] #====================ファイル出力=================== def output_file(df): # 表をCSVで出力 df.to_csv("./{0}min_bybit_BTCUSD_{1} to {2}.csv".format(chart_min,df.index[0].strftime('%Y-%m-%d'),df.index[-1].strftime('%Y-%m-%d'))) #====================価格データ取得(CSVから)=================== def get_price_from_csv(csv_path): df = pd.read_csv(csv_path).set_index('open_time') df.index = pd.to_datetime(df.index) return df #====================テーブル作成=================== def create_table(df): # MAの計算 df["7MA"] = round(df.close.rolling(7).mean(),2) df["28MA"] = round(df.close.rolling(28).mean(),2) # 売買シグナルの計算 df["Buy"] = np.where((df["7MA"].shift(1)<df["28MA"].shift(1))&(df["7MA"]>df["28MA"]),True,False) df["Sell"] = np.where((df["7MA"].shift(1)>df["28MA"].shift(1))&(df["7MA"]<df["28MA"]),True,False) # 注文・ポジションの計算 df["order"] = 0 df["order"] = df.order.mask(df.Buy==True,1) df["order"] = df.order.mask(df.Sell==True,-1) df["pos"] = df.order.cumsum() # 損益の計算 df["accrue_return"] = df.close.diff(-1)*-1 df["profit"] = df.accrue_return*df.pos df["pnl"] = df.profit.cumsum() return df #====================グラフ作成=================== def plot(df): plt.figure() # グラフの表示エリアを作成 plt.suptitle("Bybit [{0}min] {1} to {2}" .format(chart_min,df.index[0].strftime("%m/%d %H:%M"),df.index[-1].strftime("%m/%d %H:%M"))) # 終値チャート plt.subplot(2,1,1) plt.plot( df.index, df.close ) # X軸、Y軸の値を指定 plt.ylabel("{}".format(symbol), fontsize=25) # Y軸のラベル名 # 損益グラフ plt.subplot(2,1,2) plt.plot( df.index, df.pnl) # X軸、Y軸の値を指定 plt.xlabel("open_time", fontsize=25) # X軸のラベル名 plt.ylabel("pnl", fontsize=25) # Y軸のラベル名 plt.show() # グラフの表示 #====================メイン処理=================== # ohlc = get_price_from_API(chart_min,start) # output_file(df) ohlc = get_price_from_csv(csv_path) df = create_table(ohlc) print(df) plot(df)
試したこと
グラフ作成のplot関数に問題があるようです。https://stackoverflow.com/questions/47404653/pandas-0-21-0-timestamp-compatibility-issue-with-matplotlib
https://stackoverflow.com/questions/64841082/segmentation-fault-11-python-after-upgrading-to-os-big-sur
この二つのサイトを参考にしてみたのですが、
pd.plotting.register_matplotlib_converters()
を入れると、segmentation fault 11というエラーが出てしまいます。
matplotlibをインストールしなおしても変化はありません。
補足情報(FW/ツールのバージョンなど)
MacのバージョンはBig Sur
pandas 1.3.3
matplotlib 3.4.3
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。