トレーディングシステム入門:後編

システムを構築する前に「どのマーケットでトレードするのか」を決定する必要がある。
これはマーケットデータに潜む問題を知るところから始まる。

プログラムは指標「Indicator」として次のものを作成した。

{ Indicator for comparation with % Volatility between
2 charts which have different rollover each other
and same market. }

Vars:
O1 (0), H1 (0), L1 (0), C1 (0),
O2 (0), H2 (0), L2 (0), C2 (0),
     HL1 (0), HL2 (0), V1 (0), V2 (0),
V1V2 (0), AvgDif (0), StdDif (0);

O1 = O of data1; H1 = H of data1;
L1 = L of data1; C1 = C of data1;
O2 = O of data2; H2 = H of data2;
L2 = L of data2; C2 = C of data2;

{*********************************************************}
if currentbar > 1 then begin
{*********************************************************}

HL1 = Maxlist(H1,H1[1]) – Minlist(L1,L1[1]);
HL2 = Maxlist(H2,H2[1]) – Minlist(L2,L2[1]);

if H1 > H1[1] and L1 > L1[1] then V1 = HL1 *100 / L1[1];
if H1 < H1[1] and L1 < L1[1] then V1 = HL1 *100 / L1; if H1 > H1[1] and L1 < L1[1] then begin if O1 < C1 then V1 = HL1 *100 / L1 else V1 = HL1 *100 / H1; end; if H1 < H1[1] and L1 > L1[1] then begin
if O1[1] < C1[1] then V1 = HL1 *100 / L1[1] else V1 = HL1 *100 / H1[1]; end; if H2 > H2[1] and L2 > L2[1] then V2 = HL2 *100 / L2[1];
if H2 < H2[1] and L2 < L2[1] then V2 = HL2 *100 / L2; if H2 > H2[1] and L2 < L2[1] then begin if O2 < C2 then V2 = HL2 *100 / L2 else V2 = HL2 *100 / H2; end; if H2 < H2[1] and L2 > L2[1] then begin
if O2[1] < C2[1] then V2 = HL2 *100 / L2[1] else V2 = HL2 *100 / H2[1]; end; V1V2 = V1 - V2; AvgDif = AvgDif + V1V2; {StdDif = StdDev(V1V2,currentbar);} if Date = LastCalcDate then begin AvgDif = AvgDif / currentbar; print ("Date = ",Date," Average of Difference = ", AvgDif:0:2{," StandardDiv of Difference = ",StdDif:0:2}); end; Plot1 ( V1V2, "Difference" ) ; {*********************************************************} end; {*********************************************************} 実はこのプログラムの作成には数日かかってしまった。 その原因はTradestationのバグにある。 if Date = LastCalcDate then begin~end; の文を使うことで日足週足月足などのチャートの最後のバーでのみ何かを実行させることができるのだが、ここに関数を使用すると誤った結果を算出することがある。 関数それ自体がもともとより単純なプログラムで作られているため、そのプログラムを関数の代わりに使うと正しい算出がされたりする。 そしてチャート上にIndicatorがプロットされない症状も出たりする。 また割り算のあるIndicatorの場合、関数を使っているとチャートにIndicatorの表示開始位置がずいぶん後の(最近の)バーからだったりもする。 この原因はIndicatorの設定画面「format」の中の「Maximam number of bars study will reference」の設定数値の最小値をTradeStationがIndicatorのプログラムから自動(勝手)で決定しまうことにある。 (プログラム内で標準偏差の計算を{}で囲って無効化してあるのはそのためである。) さらにチャート上のプロットの表示はおかしいがprintコマンドによる数値の算出結果は正しい場合もある。 このようなことがあるため、自分でプログラムを作った場合はそれをIndicatorとして視覚で確認できるようにしチェックする必要がある。 ちなみにprintコマンドによる数値算出結果は「Print Log」という欄で確認できる。 この欄はTradeStationの上部メニューからView > EasyLanguage OutPut barを選ぶとウィンドウが下に現れる。
そこにある Print Log のタブをクリックすると現れる。

このプログラムは (A1-U1)または(A2-U2) の値 「V1V2」 を毎バーでプロットし、V1V2の平均値を最後(最新)のバーでのみ計算させ、それをPrint Logに出力する。

Emini S&P500の1999,5,20~2008,1,20の(A1-U1)の月足チャート

TradeStationBackAdjustedUnadjusted1.GIF

緑色がA1,黄色がU1。
チャート下にある赤線が今回作ったIndicator「!!Vola Comp」で、V1V2(=A1-U1)である。
この期間でのV1V2の平均値は-0.09、標準偏差は0.34。

Emini S&P500の1999,5,20~2008,1,20の(A2-U2)の月足チャート

TradeStationBackAdjustedUnadjusted2.GIF

緑色がA2,黄色がU2。
この期間でのV1V2(=A2-U2)の平均値は-0.09、標準偏差は0.38。

ここで再度A1,U1,A2,U2について書くと

A1のロールオーバーの条件:
Activity [ X ] consecutive trading days of higher [ Volume or OpenInterest ]
Back Adjustment Method [ Ratio ]

U1のロールオーバーの条件:
Activity [ X ] consecutive trading days of higher [ Volume or OpenInterest ]
Back Adjustment Method [ Unadjusted ]

A2のロールオーバーの条件:
Time [ X ] trading days [ Prior to Expiration Date ]
Back Adjustment Method [ Ratio ]

U2のロールオーバーの条件:
Time [ X ] trading days [ Prior to Expiration Date ]
Back Adjustment Method [ Unadjusted ]

これら条件をいくつか変えた場合のV1V2の平均値と標準偏差を表にする。
またEmini S&P500だけでなくS&P500についても算出してみる。

Volatilitiy_ES_SP_NQ.GIF