新規記事の投稿を行うことで、非表示にすることが可能です。
2016年05月07日
1年経過
早いものでブログを始めてから1年があっという間に過ぎてしまった...
生活環境が変わりすぎてまともに研究ができなかったが、新しい仕事にも慣れ生活も落ち着いてきたので心機一転システムの研究開発を進めていこう!
ブログの放置期間中は
などを手広く行ったので、これらを徐々に記事にまとめていく予定。
生活環境が変わりすぎてまともに研究ができなかったが、新しい仕事にも慣れ生活も落ち着いてきたので心機一転システムの研究開発を進めていこう!
ブログの放置期間中は
- 高性能な自作パソコンの準備
- 並列計算の勉強
- GPUの導入
- MT4によるFX投資用データベースの開発
- VPSの導入
- 機械学習の勉強
などを手広く行ったので、これらを徐々に記事にまとめていく予定。
2016年01月11日
Rとトレード1
英文の原著"Quantitative Trading with R : Understanding Mathematical and Computational Tools from a Quant's Perspective"は以前に読んだが、邦訳版をAmazonで見つけたので再読。
日々のデータの入手先
Yahoo Finance http://finance.yahoo.com/
Quandl http://www.quandl.com/
Google Finance http://www.google.com/finance/
Federal Reserve Bank Of St. Louis http://Research.stlouisfed.org/fred2/
データーベンダー
Tick Data, Inc. http://www.tickdata.com/
Bloomberg http://www.bloomberg.com/enterprise/data/
Thomson Reuters http://thomsonreuters.com/financial/market-data/
CME Group http://www.cmegroup.com/market-data/datamine-historical-data/
NYSE Market Data http://www.nyxdata.com/Data-Products/NYSE
Hanweck Associates http://www.hanweckassoc.com/
Activ Financial http://www.activfinancial.com/
Markit http://www.markit.com/
日々のデータの入手先
Yahoo Finance http://finance.yahoo.com/
Quandl http://www.quandl.com/
Google Finance http://www.google.com/finance/
Federal Reserve Bank Of St. Louis http://Research.stlouisfed.org/fred2/
データーベンダー
Tick Data, Inc. http://www.tickdata.com/
Bloomberg http://www.bloomberg.com/enterprise/data/
Thomson Reuters http://thomsonreuters.com/financial/market-data/
CME Group http://www.cmegroup.com/market-data/datamine-historical-data/
NYSE Market Data http://www.nyxdata.com/Data-Products/NYSE
Hanweck Associates http://www.hanweckassoc.com/
Activ Financial http://www.activfinancial.com/
Markit http://www.markit.com/
2016年
転職とその後の長期出張で、完全にシステムトレードの研究が中断してしまった…
以前に比べて時間の余裕がなくなってしまったが、また細々と再開。
今年はRaspberry PiやArduinoを利用してカメラを制御し、チャート上の資産価格の変動のイメージ解析にも挑戦してみたい。
以前に比べて時間の余裕がなくなってしまったが、また細々と再開。
今年はRaspberry PiやArduinoを利用してカメラを制御し、チャート上の資産価格の変動のイメージ解析にも挑戦してみたい。
2015年05月16日
Rubyの基礎の基礎4
privateメソッド
クラス内では"private"以下のメソッドはすべてprivateメソッドになる。
privateメソッドはクラス外から呼び出すことができない。
publicメソッドはすべて外部から呼び出しが可能。
ファイルの読み書き
open("xxx.txt", "r" do |file|)
...
end
例外処理
begin
--
rescue Errno::ENOENT (エラーの種類を指定して例外処理)
--
end
正規表現
パターンにマッチする文字列の検索
パターンにマッチする文字列の置換
テキストからパターンにマッチする情報を抽出
メタ文字
^ 行頭
$ 行末
\d 数字
\D 数字以外
\w 単語構成文字
\W 単語構成文字以外
\s 空白文字
\S 空白文字以外
* 直前の表現の0回以上の繰り返し
+ 直前の表現の1回以上の繰り返し
? 直前の表現の0回または1回マッチ
{n} 直前の表現のn回の繰り返し
{n,} 直前の表現のn回以上の繰り返し
{n,m} 直前の表現のn回以上m回以下の繰り返し
a|b aまたはbにマッチ
() 正規表現をグループ化し後方参照のためにマッチした文字列を記憶
[] []内のいずれか1文字にマッチ
[^] []内に含まれない1文字にマッチ
マッチ
演算子 =~
マッチするとマッチする部分の先頭の添字を返す。
マッチしなければnilを返す。
エスケープ\
特殊文字そのものをマッチさせるときに使用する。
%r{正規表現}とすることでエスケープする必要がない。
後方参照
()は2つ以上の正規表現をグループ化する以外に、マッチした()に相当する部分を記憶する。
マッチした部分は$1、$2、$3...と格納される。
(?: ...)でマッチする部分は記憶されない。
式展開
#{変数}で変数の値が埋め込まれる。
必ず" "の中で行う。
クラス内では"private"以下のメソッドはすべてprivateメソッドになる。
privateメソッドはクラス外から呼び出すことができない。
publicメソッドはすべて外部から呼び出しが可能。
ファイルの読み書き
open("xxx.txt", "r" do |file|)
...
end
例外処理
begin
--
rescue Errno::ENOENT (エラーの種類を指定して例外処理)
--
end
正規表現
パターンにマッチする文字列の検索
パターンにマッチする文字列の置換
テキストからパターンにマッチする情報を抽出
メタ文字
^ 行頭
$ 行末
\d 数字
\D 数字以外
\w 単語構成文字
\W 単語構成文字以外
\s 空白文字
\S 空白文字以外
* 直前の表現の0回以上の繰り返し
+ 直前の表現の1回以上の繰り返し
? 直前の表現の0回または1回マッチ
{n} 直前の表現のn回の繰り返し
{n,} 直前の表現のn回以上の繰り返し
{n,m} 直前の表現のn回以上m回以下の繰り返し
a|b aまたはbにマッチ
() 正規表現をグループ化し後方参照のためにマッチした文字列を記憶
[] []内のいずれか1文字にマッチ
[^] []内に含まれない1文字にマッチ
マッチ
演算子 =~
マッチするとマッチする部分の先頭の添字を返す。
マッチしなければnilを返す。
エスケープ\
特殊文字そのものをマッチさせるときに使用する。
%r{正規表現}とすることでエスケープする必要がない。
後方参照
()は2つ以上の正規表現をグループ化する以外に、マッチした()に相当する部分を記憶する。
マッチした部分は$1、$2、$3...と格納される。
(?: ...)でマッチする部分は記憶されない。
式展開
#{変数}で変数の値が埋め込まれる。
必ず" "の中で行う。
MATLABによるMYSQLデータベースへのアクセス6
Pan Active Market Databaseの全証券データーをMATLABでMySQLに格納できた。次にMySQLが動いていない別のコンピュータからMATLABでデーターベースへアクセスし、株価データを取得するコードを作成する。ここでは日経平均のデータがあるテーブル(code1001)にアクセスし、およそ過去10年分の安値を取得しプロットする。以下のコードの赤字の部分が実行するSQL文。
TABLE "code1001"
'2005/06/20' 11539 11539 11455 11483 152116
'2005/06/21' 11474 11511 11464 11488 122869
'2005/06/22' 11487 11560 11445 11547 133063
'2005/06/23' 11539 11576 11530 11576 128244
'2005/06/24' 11480 11537 11472 11537 119032
'2005/06/27' 11445 11445 11378 11414 122160
'2005/06/28' 11421 11519 11413 11513 143199
'2005/06/29' 11567 11594 11547 11577 177364
'2005/06/30' 11573 11589 11542 11584 179822
'2005/07/01' 11573 11663 11540 11630 154464
'2005/07/04' 11664 11664 11629 11651 126403
'2005/07/05' 11645 11658 11606 11616 140798
'2005/07/06' 11648 11676 11603 11603 131177
'2005/07/07' 11586 11602 11567 11590 128320
'2005/07/08' 11563 11653 11563 11565 161338
'2005/07/11' 11676 11713 11668 11674 130064
'2005/07/12' 11737 11738 11672 11692 124246
'2005/07/13' 11705 11707 11659 11659 115574
'2005/07/14' 11715 11784 11715 11764 125497
'2005/07/15' 11825 11828 11758 11758 124944
'2005/07/19' 11761 11770 11731 11764 142708
'2005/07/20' 11780 11816 11761 11789 152458
'2005/07/21' 11808 11867 11786 11786 160204
'2005/07/22' 11751 11753 11650 11695 132740
'2005/07/25' 11721 11782 11718 11762 133266
'2005/07/26' 11762 11772 11719 11737 133593
'2005/07/27' 11770 11848 11770 11835 178513
'2005/07/28' 11881 11889 11853 11858 195571
'2005/07/29' 11900 11913 11826 11899 175167
'2005/08/01' 11907 11972 11906 11946 183064
'2005/08/02' 11954 11982 11920 11940 173989
'2005/08/03' 11987 12009 11950 11981 197725
'2005/08/04' 11945 11945 11823 11883 196191
'2005/08/05' 11842 11863 11724 11766 166378
'2005/08/08' 11670 11794 11614 11778 154551
'2005/08/09' 11797 11958 11797 11900 164802
'2005/08/10' 11996 12138 11991 12098 224823
'2005/08/11' 12178 12284 12167 12263 223694
'2005/08/12' 12276 12324 12228 12261 189702
'2005/08/15' 12254 12308 12236 12256 189262
'2005/08/16' 12324 12336 12277 12315 201555
'2005/08/17' 12286 12369 12270 12273 225698
'2005/08/18' 12322 12369 12292 12307 187313
'2005/08/19' 12276 12291 12219 12291 173792
'2005/08/22' 12330 12478 12330 12452 195072
'2005/08/23' 12511 12612 12472 12472 223577
'2005/08/24' 12421 12515 12416 12502 169358
'2005/08/25' 12443 12466 12401 12405 177946
'2005/08/26' 12458 12482 12385 12439 179661
'2005/08/29' 12386 12386 12274 12309 159212
'2005/08/30' 12411 12457 12396 12453 187756
'2005/08/31' 12428 12443 12393 12413 157743
'2005/09/01' 12501 12573 12501 12506 205125
'2005/09/02' 12571 12600 12544 12600 186713
'2005/09/05' 12616 12655 12580 12634 200065
'2005/09/06' 12686 12730 12581 12599 251590
'2005/09/07' 12682 12682 12574 12607 193241
'2005/09/08' 12601 12601 12498 12533 188454
'2005/09/09' 12561 12692 12556 12692 303846
'2005/09/12' 12841 12926 12813 12896 223530
'2005/09/13' 12896 12940 12847 12901 263996
'2005/09/14' 12847 12871 12830 12834 239738
'2005/09/15' 12817 12986 12806 12986 301313
'2005/09/16' 12992 12992 12888 12958 274877
'2005/09/20' 12991 13159 12991 13148 326131
'2005/09/21' 13181 13235 13108 13196 369898
'2005/09/22' 13120 13170 13090 13159 281651
'2005/09/26' 13229 13392 13229 13392 307907
'2005/09/27' 13370 13373 13282 13310 346376
'2005/09/28' 13307 13487 13306 13435 332205
'2005/09/29' 13515 13617 13440 13617 360524
'2005/09/30' 13677 13678 13539 13574 304024
'2005/10/03' 13566 13584 13454 13525 306648
'2005/10/04' 13597 13738 13593 13738 314227
'2005/10/05' 13761 13783 13655 13689 295187
'2005/10/06' 13554 13554 13285 13359 281557
'2005/10/07' 13279 13332 13221 13227 269189
'2005/10/11' 13280 13556 13241 13556 272161
'2005/10/12' 13565 13704 13463 13463 315405
'2005/10/13' 13388 13475 13266 13449 229770
'2005/10/14' 13581 13581 13361 13420 271003
'2005/10/17' 13486 13510 13341 13400 268170
'2005/10/18' 13376 13441 13321 13352 303766
'2005/10/19' 13297 13304 13073 13129 305468
'2005/10/20' 13221 13264 13175 13190 268572
'2005/10/21' 13065 13243 12996 13199 220201
'2005/10/24' 13232 13244 13083 13106 202272
'2005/10/25' 13227 13336 13219 13280 248287
'2005/10/26' 13291 13406 13285 13395 262482
'2005/10/27' 13440 13501 13387 13417 284527
'2005/10/28' 13344 13373 13272 13346 255255
'2005/10/31' 13459 13606 13456 13606 271248
'2005/11/01' 13606 13867 13606 13867 179744
'2005/11/02' 13865 13927 13807 13894 370358
'2005/11/04' 14040 14099 13978 14075 364433
'2005/11/07' 14084 14097 13982 14061 368812
'2005/11/08' 14067 14071 13982 14036 455805
'2005/11/09' 13989 14136 13951 14072 392275
'2005/11/10' 14058 14121 13981 14080 296818
'2005/11/11' 14170 14206 14133 14155 251884
'2005/11/14' 14218 14218 14105 14116 250390
'2005/11/15' 14069 14142 14043 14091 251275
'2005/11/16' 14035 14170 14015 14170 282173
'2005/11/17' 14192 14448 14169 14411 260860
'2005/11/18' 14542 14633 14542 14623 240631
'2005/11/21' 14719 14808 14590 14680 260295
'2005/11/22' 14726 14763 14650 14708 208278
'2005/11/24' 14816 14866 14721 14742 232216
'2005/11/25' 14693 14784 14613 14784 226431
'2005/11/28' 14847 14986 14821 14986 204645
'2005/11/29' 14900 14995 14868 14927 208411
'2005/11/30' 14981 15013 14872 14872 243642
'2005/12/01' 14914 15130 14880 15130 264303
'2005/12/02' 15272 15421 15245 15421 332492
'2005/12/05' 15413 15563 15379 15551 371707
'2005/12/06' 15518 15572 15423 15423 300359
'2005/12/07' 15520 15558 15467 15484 276712
'2005/12/08' 15470 15523 15183 15183 249875
'2005/12/09' 15127 15447 15117 15404 370102
'2005/12/12' 15549 15764 15548 15738 313029
....
"activemarket_sql.m"
clear all;clc;
% Set this to the path to your MySQL Connector/J JAR
javaaddpath '/Users/Library/Java/Extensions/JDBC/mysql-connector-java-5.1.27-bin.jar'
% Database Server*
host = 'IP Address';
% Database Username/Password
user = 'Username';
password = 'Password';
% Database Name
dbName = 'pan_active_market_adjust';
% JDBC Parameters
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName);
jdbcDriver = 'com.mysql.jdbc.Driver';
% Create the database connection object
dbConn = database(dbName,user,password,jdbcDriver,jdbcString);
% Check to make sure that we successfully connected
if isconnection(dbConn)
sqlquery = sprintf('SELECT * FROM code1001');
curs = exec(dbConn,sqlquery);
setdbprefs('DataReturnFormat','cellarray')
curs = fetch(curs);
else
% If the connection failed, print the error message
disp(sprintf('Connection failed: %s', dbConn.Message));
end
% Close the connection so we don't run out of MySQL threads
close(dbConn);
% Plot
x = datenum(curs.Data(:,1),'yyyy/mm/dd');
y = cell2mat(curs.Data(:,4));
plot(x,y)
xlim([x(1),x(end)])
xlabel('Date')
ylabel('Price (YEN)')
datetick('x','yy/mm/dd','keeplimits','keepticks')
これでMATLABを使って取引手法の探索や最適化、株価の予測なども出来そうだ。
TABLE "code1001"
'2005/06/20' 11539 11539 11455 11483 152116
'2005/06/21' 11474 11511 11464 11488 122869
'2005/06/22' 11487 11560 11445 11547 133063
'2005/06/23' 11539 11576 11530 11576 128244
'2005/06/24' 11480 11537 11472 11537 119032
'2005/06/27' 11445 11445 11378 11414 122160
'2005/06/28' 11421 11519 11413 11513 143199
'2005/06/29' 11567 11594 11547 11577 177364
'2005/06/30' 11573 11589 11542 11584 179822
'2005/07/01' 11573 11663 11540 11630 154464
'2005/07/04' 11664 11664 11629 11651 126403
'2005/07/05' 11645 11658 11606 11616 140798
'2005/07/06' 11648 11676 11603 11603 131177
'2005/07/07' 11586 11602 11567 11590 128320
'2005/07/08' 11563 11653 11563 11565 161338
'2005/07/11' 11676 11713 11668 11674 130064
'2005/07/12' 11737 11738 11672 11692 124246
'2005/07/13' 11705 11707 11659 11659 115574
'2005/07/14' 11715 11784 11715 11764 125497
'2005/07/15' 11825 11828 11758 11758 124944
'2005/07/19' 11761 11770 11731 11764 142708
'2005/07/20' 11780 11816 11761 11789 152458
'2005/07/21' 11808 11867 11786 11786 160204
'2005/07/22' 11751 11753 11650 11695 132740
'2005/07/25' 11721 11782 11718 11762 133266
'2005/07/26' 11762 11772 11719 11737 133593
'2005/07/27' 11770 11848 11770 11835 178513
'2005/07/28' 11881 11889 11853 11858 195571
'2005/07/29' 11900 11913 11826 11899 175167
'2005/08/01' 11907 11972 11906 11946 183064
'2005/08/02' 11954 11982 11920 11940 173989
'2005/08/03' 11987 12009 11950 11981 197725
'2005/08/04' 11945 11945 11823 11883 196191
'2005/08/05' 11842 11863 11724 11766 166378
'2005/08/08' 11670 11794 11614 11778 154551
'2005/08/09' 11797 11958 11797 11900 164802
'2005/08/10' 11996 12138 11991 12098 224823
'2005/08/11' 12178 12284 12167 12263 223694
'2005/08/12' 12276 12324 12228 12261 189702
'2005/08/15' 12254 12308 12236 12256 189262
'2005/08/16' 12324 12336 12277 12315 201555
'2005/08/17' 12286 12369 12270 12273 225698
'2005/08/18' 12322 12369 12292 12307 187313
'2005/08/19' 12276 12291 12219 12291 173792
'2005/08/22' 12330 12478 12330 12452 195072
'2005/08/23' 12511 12612 12472 12472 223577
'2005/08/24' 12421 12515 12416 12502 169358
'2005/08/25' 12443 12466 12401 12405 177946
'2005/08/26' 12458 12482 12385 12439 179661
'2005/08/29' 12386 12386 12274 12309 159212
'2005/08/30' 12411 12457 12396 12453 187756
'2005/08/31' 12428 12443 12393 12413 157743
'2005/09/01' 12501 12573 12501 12506 205125
'2005/09/02' 12571 12600 12544 12600 186713
'2005/09/05' 12616 12655 12580 12634 200065
'2005/09/06' 12686 12730 12581 12599 251590
'2005/09/07' 12682 12682 12574 12607 193241
'2005/09/08' 12601 12601 12498 12533 188454
'2005/09/09' 12561 12692 12556 12692 303846
'2005/09/12' 12841 12926 12813 12896 223530
'2005/09/13' 12896 12940 12847 12901 263996
'2005/09/14' 12847 12871 12830 12834 239738
'2005/09/15' 12817 12986 12806 12986 301313
'2005/09/16' 12992 12992 12888 12958 274877
'2005/09/20' 12991 13159 12991 13148 326131
'2005/09/21' 13181 13235 13108 13196 369898
'2005/09/22' 13120 13170 13090 13159 281651
'2005/09/26' 13229 13392 13229 13392 307907
'2005/09/27' 13370 13373 13282 13310 346376
'2005/09/28' 13307 13487 13306 13435 332205
'2005/09/29' 13515 13617 13440 13617 360524
'2005/09/30' 13677 13678 13539 13574 304024
'2005/10/03' 13566 13584 13454 13525 306648
'2005/10/04' 13597 13738 13593 13738 314227
'2005/10/05' 13761 13783 13655 13689 295187
'2005/10/06' 13554 13554 13285 13359 281557
'2005/10/07' 13279 13332 13221 13227 269189
'2005/10/11' 13280 13556 13241 13556 272161
'2005/10/12' 13565 13704 13463 13463 315405
'2005/10/13' 13388 13475 13266 13449 229770
'2005/10/14' 13581 13581 13361 13420 271003
'2005/10/17' 13486 13510 13341 13400 268170
'2005/10/18' 13376 13441 13321 13352 303766
'2005/10/19' 13297 13304 13073 13129 305468
'2005/10/20' 13221 13264 13175 13190 268572
'2005/10/21' 13065 13243 12996 13199 220201
'2005/10/24' 13232 13244 13083 13106 202272
'2005/10/25' 13227 13336 13219 13280 248287
'2005/10/26' 13291 13406 13285 13395 262482
'2005/10/27' 13440 13501 13387 13417 284527
'2005/10/28' 13344 13373 13272 13346 255255
'2005/10/31' 13459 13606 13456 13606 271248
'2005/11/01' 13606 13867 13606 13867 179744
'2005/11/02' 13865 13927 13807 13894 370358
'2005/11/04' 14040 14099 13978 14075 364433
'2005/11/07' 14084 14097 13982 14061 368812
'2005/11/08' 14067 14071 13982 14036 455805
'2005/11/09' 13989 14136 13951 14072 392275
'2005/11/10' 14058 14121 13981 14080 296818
'2005/11/11' 14170 14206 14133 14155 251884
'2005/11/14' 14218 14218 14105 14116 250390
'2005/11/15' 14069 14142 14043 14091 251275
'2005/11/16' 14035 14170 14015 14170 282173
'2005/11/17' 14192 14448 14169 14411 260860
'2005/11/18' 14542 14633 14542 14623 240631
'2005/11/21' 14719 14808 14590 14680 260295
'2005/11/22' 14726 14763 14650 14708 208278
'2005/11/24' 14816 14866 14721 14742 232216
'2005/11/25' 14693 14784 14613 14784 226431
'2005/11/28' 14847 14986 14821 14986 204645
'2005/11/29' 14900 14995 14868 14927 208411
'2005/11/30' 14981 15013 14872 14872 243642
'2005/12/01' 14914 15130 14880 15130 264303
'2005/12/02' 15272 15421 15245 15421 332492
'2005/12/05' 15413 15563 15379 15551 371707
'2005/12/06' 15518 15572 15423 15423 300359
'2005/12/07' 15520 15558 15467 15484 276712
'2005/12/08' 15470 15523 15183 15183 249875
'2005/12/09' 15127 15447 15117 15404 370102
'2005/12/12' 15549 15764 15548 15738 313029
....
"activemarket_sql.m"
clear all;clc;
% Set this to the path to your MySQL Connector/J JAR
javaaddpath '/Users/Library/Java/Extensions/JDBC/mysql-connector-java-5.1.27-bin.jar'
% Database Server*
host = 'IP Address';
% Database Username/Password
user = 'Username';
password = 'Password';
% Database Name
dbName = 'pan_active_market_adjust';
% JDBC Parameters
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName);
jdbcDriver = 'com.mysql.jdbc.Driver';
% Create the database connection object
dbConn = database(dbName,user,password,jdbcDriver,jdbcString);
% Check to make sure that we successfully connected
if isconnection(dbConn)
sqlquery = sprintf('SELECT * FROM code1001');
curs = exec(dbConn,sqlquery);
setdbprefs('DataReturnFormat','cellarray')
curs = fetch(curs);
else
% If the connection failed, print the error message
disp(sprintf('Connection failed: %s', dbConn.Message));
end
% Close the connection so we don't run out of MySQL threads
close(dbConn);
% Plot
x = datenum(curs.Data(:,1),'yyyy/mm/dd');
y = cell2mat(curs.Data(:,4));
plot(x,y)
xlim([x(1),x(end)])
xlabel('Date')
ylabel('Price (YEN)')
datetick('x','yy/mm/dd','keeplimits','keepticks')
これでMATLABを使って取引手法の探索や最適化、株価の予測なども出来そうだ。
MATLABによるMYSQLデータベースへのアクセス5
MATLABによりPan Active Market Databaseの全証券データをMySQLへ格納することを試みている。書籍”Rubyではじめるシステムトレード”にあるように、"AdjustExRights"を”true”に設定することで株式分割が考慮された修正株価が取得できる。これを以下のコードの赤字の部分のようにMATLABにも適用してみると、Rubyと同じように修正株価が取得できる。そしてそれらのデータをMySQLへ一気に格納する。
clear all;clc;
% Set this to the path to your MySQL Connector/J JAR
javaaddpath('C:\Program Files\MySQL\MySQL Connector J\mysql-connector-java-5.1.27-bin.jar')
% Pan Active Market Database
dayinfo = actxserver('ActiveMarket.Calendar');
prices = actxserver('ActiveMarket.Prices');
prices.AdjustExRights = true;
%
prices.Read('1001') % Nikkei index
last_price = prices.End;
for code = 1000:9999
try
prices.Read(num2str(code))
price_begin = prices.Begin;
price_end = prices.End;
catch exeption
continue
end
%
if price_end ~= last_price;
continue
end
%
code
open_price = [];
high_price = [];
low_price = [];
close_price = [];
volume_price = [];
date_price = {};
%
day_index = prices.Begin:prices.End;
ndata = 0;
for i = day_index
if prices.IsClosed(i) == 0;
date_price = [date_price dayinfo.Date(i)];
open_price = [open_price prices.Open(i)];
high_price = [high_price prices.High(i)];
low_price = [low_price prices.Low(i)];
close_price = [close_price prices.Close(i)];
volume_price = [volume_price prices.Volume(i)];
ndata = ndata + 1;
else
continue
end
end
% Database Server*
host = 'IP Address';
% Database Username/Password
user = 'User name';
password = 'Password';
% Database Name
dbName = 'pan_active_market_adjust';
% JDBC Parameters
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName);
jdbcDriver = 'com.mysql.jdbc.Driver';
% Create the database connection object
dbConn = database(dbName,user,password,jdbcDriver,jdbcString);
tablename = sprintf('code%d',code);
sqls = sprintf('CREATE TABLE %s(date char(10), open int(6), high int(6), low int(6), close int(6), volume int(12));', tablename);
exec(dbConn,sqls);
% Check to make sure that we successfully connected
if isconnection(dbConn)
colnames = {'date','open','high','low','close','volume'};
for i = 1:ndata
uidata = [date_price(i), open_price(i), high_price(i), low_price(i), close_price(i), volume_price(i)];
datainsert(dbConn, tablename, colnames, uidata);
end
else
% If the connection failed, print the error message
disp(sprintf('Connection failed: %s', dbConn.Message));
end
end
% Close the connection so we don't run out of MySQL threads
close(dbConn);
Pan Active Market Databaseにある証券で2015年5月1日現在、取引可能なものは3823個あると思われる。これらを全部MySQLへ格納するにはおよそ26時間を要した…
試しに最近の株式分割が行われた銘柄で株価をチェックをしてみる。2015年4月27日にアイ・ケイ・ケイ(2198)が株式分割(1:2)を行っている。MATLABのコマンドウィンドウからAdjustExRightsをtrueまたはfalseにして終値をそれぞれ調べる。
> prices.AdjustExRights = false
> prices.Read('2198')
> dayinfo.DatePosition('2015/3/27')
> prices.Close(8167)
ans = 1286
また、
> prices.AdjustExRights = true
> prices.Read('2198)
> dayinfo.DatePosition('2015/3/27')
> prices.Close(8167)
ans = 643
となり、正しく株式分割が考慮されていることがわかる。
将来的にPanrolling社の相場アプリケーションを購入して最新の株価データにアップデートできるようになると、このコードを修正して、今あるデータとの差分だけをMySQLへ格納するように改良する必要がある。
clear all;clc;
% Set this to the path to your MySQL Connector/J JAR
javaaddpath('C:\Program Files\MySQL\MySQL Connector J\mysql-connector-java-5.1.27-bin.jar')
% Pan Active Market Database
dayinfo = actxserver('ActiveMarket.Calendar');
prices = actxserver('ActiveMarket.Prices');
prices.AdjustExRights = true;
%
prices.Read('1001') % Nikkei index
last_price = prices.End;
for code = 1000:9999
try
prices.Read(num2str(code))
price_begin = prices.Begin;
price_end = prices.End;
catch exeption
continue
end
%
if price_end ~= last_price;
continue
end
%
code
open_price = [];
high_price = [];
low_price = [];
close_price = [];
volume_price = [];
date_price = {};
%
day_index = prices.Begin:prices.End;
ndata = 0;
for i = day_index
if prices.IsClosed(i) == 0;
date_price = [date_price dayinfo.Date(i)];
open_price = [open_price prices.Open(i)];
high_price = [high_price prices.High(i)];
low_price = [low_price prices.Low(i)];
close_price = [close_price prices.Close(i)];
volume_price = [volume_price prices.Volume(i)];
ndata = ndata + 1;
else
continue
end
end
% Database Server*
host = 'IP Address';
% Database Username/Password
user = 'User name';
password = 'Password';
% Database Name
dbName = 'pan_active_market_adjust';
% JDBC Parameters
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName);
jdbcDriver = 'com.mysql.jdbc.Driver';
% Create the database connection object
dbConn = database(dbName,user,password,jdbcDriver,jdbcString);
tablename = sprintf('code%d',code);
sqls = sprintf('CREATE TABLE %s(date char(10), open int(6), high int(6), low int(6), close int(6), volume int(12));', tablename);
exec(dbConn,sqls);
% Check to make sure that we successfully connected
if isconnection(dbConn)
colnames = {'date','open','high','low','close','volume'};
for i = 1:ndata
uidata = [date_price(i), open_price(i), high_price(i), low_price(i), close_price(i), volume_price(i)];
datainsert(dbConn, tablename, colnames, uidata);
end
else
% If the connection failed, print the error message
disp(sprintf('Connection failed: %s', dbConn.Message));
end
end
% Close the connection so we don't run out of MySQL threads
close(dbConn);
Pan Active Market Databaseにある証券で2015年5月1日現在、取引可能なものは3823個あると思われる。これらを全部MySQLへ格納するにはおよそ26時間を要した…
試しに最近の株式分割が行われた銘柄で株価をチェックをしてみる。2015年4月27日にアイ・ケイ・ケイ(2198)が株式分割(1:2)を行っている。MATLABのコマンドウィンドウからAdjustExRightsをtrueまたはfalseにして終値をそれぞれ調べる。
> prices.AdjustExRights = false
> prices.Read('2198')
> dayinfo.DatePosition('2015/3/27')
> prices.Close(8167)
ans = 1286
また、
> prices.AdjustExRights = true
> prices.Read('2198)
> dayinfo.DatePosition('2015/3/27')
> prices.Close(8167)
ans = 643
となり、正しく株式分割が考慮されていることがわかる。
将来的にPanrolling社の相場アプリケーションを購入して最新の株価データにアップデートできるようになると、このコードを修正して、今あるデータとの差分だけをMySQLへ格納するように改良する必要がある。
2015年05月14日
MATLABによるMYSQLデータベースへのアクセス4
MATLABでPan Active Market Databaseにアクセスし抽出した全証券データをMySQLへ格納する処理を実行しているが、恐ろしく時間がかかる。Pan Active Market Database中の4000程度が取引可能な証券だと予想しているが、24時間を要してデータベースに移せたのは2400程度。
タスクマネージャーでパソコンの状態を見てみると、下図のようにCPU、メモリ共に負荷のかかる処理ではないと思うのだが。
MATLABで処理中の証券コードを表示させているが、そのコードが変わる度にネットワークの通信状態を示す以下のグラフにスパイクが観察される。2つのスパイクの間がMySQLへデータの格納処理を行っていると解釈できるので、この時間が長いということだが。
MATLABのforループを使ったコードが悪いんだろうか。それにしても遅い…
MATLABが使えない環境でも、MATLABの勉強をしようとOctaveを使って以下の本を読んでいるが、かなりOctaveはMATLABと互換性がありそう。
Octaveはかなり使えるのかもしれない。
タスクマネージャーでパソコンの状態を見てみると、下図のようにCPU、メモリ共に負荷のかかる処理ではないと思うのだが。
MATLABで処理中の証券コードを表示させているが、そのコードが変わる度にネットワークの通信状態を示す以下のグラフにスパイクが観察される。2つのスパイクの間がMySQLへデータの格納処理を行っていると解釈できるので、この時間が長いということだが。
MATLABのforループを使ったコードが悪いんだろうか。それにしても遅い…
MATLABが使えない環境でも、MATLABの勉強をしようとOctaveを使って以下の本を読んでいるが、かなりOctaveはMATLABと互換性がありそう。
Octaveはかなり使えるのかもしれない。
2015年05月13日
MATLABによるMYSQLデータベースへのアクセス3
MATLABによりPan Active Market Databaseから証券価格を抽出し、MySQLへ格納させることを試みている。これまでのコードを拡張して証券コードを次々と変化させることで、これが可能になった。2015年5月1日現在である証券が取引可能かどうかを、この日の日付インデックスにデータが有るか無いかで調べる。データが無いものは現在では取引できないのでMySQLへは格納しない。証券コードを総当りで変化させるループの中に何度もMySQLへの接続を試みるようになっているので、コードの修正が必要か。また証券価格が分割権利落ちを考慮した修正価格になっていないようだ。
"activedatabase.m"
% Set this to the path to your MySQL Connector/J JAR
javaaddpath('C:\Program Files\MySQL\MySQL Connector J\mysql-connector-java-5.1.27-bin.jar')
% Pan Active Market Database
dayinfo = actxserver('ActiveMarket.Calendar');
prices = actxserver('ActiveMarket.Prices');
%
prices.Read('1001') % Nikkei index
last_price = prices.End;
for code = 500:9999
try
prices.Read(num2str(code))
price_begin = prices.Begin;
price_end = prices.End;
catch exeption
continue
end
%
if price_end ~= last_price;
continue
end
%
code
open_price = [];
high_price = [];
low_price = [];
close_price = [];
volume_price = [];
date_price = {};
%
day_index = prices.Begin:prices.End;
ndata = 0;
for i = day_index
if prices.IsClosed(i) == 0;
date_price = [date_price dayinfo.Date(i)];
open_price = [open_price prices.Open(i)];
high_price = [high_price prices.High(i)];
low_price = [low_price prices.Low(i)];
close_price = [close_price prices.Close(i)];
volume_price = [volume_price prices.Volume(i)];
ndata = ndata + 1;
else
continue
end
end
% Database Server*
host = 'IP Address';
% Database Username/Password
user = 'User name';
password = 'Password';
% Database Name
dbName = 'pan_active_market';
% JDBC Parameters
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName);
jdbcDriver = 'com.mysql.jdbc.Driver';
% Create the database connection object
dbConn = database(dbName,user,password,jdbcDriver,jdbcString);
tablename = sprintf('code%d',code);
sqls = sprintf('CREATE TABLE %s(date char(10), open int(6), high int(6), low int(6), close int(6), volume int(12));', tablename);
exec(dbConn,sqls);
% Check to make sure that we successfully connected
if isconnection(dbConn)
colnames = {'date','open','high','low','close','volume'};
for i = 1:ndata
uidata = [date_price(i), open_price(i), high_price(i), low_price(i), close_price(i), volume_price(i)];
datainsert(dbConn, tablename, colnames, uidata);
end
else
% If the connection failed, print the error message
disp(sprintf('Connection failed: %s', dbConn.Message));
end
end
% Close the connection so we don't run out of MySQL threads
close(dbConn);
このコードを実行して、およそ2時間で337個の証券価格のデータをMySQLへ格納したようだ。現在取引ができるものはいくつぐらいになるのだろうか。いずれにしろ結構時間がかかる処理だ。
MATLABメモ
変数の文字列への埋め込み方法
result = sprintf('%s%d', 文字列, 変数)などのように、sprintf文を使う。
SQL文の実行
exec(con, 'select x from y')などのようにする。conはデータベースオブジェクト。
例外処理
try
-----
catch exception
-----
end
"activedatabase.m"
% Set this to the path to your MySQL Connector/J JAR
javaaddpath('C:\Program Files\MySQL\MySQL Connector J\mysql-connector-java-5.1.27-bin.jar')
% Pan Active Market Database
dayinfo = actxserver('ActiveMarket.Calendar');
prices = actxserver('ActiveMarket.Prices');
%
prices.Read('1001') % Nikkei index
last_price = prices.End;
for code = 500:9999
try
prices.Read(num2str(code))
price_begin = prices.Begin;
price_end = prices.End;
catch exeption
continue
end
%
if price_end ~= last_price;
continue
end
%
code
open_price = [];
high_price = [];
low_price = [];
close_price = [];
volume_price = [];
date_price = {};
%
day_index = prices.Begin:prices.End;
ndata = 0;
for i = day_index
if prices.IsClosed(i) == 0;
date_price = [date_price dayinfo.Date(i)];
open_price = [open_price prices.Open(i)];
high_price = [high_price prices.High(i)];
low_price = [low_price prices.Low(i)];
close_price = [close_price prices.Close(i)];
volume_price = [volume_price prices.Volume(i)];
ndata = ndata + 1;
else
continue
end
end
% Database Server*
host = 'IP Address';
% Database Username/Password
user = 'User name';
password = 'Password';
% Database Name
dbName = 'pan_active_market';
% JDBC Parameters
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName);
jdbcDriver = 'com.mysql.jdbc.Driver';
% Create the database connection object
dbConn = database(dbName,user,password,jdbcDriver,jdbcString);
tablename = sprintf('code%d',code);
sqls = sprintf('CREATE TABLE %s(date char(10), open int(6), high int(6), low int(6), close int(6), volume int(12));', tablename);
exec(dbConn,sqls);
% Check to make sure that we successfully connected
if isconnection(dbConn)
colnames = {'date','open','high','low','close','volume'};
for i = 1:ndata
uidata = [date_price(i), open_price(i), high_price(i), low_price(i), close_price(i), volume_price(i)];
datainsert(dbConn, tablename, colnames, uidata);
end
else
% If the connection failed, print the error message
disp(sprintf('Connection failed: %s', dbConn.Message));
end
end
% Close the connection so we don't run out of MySQL threads
close(dbConn);
このコードを実行して、およそ2時間で337個の証券価格のデータをMySQLへ格納したようだ。現在取引ができるものはいくつぐらいになるのだろうか。いずれにしろ結構時間がかかる処理だ。
MATLABメモ
変数の文字列への埋め込み方法
result = sprintf('%s%d', 文字列, 変数)などのように、sprintf文を使う。
SQL文の実行
exec(con, 'select x from y')などのようにする。conはデータベースオブジェクト。
例外処理
try
-----
catch exception
-----
end
2015年05月12日
Rubyの基礎の基礎3
Rubyの基礎的な知識をまとめておく。
attr_reader
attr_readerの後にシンボルによって外から読みたいインスタンス変数を書く。
オブジェクトのインスタンス変数にアクセスするメソッドをアクセサメソッドという。
class Lady
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
end
end
ハッシュの配列
{:open => 101, :high => 115, :low => 100, :close => 110}
Array#map
Arrayクラスのmapメソッド
[1,2,3].map {|n| n+1} #=> [2,3,4]
真偽
true || true #=> true
true || false #=> true
false || true #=> true
false || false #=> false
nilとfalseが偽、それ以外は全て真。
||の左側にnilとfalse以外の値があれば、それを返す。
||の左側がnilかfalseならば右側の値を返す。
nameがnilとfalse以外ならnameが@nameに代入される。nameがnilやfalseならば”Gonbei"が@nameに代入される。
@name = name || "Gonbei"
||=
my_name ||= "Gonbei"
my_name = my_name || "Gonbei"と同じ意味
左側の変数にすでに値が入っていれば、その値をキープ、左側の変数が空なら右側の値を左側に入れる。
Macでのマジックコメント
#!/usr/bin/env ruby
# encoding: utf-8
ハッシュ、配列を空で初期化
Hash.new あるいは {}
Array.new あるいは []
p
オブジェクトの中身をそのまま表示させる。
attr_reader
attr_readerの後にシンボルによって外から読みたいインスタンス変数を書く。
オブジェクトのインスタンス変数にアクセスするメソッドをアクセサメソッドという。
class Lady
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
end
end
ハッシュの配列
{:open => 101, :high => 115, :low => 100, :close => 110}
Array#map
Arrayクラスのmapメソッド
[1,2,3].map {|n| n+1} #=> [2,3,4]
真偽
true || true #=> true
true || false #=> true
false || true #=> true
false || false #=> false
nilとfalseが偽、それ以外は全て真。
||の左側にnilとfalse以外の値があれば、それを返す。
||の左側がnilかfalseならば右側の値を返す。
nameがnilとfalse以外ならnameが@nameに代入される。nameがnilやfalseならば”Gonbei"が@nameに代入される。
@name = name || "Gonbei"
||=
my_name ||= "Gonbei"
my_name = my_name || "Gonbei"と同じ意味
左側の変数にすでに値が入っていれば、その値をキープ、左側の変数が空なら右側の値を左側に入れる。
Macでのマジックコメント
#!/usr/bin/env ruby
# encoding: utf-8
ハッシュ、配列を空で初期化
Hash.new あるいは {}
Array.new あるいは []
p
オブジェクトの中身をそのまま表示させる。
2015年05月11日
MATLABによるMYSQLデータベースへのアクセス2
MATLABにより、Pan Active Market Databaseの株価データをMySQLデータベースへ移動させることを検討している。
1つの日付に対応する文字列を1配列要素として、次々に空の配列に格納していくやり方が分かった。具体的には、日付を格納する配列date_priceを以下の赤字のように、定義し格納していく。
dayinfo = actxserver('ActiveMarket.Calendar');
prices = actxserver('ActiveMarket.Prices');
%
code = 8604;
prices.Read(num2str(code))
price_begin = prices.Begin;
price_end = prices.End;
%
open_price = [];
high_price = [];
low_price = [];
close_price = [];
volume_price = [];
date_price = {};
%
day_index = prices.Begin:prices.End;
ndata = 0;
for i = day_index
if prices.IsClosed(i) == 0;
date_price = [date_price dayinfo.Date(i)];
open_price = [open_price prices.Open(i)];
high_price = [high_price prices.High(i)];
low_price = [low_price prices.Low(i)];
close_price = [close_price prices.Close(i)];
volume_price = [volume_price prices.Volume(i)];
ndata = ndata + 1;
else
continue
end
end
% Database Server*
host = 'IP Address';
% Database Username/Password
user = 'User name';
password = 'Password';
% Database Name
dbName = 'pan_active_market';
% JDBC Parameters
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName);
jdbcDriver = 'com.mysql.jdbc.Driver';
% Set this to the path to your MySQL Connector/J JAR
javaaddpath('C:\Program Files\MySQL\MySQL Connector J\mysql-connector-java-5.1.27-bin.jar')
% Create the database connection object
dbConn = database(dbName,user,password,jdbcDriver,jdbcString);
% Check to make sure that we successfully connected
if isconnection(dbConn)
colnames = {'date','open','high','low','close','volume'}
for i = 1:ndata
uidata = [date_price(i), open_price(i), high_price(i), low_price(i), close_price(i), volume_price(i)]
tablename = '8604test';
datainsert(dbConn, tablename, colnames, uidata);
end
else
% If the connection failed, print the error message
disp(sprintf('Connection failed: %s', dbConn.Message));
end
% Close the connection so we don't run out of MySQL threads
close(dbConn);
実行してみると、いまいちしっくりこないが一応動くようだ…下図のように一番左のカラム”date”に日付のデータが格納できるようになった。問題があるのかもしれないが、このまま進むことにする。
ところで、データーベースでテーブルを作成するSQL文で、日付を格納するカラムのdateは10文字の文字型とした。
CREATE TABLE 8604test (
date char(10),
open int(6),
high int(6),
low int(6),
close int(6),
volume int(12)
);
[課題]
1つの日付に対応する文字列を1配列要素として、次々に空の配列に格納していくやり方が分かった。具体的には、日付を格納する配列date_priceを以下の赤字のように、定義し格納していく。
dayinfo = actxserver('ActiveMarket.Calendar');
prices = actxserver('ActiveMarket.Prices');
%
code = 8604;
prices.Read(num2str(code))
price_begin = prices.Begin;
price_end = prices.End;
%
open_price = [];
high_price = [];
low_price = [];
close_price = [];
volume_price = [];
date_price = {};
%
day_index = prices.Begin:prices.End;
ndata = 0;
for i = day_index
if prices.IsClosed(i) == 0;
date_price = [date_price dayinfo.Date(i)];
open_price = [open_price prices.Open(i)];
high_price = [high_price prices.High(i)];
low_price = [low_price prices.Low(i)];
close_price = [close_price prices.Close(i)];
volume_price = [volume_price prices.Volume(i)];
ndata = ndata + 1;
else
continue
end
end
% Database Server*
host = 'IP Address';
% Database Username/Password
user = 'User name';
password = 'Password';
% Database Name
dbName = 'pan_active_market';
% JDBC Parameters
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName);
jdbcDriver = 'com.mysql.jdbc.Driver';
% Set this to the path to your MySQL Connector/J JAR
javaaddpath('C:\Program Files\MySQL\MySQL Connector J\mysql-connector-java-5.1.27-bin.jar')
% Create the database connection object
dbConn = database(dbName,user,password,jdbcDriver,jdbcString);
% Check to make sure that we successfully connected
if isconnection(dbConn)
colnames = {'date','open','high','low','close','volume'}
for i = 1:ndata
uidata = [date_price(i), open_price(i), high_price(i), low_price(i), close_price(i), volume_price(i)]
tablename = '8604test';
datainsert(dbConn, tablename, colnames, uidata);
end
else
% If the connection failed, print the error message
disp(sprintf('Connection failed: %s', dbConn.Message));
end
% Close the connection so we don't run out of MySQL threads
close(dbConn);
実行してみると、いまいちしっくりこないが一応動くようだ…下図のように一番左のカラム”date”に日付のデータが格納できるようになった。問題があるのかもしれないが、このまま進むことにする。
ところで、データーベースでテーブルを作成するSQL文で、日付を格納するカラムのdateは10文字の文字型とした。
CREATE TABLE 8604test (
date char(10),
open int(6),
high int(6),
low int(6),
close int(6),
volume int(12)
);
[課題]
- Pan Active Market Databaseの全証券銘柄のデータをMySQLへ移動