Pythonで株式チャートの表示 2 (移動平均)

前回のローソクチャートの上に移動平均を書いてみたいと思います。

その1

まづは単純に5、25日の移動平均を描きます。 rollingという関数で計算する窓枠をずらしながらmean関数で平均をとっていきます。ただし窓枠にはまるまでは計算できないので、最初の5,25日分は計算できないです。そのためmin_periodsというパラメータを設定して徐々に窓枠を大きくしていきます。

#移動平均の表示 (平均をとるデータはn225.Closeに収納)
avg_num1=5
avg_num2=25
#1つ目のSeries
sma1=n225['Close'].rolling(window=avg_num1,min_periods=1).mean()
ax1tmp.plot(sma1,color='lightgreen')
#2つ目のSeries
sma2=n225['Close'].rolling(window=avg_num2,min_periods=1).mean()
ax1tmp.plot(sma2,color='purple')
plt.show()

できたチャートが次になります。 f:id:mechagocha:20180401071508p:plain ダメっす。そりゃそうです最初の平均データ5日も25日も一緒です。

その2

で、窓枠にはまらないところを消してみました。

#移動平均の表示 (平均をとるデータはn225.Closeに収納)
avg_num1=5
avg_num2=25
xscatter = [x for x in range(0,days_num)]

#1つ目のSeries
sma1=n225['Close'].rolling(window=avg_num1).mean()
ax1tmp.plot(xscatter[avg_num1-1:],sma1[avg_num1-1:],color='lightgreen')
#1つ目のSeries
sma2=n225['Close'].rolling(window=avg_num2).mean()
ax1tmp.plot(xscatter[avg_num2-1:],sma2[avg_num2-1:],color='purple')

plt.show()

25日移動平均線短! f:id:mechagocha:20180401081059p:plain

その3

やっぱり多めにデータを用意するのが一番ですね。 データベースからWindow枠分のデータを引き抜いてきます。表示領域のデータとそのデータをくっつけます。そして移動平均表示の時に最初のデータを表示しないようにします。

#################################################
#移動平均の表示 (平均をとるデータはn225.Closeに収納)
#################################################

#何度も使うデータをまとめます
days_num = len(n225.index)
xbasedata_list = [x for x in range(0,days_num)]

#移動平均のwindow枠設定
avg_num1=5
avgnum_suf1=avg_num1-1
avg_num2=25
avgnum_suf2=avg_num2-1

#データベースよりwindow枠分のデータを引き抜く
con = sqlite3.connect(dbname, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
select_sql = "select * from n225 where Date<'{}' order by Date desc limit '{}';".format(firstDay,avgnum_suf1) 
n225_old=pd.read_sql_query(select_sql,con) #大きい順に並べて上からwidonw枠分過去のデータを取り出す。
n225_old=n225_old.sort_values(by='Date') #大きい順にとってきているので日付でソート
n225_sma1=n225_old.append(n225,ignore_index=True) #データをつなぎ合わせる(行番号つけなおし)

select_sql = "select * from n225 where Date<'{}' order by Date desc limit '{}';".format(firstDay,avgnum_suf2) 
n225_old=pd.read_sql_query(select_sql,con) #大きい順に並べて上からwidonw枠分過去のデータを取り出す。
n225_old=n225_old.sort_values(by='Date') #大きい順にとってきているので日付でソート
n225_sma2=n225_old.append(n225,ignore_index=True) #データをつなぎ合わせる(行番号つけなおし)
#print(n225_sma2)

con.close()

#1つ目のSeries
sma1=n225_sma1.Close.rolling(window=avg_num1,min_periods=avg_num1).mean()
ax1tmp.plot(xbasedata_list,sma1[avgnum_suf1:],color='lightgreen')
#print(sma1)
#print(sma1[avgnum_suf1:])

#2つ目のSeries
sma2=n225_sma2.Close.rolling(window=avg_num2,min_periods=avg_num2).mean()
ax1tmp.plot(xbasedata_list,sma2[avgnum_suf2:],color='purple')


plt.show()

グラフの出力は

f:id:mechagocha:20180401121639p:plain

ま、いい感じですね。

過去のデータなければどうすんねん、というのがありますが面倒なので気にしないでおきます。 あとは凡例の表示か。。。

next

凡例の表示です。 mechagocha.hatenablog.com

参考

参考にさせていただいたサイトです。

qiita.com