前提・実現したいこと
ビットコインの自動売買のバックテストを作ろうと思ってます。
目的は、cryptowatchのAPIを用いて過去6000本分のろうそくデータを取得してから、RSIという指標を用いて、取引のバックテストをしようと思っています。
ですが、エラーでうまくいきません。
教えて欲しいです。
発生している問題・エラーメッセージ
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-3-b7c9f5a299d9> in <module> 144 145 --> 146 if buy_signal() : 147 print("買い注文をします") 148 print("ATR:"+str(int(ATR(14)))) <ipython-input-3-b7c9f5a299d9> in buy_signal() 93 def buy_signal(): 94 rsi = RSI(14) ---> 95 if rsi < 25 : 96 return True 97 else: /anaconda3/lib/python3.6/site-packages/pandas/core/generic.py in __nonzero__(self) 1574 raise ValueError("The truth value of a {0} is ambiguous. " 1575 "Use a.empty, a.bool(), a.item(), a.any() or a.all()." -> 1576 .format(self.__class__.__name__)) 1577 1578 __bool__ = __nonzero__ ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
該当のソースコード
python
1 2# coding: UTF-8 3 4import hashlib 5import hmac 6import requests 7import datetime 8import json 9from pprint import pprint 10import numpy as np 11import pandas as pd 12from matplotlib import pyplot as plt 13 14 15#----------------------------------------------------------------- 16#取引所関係のmethod 17 18#bitFlyerのAPIを読み込んで終値のデータをpandasのSeriesにして返す関数 19def get_price_data(): 20 response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params = { "periods" : period ,"after" : 1}) 21 response = response.json() 22 close_data = [] 23 for i in range(6000): 24 close_data.append(response["result"][str(period)][i][4]) 25 arr = np.array(close_data) 26 return pd.Series(arr) 27 28#-------------------------------------------------------------------- 29#テクニカル指標実装系method 30 31#EMA 32#EMA_periodは期間、nはろうそく何本分前の値か 33def EMA(EMA_period,n): 34 EMA_data = [] 35 for i in range(2*EMA_period): 36 EMA_data.insert(0,close[data_n-1-i]) 37 if n == 0: 38 arr = np.array(EMA_data)[-EMA_period:] 39 else: 40 arr = np.array(EMA_data)[-n-EMA_period:-n] 41 #print(arr) 42 EMA = pd.Series(arr).ewm(span=EMA_period).mean() 43 #print(EMA) 44 45 return EMA[EMA_period-1] 46 47 48#MACD 49#a=短期EMA_period,b=長期EMA_period,s=シグナル期間 50def MACD_and_signal(a,b,s): 51 MACD = [] 52 for i in range(a): 53 MACD.insert(0,EMA(a,i)-EMA(b,i)) 54 arr = np.array(MACD)[-s:] 55 Signal = pd.Series(arr).rolling(s).mean() 56 57 return MACD,Signal 58 59 60#ATR 61#nは期間、n=14が普通 62def ATR(n): 63 data = [] 64 for i in range(2*n-1): 65 p1 = response[data_n-i-1][2]-response[data_n-i-1][3] #当日高値-当日安値 66 p2 = response[data_n-i-1][2]-response[data_n-i-2][4] #当日高値-前日終値 67 p3 = response[data_n-i-1][3]-response[data_n-i-2][4] #当日安値-前日終値 68 tr = max(abs(p1),abs(p2),abs(p3)) 69 data.insert(0,tr) 70 arr = np.array(data)[-n:] 71 #print(arr) 72 ATR = pd.Series(arr).ewm(span=n).mean() 73 #print(ATR) 74 return ATR[n-1] 75 76 77#RSI 78#pは期間 79def RSI(p): 80 RSI_period = p 81 #RSI_data = 82 diff = close.diff(1) 83 positive = diff.clip_lower(0).ewm(alpha=1.0/RSI_period).mean() 84 negative = diff.clip_upper(0).ewm(alpha=1.0/RSI_period).mean() 85 RSI = 100-100/(1-positive/negative) 86 return RSI 87 88 89 90#-------------------------------------------------------------------- 91#評価値系 92 93#買いサイン 94def buy_signal(): 95 rsi = RSI(14) 96 if rsi < 25 : 97 return True 98 else: 99 return False 100 101 102#売りサイン 103def sell_signal(): 104 rsi = RSI(10) 105 if rsi > 75 : 106 return True 107 else: 108 return False 109 110#-------------------------------------------------------------- 111#ここからアルゴリズム 112 113#設定 114#何秒足か 115period = 60 116#終値配列の長さ 117data_n = 100 118#flag 119flag = { 120 "check":True, 121 "sell_position":False, 122 "buy_position":False 123} 124close_data = get_price_data() 125#print(close_data) 126response_data = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params = { "periods" : period , "after" : 1}) 127response_data = response_data.json() 128#print (response_data) 129i = profit = loss = count1 = count2 = drawdown = start = 0 130asset_list = [0] 131 132 133while i < 5500: 134 while(flag["check"]): 135 response = [] 136 closelist = [] 137 for j in range(data_n): 138 response.append(response_data["result"][str(period)][i+j+start]) 139 closelist.append(close_data[i+j+start]) 140 arr = np.array(closelist) 141 close = pd.Series(arr) 142 #print(response[data_n-1][0]) 143 #print(close[data_n-1]) 144 145 146 147 if buy_signal() : 148 print("買い注文をします") 149 print("ATR:"+str(int(ATR(14)))) 150 price = close[data_n-1] 151 width = int(2*ATR(14)) 152 flag["buy_position"] = True 153 flag["check"] = False 154 else:print("買い注文しません") 155 156 if sell_signal(): 157 print("売り注文をします") 158 print("ATR:"+str(int(ATR(14)))) 159 price = close[data_n-1] 160 width = int(2*ATR(14)) 161 flag["sell_position"] = True 162 flag["check"] = False 163 else:print("売り注文しません") 164 165 i += 1 166 167 168 while(flag["sell_position"]): 169 response = [] 170 closelist = [] 171 for j in range(data_n): 172 response.append(response_data["result"][str(period)][i+j+start]) 173 closelist.append(close_data[i+j+start]) 174 arr = np.array(closelist) 175 close = pd.Series(arr) 176 print(response[data_n-1][0]) 177 print(close[data_n-1]) 178 if response[data_n-1][3] < price-width: 179 print("利確:+"+str(width)) 180 count1 += 1 181 profit += width 182 flag["sell_position"] = False 183 flag["check"] = True 184 if response[data_n-1][2] > price+width: 185 print("損切り:-"+str(width)) 186 count2 += 1 187 loss += width 188 flag["sell_position"] = False 189 flag["check"] = True 190 i += 1 191 192 while(flag["buy_position"]): 193 response = [] 194 closelist = [] 195 for j in range(data_n): 196 response.append(response_data["result"][str(period)][i+j+start]) 197 closelist.append(close_data[i+j+start]) 198 arr = np.array(closelist) 199 close = pd.Series(arr) 200 print(response[data_n-1][0]) 201 print(close[data_n-1]) 202 if response[data_n-1][2] > price+width: 203 print("利確:+"+str(width)) 204 count1 += 1 205 profit += width 206 flag["buy_position"] = False 207 flag["check"] = True 208 if response[data_n-1][3] < price-width: 209 print("損切り:-"+str(width)) 210 count2 += 1 211 loss += width 212 flag["buy_position"] = False 213 flag["check"] = True 214 i += 1 215 216 asset_list.append(profit-loss) 217 218 if drawdown > profit - loss: 219 drawdown = profit - loss 220 221 222 223#print("利益合計:"+str(profit)) 224print("損失合計:"+str(loss)) 225print("儲け:"+str(profit-loss)) 226print("利確回数:"+str(count1)) 227print("損切り回数:"+str(count2)) 228ts = pd.Series(np.array(asset_list)) 229ts.plot() 230plt.show() 231
試したこと
buy_signalなどが間違っているのかと思って、色々変更してみましたがうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
Python 3.6.4 :: Anaconda, Inc.
https://qiita.com/sodiumplus3/items/7b8292c922cfda9adb1c
参考にしました。
回答2件
あなたの回答
tips
プレビュー