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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

受付中

株価のデータフレームから、特定の銘柄の推奨日以降のドローダウンなどを出したい

H.K2
H.K2

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0回答

0評価

2クリップ

555閲覧

投稿2020/05/31 16:43

前提・実現したいこと

下記図のように、price_df(株価のデータフレーム,sqlite3から取得)と、stock_df(画像右,登録日付、銘柄コードなどが記載)のデータフレームより、登録日付以降の各銘柄コードより、購入日以降のドローダウン値、最大損失値を出したいとかんがえています。
イメージ説明

その前段階で、購入日を下記ルールで算出しようとしました。
① 公開日のつぎの日の寄り付き値を求める(購入価格)
②「購入日」、「購入価格列」を追加して、①の値段をこの列の全行に入れる
③②とLowの差を出して、その結果を列として追加(別ファイルでもよい)
④③が入ったDFを日時で切り出して可視化する

このとき、次の日に寄り付かないことも銘柄によってはあるため、high-lowという列も追加しました。
この値がゼロの時は、寄り付いていないと判断し、「次の日の寄り付き」を出すために、df_queryで
high-low列が0でないものを分離しようと考えました。

その際、下記のようなコードを書いてみたのですが、エラーが出てしまいました。

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

エラーメッセージ ----> stock_df["購入日"] = stock_df.apply(get_parchase_day, df=price_df, code=stock_df["銘柄コード"], date=stock_df["登録日付"], column_str="open", axis=1) C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, raw, result_type, args, **kwds) 6876 kwds=kwds, 6877 ) -> 6878 return op.get_result() 6879 6880 def applymap(self, func) -> "DataFrame": C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\apply.py in get_result(self) 184 return self.apply_raw() 185 --> 186 return self.apply_standard() 187 188 def apply_empty_result(self): C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\apply.py in apply_standard(self) 294 try: 295 result = libreduction.compute_reduction( --> 296 values, self.f, axis=self.axis, dummy=dummy, labels=labels 297 ) 298 except ValueError as err: pandas\_libs\reduction.pyx in pandas._libs.reduction.compute_reduction() pandas\_libs\reduction.pyx in pandas._libs.reduction.Reducer.get_result() C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\apply.py in f(x) 111 112 def f(x): --> 113 return func(x, *args, **kwds) 114 115 else: TypeError: get_parchase_day() got multiple values for argument 'df'

該当のソースコード

import sqlite3 import pandas as pd from datetime import datetime from datetime import timedelta import pandas.tseries.offsets as offsets # pandas日付データのオフセット(offsets.Day())に使う。 def get_partical_df(df, code, date): ret_df = df.query("code == @code & date > @date & high-low != 0") return ret_df # 購入日を求める関数(applyに渡す用) def get_parchase_day(df, code, date, column_str): # tmp_df = get_partical_df(df, code, date) # return tmp_df[column_str].iloc[0] tmp_df = df.query("code == @code & date > @date & high-low != 0")[0] print(tmp_df) return tmp_df[column_str] stock_df["購入日"] = stock_df.apply(get_parchase_day, df=price_df, code=stock_df["銘柄コード"], date=stock_df["登録日付"], column_str="open", axis=1)

試したこと

速度の関係上、できればforで回したくなかったのですが、いろいろ試しても動かないので、下記のようにforで回すパターンも作ろうとしてみました。(しかし、エラーは出なくなったが、すべて同じ購入日が帰ってきてしまう。)

for st_code, st_date in zip(stock_df["銘柄コード"], stock_df["登録日付"]):
print(st_code, st_date)
tmp_df = get_partical_df(price_df, str(st_code), st_date)

if tmp_df.empty: continue print(tmp_df["low"].iloc[0]) stock_df["購入日"] = tmp_df["date"].iloc[0] stock_df["購入価格"] = tmp_df["low"].iloc[0]

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

python 3.7.4
pandas 1.0.1

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。