analysis.py解説
まず、analysis.pyを作動させるAMA.pyを見てみましょう
僕自体が初心者なので、プログラミング初心者にわかるようには書けないかもしれません。流れだけでもわかって頂けたら幸いです。
import analysis
# analysis.pyを利用しますという宣言
cards = ["BLK","AMP","BK","BX","IVZ","NTRS","STT","TROW"]
# cardsは分析対象の銘柄を示しています。米国株はアルファベット複数文字で略されるので、これらのニックネームを用いてwebからデータを持って来れます。これらの相関係数や値動きの激しさを分析し、投資対象となるか、現状どうなのかを考えます
price = analysis.get_price(cards)
# analysis.py内のget_priceという関数(命令)を使ってcards内のそれぞれの要素の今までの値動きを持ってきます
price.to_csv("AMPrice.csv")
#そして、持ってきた値動きを"AMPrice.csv"というファイルに保存
analysis.normalize(price, cards)
# priceに入っている値動きに標準化(標準偏差による割り算及び、中心位置合わせ)
price = analysis.add_index(price,cards)
# price内部に全銘柄平均を追加します。これが乖離率計算のための基準となります
dev = analysis.dev_past(price, cards)
# 乖離率を計算させ、変数devを形成
dev.to_csv("AMDev.csv")
#乖離率の動きをcsvファイルに保存
analysis.show_graph(dev)
#最後に乖離率の遷移をグラフに移します。これはあってもなくても大丈夫です。
では、次にanalysis.pyを見ていきましょう。こちらは先のAMA.pyで使う関数をいろいろ詰め込んだ道具箱みたいになっています。
import matplotlib.pyplot as plt
import numpy as np
from pandas import Series,DataFrame
import pandas.io.data as web
import datetime
# いろいろimportしています。数学を用いる際や、グラフを出す際、webから情報を読み取る時などは裸のpythonに加えていろいろ道具を取り寄せる必要があります。これがimportです。
all_data={}
#株価を格納するための場所を作る(今は中身ゼロ)
def get_price(cards):
for ticker in cards:
all_data[ticker] = web.get_data_yahoo(ticker, (datetime.datetime.today() - datetime.timedelta(weeks = 208)), datetime.datetime.today())
# yahooからデータを取ってきています。今日を入れて208週間(4年間)分のデータを持ってきてそれぞれの銘柄、日にちに値する場所に入れています。
price = DataFrame({tic: data["Adj Close"]
for tic, data in all_data.items()})
#実際使うのは修正後終値(Adj Close)
return price
def get_each_sigma(price,cards):
#それぞれの値動きの標準偏差(動きの激しさ)を返す関数
sigma = [np.std(price[x]) for x in cards]
#標準偏差の計算
sigmadatas = Series(sigma, index=cards)
#標準偏差の値と銘柄名を1セットの情報にする
return sigmadatas
def normalize(price,cards):
# 標準化操作
sigma = get_each_sigma(price,cards)
# 先のget_each_sigma関数を呼び出して銘柄と標準偏差でセットの情報をもらう
for i in cards:
price[i] /= sigma[i]
norm = np.average(price[cards[0]])
# それぞれの標準偏差でそれぞれの値動きを割る
for i in cards[1:]:
price[i] = price[i] - np.average(price[i]) + norm
# Y軸中心を合わせる
def remove(price,cards,corrnorm=0.8):
# 基準(銘柄群の先頭にいる銘柄)との相関係数を計算し、相関係数が0.8以下の銘柄をcardsから削除する
corr0 = price.corrwith(price[cards[0]])
for i in cards[1:]:
if corr0[i] < corrnorm:
print(i + " is not appropriate.")
price = price.drop(i, axis=1)
# 仮に0.8より相関係数が低かった時、 "なんとか is not appropriate."と表示しprice内部からそのデータを省く
return price
# 不適合銘柄削除後の銘柄群とその値動きを返す
def add_index(price,cards):
# 銘柄群にそれらの平均値を加える
average = DataFrame({"index" : price.sum(axis = 1)/len(cards)})
return price.join(average)
def show_graph(price):
# グラフに映す操作
plt.figure()
price.plot()
plt.show()
def dev_past(price, cards):
# 乖離率の今までの遷移を返す関数
dev = price.copy()
# まず乖離率を格納する場所を作る
for i in cards:
dev[i] = (dev[i] - dev["index"])/dev["index"]
# 先に加えた平均値との差の絶対値を平均値で割り、乖離率を算出
dev["index"] = 0
return dev
AMAを作動させるとanalysisが呼び出されて結果、
"price.csv"、"dev.csv"ファイルとグラフが出てきます。