質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Bitcoin

Bitcoinは、インターネット上で流通している電子マネーです。P2Pネットワークを通じた安価な決済コストが実現できる一方、取引時の危険性や闇市場・資金洗浄など不正取引の温床といった法的問題も抱えています。

Q&A

解決済

2回答

977閲覧

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). のエラーに

gon_gon_tarou

総合スコア16

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Bitcoin

Bitcoinは、インターネット上で流通している電子マネーです。P2Pネットワークを通じた安価な決済コストが実現できる一方、取引時の危険性や闇市場・資金洗浄など不正取引の温床といった法的問題も抱えています。

0グッド

0クリップ

投稿2019/02/10 07:21

編集2019/02/10 07:26

前提・実現したいこと

ビットコインの自動売買のバックテストを作ろうと思ってます。

目的は、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
参考にしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/02/10 07:23

エラーは省略せず、traceback含めて全文貼ってください
gon_gon_tarou

2019/02/10 07:25

承知しました。ご指摘ありがとうございます。
guest

回答2

0

ベストアンサー

あまり細かく見ていませんが、

python

1def buy_signal(): 2 rsi = RSI(14) 3 if rsi < 25 : 4 return True 5 else: 6 return False

のところでRSI(14)の返り値がpandas.Series型になっています。これは複数の要素を持つデータ型なので、一意に全体の真理値が決まりません。if文の条件に書く場合は真理値に変換できないといけないので、エラーを出してくれます(親切ですね)。

Series型として返ってくるのが意図した動作でなければ、全体的にコードを見直す必要があります。Seriesを期待しているとしても、使い方を間違っている状況なのでコードを見直す必要があります。

投稿2019/02/10 07:33

編集2019/02/10 07:35
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

提示コードは把握していませんが、以下のような修正をするとよいのかもしれません。

Python

1import pandas as pd 2s = pd.Series([1,2]) 3 4# ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 5#if s < 3: 6# print('abc') 7 8# OK 9if s.all() < 3: 10 print('abc') 11 12# OK 13if s.any() < 3: 14 print('abc')

投稿2019/02/10 07:38

編集2019/02/10 07:42
can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問