2009年04月12日

通貨ペアにはそれぞれ性格がある

ようやくプログラムが動き始めたので、いくつかの通貨ペアでバックテストを行ってみました。

通貨ペアは

 EUR/USD
 USD/JPY
 EUR/JPY
 GBP/JPY
 AUD/JPY

で、年は2001年〜2008年でした。

結果的には

「微妙」

。。。

EUR/USDは2004年以外は全て好調なのに、他のペアは、PFがバラツキ過ぎ。。。

当たり前なんですけど、

「通貨ペアにはそれぞれ性格がある」

んですよね。

性格ってどういう要素から決まるんだろうか??

思いつく限りこんなところでしょうか??
ブレインストーミング的に

 取引している人数
 出来高
 実際に通貨を使用している人数
 大口が参加するかどうか
 金利差
 経済指標の回数
 国家の情勢
 
でも考えていたら、結局ボラティリティを計れば、事足りそうな気がしてきた。(というか上のものを数値化するのが難しい)

ボラティリティと、高値安値の継続率、くらいを組み込めれば良いかもしれない??

あと、出来高のデータも欲しいけど、さすがに1分足で2001年からのデータなんて見たことないです。。。


もっとそれぞれのペアで、チャートをにらめっこすると何かが見つかるかも??

システム完成までの道はまだまだ遠い。。。


↓一票いただけると嬉しいです!m(_ _)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村 
人気ブログランキングへ
posted by よろ at 12:58| Comment(0) | TrackBack(0) | システム構築

2009年04月07日

分足から日足のデータを表示するSQL

分足のデータをMySQLにロードしたので、そこから日足のデータを表示するSQLを実行してみます。

MySQLには以下のような分足データ1年分が1つのテーブル(eur_usd_2001)に入っているとします。

mysql> SELECT * FROM eur_usd_2001;
+---------------------+--------+--------+--------+--------+
| time | start | high | low | end |
+---------------------+--------+--------+--------+--------+
| 2001-01-03 07:01:00 | 0.9507 | 0.9507 | 0.9507 | 0.9507 |
| 2001-01-03 07:02:00 | 0.9506 | 0.9506 | 0.9505 | 0.9505 |
| 2001-01-03 07:03:00 | 0.9505 | 0.9507 | 0.9505 | 0.9506 |

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

| 2001-12-29 04:46:00 | 0.8837 | 0.8837 | 0.8837 | 0.8837 |
| 2001-12-29 04:51:00 | 0.8837 | 0.8837 | 0.8836 | 0.8836 |
| 2001-12-29 04:56:00 | 0.8836 | 0.8836 | 0.8836 | 0.8836 |
| 2001-12-29 04:57:00 | 0.8837 | 0.8837 | 0.8837 | 0.8837 |
+---------------------+--------+--------+--------+--------+
336554 rows in set (1.04 sec)



日足のデータは以下のようなSQLで表示できます。

mysql> SELECT SUBSTRING(time, 1,10) AS time_s,
-> (SELECT start FROM eur_usd_2001 s WHERE s.time= MIN(m.time)) start,
-> MAX(high) high,
-> MIN(low) low,
-> (SELECT end FROM eur_usd_2001 e WHERE e.time=MAX(m.time)) end
-> FROM eur_usd_2001 m
-> GROUP BY time_s limit 5;
+------------+--------+--------+--------+--------+
| time_s | start | high | low | end |
+------------+--------+--------+--------+--------+
| 2001-01-03 | 0.9507 | 0.9569 | 0.9444 | 0.9462 |
| 2001-01-04 | 0.9460 | 0.9515 | 0.9262 | 0.9442 |
| 2001-01-05 | 0.9443 | 0.9591 | 0.9432 | 0.9517 |
| 2001-01-06 | 0.9516 | 0.9582 | 0.9506 | 0.9575 | 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
| 2001-12-27 | 0.8800 | 0.8867 | 0.8773 | 0.8863 |
| 2001-12-28 | 0.8864 | 0.8864 | 0.8789 | 0.8815 |
| 2001-12-29 | 0.8814 | 0.8839 | 0.8810 | 0.8837 |
+------------+--------+--------+--------+--------+
308 rows in set (1.70 sec)

実行計画はこんな感じ、

mysql> EXPLAIN SELECT SUBSTRING(time, 1,10) AS time_s, (SELECT start FROM eur_usd_2001 s WHERE s.time= MIN(m.time)) start, MAX(high) high, MIN(low) low, (SELECT end FROM eur_usd_2001 e WHERE e.time=MAX(m.time)) end FROM eur_usd_2001 m GROUP BY time_s\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: m
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 336554
Extra: Using temporary; Using filesort
*************************** 2. row ***************************
id: 3
select_type: DEPENDENT SUBQUERY
table: e
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: func
rows: 1
Extra: Using where
*************************** 3. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: s
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: func
rows: 1
Extra: Using where
3 rows in set (0.00 sec)

当然ながら、テーブルの中の一年分のデータを検索するので、ALLになってしまいますがしょうがないです。


普段はSQLを書くことが無いので、間違っていたり、非効率だったりするかも!?

「間違ってる」とか「ここをこうすれば良くなる」
などといったご意見がありましたら、よろしくお願いします。
m(_ _)m


追記: 今のところ1日が00:00-23:59までの計算になってます。
任意の時間範囲にする場合は、さらに工夫が必要です。



↓励みになりますので、宜しければクリックをお願いします。
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村 
人気ブログランキングへ
posted by よろ at 21:32| Comment(0) | TrackBack(0) | システム構築

2009年04月04日

1分足のデータをMySQLにロードする(3)

1分足のデータをMySQLにロードする(1)と(2)

では、ヒストリカルデータをロードするテーブルの定義は、日付と時間を一つにして、MySQLのデータ型としては"datetime"にしていました。

理由は、今まで作っていたアプリケーションとの互換性のためなのですが、日付と時間を分けた形でもロードする手順を残します。

データのダウンロードは
1分足のデータをMySQLにロードする(1)
と同じで、sedの部分だけ除きます。

中身はこんなファイルです。

$ head -5 1min_2001.txt
2001-01-03,07:01:00,0.9507,0.9507,0.9507,0.9507
2001-01-03,07:02:00,0.9506,0.9506,0.9505,0.9505
2001-01-03,07:03:00,0.9505,0.9507,0.9505,0.9506
2001-01-03,07:04:00,0.9506,0.9506,0.9506,0.9506
2001-01-03,07:05:00,0.9506,0.9506,0.9506,0.9506

テーブルはこんな感じで作りました。

mysql> CREATE TABLE eur_usd_2001(
-> date date,
-> time time,
-> start decimal(6,4),
-> high decimal(6,4),
-> low decimal(6,4),
-> end decimal(6,4),
-> PRIMARY KEY (date,time)) ENGINE=MyISAM DEFAULT CHARSET=utf8
-> ;

ストレージエンジンはMyISAMなのかInnoDBなのか迷うところです。

というのも、昔は検索用途で更新が少ないテーブルであれば、MyISAMと定石のように決まっていましたが、最近ではInnoDBの性能向上もあり、どちらが良いかは一概には言えなくなってきています。

どちらが早いかも、2つを比べて検証してみます。

であとは、ロードするだけなので、
こちらも前と同様の手順です。

mysql> load data infile '/tmp/1min_2001.txt' into table eur_usd_2001 fields terminated by ',';

これで、日付と時間を分けたテーブルにロードができました。

あと忘れずにAnalyze

mysql> analyze table eur_usd_2001;
+------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------+---------+----------+----------+
| fx2.eur_usd_2001 | analyze | status | OK |
+------------------+---------+----------+----------+
1 row in set (0.13 sec)


うーんも元々こうすれば良かったのに。。。

↓励みになりますので、宜しければクリックをお願いします。
にほんブログ村 為替ブログ FX サラリーマン投資家へ


にほんブログ村 為替ブログ FX テクニカルトレード派へ


人気ブログランキングへ
posted by よろ at 12:00| Comment(0) | TrackBack(0) | システム構築

1分足のデータをMySQLにロードする(2)

さてさて、前回ダウンロードしたファイルをMySQLにロードします。

/tmp/配下にファイルがあるものとして、mysqlクライアントからログインを行い、以下のSQLを実行します。


mysql> load data infile '/tmp/1min_2001.txt' into table eur_usd_2001 fields terminated by ',';

意味としては、

/tmp/1min_2001.txt というファイルを
eur_usd_2001 というテーブルに
列の区切り文字を',' として

ロードします。

ということです。

で、テーブルの統計情報も取得しておきましょう。
(PRIMARY KEYだけの場合は関係ないかもしれないけど。。)

mysql> analyze table eur_usd_2001;
+------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------+---------+----------+----------+
| fx2.eur_usd_2001 | analyze | status | OK |
+------------------+---------+----------+----------+
1 row in set (0.13 sec)


時間があれば、解析用のSQLを書いてみようと思います。


↓励みになりますので、宜しければクリックをお願いします。
にほんブログ村 為替ブログ FX サラリーマン投資家へ
にほんブログ村
にほんブログ村 為替ブログ FX スキャルピング派へ
にほんブログ村
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村 
posted by よろ at 01:55| Comment(0) | TrackBack(0) | システム構築

2009年04月02日

1分足のデータをMySQLにロードする(1)

1分足のデータをMySQLにロードするために、まずデータのダウンロードから。

自分は、このサイトのツールを使わせていただいています。

http://kasege.net/forex/archives/2006/09/forexitedl_autoforexite.html

ダウンロードが完了すると、

1min_2001.txt

のようなファイルが出来上がりますので、これを使ってデータロードします。

そのためには、MySQLでテーブルを作る必要がありますが、こんな感じにしました。(decimalの数値は使いまわしなので適当でした。。。)


mysql> show create table eur_usd_2001\G
*************************** 1. row ***************************
Table: eur_usd_2001
Create Table: CREATE TABLE `eur_usd_2001` (
`time` datetime NOT NULL default '0000-00-00 00:00:00',
`start` decimal(6,4) default NULL,
`high` decimal(6,4) default NULL,
`low` decimal(6,4) default NULL,
`end` decimal(6,4) default NULL,
PRIMARY KEY (`time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

startは 始値
highは 高値
lowは 安値
endは 終値

です。

あと、ダウンロードした 1min_2001.txt のはじめのカラムが
日付と時間が分かれているので、自分は合わせています。

元々がこんなのが

$ cat samp.txt
2008-01-01,17:01:00,1.4589,1.4591,1.4589,1.4591
2008-01-01,17:02:00,1.4591,1.4591,1.4591,1.4591
2008-01-01,17:03:00,1.4590,1.4590,1.4589,1.4589
2008-01-01,17:04:00,1.4589,1.4590,1.4589,1.4590

sedなどでこうなります

$ sed "s/,/ /" < samp.txt
2008-01-01 17:01:00,1.4589,1.4591,1.4589,1.4591
2008-01-01 17:02:00,1.4591,1.4591,1.4591,1.4591
2008-01-01 17:03:00,1.4590,1.4590,1.4589,1.4589
2008-01-01 17:04:00,1.4589,1.4590,1.4589,1.4590

あとは、このファイルをロードするだけですがまた後日。


↓励みになりますので、宜しければクリックをお願いします。
にほんブログ村 為替ブログ FX サラリーマン投資家へ
にほんブログ村
にほんブログ村 為替ブログ FX スキャルピング派へ
にほんブログ村
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村 
posted by よろ at 03:14| Comment(0) | TrackBack(0) | システム構築