雨上がりの放物線

究極の三日坊主が居場所を見つけるまでの物語

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"ファイルとグラフが出てきます。

f:id:XiaoHeiX:20160802180915p:plain