[スポンサードリンク]
直近の高値安値 ポジション編
今回からシステムトレードの損切りについて検証を進めていく。
まずはじめは、直近の高値と安値を損切りラインとする手法を試してみたい。
損切りルールは下記のとおり
買いの場合、過去5日の最安値を損切りラインとする。
売りの場合、過去5日の最高値を損切りラインとする。
今回のシステムトレードは今までやってきたドテン売買のシステムトレードより
複雑になっているためこれから数回にわたって作り方を説明していくことにする。
ちょっとわかりにくい部分もでてくるとは思うが、しっかりとついてきてほしい。
では、さっそくエクセルでシステムトレードを作成していこう!
まずは、以前に作成した移動平均線のトレンド判定を開く。
仕掛け部分の作り方については、移動平均のトレンド判定を参照してほしい。
1.シグナルの計算
・H1にシグナルと入力する。
・H27に「=IF(K27="",IF(AND(G26<>G27,G27="上昇"),"buy",IF(AND(G26<>G27,G27="下降"),"sell","")),"")」と入力する。
これは、今日のトレンド判定Gが前日と異なり、かつ今日が上昇なら、買い(buy)。
逆に下降なら売り(sell)。それ以外は空白という意味。
・これをコピーして、データのある最終行まで貼り付ける。
2.約定価格の計算
・I1に約定価格と入力する。
・最初のシグナルが出た次の日に(例はI37)、「=IF(OR(O36<>"",S36<>""),"",IF(H36<>"",B37,I36))」と入力する。
これは、損切シグナルOと利食シグナルが空白じゃない場合は、空白を表示する。損切シグナルOと利食シグナルSが空白の場合で、更にシグナルHが空白じゃない場合は、その日の始値を表示する。それ以外の場合は前日の価格を表示するという意味。
・これをコピーして、データのある最終行まで貼り付ける。
3.日数を計算する
・J1に日数と入力する。
・最初の約定価格が出た日に(例はJ37)、「=IF(I37="","",IF(I37<>I36,1,J36+1))」と入力する。
これは、約定価格Iが空白の場合は、空白を表示し、空白ではなかった場合で、更に 今日と前日の約定価格Iが違った場合は、1を表示し、同じ場合には前日の日数に1を加算する。という意味。
・これをコピーして、データのある最終行まで貼り付ける。
4.ポジションを計算する
・K1にポジションと入力する。
・最初の約定価格が出た日に(例はK37)、「=IF(J37="","",IF(H36<>"",H36,K36))」と入力する。
これは、日数Jが空白の場合は空白を表示し、空白じゃない場合で、更に前日のシグナルHが空白じゃない場合は、前日のシグナルHを表示し、空白の場合は前日のポジションKを表示させる。という意味。
・これをコピーして、データのある最終行まで貼り付ける。
ここまでついてこれただろうか。
一応、下記の図を参考にしてほしい。
ここまでがポジジョン部分になる。
この後、損切り部分、利食い部分、損益計算部分、R倍数部分と作っていく。
このように一つのシステムトレードをいくつかのパーツに分けて作っていくと理解しやすいし、
後から改良する時にもとてもやりやすいのでおすすめ。
と、今日はここまで。
次回をお楽しみに!!
直近の高値安値 損切り編
今回は前回に引き続き、直近高値安値の損切りの損切り部分を作成していく。
1.最悪含損を計算する
・L1に「最悪含損」と入力する。
・L2に「10000」と入力する。
これは、枚数を意味する。
・最初のシグナルが出た次の日に(例はL37)、「=IF(K37="sell",(I37-C37)*L$2,IF(K37="buy",(D37-I37)*L$2,""))」と入力する。
これは、ポジション K が sell だった場合、(約定価格 I - 高値 C) × 10000通貨を表示し、ポジション K が buy だった場合、(安値 D - 約定価格 I ) × 10000通貨を表示する。それ以外は空白を表示するという意味。
・コピーして、データのある最終行まで貼り付ける。
2.損切価格を計算する
・M1に「損切価格」と入力する
・最初のシグナルが出た次の日に(例はM37)、「=IF(AND(J37=1,K37="sell"),MAX(C32:C36),IF(AND(J37=1,K37="buy"),MIN(D32:D36),IF(J37="","",M36)))」と入力する。
これは、日数 J が1で、かつポジション K が sell だった場合、過去5日の最高値を損切り価格とする。また、日数 J が1で、かつポジション K が buy だった場合、過去5日の最安値を損切り価格とする。日数 J が空白だった場合は、空白を表示し、それ以外は、前日の損切り価格を表示する。という意味。
・コピーして、データのある最終行まで貼り付ける。
3.損切り額を計算する
・N1に「損切り額」と入力する。
・最初のシグナルが出た次の日に(例はN37)、「 =IF(K37="sell",(I37-M37)*L$2,IF(K37="buy",(M37-I37)*L$2,""))」と入力する。
これは、ポジション K が sell だった場合、(約定価格 I - 損切り価格 M ) × 10000通貨を表示し、ポジション K が buy だった場合、(損切り価格 M - 約定価格 I ) × 10000通貨を表示する。それ以外は空白を表示する。という意味。
・コピーして、データのある最終行まで貼り付ける。
4.損切シグナルを計算する
・O1に「損切シグナル」と入力する。
・最初のシグナルが出た次の日に(例はO37)、「=IF(L37<N37,"損切り","")」と入力する。
これは、最悪含損 L が損切り額 N より小さかった場合、損切りと表示させる。それ以外は空白を表示させるという意味。
・コピーして、データのある最終行まで貼り付ける。
わからなくなった人は、下の表を参考にしてほしい。
1行目を色分けしてみた。
黄色の項目がシステムトレードの損切り部分になる。
損切りを改良したかったら、この部分を変更していけばいい。
次回は利食い部分を作成していく。
お楽しみに!!
直近の高値安値 利食い編
今回も前回に引き続き、直近の高値安値の損切りを作成していく。
今回組み込む利食いルールは、
買いの時、2%上昇したら利食い
売りの時、2%下降したら利食い
では、さっそく作成してみよう!!
1.含み損益を計算する
・P1に「含み損益」と入力する
・最初のシグナルが出た次の日に(例はP37)、「=IF(K37="sell",(I37-E37)*L$2,IF(K37="buy",(E37-I37)*L$2,""))」と入力する。
これは、 ポジション K が sell だった場合、(約定価格 I - 終値 E) × 10000 を表示する。
ポジション K が buy だった場合、(終値 E - 約定価格 I ) × 10000 を表示する。それ以外は空白を表示する。
・コピーして、データのある最終行まで貼り付ける。
2.利食価格を計算する
・Q1に「利食価格」と入力する
・Q2に「2.00%」と入力する
・最初のシグナルが出た次の日に(例はQ37)、「=IF(J37="","",IF(AND(J37=1,K37="sell"),I37*(1-Q$2),IF(AND(J37=1,K37="buy"),I37*(1+Q$2),Q36)))」と入力する
これは、日数 J が空白の時は空白を表示する。日数が1を表示し、かつポジションKがsellを表示した場合、約定価格の98%の価格を表示する。日数が1を表示し、かつポジションがbuyを表示した場合、約定価格の102%の価格を表示する。ことを意味する。
・コピーして、データのある最終行まで貼り付ける。
3.利食い額を計算する
・R1に「利食い額」を表示する。
・最初のシグナルが出た次の日に(例はR37)、「=IF(K37="sell",(I37-Q37)*L$2,IF(K37="buy",(Q37-I37)*L$2,""))」を入力する
これは、ポジションKがsellを表示するとき、(約定価格I - 利食価格 Q) × 10000 を表示する。
ポジションKがbuyを表示するとき、(利食価格 Q - 約定価格I) × 10000 を表示する。
・コピーして、データのある最終行まで貼り付ける。
4.利食シグナルを計算する
・S1に「利食シグナル」と入力する
・最初のシグナルが出た次の日に(例はS37)、「=IF(AND(O37="",K37<>"",P37>R37),"利食い","")」と入力する。
これは、損切シグナルOが空白、かつポジションKが空白じゃなく、かつ含み損益が利食い額よりも大きい場合、利食いと表示し、それ以外は空白を表示するという意味。
・コピーして、データのある最終行まで貼り付ける。
<ここでひとつアドバイス>
エクセルでシステムトレードを構築する場合には、シグナルをうまく使っていくことがポイントになる。今回作成している損切りのシステムトレードも仕掛けシグナル、損切りシグナル、利食いシグナルと3つのシグナルを使っている。
次回は損益部分を作成していく。
お楽しみに!!
直近の高値安値 損益編
今回も直近の高値安値の損切りシステムトレードを構築していく。
損益部分の必要項目は、損益、累積損益、最大損益、ドローダウンの4項目。
それでは早速作っていこう!
1.損益を計算しよう
・T1に「損益」と入力する。
・T2に「1050」と入力する。
これは手数料1050円を考慮して計算するために使用する。
・最初のシグナルが出た次の日に(例はT37)、「=IF(O37="損切り",N37-$T$2,IF(S37="利食い",R37-T$2,""))」と入力する。
これは、損切りシグナルOが損切りと表示されていたら、(損切り額N - 手数料T2)を表示し、利食いシグナルSに利食いと表示されていたら、(利食い額R - 手数料T2)を表示する。それ以外は空白を表示するという意味。
・コピーし、データ最終行まで貼り付ける。
2.累積損益を計算する
・U1に累積損益と入力する。
・最初のシグナルが出た次の日に(例はU37)、「=SUM(T37)+U36」と入力する。
・コピーし、データ最終行まで貼り付ける。
3.最大損益を計算する
・V1に最大損益と入力する
・最初のシグナルが出た日に(例はU36)、「=MAX(V35,U36)」と入力する。
・コピーし、データ最終行まで貼り付ける。
4.ドローダウンを計算する
・W1にドローダウンと入力する。
・最初のシグナルが出た日に(例はW36)、「=U36-V36」と入力する。
・コピーし、データ最終行まで貼り付ける。
さっ!次回はいよいよR倍数部分に入る。
完成まであと一息!!
直近の高値安値 R倍数編
今回も直近の高値安値の損切りシステムトレードを作成する。
R倍数部分の必要項目は、初期リスク、R倍数、R累積、R最大、Rドローダウンの5項目。
1.初期リスクを計算しよう
・X1に初期リスクと入力する
・最初のシグナルが出た次の日に(例はX37)、「=IF(J37="","",IF(J37=1,N37-T$2,X36))」と入力する。
これは、日数Jが空白の時は、空白を表示し、1を表示擦る時は、 損切り額N - 手数料T2 を表示し、それ以外は前日の初期リスクXを表示するという意味。
・コピーし、最終データのある行まで貼り付ける
2.R倍数を計算しよう
・Y1にR倍数と入力する
・最初のシグナルが出た次の日に(例はY37)、「=IF(T37<>"",-(T37/X37),"")」と入力する
これは、損益Tが空白じゃない時は、- ( 損益T ÷ 初期リスクX)を表示し、それ以外は空白を表示する
・コピーし、最終データのある行まで貼り付ける
3.R倍数の累積を計算しよう
・Z1にR累積と入力する
・最初のシグナルが出た次の日に(例はZ37)、「=SUM(Y37)+Z36」と入力する。
これは、R倍数Yと前日のR累積を足し算するという意味
・コピーし、最終データのある行まで貼り付ける
4.R倍数累積の最大値を計算しよう
・AA1にR最大と入力する
・最初のシグナルが出た日に(例はAA36)、「=MAX(AA35,Z36)」と入力する
・コピーし、最終データのある行まで貼り付ける
5.R倍数のドローダウンを計算しよう
・AB1にRドローと入力する
・最初のシグナルが出た次の日に(例はAB37)、「=Z37-AA37」と入力する
・コピーし、最終データのある行まで貼り付ける
お疲れ様でした。
これで一通りのシステムは完成しました。
次回は、この直近の高値安値のシステムトレードを評価してみようと思います。
直近の高値安値の損切りの評価
前回まで作成していた直近の高値安値の損切りの評価をしたいと思う。
まず、評価シートを作成するため、新しいシートを挿入して、名前を評価シートにする
勝率を計算する
・勝ち回数 (B2)
「=COUNTIF(usdデータ!$T$3:$T$1001,">0")」
損益の中で0より大きな数値を数える
・負け回数 (B4)
「=COUNTIF(usdデータ!$T$3:$T$1001,"<0")」
損益の中で0より小さな数値を数える
・売買回数 (B6)
「=SUM(B2,B4)」
勝ち回数と負け回数の合計
・勝率 (A2)
「=B2/B6」
勝ち回数÷売買回数
期待値を計算する
・利益合計 (C2)
「=SUMIF(usdデータ!$T$3:$T$1001,">0")」
損益の中で0より大きな数値を合計する
・損失合計 (C4)
「=SUMIF(usdデータ!$T$3:$T$1001,"<0")」
損益の中で0より小さな数値を合計する
・損益合計 (C6)
「=SUM(C2,C4)」
利益合計+損失合計
・平均利益 (D2)
「=C2/B2」
利益合計÷勝ち回数
・平均損失 (D4)
「=C4/B4」
損失合計÷負け回数
・期待値 (D6)
「=(D2*A2)+(D4*(1-A2))」
(平均利益×勝率)+(平均損失×(1-勝率)))
最大利益、最大損失、最大ドローダウンを計算する
・最大利益 (E2)
「=MAX(usdデータ!T3:T1001)」
損益の中での最大値
・最大損失(E4)
「=MIN(usdデータ!T3:T1001)」
損益の中での最小値
・最大ドローダウン (E6)
「=MIN(usdデータ!W3:W1001)」
ドローダウンの最小値
R倍数合計を計算する
・勝ちR倍数の合計(C9)
「=SUMIF(usdデータ!$Y$3:$Y$1001,">0")」
R倍数の中で0より大きな数値を合計する
・負けR倍数の合計(C11)
「=SUMIF(usdデータ!$Y$3:$Y$1001,"<0")」
R倍数の中で0より小さい数値を合計する
・R倍数の合計(C13)
「=SUM(C9,C11)」
勝ちR倍数と負けR倍数の合計
R倍数の期待値を計算する
・勝ちR倍数の平均(D9)
「=C9/B2」
勝ちR倍数の合計 ÷ 勝ち回数
・負けR倍数の平均(D11)
「=C11/B4」
負けR倍数の合計 ÷ 負け回数
・R倍数の期待値(D13)
「=(D9*A2)+(D11*(1-A2))」
(勝ちR倍数の平均×勝率)+(負けR倍数の平均×(1-勝率)))
R倍数の最大利益、最大損失、最大ドローダウンを計算する
・R倍数の最大利益(E9)
「=MAX(usdデータ!Y$3:Y$1001)」
R倍数の中の最大値
・R倍数の最大損失(E11)
「=MIN(usdデータ!Y$3:Y$1001)」
R倍数の中の最小値
・R倍数の最大ドローダウン(E13)
「=MIN(usdデータ!AB$3:AB$1001)」
ドローダウンの中の最小値
↑移動平均線のトレンド判定に直近の高値安値の損切りを加えた評価シート
注目すべきは、何と言っても、プラスの期待値が少しだけど、大きくなったこと!!
ただ、損切りの役割、初期リスクに対してより大きな利益を得るための投資戦略になっているかというと、勝ちR倍数の平均が1.13と物足りない。
今後は今回作成したファイルを利用して、いろいろな損切りを試していき、この数値がどのように変化していくのかを見ていこうと思う。
[スポンサードリンク]

