システムトレードする際の悩み : 実リターンの計算
証券会社のAPIを使って、投資信託(投信)を中心としたシステムトレードアプリを実装しようとしているe@stです。目指すところは、こちらで書いたような、人力リバランス型の毎日積立の年リターン(20~30%程度)と同等以上の投資成果を、自動売買で達成すること!?
さて、システムトレードでは、リターンを追求して日々たくさんの投資商品を売買することになるのですが、アルゴリズムの良し悪しを判断するために、個々の売買がどの程度のリターンを上げているのかを知りたいところ。
投資信託を一回買った時のリターンの計算式は以下の通り。
投資信託の場合、基本的に月単位、年単位でリターンを追求しに行くので、たいていの商品のページにはこうした計算式に基づいての月次リターンが掲載されている。
このように一回計算するだけならばたいした計算量ではないけれども、システムトレードで『x種の投資商品をy回買ってz回売った場合』の個別のリターン計算はけっこう複雑になりそう(トータルリターンの計算は当然できるとして、投信のように、個々の売買を合算する場合は、リターンの計算法(評価方法)は一意にならない)。
ということで、ちょっくら『x種の投資商品をy回買ってz回売った場合』のシミュレーションをして個々の売買の評価方法を考えてみようと思った次第。せっかくシミュレートするならば、売却時にかかる税金(日本ではNISAなどの制度を利用しない場合、税率20%)を計算に入れることとした。
前述の通り、今のところ、(素人投資家の僕には)個々の売買の合目的的なリターン計算法は分かっていないので、売買を行うアルゴリズムはリターン計算を必要としない以下の2点とした。
- 「ランダム投資」アルゴリズム(日々サイコロを振って、いくら買うかいくら売るかを決める方式)
- 「慎重売買」アルゴリズム(初見の日より値下がりした時のみに購入する方式)
どちらもアルゴリズムとは言えないほど単純なものだが、慎重売買アルゴリズム(のちょい改良版)は僕が東証一部株のミニ株取引で実際に採用している人力アルゴリズムとなる。
で、シミュレートしてみた結果、売却時の税率20%は投信システムトレードの投資成果にかなり響くことが分かった。
シミュレーション結果
細かい話は後にして、はじめにシミュレーション結果を確認してしまおう(売却時の税率は20%、投資期間は1年)。
(1) 値上がりしやすい投信の場合
昨年後半の超低金利下のハイテク株のように、一本調子で値上がりしていく投資信託に投資した場合、「慎重売買」アルゴリズムは結果としてバイ・アンド・ホールド(一度買ったら、十分な値上がり益を持つまで持ち続ける)となるので、ほぼ利益を上げられる。実際の売買は、一部のみ以下に表示した。
他方、「ランダム投資」アルゴリズムは、税金に負けて、ほぼ常に損失することになる。安易な利益確定は大きなリターンを生まないという、ネットでしばしば言われている投資べからず集を実行したようなものなのだろう。
--------------シミュレーション@0.0--------------
値動き682円
値動き667円
商品特性0.0で、以下の通りの利益 : 17186円
購入回数:259。例: | | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|:--------------------|--------:|------:|------:|--------:|------:|---------:|---------:|-------:|------:|
| 2021-01-02 00:00:00 | 20009.7 | 0.2 | 0.2 | 4001.95 | 0 | 4001.95 | 4001.95 | 0 | 0 |
| 2021-01-03 00:00:00 | 20010.6 | 0.4 | 0.2 | 4002.13 | 0 | 8004.26 | 8004.07 | 0 | 0.182 |
| 2021-01-04 00:00:00 | 20014.7 | 0.6 | 0.2 | 4002.94 | 0 | 12008.8 | 12007 | 0 | 1.814 |
| 2021-01-05 00:00:00 | 20016.2 | 0.8 | 0.2 | 4003.23 | 0 | 16012.9 | 16010.2 | 0 | 2.672 |
| 2021-01-08 00:00:00 | 20016.5 | 1 | 0.2 | 4003.3 | 0 | 20016.5 | 20013.5 | 0 | 2.952 |
売却履歴:0。例: | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|------|-------|-------|-------|-------|-------|--------|--------|------|
値上がりしやすい投資対象への投資成果 : ランダム投資-80516円,慎重投資17186円
--------------シミュレーション@0.1--------------
値動き539円
値動き509円
商品特性0.1で、以下の通りの利益 : 13017円
購入回数:259。例: | | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|:--------------------|--------:|------:|------:|--------:|------:|---------:|---------:|-------:|------:|
| 2021-01-02 00:00:00 | 20006.4 | 0.2 | 0.2 | 4001.28 | 0 | 4001.28 | 4001.28 | 0 | 0 |
| 2021-01-03 00:00:00 | 20007.7 | 0.4 | 0.2 | 4001.54 | 0 | 8003.07 | 8002.81 | 0 | 0.258 |
| 2021-01-04 00:00:00 | 20009.5 | 0.6 | 0.2 | 4001.89 | 0 | 12005.7 | 12004.7 | 0 | 0.966 |
| 2021-01-05 00:00:00 | 20010.6 | 0.8 | 0.2 | 4002.11 | 0 | 16008.5 | 16006.8 | 0 | 1.638 |
| 2021-01-08 00:00:00 | 20013.6 | 1 | 0.2 | 4002.72 | 0 | 20013.6 | 20009.5 | 0 | 4.07 |
売却履歴:0。例: | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|------|-------|-------|-------|-------|-------|--------|--------|------|
値上がりしやすい投資対象への投資成果 : ランダム投資-68847円,慎重投資13017円
--------------シミュレーション@0.2--------------
値動き381円
値動き413円
商品特性0.2で、以下の通りの利益 : 10709円
購入回数:259。例: | | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|:--------------------|--------:|------:|------:|--------:|------:|---------:|---------:|-------:|------:|
| 2021-01-02 00:00:00 | 20003.8 | 0.2 | 0.2 | 4000.77 | 0 | 4000.77 | 4000.77 | 0 | 0 |
| 2021-01-03 00:00:00 | 20004.8 | 0.4 | 0.2 | 4000.96 | 0 | 8001.92 | 8001.73 | 0 | 0.19 |
| 2021-01-04 00:00:00 | 20005.8 | 0.6 | 0.2 | 4001.17 | 0 | 12003.5 | 12002.9 | 0 | 0.61 |
| 2021-01-05 00:00:00 | 20007.3 | 0.8 | 0.2 | 4001.46 | 0 | 16005.8 | 16004.4 | 0 | 1.486 |
| 2021-01-08 00:00:00 | 20008 | 1 | 0.2 | 4001.6 | 0 | 20008 | 20006 | 0 | 2.038 |
売却履歴:0。例: | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|------|-------|-------|-------|-------|-------|--------|--------|------|
値上がりしやすい投資対象への投資成果 : ランダム投資-83411円,慎重投資10709円
--------------シミュレーション@0.30000000000000004--------------
値動き272円
値動き210円
商品特性0.3で、以下の通りの利益 : 5720円
購入回数:259。例: | | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|:--------------------|--------:|------:|------:|--------:|------:|---------:|---------:|-------:|-------:|
| 2021-01-02 00:00:00 | 20003.8 | 0.2 | 0.2 | 4000.75 | 0 | 4000.75 | 4000.75 | 0 | 0 |
| 2021-01-03 00:00:00 | 20002.8 | 0.4 | 0.2 | 4000.56 | 0 | 8001.13 | 8001.32 | 0 | -0.188 |
| 2021-01-04 00:00:00 | 20002.1 | 0.6 | 0.2 | 4000.42 | 0 | 12001.3 | 12001.7 | 0 | -0.472 |
| 2021-01-05 00:00:00 | 20004.8 | 0.8 | 0.2 | 4000.95 | 0 | 16003.8 | 16002.7 | 0 | 1.112 |
| 2021-01-08 00:00:00 | 20003.7 | 1 | 0.2 | 4000.74 | 0 | 20003.7 | 20003.4 | 0 | 0.288 |
売却履歴:0。例: | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|------|-------|-------|-------|-------|-------|--------|--------|------|
値上がりしやすい投資対象への投資成果 : ランダム投資-80302円,慎重投資5720円
--------------シミュレーション@0.4--------------
値動き97円
値動き111円
商品特性0.4で、以下の通りの利益 : 2883円
購入回数:259。例: | | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|:--------------------|--------:|------:|------:|--------:|------:|---------:|---------:|-------:|-------:|
| 2021-01-02 00:00:00 | 20004.3 | 0.2 | 0.2 | 4000.86 | 0 | 4000.86 | 4000.86 | 0 | 0 |
| 2021-01-03 00:00:00 | 20004 | 0.4 | 0.2 | 4000.8 | 0 | 8001.6 | 8001.66 | 0 | -0.054 |
| 2021-01-04 00:00:00 | 20002.6 | 0.6 | 0.2 | 4000.52 | 0 | 12001.6 | 12002.2 | 0 | -0.61 |
| 2021-01-05 00:00:00 | 20001.4 | 0.8 | 0.2 | 4000.29 | 0 | 16001.1 | 16002.5 | 0 | -1.324 |
| 2021-01-08 00:00:00 | 20004.1 | 1 | 0.2 | 4000.82 | 0 | 20004.1 | 20003.3 | 0 | 0.828 |
売却履歴:0。例: | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|------|-------|-------|-------|-------|-------|--------|--------|------|
(2) ヨコヨコの値動きをする投信の場合
ちょっと値上がりするとちょっと値下がりして...を繰り返す投信商品を上にも下にも動かないという意味で「ヨコヨコ」と呼ぶ。(残念ながら)日本のTOPIX連動商品はこうした値動きをする時が多い。
こうした投信の売買では、「ランダム投資」アルゴリズムは、文句なしに負け、「慎重売買」アルゴリズムは利益がほぼない(もしくは若干のマイナス)となる。
--------------シミュレーション@0.4--------------
値動き97円
値動き111円
商品特性0.4で、以下の通りの利益 : 2883円
購入回数:259。例: | | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|:--------------------|--------:|------:|------:|--------:|------:|---------:|---------:|-------:|-------:|
| 2021-01-02 00:00:00 | 20004.3 | 0.2 | 0.2 | 4000.86 | 0 | 4000.86 | 4000.86 | 0 | 0 |
| 2021-01-03 00:00:00 | 20004 | 0.4 | 0.2 | 4000.8 | 0 | 8001.6 | 8001.66 | 0 | -0.054 |
| 2021-01-04 00:00:00 | 20002.6 | 0.6 | 0.2 | 4000.52 | 0 | 12001.6 | 12002.2 | 0 | -0.61 |
| 2021-01-05 00:00:00 | 20001.4 | 0.8 | 0.2 | 4000.29 | 0 | 16001.1 | 16002.5 | 0 | -1.324 |
| 2021-01-08 00:00:00 | 20004.1 | 1 | 0.2 | 4000.82 | 0 | 20004.1 | 20003.3 | 0 | 0.828 |
売却履歴:0。例: | 価格 | 保有量 | 売買量 | 投資額 | 売却益 | 評価額 | 総投資額 | 総売却益 | 損益 |
|------|-------|-------|-------|-------|-------|--------|--------|------|
ヨコヨコ気味の投資対象への投資成果 : ランダム投資-106030円,慎重投資2883円
--------------シミュレーション@0.5--------------
値動き8円
値動き11円
ヨコヨコ気味の投資対象への投資成果 : ランダム投資-80660円,慎重投資-2873円
(3) 値が下がり続ける投信の場合
世の中には、毎年値下がりを続ける投信がある。それどんな商品?と思うだろうが、いわゆる「ベア・レバレッジ型」の投信である。これは、日経225やTOPIXなどの株価指数が値下がりした場合に大きく値上がりする(逆に値上がりした場合に大きく値下がりする)投資商品で、株価指数が値下がりすると予想する場合に短期で利用するための投資商品である(僕は買ったことないけど)。
こうした投資商品を相手にした場合、「ランダム投資」は当然に大損する。「慎重投資」は基本投資を見送るので、損は出にくい。
--------------シミュレーション@0.6000000000000001--------------
値動き-133円
値動き-157円
値下がりしやすい投資対象への投資成果 : ランダム投資-95101円,慎重投資0円
--------------シミュレーション@0.7000000000000001--------------
値動き-262円
値動き-254円
値下がりしやすい投資対象への投資成果 : ランダム投資-89133円,慎重投資0円
--------------シミュレーション@0.8--------------
値動き-400円
値動き-397円
値下がりしやすい投資対象への投資成果 : ランダム投資-87335円,慎重投資-1601円
ガリガリ書いたコード
以上のシミュレーションをするために書いた、やっつけ感満載のコードをさらしておく。
import pandas as pd
import numpy as np
date = pd.date_range('2021-1-1', '2021-12-28', freq='D')
import random
print(len(date))
初期価格= 20000
価格 = 初期価格
保有量 = 0.0
曜日 =7 #sun
売却時残存率 = 0.8 #0.8 @税率20% or 1 @NISA
print(f"==== 税率{round((1-売却時残存率)*100)}%の場合の、ランダム売買シミュレーション ====")
def update(商品特性, isRandom= True):
def 前日終値で慎重投資():
if 価格 > 初期価格:
return 0.2
if 価格 < 初期価格:
return -0.1
else :
return 0
global 価格,保有量,曜日
曜日 +=1
if 曜日 > 7:
曜日 =1 #mon
if 曜日 > 5:
売買量=0 #週末
else:
diff = round((random.random() - 商品特性)* 5,2)
売買候補量 = round((random.random() - 0.4),2) if isRandom else 前日終値で慎重投資()
価格 = 価格 +diff
価格 = 価格 if 価格 >0 else 0
保有量候補 = 保有量 +売買候補量
if 保有量候補 >0:
保有量,売買量 = 保有量候補,売買候補量
else:
保有量, 売買量 = 0, -保有量
投資額,売却益 = (0, -価格 * 売買量 * 売却時残存率) if 売買量 < 0 else (価格 * 売買量, 0)
return 価格, 保有量,売買量, 投資額,売却益
def 投資商品売買(商品特性, isRandom):
global 価格,保有量,曜日
価格 = 初期価格
保有量 = 0
曜日 =7 #sun
lst = [ update(商品特性, isRandom) for x in date]
df = pd.DataFrame(lst,index=date,columns=['価格',"保有量","売買量", "投資額","売却益"])
df["評価額"] = (df['価格'] * df["保有量"])
#pandasで累積和・累積積
df["総投資額"]=df["投資額"].cumsum(skipna=True)
df["総売却益"]=df["売却益"].cumsum(skipna=True)
df["損益"]= df["評価額"]+df["総売却益"] -df["総投資額"]
最終日行= df.tail(1).reset_index()
現在評価額,現在売却益,現在投資額= 最終日行.at[0,"評価額"],最終日行.at[0,"総売却益"],最終日行.at[0,"総投資額"]
現在価格= 最終日行.at[0,"価格"]
print(f"値動き{round(現在価格-初期価格)}円")
評価損益=round(現在評価額+現在売却益 -現在投資額)
if 評価損益 > 0:
print(f"商品特性{商品特性}で、以下の通りの利益 : {評価損益}円")
購入回,売却回 = df[df["売買量"] > 0],df[df["売買量"] < 0]
print(f"購入回数:{len(購入回)}。例:",購入回.head().to_markdown())
print(f"売却履歴:{len(売却回)}。例:",売却回.head().to_markdown())
return 評価損益
#利回りは「(分配金+売却益)÷投資原本×100」という計算式で求めることが可能です。
#投資重心計算
def 商品説明(x):
if x < 0.4:
return "値上がりしやすい投資対象"
if x > 0.6:
return "値下がりしやすい投資対象"
return "ヨコヨコ気味の投資対象"
for x in np.arange(0,0.9,0.1):
print(f"--------------シミュレーション@{x}--------------")
y1 =投資商品売買(round(x,1),True)
y2 = 投資商品売買(round(x,1),False)
print(f"{商品説明(x)}への投資成果 : ランダム投資{y1}円,慎重投資{y2}円")
#df.to_csv("価格保有量_例.csv")
税金ない場合はどうなのと思った人は、以下の売却時残存率を1.0にして試してくださいな。
売却時残存率 = 0.8 #0.8 @税率20% or 1 @NISA
意識高い人は、こんなクソコード書きながらどうやって個々の売買のリターンを計算しようか考えても思いつかなかった僕にアドバイスをください。よろしくでがんす。
「慎重売買」アルゴリズムで勝てる市場はある。
ところで、上に掲げた、「慎重売買」アルゴリズムをちょっと改良して高い確率で利益を上げられる投資手法は(たぶん)存在する。そして、もっともうまくいけそう(feasible)な市場は、日本の東証一部市場である。
具体的には、以下のアルゴリズムである。
- 東証一部企業から安心企業をリストアップし、安心度スコアを付ける(ここは人力推奨)。
- リストアップされた企業のうち、配当利回り4%以上となっている企業の株を値下がり時に買う。
- 購入した企業の株が初回購入時よりもさらに値下がりした場合には(企業の安心度に応じ)買い増していく。
- 出口戦略は、購入した株が値上がりし、配当利回りX%(<4%)となった際に株を売却する。
API経由で簡単に実装できそうな戦略だね。高配当株には有名企業(例、三菱〇〇、三井△△)が多いので、リストアップにもさほど苦労しなそうだ。
そして、この戦略をX%≒2.5%として人力で実行なされて、約14年で億り人になられた方は実在する(以下)。
出典 Zai 株で1億円を稼ぐために「3つの口座で3つの手法」を
試して、好成績で自分に合う手法を発見! 利回り4%
超の高配当株を狙い、配当収入も年100万円以上に!
そう、高配当株の世界では、売買を控え、配当金をゆっくりと享受し値上がりを待つという「慎重勇者」なアルゴリズムは高い確率で勝てるのである(注、なのなのさんは増収増益企業のみを投資対象とするなどより慎重である)。売買回数を少なくして十分な値上がりを待てば、税率20%も怖くない。しかもリターンの計算必要ないから、実装は簡単!
ということで、早速システムトレードしてみよう...と思ったのだが、日本の株式の売買は基本100株単位。システムトレードするには、僕の資金が足りない(2000万円くらいがスタートラインだろう)。
けれども日本株に投入する余裕資金がないうちに「慎重勇者」できないのは悔しいので、LINE証券のいちかぶ(一株単位のミニ株)で、「慎重勇者もどき」を試み始めている(以下の黄色の株たち)。
...買い始めた当初はマイナスが付き続けるので気持ちが萎えないように、システムトレードでの自動売買が向いている手法だと思う。
ちなみに、日本株ミニ株の売買成果は半年間でリターン10%ほど。リターンに貢献しているのは、ボラティリティが高い株を下落時にすぐ買って10%値上がりで利益確定するという別戦略だけれど。
いずれにせよ、ミニ株で、日々日本株を売買してわかったことは、米国のハイテクグロース株と相関しにくい株が(特に高配当株に)多いので、ハイテク株下落へのリスクヘッジの一つにはなるな、と。
次回
今回もほぼポエムになってしまった。次回はAPI経由で値動きを追いかけるコードなどを取り上げたいね。債券投資を組み合わせ株価の上下動に備えるアルゴリズムと共に。
...個別リターンの計算は、売買単位で管理するCFDの世界だと簡単だなぁ。どこかに、CFD用のAPI公開されてないかな??