【Python】個人投資家は「ぱんつを履かないサル」に勝てるのか?
書籍「ウォール街のランダム・ウォーカー」に、このような一節がある。
ランダム・ウォークというのは、「物事の過去の動きからは、将来の動きや方向性を予測する事は不可能である」ということを意味する言葉である。
~中略~
ランダム・ウォークを突きつめていけば、目隠しをしたサルに新聞の相場欄めがけてダーツを投げさせ、それで選んだ銘柄でポートフォリオを組んでも、専門家が注意深く選んだポートフォリオとさほど変わらぬ運用成果を上げられることを意味するからだ。
出典:ウォール街のランダム・ウォーカー
到底受け入れられない一節である。
「ぱんつを履かないサル」に「財務分析し、経営分析し、経済指標を確認し、たまにぱんつを履く私が負ける訳がない!」
実際に勝負をしてやろうではないか!
そのまえに、下記の動画で、一点補足しておきたい。
これは、ガンダム・ウォークである。
何の話をしていたんだっけ?
そうそう、「勝負をしてやろうではないか!」
といっても、家にさるを連れて来て、運用成績が負けた場合、私の「ポートフォリオマネージャーの座」と「ぱんつ」が奪われてしまうかもしれない。そうなっては、色んな意味で目も当てられない事態になる。
そこで、Pythonで検証することとした。
プログラムを実行すると下記の事が分かります。
自分の選択した銘柄は
・サルに勝てるのか?
・ベンチマークに勝てるのか?(VOO:S&P500、QQQ:NASDAQ)
・指定した期間のパフォーマンスはどうだったのか?
実行すると、下記のような結果が得られます。
0.事前準備
事前準備はこちら。5分もあればできると思います。
では、コードから・・・
1.コード
検証するにあたって、条件は下記にしました。
条件1:S&P500(505銘柄)からランダムに10銘柄を選択。
条件2:開始時点で10銘柄に均等に投資。
条件3:期間を変えて3回勝負。(3か月、1年、3年)
条件4:私はブログに書いている銘柄から選定する。
['TJX','ZTS','CPRT','ORLY','ADBE','COST','TTC','MSCI','DG','BABA'」
(実際のポートフォリオとは異なります。ZoomとShopifyの記事も書いてますが、記事を書いてから現在値でも、2倍~3倍になっているし、サル相手ではかわいそうです。また、良い企業だと認めつつも、価格が高いと評価していたので、対象外とします。)
補足:ベンチマークとして下記を併記。
VOO(S&P500)とQQQ(NASDAQ)が半分づつのポートフォリオ
だいたいの条件を説明したところで、コードは下記になります。
使用する場合は、Googleコラボに下記をコピペしてください。
詳細は、コード内にコメント文で記載したので、割愛します。
実際に試してみたい人は、コードの上部にある、次の2項目を変更して使ってみてください。
#調整項目1:調査対象の期間
#調整項目2:比較したい銘柄(パフォーマンスを見たい銘柄)
#pip install yfinance
import random
import cv2
#google colabで画像を表示するための処理
from google.colab.patches import cv2_imshow
import pandas as pd
import datetime
import yfinance as yf
#import fix_yahoo_finance as yf
import time
#調整項目1:調査対象の期間
start = datetime.date(2020,4,30)
end = datetime.date(2021,4,30)
startsrt = start.strftime('%Y-%m-%d')
endstr = end.strftime('%Y-%m-%d')
#調整項目2:比較したい銘柄(パフォーマンスを見たい銘柄)
codelist2=['TJX','ZTS','CPRT','ORLY','ADBE','COST','TTC','MSCI','DG','BABA']
#S&P500のティッカー取得(wikipediaより)
url = 'http://en.wikipedia.org/wiki/List_of_S%26P_500_companies'
tables = pd.read_html(url)
df = tables[0]
gum_sum=[]
#S&P500からランダム銘柄選択
for j in range(1):
codelist=[]
for i in range(10):
gundam=random.randint(0, 504)
ticker=df["Symbol"].loc[gundam]
##ガンダムがランダムに選択するイメージ
# print("\n■■■"+str(i+1) + "銘柄目…■■■")
##もったいつけて表示するための処理
# time.sleep(3)
# print("\n\t\t"+ticker+" !!\n")
# print (df["Security"].loc[gundam])
# print (df["GICS Sector"].loc[gundam])
# print (df["GICS Sub-Industry"].loc[gundam])
# print (df["Headquarters Location"].loc[gundam])
# print (df["Founded"].loc[gundam])
##ガンダムの画像(画像は別途用意が必要)
# img = cv2.imread('./gundam.png', cv2.IMREAD_UNCHANGED)
# cv2_imshow(img)
#取得したティッカーを保持
codelist.append(ticker)
#ティッカーにドットが含まれる場合、ハイフンへ変換(仕様)
codelistr = [s.replace('.', '-') for s in codelist]
print(codelistr)
#株価取得 ランダム
data = yf.download(codelistr, start=start, end=end)["Adj Close"]
df_all=(1+data.pct_change()).cumprod()
# print(df_all.iloc[-1])
print('■ランダム '+startsrt + 'から'+ endstr + 'まで 平均 ' + str(round(df_all.iloc[-1].mean(),2)) + ' 倍')
#結果を保持
gum_sum.append(df_all.iloc[-1].mean())
#株価取得 あなた
data = yf.download(codelist2, start=start, end=end)["Adj Close"]
df_all2=(1+data.pct_change()).cumprod()
print(df_all2.iloc[-1])
codelist3=['QQQ','VOO']
#株価取得 ベンチマーク
data = yf.download(codelist3, start=start, end=end)["Adj Close"]
df_all3=(1+data.pct_change()).cumprod()
print(df_all3.iloc[-1])
#結果出力
print('\n■■■ 結果(期間 '+startsrt + ' - '+ endstr + ') ■■■')
if sum(gum_sum)/len(gum_sum) > df_all2.iloc[-1].mean():
print("\n\n\t\t負け!!")
print("\n\n\t\t序列: 🐵 > あなた")
print("\n\n\t\t🐵に運用を任せましょう!\n")
else:
print("\n\n\t\t勝ち!!")
print("\n\n\t\t序列: 🐵 < あなた")
print("\n\n\t\t人類の勝利です!\n")
print('\n\t(ベンチマーク 平均 ' + str(round(df_all3.iloc[-1].mean(),2)) + ' 倍)')
print('\n\t(あなた 平均 ' + str(round(df_all2.iloc[-1].mean(),2)) + ' 倍)')
print('\n\t(サル🐵 平均 ' + str(round(sum(gum_sum)/len(gum_sum),2))+' 倍)')
しかし、一点だけ、説明したい事があります。
「ランダムに銘柄を選択する部分」のコードで、
「ガンダムに銘柄を選択させる」コードを書いています。
何の事を言っているのか分からないと思います。
どういう事かと言うと、下記の様な感じで、
「もったいぶって、ためを作って、3秒おきに銘柄が出力」されるのです。
ランダムにガンダムが最終話のキメのポーズで銘柄を選択というこの構想。
最初はおもしろかったのですが、何回か実行しているうちに、熱が覚めてきて、我に返り、邪魔で遅いだけだと思い直し、コメントアウト(無効化)してあります。(コメントアウトを外して、画像を用意すれば、動作すると思います。)
では、実行して見ましょう!
2.実行結果
1回目(期間:3か月)
なにっ!ベンチマークを上回ったものの、
サルに負けているではありませんか!
2回目(期間:1年)
ウキィー!!(なにー!)
また、さるに負けている・・・
ベンチマークにも負けた・・・
こうなってくると、心の支えは、「ベンチマーク」も「さる」に負けているという仲間意識だけである。(ダメな方向・・・)
人類の英知が・・・
そんなわけ事があるはずがない・・・
財務分析し、経営分析し、経済指標を確認し、
たまにぱんつを履く私が「さる」に負ける訳が・・・
ウキィーキキ、ウキウキウキキ
(長期投資だから・・・3年なら勝てるはず・・・)
3回目(3年)
やりました!
さるに勝ちました!
ベンチマークにも勝ちました!
あまりのショックに、
一瞬、言語を忘れてしまいましたが、ついに勝ちました!
さると僅差なのは目をつぶりましょう!
でも、きになる・・・
おきて破りの4回目(5年)
やりました!
ベンチマークにも、さるにも圧勝です!
まとめ
銘柄分析をする時、売上が伸びて、利益が伸びて、EPSが上昇していれば、株価の下値は切りあがってくるという考えにもとづいて、
財務分析では、経営効率・資金繰り・財務体力なんかを見ているし、
経営学の視点から、ビジネスの強さは何なのか・エコノミックモートはあるのか・成長に持続性はあるのか、業態として成長しやすいのか、分析しているし、
決算資料や決算カンファレンスコールから、企業文化を読み解こうとしていたりするし、
マクロとして、経済の動向を把握するように努めていたりするのだけど、
今回、やって見て分かったのは、短期では「さる」と差がない!という事を痛感しました。銘柄分析の成果は、1年ですら、短くて、3年以上になって、やっと差として表れてくるようなものかも知れないと感じました。
ただし、これも、過去から分析したものでしかなく、最低でも、今後3年以上続くようなビジネスの強さを持つ企業を見つけられた時に、やっと成果として出てくるのかもしれないなぁという気がしました。
3年と5年のパフォーマンスが「さる」より良くなったことで、気を良くして少し書いてみました。
なんとか体面を保ちましたが、
全敗していた場合、「まとめ」が下記の様になっていた可能性もあります。
まとめ
ウキィーキキ、ウキウキウキキ、ウキィーキキ、ウキウキウキキ、ウキィーキキ、ウキウキウキキ、ウキィーキキ、ウキウキウキキ、ウキィーキキ、ウキウキウキキ、ウキィーキキ、ウキウキウキキ、ウキウキウキキウキキウキキキキキキキキ
ウキ!(よかったら試しに、自分の保有銘柄やETFを入力して、「さる」と比較してみてください。何かの参考になれば幸いです。では!)
おつかれさん、の意味を込めて、
「缶コーヒー一杯ぐらい、ご馳走してあげよう」という
太っ腹な方がいれば、よろしくお願いします!
(本編はココまで、課金しても雑談しかありません。)
課金しなくても、参考になったら、「ハートボタン」をクリックしたり、「リツイート」してくれると読まれる可能性があがるので嬉しいです。やる気が出ます。
(以下、雑談です。)
ここから先は
¥ 100
Amazonギフトカード5,000円分が当たる
この記事が気に入ったらチップで応援してみませんか?