IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Java technology  >

カブロボ テクニカル分析と、そのアルゴリズムの紹介: その6 移動平均によるドテン売買と長期シミュレーション

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません


レベル: 上級

木村 桂 (kimuc@jp.ibm.com), ソフトウェア事業, IBM 

2006年 3月 17日

この連載も6回目を迎えました。徐々にではありますが、読者の皆様からのフィードバックも集まるようになってきて、改めて連載してよかったなあ、と思っております。その一方で第二回のカブロボコンテストも評価対象の最終月である3月の中盤を迎えました。今度、このコンテストがどのような形で継続していくのかも興味ありますが、コンテストが開かれていない期間でも、なんらかの形でカブロボを使ってもらうことはできないだろうか、という不安や悩みもあります。

カブロボを実投資に応用

同時に「このテクニカル分析を紹介してほしい」という要望もいただいており、実現に向けた検討にも入らせていただいております。ただ今の連載のスタイルでは実現が難しそうな要望もあります。そこでこれらの問題をまとめて解決するべく、今回は思い切って少し趣向を変えてみることにします。 今までの連載ではカブロボの SDK を使い、カブロボのルールに即して、実際にコンテストに参加できるロボットを作るという目的の中でプログラミング技術を紹介してきましたが、今回以降しばらくは(そのままのアルゴリズムで)コンテストへの参加を前提とはせず、むしろカブロボの仕組みを使って実際の投資をシミュレートする目的に重きをおいた紹介をさせていただきたいと思っております。

過去5回の連載ではどちらかというと「今日の時点で売買するべき銘柄はどれか?」という観点で銘柄を探すロボットを作り、2005年4月の1ヶ月間のデータでその動作を確認する、という形で紹介してきました。ただ実際にはこのような方法で投資をされている方は少ないと思われます。どちらかというとまず銘柄をある程度絞った上で、その売買タイミングのみを推測して投資判断とする、というスタイルで投資されている方が少なくないのではないでしょうか?

どの程度の中・長期間で投資をするのかというスタイルにもよりますが、この考え方をカブロボに応用した場合は1ヶ月間の中での成果で評価されるというカブロボのルール上、ふさわしくないのです。したがって本連載でも扱いを検討していましたが、ここは敢えてこのままカブロボコンテストに応募できるロボットを作るのではなく、カブロボの仕組みを投資シミュレーターとして使うことに割り切ることにします。

目的はアルゴリズムの精度を長期間に渡るシミュレーションで確認することです。そのため今回を含めた数回の連載では以下のような(現在のカブロボのルールでは認められなかったり、無意味だったりするのですが)前提でアルゴリズムを紹介することにします:

  • 投資銘柄は1つに絞る
  • 1ヶ月という短い期間ではなく、半年間に渡って運用をシミュレートする

投資銘柄を絞らない方法も考えたのですが、今回のシミュレーションではアルゴリズムの長期的な精度を確認する目的から、複数の銘柄から「今はどの株が買いか?」を調べるアルゴリズムを取り除くことにしました。

これによって売買を行う銘柄は固定した上で、後は買いと売りのタイミングを測ることだけに専念したアルゴリズムの分析を行うことにしました。今までとは異なる全く新しい試みにチャレンジしてみます。

そして「買いと売りのタイミングを測るアルゴリズム」の代表格といえば移動平均によるゴールデンクロス/デッドクロスだと思います。今回はこの移動平均アルゴリズムの紹介を行うと共に、長期間のシミュレーションでどの程度の精度があるのか、また移動平均を計算する日数を微調整することで精度がどのように変わっていくのか、をシミュレートしてみることにします。




上に戻る


ゴールデンクロス/デッドクロス

比較的有名なテクニカル手法であるため、多くの方がご存知かもしれませんが、まずは確認の意味も含めてゴールデンクロス/デッドクロスの考え方を簡単に紹介しておきます。「クロス」というからには何かと何かが交差するのですが、この投資手法では短期間の移動平均線と、長期間の移動平均線の交差するタイミングで売買を行う、という考え方に基づいています。

株価が変化する要因は業績やニュース、政治経済全般が関わってきます。長期的な傾向に影響する要因もあれば、一時的に株価が上下するようなニュースもあります。一日の中でも株価は大きく動いたりあまり動かなかったりします。またなんらかの要因で1日だけ突出して上がったり下がったりすることもあります。それらの動き全てを逐一追っていたのでは小さな動きに惑わされてしまいます。


図1 株価はいろいろな要素で常に細かく変動しているため、そのまま眺めているだけでは全体的な傾向(上昇傾向なのか、下降傾向なのか)が分かりにくい

このような細かな要因を無視して、大局的な流れを調べるのに移動平均という考え方が適しています。これは何日間かの株価の平均値を指標とする、という考え方です。1日だけ大きく株価が動いた日があっても、平均化することで例外的な値もなだらかになり、より大きな動きや傾向が見えてくるようになるからです。

(例) 5日間の移動平均値(毎日この値を計算して、それを結んで線グラフ化します)
移動平均値 = ( P4 + P3 + P2 + P1 + P0 ) / 5  (Pk: k日前の株価)

特に短期間と長期間の2つの平均値をとった場合、長期間の平均値の動きは短期間のそれよりも更になだらかになります。こうして実際の動きをなだらかにした短期間の移動平均値と、更にゆっくりとなだらかな動きを見せる長期間の移動平均値の2つの線をグラフとしてあらわすことができるようになります。


図2 移動平均の値を取って動きをなだらかにすると、ある程度の傾向が見えてくる

この移動平均の値を計算する期間が長ければ長いほどグラフはなだらかになります。結果として2本の移動平均線は、実際の株価変動に比較的近い細かな動きをする短期の移動平均線と、比較的ゆっくりなだらかに動く長期の移動平均線が何度か交わる形になります。この交わるタイミングを売買のサインとみなして投資しよう、というのが今回の目的になります。

特に短期移動平均線が長期移動平均線を下から上に突き抜ける形でクロスするケースをゴールデンクロスと呼びます。これは(短期間の)比較的最近の傾向が(長期間の)より全体的な傾向を上回ったことを意味しますので、株価が上昇傾向にあることを示すサインとみなし、買いのサインとみなせるのではないか、と考えます。 逆に短期移動平均線が長期移動平均線を上から下に突き抜ける形でクロスするケースをデッドクロスと呼び、これは同様の理由から売りのサインと考えます。

なお、ゴールデンクロスとデッドクロスは2つの曲線が交わるタイミングで発生するものですから、これら2つは交互に発生することになります(例えばゴールデンクロスが発生した場合、次のゴールデンクロス発生の前に必ずデッドクロスが発生します)。


図3 ゴールデンクロスとデッドクロス

今回のテクニカル指標でのシミュレーションはこの売り/買いのサインをそのまま売買に結びつけることにします。つまり、

  • ゴールデンクロスになったら買い
  • デッドクロスになったら空売り

これらをひたすらに繰り返すだけのロボットを作ります。クロスが発生するたびに、いわゆる「ドテン(途転)」の売買を繰り返すロボットです。

このロボットを長期間運用し、更に精度を高めるための日数調整をしてみます。




上に戻る


アルゴリズム化

投資判断自体は上記で説明した通りです。一部繰り返しになりますが、改めて今回のロボットの動作を説明しますと、以下のようになります:

  1. まず投資銘柄(会社)のインデックスを決めます。
  2. 次に移動平均値を求める期間日数を、短期(MA1DAY)と長期(MA2DAY)の2つ決めます。
  3. 毎日、1 と 2 の情報を元に株価と移動平均値を求め、前日から今日にかけてゴールデンクロス/デッドクロスが起こっていないかどうかを確認します。
  4. クロスが発生していた場合は次の判断で売買注文を発行します:
    1. ゴールデンクロスが起こっていた場合、
      • これがシミュレーション期間中で初めてのクロスだった場合は、1単位購入します。
      • これがシミュレーション期間中で初めてのクロスでなかった場合は、直前のデッドクロス時に1単位空売りしている状態のはずなので2単位購入し、差し引きで1単位購入している状態にする(いわゆる「ドテン買い」をします)
    2. デッドクロスが起こっていた場合、
      • これがシミュレーション期間中で初めてのクロスだった場合は、1単位売却(空売り)します。
      • これがシミュレーション期間中で初めてのクロスでなかった場合は、直前のゴールデンクロス時に1単位購入している状態のはずなので2単位売却し、差し引きで1単位空売りしている状態にする(いわゆる「ドテン売り」をします)

なお「昨日から今日にかけてゴールデンクロスが発生しているかどうか」をどのように判断すべきかというと、以下のような計算を行うことにします:

  1. 以下の4つの値を求めます:
    1. MA1T: 今日の時点での短期移動平均値(= ( MA1DAY - 1 ) 日前から今日までの MA1DAY 日間の株価終値の平均値)
    2. MA2T: 今日の時点での長期移動平均値(= ( MA2DAY - 1 ) 日前から今日までの MA2DAY 日間の株価終値の平均値)
    3. MA1Y: 前日の時点での短期移動平均値(= MA1DAY 日前から前日までの MA1DAY 日間の株価終値の平均値)
    4. MA2Y: 前日の時点での長期移動平均値(= MA2DAY 日前から前日までの MA2DAY 日間の株価終値の平均値)
  2. 上記で求めた値を使って、以下の2つの値を求めます:
    1. DiffT: 今日の時点での短期移動平均値と長期移動平均値の差(= MA1T - MA2T)
    2. DiffY: 前日の時点での短期移動平均値と長期移動平均値の差(= MA1Y - MA2Y)

短期移動平均値と長期移動平均値がクロスするということは、毎日のこれら2つの値の差である DiffT がマイナスからプラスへ(この場合はゴールデンクロス)、またはプラスからマイナスへ(この場合はデッドクロス)変わることを意味しています。ということは DiffY と DiffT の符号が異なっていた場合はどちらかのクロスが発生した、と判断できることになりますから、DiffY * DiffT の値が負の値になっていればクロスが発生した、と判断できることになります。そしてその場合は DiffT が正か負かを判断することでゴールデンクロスかデッドクロスかを判断できます。

これでゴールデンクロスやデッドクロスのタイミングを測るための実現方法が分かりました。では実際のプログラムを作ってみましょう。




上に戻る


Java のプログラムで実装

これまでに説明してきたアルゴリズムを実装すると以下のようになります。ここでは MovingAvgRobot というクラス名で作成しました:

import java.util.Calendar;
import java.util.List;

import jp.kaburobo.information.IndexInformation;
import jp.kaburobo.information.InformationManager;
import jp.kaburobo.investment.InvestmentAgent;
import jp.kaburobo.investment.SimpleStockOrder;
import jp.kaburobo.investment.Stock;
import jp.kaburobo.investment.StockOrder;
import jp.kaburobo.robot.Robot;
import jp.kaburobo.util.Time;

public class MovingAvgRobot implements Robot {
 static int tradetype = -1;  // 0

 public void run(InvestmentAgent arg0) {
  // TODO Auto-generated method stub
  int IDX = 0;   // ここで指定した銘柄を対象にシミュレートする 1
                 // (0:日本製粉, 1:明示乳業, ..)
  int MA1DAY = 5;  // 短期移動平均値を求める日数 2
  int MA2DAY = 10;  // 長期移動平均値を求める日数(ただし MA1DAY < MA2DAY)

  Stock[] stocks = arg0.getStocks();	// 銘柄リストの取得
  
  // IDXで指定した銘柄について短期・長期それぞれの移動平均値を求める
   
  // 直近の日付から ( MA2DAY + 1 ) 日分の銘柄指標データを取得 3
  Calendar cdt = Time.getTime();
  InformationManager infoManager = arg0.getInformationManager();
  List list = infoManager.getIndexInformation( stocks[IDX], cdt, -1 * ( MA2DAY + 1 ) );
  long cp[] = new long[MA2DAY+1];
  for( int i = 0; i <= MA2DAY; i ++ ){

    // ( MA2DAY + 1 - i )日前のデータ
    IndexInformation indexInformation = ( IndexInformation )list.get( i );

   cp[i] = indexInformation.getClosingPrice();   // ( MA2DAY + 1 - i )日前の終値
  }

  // 当日と前(営業)日それぞれについて短期・長期の移動平均値を求める 4
  double ma1T = getAVG( cp, MA2DAY - MA1DAY + 1, MA1DAY );	// 当日の短期移動平均値
  double ma1Y = getAVG( cp, MA2DAY - MA1DAY, MA1DAY );		// 前日の短期移動平均値
  double ma2T = getAVG( cp, 1, MA2DAY );			// 当日の長期移動平均値
  double ma2Y = getAVG( cp, 0, MA2DAY );			// 前日の長期移動平均値

  System.out.println( "MA1 = " + ma1T + ", MA2 = " + ma2T );
  
  // 当日と前(営業)日それぞれについて移動平均値の差を求める 5
  // (この積が負であればクロスしたことになる)
  double diffT = ma1T - ma2T;	// 当日の移動平均値の差
  double diffY = ma1Y - ma2Y;	// 前日の移動平均値の差

  if( diffT * diffY <= 0 && diffT != 0 ){  // 6
   // 移動平均線がクロスした!
   
   // 最初の売買だった場合は1単位、ドテンの場合は2単位 7
   int quantity = ( tradetype == -1 ) ? 1 : 2;
   
   // 買いシグナルか、売りシグナルかを判断 8
   if( diffT > 0 ){
    // ゴールデンクロス(=買いシグナル)    
    tradetype = StockOrder.BUY;
   }else{
    // デッドクロス(=売りシグナル)
    tradetype = StockOrder.SELL;
   }

   System.out.println( "注文銘柄: " + stocks[IDX].getName()
    + "(" + stocks[IDX].getCode() + ")\t終値: " + cp[MA2DAY] );

   SimpleStockOrder stockOrder = new SimpleStockOrder();
   stockOrder.setStock( stocks[IDX] );		// 注文の銘柄を設定
   stockOrder.setLimitType( StockOrder.MARKET );	// 成り行き注文
   stockOrder.setTradeType( tradetype );		// 買い/売り注文を設定
   stockOrder.setQuantity( quantity );		// 注文を1単位株に設定
   arg0.order( stockOrder );			// 注文の発行 9
  }
 }
 
 // 平均値
 private double getAVG( long[] v, int startidx, int num ){
  double sum = 0.0;
  for( int i = startidx; i < startidx + num; i ++ ){
   sum += ( double )v[i];
  }

  return ( sum / num );
 }
}

以下にこのプログラムの流れを簡単に紹介します:

  1. このプログラムでは static な整数型変数 tradetype を定義しています。これは現在の注文内容を保持するためのフラグ変数です。買い注文を出している時は StockOrder.BUY( = 1 )、売り注文を出している時は StockOrder.SELL( = 0 )の値になりますが、初期値はどちらでもないという意味で -1 にしておきます。
  2. 次に今回のシミュレーションを行う対象銘柄 IDX を決定します。これは InvestmentAgent.getStocks() で得られる Stock 型配列の何番目の銘柄を利用するかを指定する変数です。今回は仮にゼロで固定して、日本製粉株だけを対象にシミュレートしてみます。
  3. 更に短期と長期それぞれの移動平均値を計算するための日数である MA1DAY, MA2DAY を決定します。ここは後で変更しますが、仮に MA1DAY = 5, MA2DAY = 10 と設定しておきます。
  4. 銘柄とシミュレートに必要なデータの日数が決まったら、計算に必要な ( MA2DAY + 1 ) 日分の終値を取得します。
  5. 3 で得られた終値を元に、短期・長期それぞれの移動平均値を今日と前日の分、つまり4つの値を計算で求めます。また当日の値については確認のため画面に出力します。
  6. そして 4 で得られた値の差を求め、今日と前日それぞれについて移動平均値の短期と長期の差を求めます。
  7. 2つの移動平均線がクロスしたかどうかの判断は、5 で得られた2つの値の積が負の値になっているかどうかで分かります。
  8. クロスしていた場合、まず既に何らかの注文が出ているかどうかを調べます。出ていない場合は新規に1単位注文し、出ていた場合はドテン売買になるため2単位注文します。
  9. また今回のクロスがゴールデンクロスであったのか、デッドクロスであったのかを調べて、売買注文の種類を決定します。
  10. 最後にこれまで求めた結果を使って成行注文を行います。

これまでの連載で説明してきたアルゴリズムと大きく異なる点が1つあります。今までは新規に注文した売買は、翌営業日に必ず決済していました。つまり1日だけの売買を何度も繰り返し行ってきていましたが、今回は特に決済用のロジックを用意していません。「買いのサイン」と「売りのサイン」だけを判断材料にして、そのサインが出たとおりの注文を行うようにしたため、ある意味ではプログラムがシンプルになりました。 今まではカブロボのルール上、1ヶ月の中で複数銘柄の売買を行う必要があったための措置でしたが、この制限を敢えてはずして本来の投資に近い(と思われる)形でのアルゴリズムにした結果がこのようになりました。




上に戻る


シミュレーション結果

このプログラムを実行すると以下のような結果になります。シミュレート期間 2005 年の4月です:

MovingAvgRobot start
■1日目2005/04/01 金 終了時の所持金額
                  総資産 = 手持ち資金+所有株式時価総額 = 5,000,000円
                 手持ち資金(運転可能金額 + ロック金額) = 5,000,000円
                                           運転可能金額 = 5,000,000円
                                                     ロック資金 = 0円
                                              単純計算年率利益率 0.0%

○ロボットの銘柄評価
MA1 = 531.0, MA2 = 536.9
実行時間: 0.156 秒.

  :
  :
 (略)
  :
  :

■28日目2005/04/28 木 終了時の所持金額
                  総資産 = 手持ち資金+所有株式時価総額 = 5,000,000円
                 手持ち資金(運転可能金額 + ロック金額) = 5,000,000円
                                           運転可能金額 = 5,000,000円
                                                     ロック資金 = 0円
                                              単純計算年率利益率 0.0%

○ロボットの銘柄評価
MA1 = 495.2, MA2 = 495.1
注文銘柄: 日本粉(2001) 終値: 492
購入: 2001 日本粉 1単位 成行

【注文処理結果】
                        銘柄名|銘柄コード|      枚数|  購入価格|    前日比
------------------------------+----------+----------+----------+----------
                        日本粉|      2001|      1000|       490|        -1



【ポートフォリオ】
                        銘柄名|銘柄コード|      枚数|  購入価格|    前日比
------------------------------+----------+----------+----------+----------
                        日本粉|      2001|      1000|       490|        -1


実行時間: 0.406 秒.

■29日目2005/04/29 金 終了時の所持金額
No Data
実行時間: 0.0 秒.

■30日目2005/04/30 土 終了時の所持金額
No Data
実行時間: 0.0 秒.

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【最終結果】
あなたのロボットによる、該当期間の運用成績は、こちらです。
総資産 = 手持ち資金+所有株式時価総額 = 5,003,000円
                                              単純計算年率利益率 1.0%

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

結果だけを見ると 3000 円のプラスなんですが、実は 2005/04/28 に1回だけ買い注文を行い、その結果がこのようにプラスになっていました。比較的短期間の設定で移動平均を求めたつもりでしたが、それでもこの期間では1回しか注文を行わないのです。 これではせっかくよりリアルな注文方法にしても面白味に欠けるのでシミュレーションの期間をもっと長くしてみましょう。




上に戻る


シミュレーション期間を設定

作成したロボットを何の指定もなく実行すると 2005 年4月のデータを用いて1ヶ月間シミュレートされていました。このシミュレート期間を変更しましょう。

作成したロボット(MovingAvgRobot という名前であると仮定します)をコマンドラインから実行している場合は、以下のどちらかのようにオプションを指定します:

  1. kaburobo MovingAvgRobot 2005-1-1 2005-6-30
  2. kaburobo MovingAvgRobot 2005-1-1 181

(1) の方法ではシミュレーションの開始日と終了日を指定しています。また (2) の方法では開始日と期間日数を指定しています。どちらの方法でも構いませんが、日付は必ず YYYY-M-D 形式で(スラッシュではなくハイフン区切りで)指定する必要があります。

一方、Eclipse 等の統合開発環境を用いて、jp.kaburobo.driver.KabuRoboDriver クラスを直接指定して実行している場合は、その main 関数を以下のように変更します:

import jp.kaburobo.driver.KabuRoboDriver;

public class RobotExec{
 public static void main( String[] args ){
   :
   :

  // 今まではロボット名だけを指定していたが、
  String[] arg = { "MovingAvgRobot", "2005-1-1", "2005-6-30" };  // 期間のパラメータも指定する

  KabuRoboDriver.main( arg );
 }
}
            

この設定で改めて実行しなおすと、指定された期間でロボットの動作をシミュレーションできます。
以下は実際にこの(2005年1月1日から2005年6月30日までの)設定でシミュレーションを行った場合の結果です:

MovingAvgRobot start
■1日目2005/01/01 土 終了時の所持金額
No Data
実行時間: 0.0 秒.

■2日目2005/01/02 日 終了時の所持金額
No Data
実行時間: 0.0 秒.

■3日目2005/01/03 月 終了時の所持金額
No Data
実行時間: 0.0 秒.

■4日目2005/01/04 火 終了時の所持金額
                  総資産 = 手持ち資金+所有株式時価総額 = 5,000,000円
                 手持ち資金(運転可能金額 + ロック金額) = 5,000,000円
                                           運転可能金額 = 5,000,000円
                                                     ロック資金 = 0円
                                              単純計算年率利益率 0.0%

○ロボットの銘柄評価
MA1 = 472.6, MA2 = 457.7
実行時間: 0.235 秒.

  :
  :
 (略)
  :
  :

■24日目2005/01/24 月 終了時の所持金額
                  総資産 = 手持ち資金+所有株式時価総額 = 5,000,000円
                 手持ち資金(運転可能金額 + ロック金額) = 5,000,000円
                                           運転可能金額 = 5,000,000円
                                                     ロック資金 = 0円
                                              単純計算年率利益率 0.0%

○ロボットの銘柄評価
MA1 = 495.8, MA2 = 496.0
注文銘柄: 日本粉(2001) 終値: 496
売却: 2001 日本粉 1単位 成行

【注文処理結果】
                        銘柄名|銘柄コード|      枚数|  購入価格|    前日比
------------------------------+----------+----------+----------+----------
                        日本粉|      2001|     -1000|       492|        -4



【ポートフォリオ】
                        銘柄名|銘柄コード|      枚数|  購入価格|    前日比
------------------------------+----------+----------+----------+----------
                        日本粉|      2001|     -1000|       492|        -4


実行時間: 0.032 秒.

  :
  :
 (略)
  :
  :

■181日目2005/06/30 木 終了時の所持金額
                  総資産 = 手持ち資金+所有株式時価総額 = 5,000,000円
                 手持ち資金(運転可能金額 + ロック金額) = 5,484,000円
                                           運転可能金額 = 4,516,000円
                                               ロック資金 = 968,000円
                                              単純計算年率利益率 0.0%

○ロボットの銘柄評価
MA1 = 486.0, MA2 = 490.0

【ポートフォリオ】
                        銘柄名|銘柄コード|      枚数|  購入価格|    前日比
------------------------------+----------+----------+----------+----------
                        日本粉|      2001|     -1000|       485|        -3


実行時間: 0.203 秒.

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【最終結果】
あなたのロボットによる、該当期間の運用成績は、こちらです。
総資産 = 手持ち資金+所有株式時価総額 = 4,997,000円
                                              単純計算年率利益率 0.0%

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

MovingAvgRobot end

結果を見れば分かるように (元旦は休日のためロボットは何もしませんが)2005/01/01 から 2005/06/30 までの 181 日間でシミュレートが行われています。またその内容も 2005/01/24 に最初の注文を行ったのを皮切りに、2005/04/28 も含めて計 17 回の売買を行ったことが出力結果からわかります。そしてその結果、残念ながら 3000 円のマイナスになっていました。結論としてこの期間のシミュレートをした限りでは、5日と10日の移動平均による売買はあまりよい精度ではなかったことになります。




上に戻る


移動平均設定日数を変えてシミュレーション

さて、ここからが今回の記事のハイライト部分です。これまでに分かったのは

日本製粉株は、移動平均値の設定日数を5日と10日にして 2005 年前半のデータでシミュレートすると、3000 円のマイナス

になった、ということです。

このうち、緑、赤、青字の部分はプログラム中で変えることができます。特に赤字の部分を変更することで、日本製粉の株を売買するにはどの程度の移動平均日数を設定すればよいかがわかるようなシミュレーションを行えることになります。もちろんここで分かるのは過去のデータを使った場合の結果でしかなく、今後シミュレートどおりの結果が得られる保証はありませんが、このようなシミュレーションを個人で行うことができるようになる環境がそろいます。

早速試してみました。上記プログラムの (2) の部分を色々変更しては実行し、その結果だけを集めてみたのが以下の表になります。なお、ここでのシミュレートに指定した日数はフィボナッチ級数に出てくる数字をそのまま使ってみたものですが、任意の値を入力して構いません。

MA1DAYMA2DAY運用成績
58+11,000
13+14,000
21+20,000
813-2,000
21+30,000
34+23,000
1321+38,000
34 +81,000
55+28,000
2134+8,000
55+10,000
89+9,000

結果的には MA1DAY = 8, MA2DAY = 13 のケース以外、12通り中11通りでプラスになりました。単純な移動平均によるゴールデンクロス/デッドクロスによるシステマチックな売買をしただけですが、それなりの精度で結果を出せているように思えます。またこの結果から日本製粉株は13日と34日の移動平均線がかなり参考になる※、ということが分かります。

※あくまで過去のデータを元にしたシミュレーションによる「参考」です。




上に戻る


幅広い応用

テクニカルチャートの中には今回の2本の移動平均線によるゴールデンクロスやデッドクロスのように「買いサイン」や「売りサイン」を出す指標がいくつもあります。今回紹介した手法はそのほとんど全てに応用できると思っております。興味のある皆さんは是非別の銘柄や別の期間で試したり、また別のテクニカル手法による売買サインを元にするようなロボットを作成してみると実際の投資でも参考になるのではないでしょうか?

次回もこの形式でアルゴリズムを紹介し、最後に精度を高めるためのシミュレーションを行う予定です。



著者について

木村 桂: 日本IBM ソフトウェア事業




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


54321
大変素晴らしい不充分・不完全である
 


上に戻る


    日本IBMについて プライバシー お問い合わせ