お金の健康

投資にプログラミングを使いたい!Pythonでチャート分析をした話

こんにちはー、ウチダです。

投資でひと儲けするためにオリジナルの分析をしたいと思ったことはありませんか?

私はプログラミング言語Pythonが金融分析に役立つというYoutube動画を見て、Pythonを独学しています。

今回はPythonを使った投資のチャート分析について紹介します。

投資にプログラミングを使いたい!Pythonで分析を始めよう

投資にプログラミングを使いたい!Pythonで分析を始めよう

私は投資とプログラミングの組み合わせを独学しています。

プログラミング言語にはPythonを使用しています。

プログラミング言語pythonを投資に使う

Pythonはデータ分析、AI、機械学習、深層学習といった分野の主要言語となっています。

コードがシンプルで読み書きしやすく、初学者でも勉強しやすい特徴があります。

さらに個人的な考えでは、

  • 「データ分析とかAIとか、投資に活用できたらめっちゃ面白そう
  • 「海外でかなり人気が高く、Youtubeで「Python investment」など英語で検索するとハイクオリティの動画が多くて、勉強しやすい

という特徴も感じています。

今回はPythonを使って投資のチャート分析をする方法を紹介します。

プログラミングでチャートを表示する

プログラミングでチャートを表示する

Pythonには外部ライブラリが使えるという特徴があります。

つまり天才たちが作ってくれたプログラムをインストールすれば、自分のプログラムで自由に使えます

今回はyahoo financeから米国の主要な株価指数であるS&P500のデータを取得します。

イメージは、yahoo financeからS&P500のデータを取ってくるようにPythonに指示するプログラムです。

pythonで投資のデータを取得するやリ方
図1 プログラムのイメージ

yahoo financeのサイトを見ると、S&P500のシンボルは^GSPCになっています。

yahoo financeで投資データの見方
図2 yahoo financeの画面(S&P 500)

(引用:Yahoo!finance、S&P 500(^GSPC):リンク

したがって、PythonでS&P500のデータを持ってくるときは、^GSPCを使います。

期間は2000年1月3日〜2019年12月31日、価格は終値(Close)を使ってグラフを作成しました。

コードはこんな感じです。

#import libraries
from pandas_datareader import data
import pandas as pd
from pylab import mpl, plt
import numpy as np
plt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'
%matplotlib inline

#determine start & end
start = '2000-01-03'
end = '2019-12-31'

#get data from yahoo finance
SP500_df = data.DataReader('^GSPC', 'yahoo', start, end)
SP500_date = SP500_df.index
SP500_price = SP500_df['Close']

#show chart
plt.figure(figsize=(20, 10))
plt.plot(SP500_date, SP500_price, label = 'Close', color='#99b898')
plt.figure(figsize=(20, 10))
plt.plot(SP500_date, SP500_price, lw=2, label = 'Close', color='#99b898')
plt.legend(loc=2, fontsize=18)
plt.xlabel('year', fontsize=18)
plt.ylabel('price(USD)', fontsize=18)
plt.tick_params(labelsize=18)
plt.savefig("SP500.png")

SP500_dfにはS&P500のデータが入っており、先頭5行と末尾5行を表示するとこのようになります。

pythonで投資データをダウンロードした様子
表1 SP500_dfの中身

そして、できあがったグラフはこちらです。

pythonで投資データをチャートにした様子
図3 S&P 500のチャート(終値)

この20年間で価格が2倍〜3倍になっているのを見ると、すごい上昇率です。

グラフが作成できたので、これから分析していきます。

プログラミングで移動平均線を表示する

プログラミングで移動平均線を表示する
図4 移動平均線を追加したチャート

テクニカル分析の基本として、移動平均線をグラフに追加します。

移動平均線とは、ある一定期間における値の平均値を計算して、トレンドを見るのに使います。

例えば、図4では、短期として75日線(青色)、長期として200日線(赤色)を表示しています。

短期ライン(青色)が上、長期ライン(赤色)が下にあるときは価格が上昇傾向にあることがわかります。

これがトレンドを見るということです。

チャートと移動平均を表示するのに使用したコードはこちらです。

#make sma data
SP500_df['SMA1'] = SP500_df['Close'].rolling(window=75).mean()
SP500_df['SMA2'] = SP500_df['Close'].rolling(window=200).mean()

#determine word
SP500_date = SP500_df.index
SP500_price = SP500_df['Close']
sma1 = SP500_df['SMA1']
sma2 = SP500_df['SMA2']

#show chart
plt.figure(figsize=(20, 10))
plt.plot(SP500_date, SP500_price, lw=2, label = 'Close', color='#99b898')
plt.plot(SP500_date, sma1, lw=2, label = 'SMA1:75days', color='b')
plt.plot(SP500_date, sma2, lw=2, label = 'SMA2:200days', color='r')
plt.legend(loc=2, fontsize=18)
plt.xlabel('year', fontsize=18)
plt.ylabel('price(USD)', fontsize=18)
plt.tick_params(labelsize=18)
plt.savefig("SP500_SMA.png")

移動平均線の日数は、rolling(window=○○)の数字を変えたらOKです。

移動平均は短期と長期の上限関係でトレンドを調べますが、

上下関係をいちいち見るのは面倒ですよね。

そこで、トレンドを可視化しましょう。

プログラミングで投資のポジションをとる

プログラミングで投資のポジションをとる
図5 ポジションを追加したチャート

短期ライン(青色)が上、長期ライン(赤色)が下にある時は上昇トレンドです。

図5ではポジションライン(黒色)を1で表しました。

逆も然りで、下落トレンドはポジションライン(黒色)を−1で表しました。

つまりポジションは以下のように整理できます。

  • 短期ライン(青色)が上、長期ライン(赤色)が下にあるとき:positions=1
  • 短期ライン(青色)が下、長期ライン(赤色)が上にあるとき:positions=-1

これをチャートに表示した結果が図5になるのです。

移動平均線の上下関係からポジションを可視化するのに、使用したコードはこちらです。

#drop na data
SP500_df.dropna(inplace=True)

#make positions
SP500_df['positions'] = np.where(SP500_df['SMA1'] > SP500_df['SMA2'], 1, -1)
positions = SP500_df['positions']

#show chart
mpl.rcParams['figure.figsize'] = (20, 10)
fig, ax1 = plt.subplots()
plt.plot(SP500_date, SP500_price, lw=2, label = 'Close', color='#99b898')
plt.plot(SP500_date, sma1, lw=2, label = 'SMA1:75days', color='b')
plt.plot(SP500_date, sma2, lw=2, label = 'SMA2:200days', color='r')
plt.legend(loc=2, fontsize=18)
plt.xlabel('year', fontsize=18)
plt.ylabel('price(USD)', fontsize=18)
plt.tick_params(labelsize=18)
ax2 = ax1.twinx()
plt.plot(positions, 'black', lw=2, label='positions')
plt.legend(loc=6, fontsize=18)
plt.ylabel('positions', fontsize=18)
plt.tick_params(labelsize=18)
plt.savefig("SP500_positions.png");

あとはpositionsが1のときは買い、1でないときは売りというプログラムを組めば自動売買もできそうです。

移動平均線の日数をうまく調整したら、いい取引戦略ができそうに思えます。

まとめ

今回はS&P 500を用いて、チャートの作成と移動平均線の表示を行いました。

慣れてきたらオリジナルのチャートを作ったり、独自の分析方法を編み出したりできそうです。

ここまで読んでくださりありがとうございました。^^

プログラミング言語Pythonの機械学習を使って株価の予測をした話

★pythonによる投資の分析を学ぶのにおすすめの本

-お金の健康