pythonでローソク足を描く

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型への変換が必要となります。

pythonで描いたローソク足チャート
同じ銘柄の同じ期間の増田足

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が出ます。PerlPythonではwarningが出つつも普通に処理されますが、C言語系なら無理なやつです。

最終形態
関連記事