雨上がりの放物線

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

「複雑系」とは何か-ともすればオカルト

講談社現代新書吉永良正著。

サンタフェ研究所の内部構造なんて僕には興味ない。出来れば「『複雑系』とは何か」について紙面を使ってくれ。

 

前に「予測ビジネスで儲ける人々」、や「非線形科学」で少し複雑系には触れていると思うので手短に複雑系について書こう。

複雑系は多数の小さな要素からなる。そして要素間には非常に単純な物理法則に従った相互作用を持つ。要素間の相互作用の理解は簡単だが、それが積もり積もって集団全体に予想できないような「社会性」が生まれる。このような性質を持つシステムを「複雑系」と呼ぶ。

アリや渡り鳥の集団、多くの生き物の生態系において観察される。

 

そして複雑系研究は以下の2つの前提を元に成り立っている。

1. 全ての複雑な現象には必ず内奥に共通のルールを持つ。

2. そのルールはコンピュータで計算できるくらいの単純さを持っていること。

そしてこの更に奥に存在するのが研究者ゲルマンの言葉「表面的な複雑さは深部の単純さから生まれる」。

笑っちゃうような希望的観測だな。みんな推理小説の読みすぎなんじゃないだろうか。この世の全てにルールがある。本当にそうだったらどれだけ素晴らしく、面白いだろう。あらゆる出来事は一つの、あるいは複数のルールに縛られていると考えるのは人間の脳がなせる錯覚だ。初歩的な認知心理学の本を読めば出てくるぞ。そういう意味でこのロマンに満ちた「複雑系科学」とは人間の業から生まれるべくして生まれたのだ。

でも僕はこういう狂気が好きだ。本当に厳密な論理からは生まれなさそうなこの情熱が好きだし、こういう情熱こそが世界を変えるのだ。

 

本書で紹介されている複雑系を説明するキーワード

キーワード1: 複雑適応系

適応系は示すのは「永遠に変化し続けるシステム」だ。上記のように「複雑系」は多数の要素からなり、その要素間相互作用からなる集団の性質が重要だ。アリの例で言えば、個々のアリは寄り集まりアリ小隊を形成し、それらは中隊、大隊、全軍へと一つ一つのレベルが「積み木」のようになっている。そして、ここの要素は常に自分の周りの環境を感じ取って状態を変化させていくのだ。つまり、その積み木は変形し、再配列し、ある場面では減少し、増加し、分裂し、合体する。この積み木に「最適解」は存在しない。常に周りの情報を汲み取ることで永遠に変化し続けるのだ。

 

キーワード2: カオスの縁

ライフ・ゲームはむちゃくちゃ面白いから良かったら自分で検索してみてください。スクリーンセーバー代わりに流しておくのがオススメです。

ライフ・ゲームは生命が織りなすパターンを説明し、それの終着点は4つに分類される。

1. 絶滅(一つも生命が残らない)

2. 静的平衡状態(死んだ数とちょうど同じだけ生まれ、一つの幾何学的パターンを作る)

3. カオス(予測の難しい変動を永遠にし続ける)

4. クラス4(予測し辛い変動を起こしたり、かと思えばパターンを作ったりする)

このクラス4こそが複雑系の生息領域らしい。λパラメータという値を用いて分析するとクラス4のあたりで系の「複雑性」(説明が難しいな、「多様性」「可能性の広さ」)が最大値をとるらしい。これよりλが小さい値では「平衡状態」を、大きい値では「カオス」に向かっていく。よって、このクラス4はカオスの縁に位置するのだ。これは物理減少における「相転移」に値する。つまりクラス4は臨海値、相転移点を意味する。

 

キーワード3: 自己組織化臨界

このキーワードに関する説明は明らかに他に比べて乏しい。エネルギーを消費して自身の動的平衡を創り出し始める臨界点のような事を言っている、気がする。カオスの縁と似た概念であることは伝わるが、その差異についての言及は避けられている。

 

キーワード4: 創発

これは簡単だ。系の要素間相互作用により、要素自体には無い性質が系全体に備わる事。まさに、「全体は部分の総和ではない」を意味する。

 

この後には日本と欧米の複雑系研究の違いとか、人工生命の話とかあるが、関係は無い。

さてさて、我がロング・ショートは何を読めば進化するんだろうか?

相転移に関する本読んで、先が無いと感じたら大人しく相場について勉強しますか。

非線形科学-金融の話は出てこない

最近は相場というより相場の裏に広がる構造に興味が湧いている。

少し触れてみて仮説が正しい点と間違っていた点両方見えたので8月は学びに力を入れている。本業やんなきゃってなってるのもある。はあ、卒業出来っかな。

 

前回の書評を通してある仮説を立てた。

相場には「負のフィードバックループ(秩序を守る機構)」と「正のフィードバックループ(変化を拡大し、秩序を破壊する機構)」の両方が働いている。負のフィードバックループとか毎回書くのはしんどいので、「秩序」と「破壊」と名付けよう。基本的には「秩序」が働くため、割高銘柄はじきに値を下げ、割安銘柄は逆に動く。これは「値が下がった」から「次は上がる」と考える投資家によって作られる現象だ。そしてこれを利用して利益にするのが7月の間運用した「ロング・ショート1号」だった。

しかし、値が一方向に大きく動いたりすると「破壊」の出番がやってくる。「値が下がった」から「次も下がる」と考える投資家が増えてくるのだ。この投資家の思考の変化により今まで安定して成り立っていた値動きは壊され、踏みにじられ、相場に大きな変化が生まれる。これは「トレンド」や「ブラックスワン」、あるいは「ドラゴンキング」など様々な名称で呼ばれ、投資家を狂喜させたり破滅させてきたりした。

「ロング・ショート1号」は3週間の間完璧に機能したが、最後の週で組み入れ銘柄の一つが一方向に動き続けたため(ここでこの銘柄において小さな「破壊」が働いたと考えている)、最終的にはギリギリプラスという結果に至った。

 

仮説は、

「値動き」と「出来高」から現状では「秩序と破壊の綱引き」においてどちらが優勢かわかればロング・ショート1号は強くなるのではないか、というものだ。別に「破壊」でどちらに値が動くのかはわからなくてもいい(もちろんわかればそれだけで大きな利益を得る事が出来て嬉しいのだが)。「破壊」相場からポートフォリオを守れるだけでも十分な収穫である。

そして「秩序と破壊の綱引き」はパターンからわかるのではないかと考えた。「秩序」は対数っぽいパターンを書きそうだし、「破壊」は指数っぽい動きしそうだからだ。確証はない。だから勉強してる。

 

前置きが長くなった。

読んだのは集英社文庫からの新書「非線形科学」、蔵元由紀著。

「秩序」と「破壊」について学ぶために買ったのがこの本だ。非線形科学。これはカオスと複雑系における動きの根源となるルールだ。一言で言うと「自己の現状を把握して、それを元に動きを変える性質」だ。ただ上がるだけでも下がるだけでもない。決まった自己解釈、反応のルールに従って変動量を調整する。それによって作られる現象は「静止状態」「周期変動」「カオス」「クラス4」に分けられる。カオスもまたルールによって作られるのだ。複雑で雑多な状態からカオスが生まれるのではなく、根源的にカオスを作るのはルールだ。ローレンツはたった3つの式変数からできるカオスモデル、ローレンツ・モデルを作っている。

 

面白い話が続く、でも残念ながら金融に関わりそうな話は出てこないな笑

少しあるのは最後のベキ乗則の話くらい。

ブラック・スワン」でタレブは「自然科学と違って社会はベキ乗則からなる」みたいな話をしていたけど、自然科学もまたベキ乗則に従うこともあるのだ。ここで記されているのは相転移相転移とか、地震とか「果ての国」にも自然は残されていることを知る。やーいタレブ。

 

 

予測ビジネスで儲ける人々-無知と無知に頼るカモ

ブックオフで300円で買えるハードカバー。つまらないところも、わからないところもあるけど、面白くて勉強になる本だった。

 

この本が伝えようとしている事は一つだけ、第9章のタイトルに出てきている、「確実なのは不確実性だけ」。良いセンスだ。

この本は気象学者から始まり、その他のあらゆる予測行為、将来の経済、株価、技術、社会を予想する行為は全く意味が無い。現在のトレンドを後追いする事は出来てもトレンドの転換点を安定して見つける事は今まで出来てい無いし、これからも出来無いと述べている。僕は僕に関係ある経済と株価予測の不可能性についてここでは書いていこうと思う。

 

なぜ長期の経済予測、株価が不可能なのか?

すこし違う話になるが、第2章で筆者は気象学者について述べている。5分後の天気はだいたい当てられる。1日後の天気は当てられ無いでも無い。1ヶ月後はほとんど不可能だ。このように天気を当てるのが難しくなっていくのは気象がカオスだからだ。

 

カオスとは、僕らのよく知っている物理法則によって支配されているが、高い非線形性によって初期条件のほんの少しの違いが大きな変化を生み出し結果的に予測が凄まじく難しい事象、そのような振る舞いを指す。よく聞くバタフライ効果ってやつだ。蝶が羽ばたく事が巡り巡ってハリケーンを生み出す(かもしれ無い)。

このカオスは一応完璧な物理法則によって成り立っているので、予測は難しいが完璧な答えが存在する。そして、短期ならそこそこの精度で予測できる。

 

そして、経済もまたカオスと似た挙動を取る事を見つけた学者がいた。だから経済もまた短期的には予測可能なんじゃ無い?短期的に予測できるならそこからお金引きずり出せるんじゃ無い?と考えたわけだ。

でも、経済はカオスじゃ無い、ほんとは複雑系なんだ。だからカオスで得た知見を用いて経済を予測するなんて馬鹿馬鹿しい話なんだよ、と本書は述べている。

 

複雑系とは

難しいのでゆっくり行きます。まず、複雑系は多数の要素からなる。たくさんの同じ要素かもしれ無いし、もしかしたら複数種が混じっているかもしれ無い。まあとりあえずたくさんいる。

次にそれらの要素は互いに影響を及ぼし合う。AはBを引きつけ、Cを遠ざけ、Dを虐げる。そこには社会が出来上がる。全体として一つの生命、あるいは連携した組織として振舞うものが複雑系だ。そして、出来上がる組織は非常に大きい数の要素からなっているので、要素の性質からは組織の性質は予測でき無い。これが複雑系の予測が出来無い理由である。

 

よし、ようやく経済の話に戻れる。上の文章を元に経済が予測の出来無い理由を挙げていく。

1. 社会には絶対的な自然法則が無い。(ミクロ、マクロレベルの両方において)

2. 経済活動をするそれぞれの要素(個人や企業)はそれぞれ密接に関わりあう。そのつながりこそが経済であるため、経済を予測するには全要素間の関わり方、関わる量を調べる必要がある。

3. 各要素の関わり方を決定する事は非常に難しい。例えば、渋滞を緩和するために高速道路を立てる事が渋滞の重症化へとつながる事もあるように。それぞれの関わり方は正負のフィードバックループの重ね合わせで出来ている。

4. 複雑系は秩序だった期間の合間に起きる混乱期が存在する。これは予想され無いからこそ混乱をおこす。

5. 人間が勉強するように複雑系も環境に適応し、振る舞い方を変える。よって以前に確立された理論も使えるとは限ら無い。

6. 複雑系にサイクルは無い。歴史は繰り返すかもしれ無いし、永遠に繰り返さ無いかもしれ無い。

 

正確には経済は「非線形複雑適応系」らしい。まあただの複雑系より難しいって話だ。個々の要素の関わりあい方に非線形性があるので、カオスっぽい動きも入って来ますよ、と。

 

 

本を読んで思いついた投資戦略

キーワードは「フィードバックループ」だ。経済には正と負のフィードバックループが存在する。負は秩序を守る働き。慣性力、反作用、需要と供給、平均への回帰、規模による収益遁減など。

正は秩序を壊し、新たなルールを作る動きだ。成功が成功を呼んだり、混乱が混乱を生み出し、壊滅へと繋がるような動き。基本的にこちらの動きは素早く、大きく、計り知れ無いほど激しい。タレブがいうブラック・スワンも正のフィードバックループの一種だろう。

7月の間に運用したロング・ショート1号は負のフィードバックを用いている。こちらが割高になったから下がるだろう、割安のやつは上がるだろう。という機構を利用して安定した利益を出す戦略だ。だからこそ最後の週にサントリーに正のフィードバックループが起きて大損を出した。

つまり、負のフィードバックループが正に切り替わる瞬間を見つけられればいいわけだ。今、株価は秩序を保つ局面なのか、それともこれから自触媒反応のようにぶっこわれていくのか。どっちにあるのか。

値動きと出来高の動きから局面を理解する。適当な値(xとする)を見つけ、閾値を設定する。そのxが閾値より小さいと時、負のフィードバックループにあるとし、自体はこれから収束する可能性が高いと判断。閾値より大きい時、これから変革が始まると考える。負のフィードバックは対数っぽいし、正のは指数っぽく動きそうなので見分けられそうなきがするけどなー。ちょっと複雑なモメンタム戦略って感じ。

問題は本当に欲しいのは正のフィードバックループにあるという確認じゃなくて正のフィードバックループにはいる前兆なのだが、まあそれはこれからぼちぼち考えていこう。

 

長くなってしまった。

 

 

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
# 最後に金額比率をそれぞれの株価で割って株数比率に変える

 

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

 

7/31 Pythonによる分析法(雑)

Pythonとは

数理系に強いプログラミング言語、AQRというクオンツファンドの人が能力の拡張を頑張ったおかげで金融系で結構使われているらしい。

 

僕が今月ちまちま勉強してできるようにしたのは、2つです。

一つはセクター別の株価分析。セクターの中である程度規模が大きい(株価の値動きの激しく無い)銘柄を決めたら(ここまでは手作業、株マップとかで)、株価の取得及びcsvファイルへの記録、値動きの激しさ(標準偏差)、それをもとにした標準化、相関係数計算、相関係数の低い銘柄の排除、それらを基にして現在までの乖離率の推移をグラフに映し出す為のプログラムです。このプログラムに入力として銘柄コードを与えてやればカタカタ働いて結果を返してくれます。

これにはanalysis.pyと名付けました(pyはPythonプログラムの事)

analysis.py
import matplotlib.pyplot as plt
import numpy as np
from pandas import Series,DataFrame
import pandas.io.data as web
import datetime

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())

price = DataFrame({tic: data["Adj Close"]
for tic, data in all_data.items()})
return price


def get_each_sigma(price,cards):
sigma = [np.std(price[x]) for x in cards]
sigmadatas = Series(sigma, index=cards)
return sigmadatas

def normalize(price,cards):
sigma = get_each_sigma(price,cards)
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

def remove(price,cards,corrnorm=0.8):
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)
cards = cards.remove(i)
return price

def add_index(price,cards):
average = DataFrame({"index" : price.sum(axis = 1)/len(cards)}) # should be improved
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

もう一つは投資配分を出力するプログラム。入力としてanalysisの結果用いる事にした銘柄群、それとリアルタイムの株価(これを手に入れる方法はわかりませんでした)を入れる事で現在の乖離率を計算し、それぞれ買うべき、あるいは売るべき単位数を返してくれます。こちらはdecision.pyです。

import analysis
import numpy as np
import pandas as pd
import datetime

all_data = {}
def get_now(p,cards): #use new signals
for i in range(len(p)):
all_data[cards[i]] = p[i]
return all_data

def dev_n(all_data, price, cards): #use new price and 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={}
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: #make s and l
if dev[i] >= norm:
s += dev[i]
elif dev[i] <= -norm:
l -= dev[i]
else: pass

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

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

あとはそれらのスイッチを入れるプログラムさえあればOKです。今回は米国株のアセットマネジメントセクターを用いてプログラムを書いたのでAMA(Asset Management Analysis)とAMD(Asset Management Decision)と名付けました。

AMA.py

import analysis

cards = ["BLK","AMP","BK","BX","IVZ","NTRS","STT","TROW"]

price = analysis.get_price(cards)
print(price)
price.to_csv("AMPrice.csv")
analysis.normalize(price, cards)

price = analysis.add_index(price,cards)

dev = analysis.dev_past(price, cards)

dev.to_csv("AMDev.csv")
analysis.show_graph(dev)

AMD.py

import decision
import pandas as pd

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]

price = pd.read_csv("AMPrice.csv")
data = decision.get_now(p,cards)
print(data)

dev = decision.dev_n(data, price, cards)
print(dev)
inv = decision.inv_n(dev,cards)
num_rate = decision.number_rate(data,inv,cards)
print(num_rate)

コードだけ乗っけても不親切なので次から2回に分けてanalysisとdecisionを解説する会を作りますね。出来るかなー。

7/31 ロング・ショート戦略 反省4回目

今週は初の大損を出しました笑

トレダビで1000万円から始めたデモ口座の現状を確認します。

総資産額:10,037,109円 (- 125,225円)

評価損益:- 116,809円

f:id:XiaoHeiX:20160731213103p:plain

 

先週は損してみたいとほざきましたが傷つきますなー。

 

サントリーに乖離率が一方的に離れる動きがあったのでそれで大損こいてしまいました。標準化された乖離率の一ヶ月間の動きがこちらです。

f:id:XiaoHeiX:20160731214209p:plain

今週の間にサントリーが一方的にマイナス方向に伸びているのがわかります。僕のロングショートは乖離率が0 %へと収束する動きを予想しており、乖離率が大きくなるほど投資比率も大きくなるのでこの0から離れる動きで大損を出しています。12 %で損切りを考えているので、損切り間近であるとわかります。

 

まあこのグラフを見る限り一ヶ月の間に0に収束する動きがあるとは言えない事が判るので戦略の見直しが必要なのですがまずはサントリーの値動きが急にマイナスに偏った理由を考えましょう。

大きなニュースは流れてないので、ファンダメンタルには変化なし?

では、チャートはどうなっているでしょう。

f:id:XiaoHeiX:20160731215421p:plain

直近の売買高に大きな変化はないのでやはりファンダメンタルズによるものではないでしょう。三ヶ月の日足チャートを見る限り、ダウントレンドの途中に休止期的なペナントが発生して、それの支持線が割れたのでダウントレンドが再開したって感じですかね。FX始めた頃はテクニカル信者で完全な信者だったんですけど、最近はあんまりで、これからも投資戦略に使う予定はありません。テクニカルって短期筋の動きだから長い目で見ればプラマイゼロになる気がするんだがどうなんだろう。

FXでは短期ポジションしかとった事ないのでわかりません。

 

今回わかったのは

①テクニカル的な動きでも大きな損失が出る事

→4銘柄ってやっぱ分散投資として足りてない事

②おそらく、トレンドが無い状態においてより高いパフォーマンスを発揮する事

→トレンドを感知するMACDとかスクリーニングに組み込んでやれば良くなりそう

→やっぱり銘柄増やさな

 

次回は今月中に勉強したPythonについて書きましょう。

戦略の方向としてはこのままで、銘柄を増やす単純作業になりそうです。

イノベーションが起きて構造が一気に変わり辛い食品銘柄を使うアプローチは正しいと思います。ただ、あまりにも分散性が低く、かつ今がどんな局面にあるか判断するスイッチが足りてい無いので今週のような損が生まれるのでしょう。

書く順番としては

pythonのおさらい  → トレンド有る無しの判断機構構築 → 銘柄数増やしてテスト

という順番にする予定です。