Home > 自動トレーディングへの道

自動トレーディングへの道 Archive

カブロボその1

とりあえず何か簡単でいいからカブロボを作ろうということで作成してみた。

25日移動平均線の傾きの正負で短期トレンドを決める

25日線の傾きが正なら(短期)上昇トレンド、負なら短期下降トレンドと判断することにする。上昇トレンドの株は買いのみ。下降トレンドの株は空売りしかしない。

5日移動平均線の乖離率で絞り込む

上昇トレンドの銘柄は、5日移動平均線の乖離率が-3%から-7%の間にあるとき、次の取引(翌日あるいは後場)に成り行き買いで発注する。設定を変更しないとカブロボは資金の10%しか買えないので、めいっぱい買うように指示する。逆に下降トレンドの場合は5日線を3%から7%上抜いているときに空売りする。

なぜ7%かというと、あまり極端に突き抜けている場合は何かとんでもない材料があったと判断することにしたからである。

ロスカットはしないことにした

デフォルトで-20%の損失で強制ロスカットになっているため、ロスカットはあえてしないことに(パラメータとして-40%の損失でロスカットにしてあるが、これが発動することはない)。

脱出条件は高値から10%以上下落したとき

色々な人のカブロボを見ていると「5%の利益で利益確定、10%の損失でロスカット」のようなものが多いように思う。しかし、これだと利益を十分に確保できないので、貪欲に利益を追求するようにした。上昇している間はずっと放置し、下落トレンド化が鮮明になると初めて売ることにする。ただし利益がマイナスの場合は売らない。

結果

■■最終成績表■■■■■■■■■■■■■■■■■■■■
–●取引データ●————————————–
初期資産額(円)      :50,000,000
最終資産額(円)      :54,256,219
取引開始日        :2006-01-04
取引終了日        :2006-12-29
経過日数(日)       :359
運用日数(日)       :248
総トレード数       :120
勝ちトレード数      :74
負けトレード数      :46
勝率(%)         :61.67
年間平均トレード数    :120
全トレード平均期間(日)  :70
勝ちトレード平均期間(日) :70
負けトレード平均期間(日) :70
最長フラット期間(日)   :20
トータル約定金額(円)   :426,073,050
–●損益データ●————————————–
トータル純損益(%)    :8.51
勝ちトレード純利益(%)  :27.16
負けトレード純損失(%)  :-17.25
買いトレード純損益(%)  :3.71
売りトレード純損益(%)  :6.2
平均損益(%)       :1.42
平均利益(%)       :9.33
平均損失(%)       :-11.3
年率換算利回り(%)    :8.41
最大勝ちトレード(%)   :42.12
最大負けトレード(%)   :-22.74
–●指標データ●————————————–
平均ドローダウン(%)   :2.51
最大ドローダウン(%)   :12.72
損益レシオ(倍)      :0.98
プロフィットファクター(倍):1.57
リスクレシオ(倍)     :0.66
年率シャープレシオ(倍)  :0.8
年率ボラティリティ(%)  :10.49
■■■■■■■■■■■■■■■■■■■■■■■■■■■

考察

最大勝ちトレードが42%なのが特徴と言える。一方で損失も大きい。設定によって小さくこつこつ、大きく負けないカブロボも可能だけれど、貪欲な利益を追求するようにした。パラメータはいろいろ調整してみた。高値から5%下がったら売るより10%くらい我慢した方が結果がよいとか、購入条件も3〜7%としたけれど、これも色々調整した結果。

パラメータの調整は自動でできるようになるといいのだけれど。

銘柄別の日足株価データの取得方法

システムトレードのバックテストを行うにあたって、長期の日足データが欲しくなります。ぐぐると多くの方法があることがわかりますが、他の方が言及していない(と思われる)方法を紹介します。

HYPER SBIを使う

無料というわけにはいかないのですが、定期的にトレードしている人にとっては実質的に無料で使えるソフトHYPER SBIを使います。

メニューから時系列を選ぶ

欲しいデータを選ぶ

プルダウンメニューから為替、個別銘柄、主要指標、先物、歩み値を選ぶことができます。ここでは任天堂の日足を選んで日時を1988年3月6日から2008年9月6日まで選んで「検索」を押しました。最後に「CSV出力」を選ぶとCSVでデータを入手できます。


歩み値データも取得可能

取得した歩み値データからチャートを作ってみました。別にこんなことをしなくても、楽に表示する方法はあるのだけど、テストということで。。。これは2008年9月5日の任天堂のチャートをExcelで作ってみました。

自動トレーディングへの道(9)

しばらく多忙にかまけて放置していたけれど、市況がよくなってきたのでムクムクとやる気を出して、と言っても30分ほど作業をしてみた。

方針は以前作ったMonexに対して、出来高の平均の3倍の取引があれば通知をするように変更するもの。結果がどうなるかは試してみてのお楽しみ。

巡回に関するルールの変更

変更点をいくつか。まず出来高チェックなので頻繁に見る必要はなく、サーバに与える負荷を軽くすることにした。まず銘柄数をそう多くしない前提で1分おきにチェックをする。Thread.sleep()はミリ秒を与えるので、interval = 1000 * 60としている。これをchainの要素数で割った時間だけ眠らせることにした。このオブジェクトのインスタンスは自身のstaticなチェインに記録させているので、each()してやれば、あとはどんどんnewするだけで正しく巡回する。

	public static void each() throws InterruptedException {
		Iterator it = chain.iterator();

		// リストの要素数
		int size = chain.size();
		int wait = interval / size;

		while (it.hasNext()) {
			StockMonitor m = it.next();
			m.update();
			Thread.sleep(wait);
		}
	}

HistoricalPricesList

Priceとあるけど出来高を今回は格納している。

package utilities;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class HistoricalPricesList
{
	private List historical;
	private int max;

	public HistoricalPricesList( int size )
	{
		this.max = size;
		historical = new ArrayList();
	}

	public void add( int value )
	{
		int size = historical.size();

		// サイズを超える場合は一番古いものを捨てる
		if( size >= max )
			historical.remove(0);

		historical.add(value);
	}

	// リストの平均を得る
	public int average()
	{
		int size = historical.size();
		int sum = 0;
		Iterator it = historical.iterator();

		// ゼロによる除算回避
		if( size == 0 )
			return 0;

		while (it.hasNext())
			sum += it.next();

		return sum / size;
	}
}

つまり、ガシガシ値を放り込むと平均を取り出せるというだけ。

update()

定期的に株価や出来高を見て、平均の3倍を超える出来高が発生したら通知する。

	public void update()
	{
		try
		{
			getPrice();
			java.util.Date d = new java.util.Date();

			if( volume != previous )
			{
				previous = volume;

				int average = historical.average();
				if( volume > 3 * average )
				{
					// 出来高急増
					System.out.println(d);
					System.out.println( code );
					System.out.println( "Last Trade:" + price );
					System.out.println( "Volume:" + volume );
					System.out.println( "" );
				}

				historical.add(volume);
			}
		}
		catch (CodeNotFoundException e)
		{
		}
	}

Home > 自動トレーディングへの道

Search
Feeds
Meta

Page Top