pythonでプログラムを書き始めてから3日目です。
株価の時系列データは無料で公開しているところはほぼ無いのと、その逆にローソク足チャートを無料で見れるサイトはいくらでもあるので、こんな記事を誰が読むのか不明ですが、同様の試みを行った人たちの記事が古いので、忘備録として残しておきます。
"matplotlib.finance"というpythonのライブラリーはもう無いし、その後継の"mpl_finance"も使用すると「"mpl_finance"をuninstallして、"mplfinance"を使ってください」というwarningが出るのです。ということで、"mplfinance"をインストールします。
"mplfinance"を使ったサンプルです。
import csv import pandas import mplfinance data2d = [] datedata = [] with open('e:/data/python/kabu/data/code/****.csv',"r") as datafile: datacsv = csv.reader(datafile) for row in datacsv: datedata.append(row[0]) open_ = float(row[1]) high_ = float(row[2]) low_ = float(row[3]) close_ = float(row[4]) edit_ = [open_, high_, low_, close_] data2d.append(edit_) datafile.close() dateindex = pandas.DatetimeIndex(datedata) df = pandas.DataFrame(data2d,columns=['Open','High','Low','Close'], index=dateindex) mplfinance.plot(df,type='candle')
CSVデータファイルに関しては、どこかで入手してください。
indexに使用する日付データは、pandas.DatetimeIndex 形式への変換が必須となっています。他のデータも読み込んだままではstr型ですので、float型への変換が必要となります。
import csv import pandas import mplfinance drowperiod = 60 data2d = [] datedata = [] with open('e:/data/topix_daily.csv',"r") as datafile: datacsv = csv.reader(datafile) for row in datacsv: dateedit = row[0] dateedit = dateedit[0:4] + '-' +dateedit[4:6] + '-' + dateedit[6:] datedata.append(dateedit) ohlc = [float(row[3]), float(row[4]), float(row[5]), float(row[6])] data2d.append(ohlc) datafile.close() dateindex = pandas.DatetimeIndex(datedata) df1 = pandas.DataFrame(data2d,columns=['Open','High','Low','Close'],index=dateindex) df1['3days'] = df1['Close'].rolling(3).mean() df1['20days'] = df1['Close'].rolling(20).mean() df1['25days'] = df1['Close'].rolling(25).mean() df1['75days'] = df1['Close'].rolling(75).mean() df1['%K'] = (df1['Close'] -df1['Low'].rolling(window=24).min())*100/(df1['High'].rolling(window=24).max() -df1['Low'].rolling(window=24).min()) df1['%D'] = df1['%K'].rolling(3).mean() df1['tenkan'] = (df1['High'].rolling(9).max() + df1['Low'].rolling(9).min())/2 df1['kijun'] = (df1['High'].rolling(26).max() + df1['Low'].rolling(26).min())/2 df1['senko1'] = ((df1['tenkan'] + df1['kijun'])/2).shift(26) df1['senko2'] = ((df1['High'].rolling(52).max() + df1['Low'].rolling(52).min())/2).shift(26) df1['20'] = 20 df1['80'] = 80 data2d2 =[] datamd = [] yesterday_ = 0 with open('e:/data/topix_sig.csv',"r") as datafile2: datacsv = csv.reader(datafile2) for row in datacsv: data2d2.append([float(row[4]) + float(row[5])*2, float(row[4]) - float(row[5])*2]) if df1['3days'][row[0]] > df1['3days'][yesterday_]: edit_ = [df1['3days'][yesterday_], df1['3days'][row[0]], df1['3days'][yesterday_], df1['3days'][row[0]], float(row[4])] else: edit_ = [df1['3days'][yesterday_], df1['3days'][yesterday_], df1['3days'][row[0]], df1['3days'][row[0]], float(row[4])] datamd.append(edit_) yesterday_ = row[0] datafile2.close() del datedata[0:-drowperiod] del data2d2[0:-drowperiod] del datamd[0:-drowperiod] dateindex2 = pandas.DatetimeIndex(datedata) df2 = pandas.DataFrame(data2d2,columns=['psigma','nsigma'],index=dateindex2) df3 = pandas.DataFrame(datamd,columns=['Open','High','Low','Close','20day'],index=dateindex2) lastdate = datedata[-drowperiod] apdict = [ mplfinance.make_addplot(df1['25days'][lastdate:],label="25days",color='#1E90FF',width=1), mplfinance.make_addplot(df1['75days'][lastdate:],label="75days",color='#b8860b',width=1), mplfinance.make_addplot(df2[['psigma','nsigma']],label=["+2σ","-2σ"],color='#9932cc',width=1), mplfinance.make_addplot(df1['tenkan'][lastdate:],label="tenkan", panel=0,color='#3cb371',width=1), mplfinance.make_addplot(df1['senko1'][lastdate:],label="senko1", panel=0,color='#006B3D',alpha=0.8,width=1), mplfinance.make_addplot(df1['senko2'][lastdate:],label="senko2", panel=0,color='#D3212C',alpha=0.8,width=1), mplfinance.make_addplot(df1[['%K','%D']][lastdate:],label=['%K','%D'],ylim=[0, 100], panel=1), mplfinance.make_addplot(df1[['80', '20']][lastdate:],panel=1,color='#ff00ff',width=1), # make_addplot では hlines指定は無効 mplfinance.make_addplot(df3[['Open','High','Low','Close']],type='candle', panel=2), mplfinance.make_addplot(df1['20days'][lastdate:],label="20days", panel=2,color='#1E90FF',width=1), mplfinance.make_addplot(df1['75days'][lastdate:],label="75days", panel=2,color='#b8860b',width=1), mplfinance.make_addplot(df2[['psigma','nsigma']],label=["+2σ","-2σ"], panel=2,color='#9932cc',width=1), ] ichimoko_fill_up = dict(y1 = df1['senko1'][lastdate:].values, y2 = df1['senko2'][lastdate:].values, where = df1['senko1'][lastdate:] >= df1['senko2'][lastdate:], alpha = 0.5, color = '#a6f7a6') ichimoko_fill_down = dict(y1 = df1['senko1'][lastdate:].values, y2 = df1['senko2'][lastdate:].values, where = df1['senko1'][lastdate:] < df1['senko2'][lastdate:], alpha = 0.5, color = '#FC8EAC') pngsavefile = 'e:/data/test.png' mplfinance.plot(df1[lastdate:],type='candle',addplot=apdict,figsize=(9,18),panel_ratios=(5,2,4),fill_between = [ichimoko_fill_up,ichimoko_fill_down],savefig=pngsavefile)
hlines は panel = 0 にしか適応できません。
変数 "yesterday_" について、最初はint型で定義しておきながら、後からstr型を代入しているのでwarningが出ます。PerlやPythonではwarningが出つつも普通に処理されますが、C言語系なら無理なやつです。関連記事