前回のローソクチャートの上に移動平均を書いてみたいと思います。
その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()
できたチャートが次になります。 ダメっす。そりゃそうです最初の平均データ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日移動平均線短!
その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()
グラフの出力は
ま、いい感じですね。
過去のデータなければどうすんねん、というのがありますが面倒なので気にしないでおきます。 あとは凡例の表示か。。。
next
凡例の表示です。 mechagocha.hatenablog.com
参考
参考にさせていただいたサイトです。