🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

1回答

1609閲覧

複数銘柄で株価指標を表示するプログラムを作成したい

ryou4r0

総合スコア2

Python

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

0グッド

0クリップ

投稿2021/03/10 07:26

編集2021/03/10 07:46

前提・実現したいこと

Pythonで複数の銘柄で複数の株価指標を表示するプログラムを作成したい

作成したコードでは1つの銘柄の指標結果しか表示されないため、抜け・誤りがあれば教えていただきたいです。

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

1つの銘柄分の指標結果しか表示されない

該当のソースコード

Python

1import datetime as dt 2from datetime import timedelta as td 3import pandas as pd 4import pandas_datareader.data as web 5import math 6import numpy as np 7import talib as ta 8 9end = dt.datetime.today() 10start = end - td(days=1000) 11 12Ticker = ['MSFT','FB','AAPL','CHTR','ACC','ACH','ACHC','ACI','ACIA','ACIW','ACLS','ACM'] 13 14df = web.DataReader(Ticker[0],'yahoo',start,end) 15 16df['mfi'] = ta.MFI(df['High'], df['Low'], df['Adj Close'], df['Volume'], timeperiod=14) 17df[Ticker[0]] = df['mfi'] 18da = pd.DataFrame(df[Ticker[0]].dropna(how='any')) 19 20for i in range(1,len(Ticker)): 21 try: 22 globals()['df'+str(i)] = web.DataReader(Ticker[i],'yahoo',start,end) 23 globals()['df'+str(i)]['mfi'] = ta.MFI(globals()['df'+str(i)]['High'], ['df'+str(i)]['Low'], ['df'+str(i)]['Adj Close'], ['df'+str(i)]['Volume'], timeperiod=14) 24 da[Ticker[i]] = globals()['df'+str(i)]['mfi'].dropna(how='any') 25 except: 26 pass 27 28pd.options.display.precision = 2 29da.tail()

試したこと

上記プログラムの実行結果
Date     MSFT
2021-03-03 32.47
2021-03-04 26.27
2021-03-05 30.37
2021-03-08 29.91
2021-03-09 36.59

表示したい結果
Date     MSFT  FB  AAPL  ....
2021-03-03 32.47  00.00  ....
2021-03-04 26.27   00.00   ....
2021-03-05 30.37   ....   ....
2021-03-08 29.91   ....   ....
2021-03-09 36.59   ....   ....

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

同様のプログラムで指標をRSIにした場合は問題なく表示できました。

Python

1import datetime as dt 2from datetime import timedelta as td 3import pandas as pd 4import pandas_datareader.data as web 5import math 6import numpy as np 7import talib as ta 8 9end = dt.datetime.today() 10start = end - td(days=1000) 11 12Ticker = ['MSFT','FB','AAPL','CHTR','ACC','ACH','ACHC','ACI','ACIA','ACIW','ACLS','ACM'] 13 14df = web.DataReader(Ticker[0],'yahoo',start,end) 15 16df['rsi'] = ta.RSI(df['Adj Close'], timeperiod=14) 17df[Ticker[0]] = df['rsi'] 18da = pd.DataFrame(df[Ticker[0]].dropna(how='any')) 19 20for i in range(1,len(Ticker)): 21 try: 22 globals()['df'+str(i)] = web.DataReader(Ticker[i],'yahoo',start,end) 23 globals()['df'+str(i)]['rsi'] = ta.RSI(globals()['df'+str(i)]['Adj Close'], timeperiod=14) 24 da[Ticker[i]] = globals()['df'+str(i)]['rsi'].dropna(how='any') 25 except: 26 pass 27 28pd.options.display.precision = 2 29da.tail()

プログラムの実行結果
MSFT FB AAPL CHTR ACC ACH ACHC ACI ACIA ACIW ACLS ACM
Date
2021-03-03 41.31 41.40 37.13 43.28 48.66 72.22 58.04 61.93 NaN 38.36 53.12 56.42
2021-03-04 40.43 43.74 34.71 46.34 42.25 63.13 54.95 63.81 NaN 35.40 45.50 52.65
2021-03-05 47.50 50.12 37.63 53.07 48.07 56.73 57.21 61.03 NaN 43.74 49.61 58.43
2021-03-08 42.77 43.02 31.65 48.42 50.97 58.45 62.58 52.44 NaN 46.20 43.42 59.54
2021-03-09 50.78 51.60 41.08 49.40 49.57 56.63 64.01 53.00 NaN 50.19 51.21 62.00

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

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

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

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

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

y_waiwai

2021/03/10 07:30

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
ryou4r0

2021/03/10 07:47

ご指摘ありがとうございます。 補足情報内のプログラムを'''で囲みましたのでお知らせいたします。
guest

回答1

0

ベストアンサー

問題あるほうのコードを実行しようとするとSyntaxWarningがでます:

SyntaxWarning: list indices must be integers or slices, not str; perhaps you missed a comma?

該当行を見てみます。

python

1globals()['df'+str(i)]['mfi'] = ta.MFI(globals()['df'+str(i)]['High'], ['df'+str(i)]['Low'], ['df'+str(i)]['Adj Close'], ['df'+str(i)]['Volume'], timeperiod=14)

MFI()に渡しているものが

globals()['df'+str(i)]['High'], ['df'+str(i)]['Low'], ['df'+str(i)]['Adj Close'], ['df'+str(i)]['Volume'], timeperiod=14

ところどころglobals()抜けてませんか?

投稿2021/03/10 08:00

ozwk

総合スコア13551

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

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

ryou4r0

2021/03/10 09:56

コメントのとおりglobals()をそれぞれの値の前に入れると表示されました! 初歩的な質問にお付き合いいただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問