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

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

新規登録して質問してみよう
ただいま回答率
85.47%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

0回答

949閲覧

pythonで株価データをリストに入れて,一つずつループ処理をしてif文に繋げたい

tetora000

総合スコア0

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2021/01/07 00:16

編集2021/01/10 16:01

前提・実現したいこと

現在,pythonである投資方法を基にして,その方法に沿ったパターンが過去に何回起こったか,またその勝率はどのくらいなのかを調べています.
その投資方法というのが,チャートを参考にしたものなのですが,全体の株価の5%~25%をボックス圏として揉み合い,そこから数ヶ月したら上振れするという投資方法で,この勝率を求めたいと思っています.

colaboratory を使っています.(各セルごとに1行ずつ開けてます)

5%の株価を(sup_line),25%の株価を(resi_line)としてます.
また揉み合う期間を記録する(renzoku_days),何日揉み合うかを決める変数(momidays)としてます.

今回分からないところが,

・リストの中でボックス圏を揉み合う連続した値(renzoku_days)のカウント
・勝った時のカウントの仕方=負けた時のカウント
・途中で条件に合わなかった時のリストを続きから読み込むやり方

です.

発生している問題・エラーメッセージ

ValueError Traceback (most recent call last) <ipython-input-34-da09756d28d2> in <module>() 1 for p_today in kabu: ----> 2 if (sup_line <= p_today <= resi_line): 3 renzoku_days += 1 4 if (renzoku_days > momidays): #何日連続しているか 5 if (resi_line < p_today): #勝ち!! ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

該当のソースコード

from datetime import datetime from pandas_datareader import data import pandas as pd import numpy as np start = '2019-01-01' end ='2020-01-01' df = data.DataReader('GOOG', 'yahoo', start, end) df len(df) df['Adj Close'] df.values df.index k_ris = df.values d_ris = df.index k_ris print(type(k_ris)) df = df['Adj Close'] # 5%,25%を出す row = 5 high = 25 sup_line,resi_line=np.percentile(df,[row,high]) print(sup_line) print(resi_line) kabu = k_ris.tolist() print(kabu) len(kabu) momidays = 30 #揉み合う期間を決める renzoku_days = 0 #揉み合い期間の長さを記録する win = 0 lose = 0 #ここからエラーが出ているところです for p_today in kabu: if (sup_line <= p_today <= resi_line): renzoku_days += 1 if (renzoku_days > momidays): #何日連続しているか if (resi_line < p_today): #勝ち!! win += 1 print(renzoku_days,'日間揉み合った結果上振れ') renzoku_days = 0 elif (p_today < sup_line): #負けた,,, lose += 1 print(renzoku_days,'日間揉み合った結果下振れ') renzoku_days = 0 else: #揉み合ってない! renzoku_days = 0 renzoku_days = 0 #ここからエラーは出てません pattern = win + lose if (win ==0): win_rate = 0 else: win_rate = win / pattern * 100 print('計測開始      :', start) print('計測終了      :', end) print('揉み合う期間    :', momidays) print('実際に揉み合った期間:', renzoku_days) print('レジスタンスライン : ', row, '%,', sup_line) print('サポートライン   :', high,'%,',resi_line) print('パターン数     :',pattern,'回') print('勝率        :',win_rate,'%')

追記のソースコード

from datetime import datetime from pandas_datareader import data import pandas as pd import numpy as np start = '2019-01-01' end ='2020-01-01' df = data.DataReader('GOOG', 'yahoo', start, end) lst = df['Adj Close'].values.tolist() print(lst) momi_days = 30 renzoku_days = 0 win = 0 lose = 0 # 5%,25%を出す row = 5 high = 25 sup_line,resi_line=np.percentile(lst,[row,high]) print(sup_line) print(resi_line) len(lst) for p_today in lst: if (sup_line <= p_today <= resi_line): renzoku_days += 1 if (renzoku_days > momi_days): #何日連続しているか if (resi_line < p_today): #勝ち!! win += 1 print(renzoku_days,'日間揉み合った結果上振れ') renzoku_days = 0 elif (p_today < sup_line): #負けた,,, lose += 1 print(renzoku_days,'日間揉み合った結果下振れ') renzoku_days = 0 else: #揉み合ってない! renzoku_days = 0 renzoku_days = 0

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

プログラミングは実践だというので自分なりに初めて作ってみました.
すごくごちゃごちゃしていてすいません...
よろしくお願いします.

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

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

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

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

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

meg_

2021/01/07 02:27

エラー発生箇所が不明です。エラーメッセージは抜粋ではなく全文掲載しないと回答が困難です。 またコードにインデントがないので付けてください。
meg_

2021/01/07 08:43

renzoku_days = 0 上記コードで「IndentationError: unindent does not match any outer indentation level」のエラーが出ました。対応お願いします。
tetora000

2021/01/07 08:51

お手数おかけして,大変申し訳ありません. 修正しました.
meg_

2021/01/07 09:14

今度は「kabu = k_ris.tolist()」のところで「NameError: name 'k_ris' is not defined」のエラーが出ました。検証可能なコードを提示されるのは難しい状況でしょうか?
tetora000

2021/01/07 10:05

本当に申し訳ありません. 変数に格納したのを入れ忘れていました.
meg_

2021/01/07 12:39

エラーは出なくなりました。 「(sup_line <= p_today <= resi_line)」のコードで実現したい結果は何でようか?
tetora000

2021/01/07 13:28

p_todayが条件にあった時にrenzoku_daysを+1ずつカウントするような結果を出したいです. また条件に合わなかった時にrenzoku_daysの値を0にしてリストの途中から再び審査していくような仕様にしたいです.
meg_

2021/01/07 13:35

条件式(sup_line <= p_today <= resi_line)でTrueとなる条件は何か?という質問です。 デバッグしたところループの初回ではsup_lineとresi_lineに1つの要素、p_todayに6つの要素が入っていました。それらの大小をどのように比較したいのでしょうか? ※現状の書き方ではエラーになるため書き換える必要がありますが、質問者さんの意図が分からないため直せません。例えば条件を満たすものが1つでもあればTrueとするのか?、全ての要素が満たせばTrueとするのか?などです。
tetora000

2021/01/07 14:41 編集

自分がしようとしていることが,( チャートで考えるとわかりやすいのですが ) 株価が一定の価格の範囲内に,一定期間入っていた後に,上張れするのか下振れするのかを見ようとしています. 一定の範囲内       : sup_line <= リスト内の株価をひとつずつ入れていく <= resi_line 一定期間         : momidays 揉み合う期間をカウントする: renzoku_days 一定の範囲内に一定期間入り続けた後に上張れ or 下振れした時に勝ち or 負けを記録すればいいのですが,その後,残りのリストを審査していく中でまた範囲に入ってくるようなことがあったら,それもまた記録していきたいのです. また一定の価格の範囲内に入ったとしても,一定期間内に範囲を外れるようなことがあれば,再びrenzoku_daysを0にして,また範囲に入ってきたら+1ずつ上げていきたいです. meg_さんのおっしゃっているのは,any(),all()でしょうか. 私も使おうとしたのですが,この場合だとどのように使ったらいいのか分かりませんでした.
meg_

2021/01/07 14:57

すみませんがロジックについての説明を求めているのではなく、(sup_line <= p_today <= resi_line)でどんなときにTrueで、どんなときにFalseとしたいのか?が知りたいのです。 ループの初回で3つの変数値は下記となっていました。 sup_line:1070.4344909667968 p_today:[1052.3199462890625, 1015.7100219726562, 1016.5700073242188, 1045.8499755859375, 1532600.0, 1045.8499755859375] resi_line:1121.5274658203125 これらから算出したいものは何でしょうか?
meg_

2021/01/07 14:59

> 一定の範囲内       : sup_line <= リスト内の株価をひとつずつ入れていく <= resi_line もしかして、p_todayが複数値になっているのが想定外だったりしますか?
tetora000

2021/01/07 15:19 編集

丁寧な説明ありがとうございます. この場合,範囲に入っているものをTrueとし,入っていないものをFalseとしたいです. p_todayが複数値ではないと思っていました. なぜ,252個の要素が入ったリストをひとつずつp_todayに格納すると6つになってしまうのでしょうか. 私がしたいことは,今回のリストの252個のデータをひとつずつif文で審査していきたいと思っております.
meg_

2021/01/07 15:40 編集

プログラム中に「print(kabu)」のコードがあるので、変数kabuの中身については確認済のはずでが違いますか?そこを確認して修正する必要がありますね。
tetora000

2021/01/07 16:01

しっかり出てきています. その後に記述したlenにも252と出ています.
meg_

2021/01/07 16:46

変数kabuはリストのリストですよね?kabuの要素数が252でその各要素の要素数が「6」なのでは?
tetora000

2021/01/07 16:51

つまりp_todayは252個の要素が6つに分かれているということでしょうか? またなぜ6つになるのかを教えていただけませんか.
meg_

2021/01/08 01:08

print(kabu[0])としたときに何が出力されますか?
tetora000

2021/01/09 07:49

[1052.3199462890625, 1015.7100219726562, 1016.5700073242188, 1045.8499755859375, 1532600.0, 1045.8499755859375] と出てきました. なぜ,一つだけではないのでしょうか? 途中で余計な処理を入れてますか?
meg_

2021/01/09 12:57

> なぜ,一つだけではないのでしょうか? > 途中で余計な処理を入れてますか? np.shape(df.values)の結果は(252, 6)であり、元々6列のデータだからですね。
tetora000

2021/01/10 06:02

なるほど!!Adj Closeだけではなく,他の値も出ていたってことですね. ありがとうございます. ちなみに,for文のところなのですが,エラーは出ないのですが実行結果が何も出力されません. 何か足りないのでしょうか...
meg_

2021/01/10 11:59

> ちなみに,for文のところなのですが,エラーは出ないのですが実行結果が何も出力されません. > 何か足りないのでしょうか... 何のことを言っているのでしょうか? 質問のコードは「ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()」のエラーで止まるコードのままです。
tetora000

2021/01/10 14:32

from datetime import datetime from pandas_datareader import data import pandas as pd import numpy as np start = '2019-01-01' end ='2020-01-01' df = data.DataReader('GOOG', 'yahoo', start, end) lst = df['Adj Close'].values.tolist() print(lst) momi_days = 30 renzoku_days = 0 win = 0 lose = 0 # 5%,25%を出す row = 5 high = 25 sup_line,resi_line=np.percentile(lst,[row,high]) print(sup_line) print(resi_line) len(lst) for p_today in lst: if (sup_line <= p_today <= resi_line): renzoku_days += 1 if (renzoku_days > momi_days): #何日連続しているか if (resi_line < p_today): #勝ち!! win += 1 print(renzoku_days,'日間揉み合った結果上振れ') renzoku_days = 0 elif (p_today < sup_line): #負けた,,, lose += 1 print(renzoku_days,'日間揉み合った結果下振れ') renzoku_days = 0 else: #揉み合ってない! renzoku_days = 0 renzoku_days = 0 上記のコードで作り直してみたのですが,何も出力されませんでした...
meg_

2021/01/10 15:32

この欄ではインデントが消えてしまってコードが実行できません。質問に追記していただきたいです。
tetora000

2021/01/10 16:02 編集

追記しました! よろしくお願いします.
meg_

2021/01/11 11:20

> 上記のコードで作り直してみたのですが,何も出力されませんでした... sup_line <= p_today <= resi_line がFalseだからではないですか?
tetora000

2021/01/11 19:13

> sup_line <= p_today <= resi_line がFalseだからではないですか? p_todayの要素一つ一つをTrueだったら次のif文に移行させてFalseだった場合はrenzoku_daysの値を0にしたいと思っています。 要素を一つづつ取り出して審査していきたい場合だとif文ではないものを使った方が良いのでしょうか
meg_

2021/01/12 02:12

sup_line <= p_today <= resi_line が成り立つデータがなかったということです。この結果が想定外なのであれば、条件式が間違っているかデータが悪いかだと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問