読者です 読者をやめる 読者になる 読者になる

雨上がりの放物線

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

decision.py 解説

まず、analysis.pyを作動させるAMA.pyを見てみましょう。
AMD.py
import
decision
# decisionを用いるという宣言
import pandas as pd
# pandasというpython内部の機構も使う

cards = ["BLK","AMP","BK","BX","IVZ","NTRS","STT","TROW"]
p = [356.58,96.38,39.71,25.30,27.60,67.11,57.46,74.08]
#cardsは用いる銘柄群で、pはそれぞれの現在の値

price = pd.read_csv("AMPrice.csv")
# analysisで作った値動きファイルを読み込み、投資判断に用います

data = decision.get_now(p,cards)
# get_nowという関数で[銘柄名、値段]となっているリストを作る


dev = decision.dev_n(data, price, cards)
# dev_nという関数でそれぞれの銘柄の現在の乖離率を計算

inv = decision.inv_n(dev,cards)
# inv_nという関数で乖離率よりそれぞれへの投資金額比率を計算

num_rate = decision.number_rate(data,inv,cards)
# 金額比率で出されても見辛いので株数比率に直します。これで何株うるのか、買うのかが出てきます。
print
(num_rate)
# 出力


では、実際のdecision.pyを見ていきましょう。
import analysis
import numpy as np
import pandas as pd
import datetime
# いろいろ使うと宣言。このうちには前回銘柄分析に用いたanalysisも含まれます。

all_data = {}
def get_now(p,cards):
for i in range(len(p)):
all_data[cards[i]] = p[i]
return all_data
# これはp(価格リスト)とcards(銘柄リスト)を入力することでそれらを結びつける関数です。[銘柄1:価格1, 銘柄2:価格2,,,,,銘柄n:価格n]みたいなデータを出力します。

def dev_n(all_data, price, cards):
sigma = analysis.get_each_sigma(price, cards)
for i in cards:
all_data[i] /= sigma[i]
price[i] /= sigma[i]
norm = np.average(price[cards[0]])
for i in cards:
all_data[i] = all_data[i] - np.average(price[i]) + norm
print(all_data)
sum = 0
for i in cards:
sum += all_data[i]
sum /= len(all_data)
all_data["index"] = sum
dev={}
# ここまではanalysisでも行った標準化と、index(算術平均)の追加

for i in cards:
dev[i] = (all_data[i] - all_data["index"]) / all_data["index"]
# 乖離率を計算
dev["index"] = 0
return dev

def inv_n(dev,cards, norm = 0.04):
inv = {}
s = 0
l = 0
for i in cards:
if dev[i] >= norm:
s += dev[i]
elif dev[i] <= -norm:
l -= dev[i]
else: pass
# 若干複雑かもしれません。負の乖離率の合計値をlに、正の乖離率の合計をsに保存
# その際、normが障壁となります。乖離率の絶対値がnormより小さければ無視

for i in cards:
        if dev[i] >= norm:
inv[i] = -dev[i]/s
elif dev[i] <= -norm:
inv[i] = -dev[i]/l
else: inv[i] = 0
return inv
# 乖離率絶対値がnormより大きいもののみを考える。乖離率が正に大きい程s(short値)が大きくなり、負に大きい程l(long値)投資比率が大きくなる

def number_rate(all_data,inv,cards):
num_rate = {}
min = 1
for i in cards:
num_rate[i] = inv[i]/all_data[i]
if num_rate[i] != 0 and abs(num_rate[i]) <= min:
min = abs(num_rate[i])
else: pass
for i in cards:
num_rate[i] = num_rate[i]/min *100
return num_rate
# 最後に金額比率をそれぞれの株価で割って株数比率に変える