ChatGPTにPythonコードを提示したうえで、訂正内容を指示して修正コードを取得してみました。
訂正元になるコードは以下です。これはpandas_datareaderで2000年1月1日以降の日経平均株価の四本値を取得してデータフレームに入れたものです。
from pandas_datareader import data as pdr
import datetime
import yfinance as yf
start = "2000-1-1"
end = datetime.date.today()
ticker = "^N225"
yf.pdr_override()
df = pdr.get_data_yahoo(ticker, start, end)
df
指示文(プロンプト)1:
下記のPythonコードを以下のように訂正してください。
1. df内の全行数を表示する
2. openよりcloseが下回る件数の割合を計算して表示する
3. openよりcloseが上回る件数の割合を計算して表示する
〜以下に先ほどのコードを入れる
回答:
以下が訂正されたPythonコードです。
from pandas_datareader import data as pdr
import datetime
import yfinance as yf
start = "2000-1-1"
end = datetime.date.today()
ticker = "^N225"
yf.pdr_override()
df = pdr.get_data_yahoo(ticker, start, end)
# 1. df内の全行数を表示する
print("全行数:", len(df))
# 2. openよりcloseが下回る件数の割合を計算して表示する
lower_count = len(df[df['Open'] > df['Close']])
lower_percentage = lower_count / len(df) * 100
print("OpenよりCloseが下回る件数の割合(%):", lower_percentage)
# 3. openよりcloseが上回る件数の割合を計算して表示する
higher_count = len(df[df['Open'] < df['Close']])
higher_percentage = higher_count / len(df) * 100
print("OpenよりCloseが上回る件数の割合(%):", higher_percentage)
訂正内容:
df内の全行数を表示するために、len(df)を使ってDataFrameの行数を取得し、print()関数で表示するようにしました。
OpenよりCloseが下回る件数の割合を計算して表示するために、DataFrameの条件抽出を行い、件数と割合を計算してprint()関数で表示するようにしました。
OpenよりCloseが上回る件数の割合を計算して表示するために、同様にDataFrameの条件抽出を行い、件数と割合を計算してprint()関数で表示するようにしました。
結果:
以下のように成功しました。
指示文(プロンプト)2:
openよりcloseが下回るケースが3回以上続く場合の割合
回答:
以下が修正後のPythonコードです。
from pandas_datareader import data as pdr
import datetime
import yfinance as yf
start = "2000-1-1"
end = datetime.date.today()
ticker = "^N225"
yf.pdr_override()
df = pdr.get_data_yahoo(ticker, start, end)
# 1. df内の全行数を表示する
print("全行数:", len(df))
# openよりcloseが下回るケースが3回以上続く場合の割合を計算して表示する
lower_consecutive_3_count = 0
for i in range(len(df)-2):
if (df.iloc[i]['Open'] > df.iloc[i]['Close']) and (df.iloc[i+1]['Open'] > df.iloc[i+1]['Close']) and (df.iloc[i+2]['Open'] > df.iloc[i+2]['Close']):
lower_consecutive_3_count += 1
lower_consecutive_3_percentage = lower_consecutive_3_count / (len(df)-2) * 100
print("OpenよりCloseが下回るケースが3回以上続く場合の割合(%):", lower_consecutive_3_percentage)
訂正内容: OpenよりCloseが下回るケースが3回以上続く場合の割合を計算して表示するために、DataFrameの各行のOpenとCloseの値を比較し、3回以上続く場合をカウントするループ処理を追加し、割合を計算してprint()関数で表示するようにしました。
結果:
以下のように成功しました。
いわゆるローソク足ですが、陽線、陰線のほか、上ヒゲでの陰線引けがn回以上続く確率などを対話的に求められます。Jupyter Notebookだとコードも追加して対話的に記述できるので、直近のローソク足の状況を自然文で記述して、確率を推測してみるとか、その場の思いつきで探索ができそうですね。