新規記事の投稿を行うことで、非表示にすることが可能です。
2015年05月11日
Rメモ
コードの選択範囲をコメント文にする(コメントの有効無効の切り替え)方法
Rstudioのエディタで、コメント文にしたい行を選択してCtrlキー+Shift+キー+cキーを同時に押す。
shinyServer(
function(input,output){
x <- reactive({as.numeric(input$text1) + 100})
output$text1 <- renderText({x() })
output$text2 <- renderText({x() + as.numeric(input$text2)})
}
)
# shinyServer(
# function(input,output){
# x <- reactive({as.numeric(input$text1) + 100})
# output$text1 <- renderText({x() })
# output$text2 <- renderText({x() + as.numeric(input$text2)})
# }
# )
もう1度Ctrl+Shift+cでコメントを外せる。
rChartsのインストール方法
> require(devtools)
> install_github('rCharts','ramnathv')
Rstudioのエディタで、コメント文にしたい行を選択してCtrlキー+Shift+キー+cキーを同時に押す。
shinyServer(
function(input,output){
x <- reactive({as.numeric(input$text1) + 100})
output$text1 <- renderText({x() })
output$text2 <- renderText({x() + as.numeric(input$text2)})
}
)
# shinyServer(
# function(input,output){
# x <- reactive({as.numeric(input$text1) + 100})
# output$text1 <- renderText({x() })
# output$text2 <- renderText({x() + as.numeric(input$text2)})
# }
# )
もう1度Ctrl+Shift+cでコメントを外せる。
rChartsのインストール方法
> require(devtools)
> install_github('rCharts','ramnathv')
【このカテゴリーの最新記事】
-
no image
2015年05月08日
MATLABによるMYSQLデータベースへのアクセス
Pan Active Market DatabaseはWindows環境でしか利用できない。最終的にはLinux環境でのシステム運用を想定しているので、Pan Active Market DatabaseのデータをMySQLデータベースへ格納する。Pan Active Market Databaseからデータを引き出してSQL文でデータベースへ格納するだけなので、Rubyでやってしまってもいいのだが、ここではMATLABで行う方法を検討してみる。
まずコマンドラインからMySQLにログインする。
1つの証券データは、日付、始値、高値、安値、終値、出来高からなる。これらをデータベースに格納するために以下の様なテーブルを作成する。日付にあたるカラム”dayindex”は本来日付を格納したいが、MATLABで不明点があるため、今のところは1, 2, 3, ...という数値で与えることにする。
CREATE TABLE 8604test (
dayindex int(6)
open int(6)
high int(6)
low int(6)
close int(6)
volume int(12)
);
テーブルを作成しておく。
以下のリンク先を参考にMATLABのスクリプト"activedatabase.m"を作成する。
https://web.stanford.edu/group/farmshare/cgi-bin/wiki/index.php/MatlabMysql
http://www.mathworks.com/help/database/ug/datainsert.html
"activedatabase.m"
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;
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)];
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 = {'dayindex','open','high','low','close','volume'}
for i = 1:ndata
uidata = [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);
MATLABの処理が終わったらMySQLのテーブルを確認すると、
COURSERAのコースで学んだ、配列に要素を付け加えていく方法が早速役に立った。
https://fanblogs.jp/systemtradelab/archive/15/0
date_priceの要素に日付が入れられれば完成なのだが、上の赤字のコードのようにすると日付を構成する文字が1文字ずつ配列に格納されしまい、日付の文字列データを要素として含む配列にならない。証券コードをループで変化させるようにすれば、原理的にはPan Active Market Databaseの全データをMySQLデータベースに格納することが可能なはずだ。
[課題]
まずコマンドラインからMySQLにログインする。
1つの証券データは、日付、始値、高値、安値、終値、出来高からなる。これらをデータベースに格納するために以下の様なテーブルを作成する。日付にあたるカラム”dayindex”は本来日付を格納したいが、MATLABで不明点があるため、今のところは1, 2, 3, ...という数値で与えることにする。
CREATE TABLE 8604test (
dayindex int(6)
open int(6)
high int(6)
low int(6)
close int(6)
volume int(12)
);
テーブルを作成しておく。
以下のリンク先を参考にMATLABのスクリプト"activedatabase.m"を作成する。
https://web.stanford.edu/group/farmshare/cgi-bin/wiki/index.php/MatlabMysql
http://www.mathworks.com/help/database/ug/datainsert.html
"activedatabase.m"
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;
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)];
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 = {'dayindex','open','high','low','close','volume'}
for i = 1:ndata
uidata = [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);
MATLABの処理が終わったらMySQLのテーブルを確認すると、
COURSERAのコースで学んだ、配列に要素を付け加えていく方法が早速役に立った。
https://fanblogs.jp/systemtradelab/archive/15/0
date_priceの要素に日付が入れられれば完成なのだが、上の赤字のコードのようにすると日付を構成する文字が1文字ずつ配列に格納されしまい、日付の文字列データを要素として含む配列にならない。証券コードをループで変化させるようにすれば、原理的にはPan Active Market Databaseの全データをMySQLデータベースに格納することが可能なはずだ。
[課題]
- 配列への文字列要素の逐次追加
- 全証券銘柄のデータ取得スクリプトへの拡張
Rubyではじめるシステムトレード8
”Rubyではじめるシステムトレード”のサンプルスクリプトをPan Active Market Databaseの株価を利用して、トレードのシミュレーションを行うことを目指している。
ここまでで、動作確認用のサンプルスクリプトが問題なく動くようになった。最後にシミュレーター本体"simulate.rb"を実行する。シミュレーションの設定ファイルはRubyのスクリプトとして用意される仕様になっている。書籍で解説されているのは移動平均乖離率を利用したトレードで、設定ファイルは"estrangement.rb"で、Pan Active Market Databaseから株価を取得するように以下の太字のように記述する。
"estrangement.rb"
Simulation.setting "estrangement", "0.0.1" do
trading_system do
entry EstrangementEntry, span: 20, rate: 5
exit StopOutExit
exit EstrangementExit, span: 20, rate: 3
stop AverageTrueRangeStop, span: 20, ratio: 1
filter MovingAverageDirectionFilter, span: 40
end
from "2005/06/20"
to "2015/05/01"
data_loader PanDatabaseToStock, data_dir: "data",
stock_list: "./data/tosho_list.txt"
record_dir "result"
record_every_stock true
end
特にPanDatabaseToStockで株価を扱うときは、サンプルスクリプト内の"market_section: "東証1部""の項目を削除しなくてはいけない。シミュレーションの実行毎に結果を保存するフォルダを用意するのは面倒だが、バージョン番号を”0.0.1”などと指定することで、バージョン番号に応じた新しいフォルダが作成される仕組みになっており大変便利。
そして"simulate.rb"を設定ファイルを指定して以下のように実行する。
$ ruby bin/simulation.rb setting/estrangement.rb
1銘柄だけのシミュレーションを行うときは、証券コードを指定して、
$ ruby bin/simulation.rb setting/estrangement.rb 1001
などとする。
証券コードが次々と表示されていき、計算は25分程度で終了する。そして全取引のまとめ”_stats.csv”と各証券銘柄の取引結果"_stats_for_each_stock.csv"が各証券銘柄の取引履歴”証券コード.csv”ファイルと共に、resultフォルダ以下に自動的に作成される。
"_stats.csv"
総損益,勝ち数,負け数,分け数,勝率,平均損益,PF,総R倍数,平均R倍数,総損益率,平均損益率,平均期間
1158395500.0,83499,94306,2561,0.4629420178969429,6422.471530110996,1.2210031536952026,14993.294925766015,0.08312705790318582,69061.88261362449,0.38289856521530935,4.124729716243638
"_stats_for_each_stock.csv"
コード,総損益,勝ち数,負け数,分け数,勝率,平均損益,PF,総R倍数,平均R倍数,総損益率,平均損益率,平均期間
641,1500,1,1,0,0.5,750.0,3.5,2.5,1.25,5.28080167255425,2.640400836277125,2.0
1001,-100300,8,10,0,0.4444444444444444,-5572.222222222223,0.7176238738738738,-1.9033385747429017,-0.10574103193016121,-2.795630513321206,-0.15531280629562255,3.611111111111111
1002,-5700.0,6,7,0,0.46153846153846156,-438.46153846153845,0.7164179104477612,-2.132984967475883,-0.16407576672891408,-3.624682490150885,-0.27882173001160654,4.153846153846154
1301,13600.0,16,10,0,0.6153846153846154,523.0769230769231,3.029850746268657,12.887687312687316,0.4956802812572044,52.45106692872076,2.017348728027722,3.730769230769231
1305,-1300,7,7,1,0.4666666666666667,-86.66666666666667,0.9362745098039216,0.8626722834898157,0.057511485565987716,0.3769308474350742,0.02512872316233828,4.4
1306,8800,6,5,0,0.5454545454545454,800.0,1.7521367521367521,3.5806101585196415,0.3255100144108765,7.536231212718562,0.6851119284289602,4.909090909090909
1308,6200,7,5,1,0.5384615384615384,476.9230769230769,1.4428571428571428,1.7273119835988107,0.1328701525845239,5.296953503322498,0.40745796179403826,4.384615384615385
1309,1267000,17,10,1,0.6071428571428571,45250.0,2.191909689557855,13.259806339866424,0.4735645121380866,50.43860396524438,1.8013787130444423,4.535714285714286
1310,4900,6,8,1,0.4,326.6666666666667,1.3888888888888888,0.634211993193686,0.04228079954624574,4.908410659166213,0.32722737727774753,4.066666666666666
1311,2500.0,10,12,0,0.45454545454545453,113.63636363636364,1.1396648044692737,1.0303491814866166,0.04683405370393712,0.8679429764590654,0.03945195347541206,3.9545454545454546
1312,-40000,4,7,0,0.36363636363636365,-3636.3636363636365,0.8148148148148148,0.33187218068656543,0.030170198244233223,-0.5045378096797617,-0.04586707360725106,4.181818181818182
1313,-5100,14,14,0,0.5,-182.14285714285714,0.9314516129032258,-0.9650050867744064,-0.03446446738480023,-3.9954731770827667,-0.14269547061009882,3.6785714285714284
1314,19200,8,4,0,0.6666666666666666,1600.0,2.422222222222222,5.94264513026753,0.49522042752229417,25.40178475834549,2.1168153965287906,4.833333333333333
1316,-18200,1,12,0,0.07692307692307693,-1400.0,0.08542713567839195,-9.626117414997594,-0.7404705703844303,-23.372069590075803,-1.7978515069289078,3.923076923076923
1317,-15400,6,10,0,0.375,-962.5,0.624390243902439,3.40959647911679,0.21309977994479937,-6.257450225745265,-0.39109063910907904,4.3125
1318,-7700,5,8,0,0.38461538461538464,-592.3076923076923,0.6607929515418502,0.5095915452924209,0.03919934963787853,-4.941934075657878,-0.380148775050606,4.846153846153846
1319,-7500.0,8,19,0,0.2962962962962963,-277.77777777777777,0.3951612903225806,-6.754853479853482,-0.25017975851309193,-31.252810953670135,-1.1575115168025976,2.6666666666666665
1320,13000,9,6,0,0.6,866.6666666666666,1.0555555555555556,-0.38794319006693634,-0.025862879337795755,6.695760537470772,0.4463840358313848,4.066666666666666
1321,-14000.0,7,7,0,0.5,-1000.0,0.940677966101695,-1.1734195355719315,-0.08381568111228081,4.338163997030426,0.30986885693074473,4.285714285714286
1322,13300,10,11,1,0.45454545454545453,604.5454545454545,1.0888443553774214,1.2576197578972792,0.05716453444987633,5.166575594032352,0.23484434518328873,3.772727272727273
1323,9500,12,10,0,0.5454545454545454,431.8181818181818,2.217948717948718,5.717460317460318,0.2598845598845599,40.46200480929459,1.8391820367861178,4.090909090909091
1324,5000,16,14,0,0.5333333333333333,166.66666666666666,1.8620689655172413,9.61818181818182,0.32060606060606067,55.191423193329825,1.8397141064443274,4.166666666666667
1325,7200.0,14,10,1,0.56,288.0,2.0,7.798496240601503,0.31193984962406013,35.2954808379909,1.411819233519636,3.64
1326,50000,5,4,0,0.5555555555555556,5555.555555555556,1.3875968992248062,2.306836225113155,0.2563151361236839,8.888206968476673,0.9875785520529637,3.888888888888889
1327,71500,9,7,0,0.5625,4468.75,1.8313953488372092,5.476436834840725,0.3422773021775453,16.631144905082127,1.039446556567633,3.6875
1328,23500,5,4,0,0.5555555555555556,2611.1111111111113,1.681159420289855,3.4101465225075667,0.3789051691675074,5.9935148832698175,0.6659460981410908,4.0
1329,-74000.0,7,7,0,0.5,-5285.714285714285,0.7347670250896058,-0.49334941900071094,-0.035239244214336496,-1.9490350662498237,-0.13921679044641597,4.357142857142857
1330,-105000,6,8,0,0.42857142857142855,-7500.0,0.6276595744680851,-3.02343673618687,-0.2159597668704907,-4.732708024485519,-0.33805057317753706,3.9285714285714284
1331,-100,2,3,0,0.4,-20.0,0.9411764705882353,-0.37142857142857144,-0.07428571428571429,-1.0569997933075834,-0.21139995866151667,3.8
1332,-20400,16,30,0,0.34782608695652173,-443.4782608695652,0.5255813953488372,-13.465148957509637,-0.2927206295110791,-48.37360690345826,-1.0516001500751795,3.5652173913043477
1334,-4200.0,20,24,1,0.4444444444444444,-93.33333333333333,0.7835051546391752,-2.3178178847296493,-0.05150706410510332,-12.943845296109627,-0.2876410065802139,4.066666666666666
1341,23500,1,1,0,0.5,11750.0,3.238095238095238,2.238095238095238,1.119047619047619,5.462529274004685,2.7312646370023423,2.5
1342,-2500.0,0,3,0,0.0,-833.3333333333334,0.0,-3.0972222222222223,-1.0324074074074074,-8.952895607598016,-2.9842985358660052,4.666666666666667
1343,11100,4,3,0,0.5714285714285714,1585.7142857142858,2.2065217391304346,3.3829788568919,0.48328269384170003,13.07048687957986,1.8672124113685515,5.571428571428571
1344,2900,7,6,0,0.5384615384615384,223.07692307692307,1.3372093023255813,3.0666666666666664,0.2358974358974359,4.572486431439351,0.3517297254953347,5.3076923076923075
1345,-900,3,4,0,0.42857142857142855,-128.57142857142858,0.926829268292683,-0.02520853130609213,-0.0036012187580131616,0.9842882181882335,0.14061260259831906,4.0
1346,-145000,2,4,0,0.3333333333333333,-24166.666666666668,0.15204678362573099,-3.2366401105896907,-0.5394400184316152,-10.120862432816255,-1.6868104054693758,4.166666666666667
1347,52600,6,3,0,0.6666666666666666,5844.444444444444,4.005714285714285,6.717390742573354,0.7463767491748171,13.360013051167872,1.484445894574208,4.555555555555555
1348,-5700.0,2,5,0,0.2857142857142857,-814.2857142857143,0.5327868852459017,-0.8572856428928392,-0.12246937755611988,-5.27112434572508,-0.7530177636750114,5.0
なんとかシミュレーターが動くようになった!これで取引ルールの評価に進むことができる。
ここまでで、動作確認用のサンプルスクリプトが問題なく動くようになった。最後にシミュレーター本体"simulate.rb"を実行する。シミュレーションの設定ファイルはRubyのスクリプトとして用意される仕様になっている。書籍で解説されているのは移動平均乖離率を利用したトレードで、設定ファイルは"estrangement.rb"で、Pan Active Market Databaseから株価を取得するように以下の太字のように記述する。
"estrangement.rb"
Simulation.setting "estrangement", "0.0.1" do
trading_system do
entry EstrangementEntry, span: 20, rate: 5
exit StopOutExit
exit EstrangementExit, span: 20, rate: 3
stop AverageTrueRangeStop, span: 20, ratio: 1
filter MovingAverageDirectionFilter, span: 40
end
from "2005/06/20"
to "2015/05/01"
data_loader PanDatabaseToStock, data_dir: "data",
stock_list: "./data/tosho_list.txt"
record_dir "result"
record_every_stock true
end
特にPanDatabaseToStockで株価を扱うときは、サンプルスクリプト内の"market_section: "東証1部""の項目を削除しなくてはいけない。シミュレーションの実行毎に結果を保存するフォルダを用意するのは面倒だが、バージョン番号を”0.0.1”などと指定することで、バージョン番号に応じた新しいフォルダが作成される仕組みになっており大変便利。
そして"simulate.rb"を設定ファイルを指定して以下のように実行する。
$ ruby bin/simulation.rb setting/estrangement.rb
1銘柄だけのシミュレーションを行うときは、証券コードを指定して、
$ ruby bin/simulation.rb setting/estrangement.rb 1001
などとする。
証券コードが次々と表示されていき、計算は25分程度で終了する。そして全取引のまとめ”_stats.csv”と各証券銘柄の取引結果"_stats_for_each_stock.csv"が各証券銘柄の取引履歴”証券コード.csv”ファイルと共に、resultフォルダ以下に自動的に作成される。
"_stats.csv"
総損益,勝ち数,負け数,分け数,勝率,平均損益,PF,総R倍数,平均R倍数,総損益率,平均損益率,平均期間
1158395500.0,83499,94306,2561,0.4629420178969429,6422.471530110996,1.2210031536952026,14993.294925766015,0.08312705790318582,69061.88261362449,0.38289856521530935,4.124729716243638
"_stats_for_each_stock.csv"
コード,総損益,勝ち数,負け数,分け数,勝率,平均損益,PF,総R倍数,平均R倍数,総損益率,平均損益率,平均期間
641,1500,1,1,0,0.5,750.0,3.5,2.5,1.25,5.28080167255425,2.640400836277125,2.0
1001,-100300,8,10,0,0.4444444444444444,-5572.222222222223,0.7176238738738738,-1.9033385747429017,-0.10574103193016121,-2.795630513321206,-0.15531280629562255,3.611111111111111
1002,-5700.0,6,7,0,0.46153846153846156,-438.46153846153845,0.7164179104477612,-2.132984967475883,-0.16407576672891408,-3.624682490150885,-0.27882173001160654,4.153846153846154
1301,13600.0,16,10,0,0.6153846153846154,523.0769230769231,3.029850746268657,12.887687312687316,0.4956802812572044,52.45106692872076,2.017348728027722,3.730769230769231
1305,-1300,7,7,1,0.4666666666666667,-86.66666666666667,0.9362745098039216,0.8626722834898157,0.057511485565987716,0.3769308474350742,0.02512872316233828,4.4
1306,8800,6,5,0,0.5454545454545454,800.0,1.7521367521367521,3.5806101585196415,0.3255100144108765,7.536231212718562,0.6851119284289602,4.909090909090909
1308,6200,7,5,1,0.5384615384615384,476.9230769230769,1.4428571428571428,1.7273119835988107,0.1328701525845239,5.296953503322498,0.40745796179403826,4.384615384615385
1309,1267000,17,10,1,0.6071428571428571,45250.0,2.191909689557855,13.259806339866424,0.4735645121380866,50.43860396524438,1.8013787130444423,4.535714285714286
1310,4900,6,8,1,0.4,326.6666666666667,1.3888888888888888,0.634211993193686,0.04228079954624574,4.908410659166213,0.32722737727774753,4.066666666666666
1311,2500.0,10,12,0,0.45454545454545453,113.63636363636364,1.1396648044692737,1.0303491814866166,0.04683405370393712,0.8679429764590654,0.03945195347541206,3.9545454545454546
1312,-40000,4,7,0,0.36363636363636365,-3636.3636363636365,0.8148148148148148,0.33187218068656543,0.030170198244233223,-0.5045378096797617,-0.04586707360725106,4.181818181818182
1313,-5100,14,14,0,0.5,-182.14285714285714,0.9314516129032258,-0.9650050867744064,-0.03446446738480023,-3.9954731770827667,-0.14269547061009882,3.6785714285714284
1314,19200,8,4,0,0.6666666666666666,1600.0,2.422222222222222,5.94264513026753,0.49522042752229417,25.40178475834549,2.1168153965287906,4.833333333333333
1316,-18200,1,12,0,0.07692307692307693,-1400.0,0.08542713567839195,-9.626117414997594,-0.7404705703844303,-23.372069590075803,-1.7978515069289078,3.923076923076923
1317,-15400,6,10,0,0.375,-962.5,0.624390243902439,3.40959647911679,0.21309977994479937,-6.257450225745265,-0.39109063910907904,4.3125
1318,-7700,5,8,0,0.38461538461538464,-592.3076923076923,0.6607929515418502,0.5095915452924209,0.03919934963787853,-4.941934075657878,-0.380148775050606,4.846153846153846
1319,-7500.0,8,19,0,0.2962962962962963,-277.77777777777777,0.3951612903225806,-6.754853479853482,-0.25017975851309193,-31.252810953670135,-1.1575115168025976,2.6666666666666665
1320,13000,9,6,0,0.6,866.6666666666666,1.0555555555555556,-0.38794319006693634,-0.025862879337795755,6.695760537470772,0.4463840358313848,4.066666666666666
1321,-14000.0,7,7,0,0.5,-1000.0,0.940677966101695,-1.1734195355719315,-0.08381568111228081,4.338163997030426,0.30986885693074473,4.285714285714286
1322,13300,10,11,1,0.45454545454545453,604.5454545454545,1.0888443553774214,1.2576197578972792,0.05716453444987633,5.166575594032352,0.23484434518328873,3.772727272727273
1323,9500,12,10,0,0.5454545454545454,431.8181818181818,2.217948717948718,5.717460317460318,0.2598845598845599,40.46200480929459,1.8391820367861178,4.090909090909091
1324,5000,16,14,0,0.5333333333333333,166.66666666666666,1.8620689655172413,9.61818181818182,0.32060606060606067,55.191423193329825,1.8397141064443274,4.166666666666667
1325,7200.0,14,10,1,0.56,288.0,2.0,7.798496240601503,0.31193984962406013,35.2954808379909,1.411819233519636,3.64
1326,50000,5,4,0,0.5555555555555556,5555.555555555556,1.3875968992248062,2.306836225113155,0.2563151361236839,8.888206968476673,0.9875785520529637,3.888888888888889
1327,71500,9,7,0,0.5625,4468.75,1.8313953488372092,5.476436834840725,0.3422773021775453,16.631144905082127,1.039446556567633,3.6875
1328,23500,5,4,0,0.5555555555555556,2611.1111111111113,1.681159420289855,3.4101465225075667,0.3789051691675074,5.9935148832698175,0.6659460981410908,4.0
1329,-74000.0,7,7,0,0.5,-5285.714285714285,0.7347670250896058,-0.49334941900071094,-0.035239244214336496,-1.9490350662498237,-0.13921679044641597,4.357142857142857
1330,-105000,6,8,0,0.42857142857142855,-7500.0,0.6276595744680851,-3.02343673618687,-0.2159597668704907,-4.732708024485519,-0.33805057317753706,3.9285714285714284
1331,-100,2,3,0,0.4,-20.0,0.9411764705882353,-0.37142857142857144,-0.07428571428571429,-1.0569997933075834,-0.21139995866151667,3.8
1332,-20400,16,30,0,0.34782608695652173,-443.4782608695652,0.5255813953488372,-13.465148957509637,-0.2927206295110791,-48.37360690345826,-1.0516001500751795,3.5652173913043477
1334,-4200.0,20,24,1,0.4444444444444444,-93.33333333333333,0.7835051546391752,-2.3178178847296493,-0.05150706410510332,-12.943845296109627,-0.2876410065802139,4.066666666666666
1341,23500,1,1,0,0.5,11750.0,3.238095238095238,2.238095238095238,1.119047619047619,5.462529274004685,2.7312646370023423,2.5
1342,-2500.0,0,3,0,0.0,-833.3333333333334,0.0,-3.0972222222222223,-1.0324074074074074,-8.952895607598016,-2.9842985358660052,4.666666666666667
1343,11100,4,3,0,0.5714285714285714,1585.7142857142858,2.2065217391304346,3.3829788568919,0.48328269384170003,13.07048687957986,1.8672124113685515,5.571428571428571
1344,2900,7,6,0,0.5384615384615384,223.07692307692307,1.3372093023255813,3.0666666666666664,0.2358974358974359,4.572486431439351,0.3517297254953347,5.3076923076923075
1345,-900,3,4,0,0.42857142857142855,-128.57142857142858,0.926829268292683,-0.02520853130609213,-0.0036012187580131616,0.9842882181882335,0.14061260259831906,4.0
1346,-145000,2,4,0,0.3333333333333333,-24166.666666666668,0.15204678362573099,-3.2366401105896907,-0.5394400184316152,-10.120862432816255,-1.6868104054693758,4.166666666666667
1347,52600,6,3,0,0.6666666666666666,5844.444444444444,4.005714285714285,6.717390742573354,0.7463767491748171,13.360013051167872,1.484445894574208,4.555555555555555
1348,-5700.0,2,5,0,0.2857142857142857,-814.2857142857143,0.5327868852459017,-0.8572856428928392,-0.12246937755611988,-5.27112434572508,-0.7530177636750114,5.0
なんとかシミュレーターが動くようになった!これで取引ルールの評価に進むことができる。
Rubyの基礎の基礎2
さらにRubyの基礎を概観しておく。
クラス
”オブジェクトの種類”をクラスと言う。
クラスとは何かの”設計図”である。
オブジェクトがどのような属性(データ)を持ち、どのように操作(メソッド)するかを規定したもの。
インスタンス
クラスから作られた1つ1つのオブジェクト。具体例。
クラスの作り方
class 名前
....
end
メソッドの定義
class 名前
def メソッド
.....
end
end
インスタンス変数
@変数名
メソッドが最後まで来て処理を終えても、保持される。
インスタンス〜オブジェクト
メモ
initializeメソッドはnewにより自動的に呼び出され、主にインスタンスの初期化を行う。
インスタンスを作るnewメソッド。
クラス
”オブジェクトの種類”をクラスと言う。
クラスとは何かの”設計図”である。
オブジェクトがどのような属性(データ)を持ち、どのように操作(メソッド)するかを規定したもの。
インスタンス
クラスから作られた1つ1つのオブジェクト。具体例。
クラスの作り方
class 名前
....
end
メソッドの定義
class 名前
def メソッド
.....
end
end
インスタンス変数
@変数名
メソッドが最後まで来て処理を終えても、保持される。
インスタンス〜オブジェクト
メモ
initializeメソッドはnewにより自動的に呼び出され、主にインスタンスの初期化を行う。
インスタンスを作るnewメソッド。
Rubyの基礎の基礎
”Rubyではじめるシステムトレード”で解説されているRubyのスクリプトは、システムトレードを研究するのに非常に参考になる。今後このスクリプトの機能を拡張していくためにRubyを学習していこうと思う。この書籍では最初にRubyの基礎が解説されているので、重要なことをメモしておく。
オブジェクト
”オブジェクト”とは、「モノ」や「役割」なんかをプログラムで表したもの。
具体的には”数”や”文字列”など。
オブジェクトには”属性”と”操作”がある。属性はオブジェクトが持っている”データ”。操作とはオブジェクトに働きかけて情報を引き出したり仕事をさせたりすることで、”メソッド”と呼ばれる。
メソッドの呼び出し方法
1.next
(オブジェクト).(メソッド名) #=2 (返値)
ハッシュ
複数のオブジェクトを入れておくもの。
trade = {"entry price" => 500, "volume" => 1000, "exit price" => 550}
{キー => 値, キー => 値 , キー => 値... }
trade["entry price"] #=> 500
[]で値にアクセスする。
trade["volume"] = 2000
新たにキーを設定して値を入れることができる。
シンボル
文字列に似ているが、シンボルは「一意的」である。
ハッシュのキーで使われることが多い。
:name
:date
:my_money
:(文字列)
文字そのものを加工したりするには文字列、何度も出てくる名前などにはシンボルという使い分けで、まずは良い。
nil
何もないということ。
a = []
a[0] #=> nil
b = {}
b[:data] => nil
イテレータ
timesメソッド
10.times { ... } or 10.times do ... end
eachメソッド
[1, 3, 5].each { ... } or [1, 3, 5].each do |n| ... end
メソッドを作る
def メソッド名(引数)
....
end
メソッドは最後に実行された式の値を返す。
オブジェクト
”オブジェクト”とは、「モノ」や「役割」なんかをプログラムで表したもの。
具体的には”数”や”文字列”など。
オブジェクトには”属性”と”操作”がある。属性はオブジェクトが持っている”データ”。操作とはオブジェクトに働きかけて情報を引き出したり仕事をさせたりすることで、”メソッド”と呼ばれる。
メソッドの呼び出し方法
1.next
(オブジェクト).(メソッド名) #=2 (返値)
ハッシュ
複数のオブジェクトを入れておくもの。
trade = {"entry price" => 500, "volume" => 1000, "exit price" => 550}
{キー => 値, キー => 値 , キー => 値... }
trade["entry price"] #=> 500
[]で値にアクセスする。
trade["volume"] = 2000
新たにキーを設定して値を入れることができる。
シンボル
文字列に似ているが、シンボルは「一意的」である。
ハッシュのキーで使われることが多い。
:name
:date
:my_money
:(文字列)
文字そのものを加工したりするには文字列、何度も出てくる名前などにはシンボルという使い分けで、まずは良い。
nil
何もないということ。
a = []
a[0] #=> nil
b = {}
b[:data] => nil
イテレータ
timesメソッド
10.times { ... } or 10.times do ... end
eachメソッド
[1, 3, 5].each { ... } or [1, 3, 5].each do |n| ... end
メソッドを作る
def メソッド名(引数)
....
end
メソッドは最後に実行された式の値を返す。
Rubyのインストール
”Rubyではじめるシステムトレード”で使用されているRubyのバージョンに合わせて、トラブルの原因を防ぐためにこれまで1.9.3を使用してきた。特に問題がないようなので、現時点で最新版のバージョン2.2.2をインストールする。
下記からRubyのインストーラーをダウンロードする。
http://rubyinstaller.org/downloads/
クリックしてインストーラーを立ち上げる。
使用言語を適用に選び、
契約書に同意する。
インストール先を指定し、”PATHを設定する”にチェックを入れておく。
特に問題なくインストール完了!
下記からRubyのインストーラーをダウンロードする。
http://rubyinstaller.org/downloads/
クリックしてインストーラーを立ち上げる。
使用言語を適用に選び、
契約書に同意する。
インストール先を指定し、”PATHを設定する”にチェックを入れておく。
特に問題なくインストール完了!
2015年05月07日
Androidアプリの開発環境の準備
COURSERAでAndroidに関する新しいクラス”Programming Mobile Applications for Android Handheld Systems: Part1"を受講する。
Android用アプリの開発環境の準備。MacOSに環境を構築する。Android Studioを以下のリンクからダウンロードしてクリックするだけで、インストールは終了。Amazonがこのクラスをサポートしているようで無料で電子書籍が入手できる。Androidアプリの開発者を増やしたいのだろうか。なかなか興味深い。
http://developer.android.com/sdk
インストール方法を解説したビデオ。
Android Studioのインストールが完了し、ソフトを立ち上げる。
設定を進めていく。
JDKの設定を行い、インストールタイプはスタンダードにしておく。
ライセンスに同意して、
設定を進めていくが、コンポーネントのDownload中にトラブル発生。
sys-img-x86-addon-google_apis-google-22に関するエラーが発生。なんどやってもここで中断されてしまう。
少し調べるとここで同じ問題について議論がされている。
http://stackoverflow.com/questions/27376465/android-studio-doesnt-start-fails-saying-components-not-installed
MacOSX向けにいくつか解決策が挙げられていて、Android Studioがあるディレクトリで
$ sudo ./studio
などを実行するも上手くいかず。
他のコメントとして、インストールタイプを"Standard"から”Custom"へ変更するというものがあり、これを試す。また始めからやり直し。UIはデフォルトにしておく。
コンポーネントは一応全部インストールすることにする。
エミュレータの設定はデフォルのままにする。
ライセンスに同意する。
ダウンロード&インストール開始。
今度は問題なくインストールが終了し、
無事に起動!
メモ
** Macでのプリントスクリーン **
全画面”commandキー”と”shiftキー” と ”3”を同時に押す
選択領域”commandキー”と”shiftキー”と”4”を同時に押し、領域を選択
アクティブなウィンドウ”commandキー” と”shiftキー”と”4”を同時に押し、”spaceキー” でウインドウを確定し クリック
Android用アプリの開発環境の準備。MacOSに環境を構築する。Android Studioを以下のリンクからダウンロードしてクリックするだけで、インストールは終了。Amazonがこのクラスをサポートしているようで無料で電子書籍が入手できる。Androidアプリの開発者を増やしたいのだろうか。なかなか興味深い。
http://developer.android.com/sdk
インストール方法を解説したビデオ。
Android Studioのインストールが完了し、ソフトを立ち上げる。
設定を進めていく。
JDKの設定を行い、インストールタイプはスタンダードにしておく。
ライセンスに同意して、
設定を進めていくが、コンポーネントのDownload中にトラブル発生。
sys-img-x86-addon-google_apis-google-22に関するエラーが発生。なんどやってもここで中断されてしまう。
少し調べるとここで同じ問題について議論がされている。
http://stackoverflow.com/questions/27376465/android-studio-doesnt-start-fails-saying-components-not-installed
MacOSX向けにいくつか解決策が挙げられていて、Android Studioがあるディレクトリで
$ sudo ./studio
などを実行するも上手くいかず。
他のコメントとして、インストールタイプを"Standard"から”Custom"へ変更するというものがあり、これを試す。また始めからやり直し。UIはデフォルトにしておく。
コンポーネントは一応全部インストールすることにする。
エミュレータの設定はデフォルのままにする。
ライセンスに同意する。
ダウンロード&インストール開始。
今度は問題なくインストールが終了し、
無事に起動!
メモ
** Macでのプリントスクリーン **
全画面”commandキー”と”shiftキー” と ”3”を同時に押す
選択領域”commandキー”と”shiftキー”と”4”を同時に押し、領域を選択
アクティブなウィンドウ”commandキー” と”shiftキー”と”4”を同時に押し、”spaceキー” でウインドウを確定し クリック
Rubyではじめるシステムトレード7
書籍"Rubyではじめるシステムトレード”にあるトレードシミュレーションサンプルスクリプトをPan Active Market Databaseの株価データを使って動かすことを目指している。
ここまでで1銘柄に対して取引シミュレーションができるようになった。
https://fanblogs.jp/systemtradelab/archive/26/0
さらに動作チェックをすすめていく。サンプルスクリプト"simulation_check.rb"を以下の太字のように変更し、Pan Active Market Databaseから株価が取得できるように変更する。
”simulation_check.rb”
# coding: Windows-31J
require "./lib/simulation"
require "./lib/base"
require "./lib/pan_database_to_stock"
text_to_stock =
PanDatabaseToStock.new(stock_list: "./data/tosho_list.txt")
estrangement_system =
TradingSystem.new(entries: EstrangementEntry.new(span: 20, rate: 5),
exits: [StopOutExit.new,
EstrangementExit.new(span: 20, rate: 3)],
stops: AverageTrueRangeStop.new(span: 20),
filters: MovingAverageDirectionFilter.new(span: 30))
recorder = Recorder.new
recorder.record_dir = "result/estrangement/test_simulation"
simulation =
Simulation.new(trading_system: estrangement_system,
data_loader: text_to_stock,
recorder: recorder)
recorder.create_record_folder
#simulation.simulate_a_stock(8604) コメントにする
simulation.simulate_all_stocks
また、
https://fanblogs.jp/systemtradelab/archive/25/0
で作成したスクリプトの中のprint文を以下のように少し修正したものを実行して、出力を”tosho_list.txt"にリダイレクトする。
print(i,",", prices.Name,",",100,"\n")
これで”tosho_list.txt"内の全銘柄が、”証券コード, 証券名, 100”という形になった。値100は取引株数だと思われるが、今はスクリプトを動かすことを目指しているので特に意味は無い。
"tosho_list.txt"
641,日経・東工取商品指数,100
1001,日経225,100
1002,TOPIX(東証指数),100
1003,NYドル円,100
1007,東京米ドル円,100
1008,東京ユーロ円,100
1009,東京英ポンド円,100
1013,東京豪ドル円,100
1061,-- unregistered --,100
1062,-- unregistered --,100
1063,-- unregistered --,100
1301,極洋,100
1305,ダイワTOPIX ETF,100
1306,野村TOPIX ETF,100
1308,日興TOPIX ETF,100
1309,上海株式指数・上証50ETF,100
1310,ダイワコア30ETF,100
1311,野村コア30ETF,100
1312,ラッセル野村小型コアETF,100
1313,KODEX200ETF,100
1314,-- unregistered --,100
1316,TOPIX100日本大型株,100
1317,TOPIXMid400日本中型株,100
1318,TOPIX Small日本小型株,100
1319,日経300 ETF,100
1320,ダイワ225 ETF,100
1321,野村225 ETF,100
1322,中国A株(パンダ)CSI300,100
1323,NEXT南アフリカ株ETF,100
1324,NEXTロシア株ETF,100
1325,NEXTブラジル株ETF,100
1326,SPDRゴールド・シェア,100
1327,-- unregistered --,100
...
これをdataフォルダ内に保存。
早速変更したスクリプトを実行してみる。
$ ruby check/simuation_check.rb
実行すると
”記録フォルダ result/estrangement/test_simulationは存在しません。新しく作りますか? y/n"
というメッセージが出る。
yと入力すると処理が始まる。
証券コードとデータの順番?のようなものが次々と出力されていく。およそ25分で全部の処理が終了。現在では取引されていないような銘柄もあるはずだが、特にエラーも出ない。
result/estrangement/test_simulation以下に大量のcsvファイルが作成される。
"証券コード".csvには取引履歴が出力されるようだ。例えば野村8604は以下のようになっている。
"8604.csv"
取引種別,入日付,入値,数量,初期ストップ,出日付,出値,損益(円),R倍数,%損益,期間
long,2006/01/19,2040,100,1963,2006/01/27,2285,24500,3.1818181818181817,12.009803921568627,7
short,2006/08/16,2200,100,2258,2006/08/17,2295,-9500,-1.6379310344827587,-4.318181818181818,2
long,2006/09/15,2125,100,2075,2006/09/20,2070,-5500,-1.1,-2.588235294117647,3
long,2006/09/21,2065,100,2015,2006/09/28,2125,6000,1.2,2.9055690072639226,6
short,2006/12/07,2095,100,2149,2006/12/15,2175,-8000,-1.4814814814814814,-3.8186157517899764,7
long,2007/10/26,1858,100,1784,2007/10/30,2005,14700,1.9864864864864864,7.911733046286329,3
short,2008/02/18,1625,100,1703,2008/02/19,1699.0,-7400.0,-0.9487179487179487,-4.5538461538461545,2
short,2008/02/20,1697,100,1772,2008/02/26,1800,-10300,-1.3733333333333333,-6.069534472598703,5
long,2008/03/10,1535,100,1464,2008/03/11,1452,-8300,-1.1690140845070423,-5.407166123778501,2
short,2008/04/03,1643,100,1716,2008/04/04,1716,-7300,-1.0,-4.443091905051735,2
short,2008/04/07,1687,100,1761.0,2008/04/10,1562,12500,1.6891891891891893,7.409602845287493,4
short,2008/07/25,1648,100,1706,2008/07/29,1530,11800,2.0344827586206895,7.160194174757281,3
short,2008/09/11,1471,100,1521,2008/09/12,1443,2800,0.56,1.9034670292318152,2
short,2008/09/25,1470,100,1546,2008/09/30,1300,17000,2.236842105263158,11.564625850340136,4
short,2008/10/16,1281,100,1389,2008/10/17,1270,1100,0.10185185185185185,0.858704137392662,2
short,2008/12/22,700,100,747,2008/12/22,747,-4700,-1.0,-6.714285714285714,1
short,2008/12/24,737,100,784,2009/01/09,728,900,0.19148936170212766,1.2211668928086838,10
long,2009/01/21,616,100,580,2009/02/02,585,-3100,-0.8611111111111112,-5.032467532467533,9
short,2009/03/16,474,100,497,2009/03/17,497,-2300,-1.0,-4.852320675105485,2
short,2009/03/18,519,100,543,2009/03/23,543,-2400,-1.0,-4.624277456647398,3
short,2009/03/24,557,100,582,2009/04/01,505,5200,2.08,9.33572710951526,7
long,2009/07/09,731,100,695,2009/07/13,692,-3900,-1.0833333333333333,-5.33515731874145,3
short,2009/07/28,820,100,851,2009/08/06,783,3700,1.1935483870967742,4.512195121951219,8
short,2009/10/21,671,100,708,2009/10/28,644,2700,0.7297297297297297,4.023845007451564,6
short,2009/12/04,691,100,714,2009/12/07,714,-2300,-1.0,-3.3285094066570187,2
long,2010/02/01,684,100,661,2010/02/03,709,2500,1.0869565217391304,3.654970760233918,3
long,2010/02/04,683,100,659,2010/02/04,659,-2400,-1.0,-3.513909224011713,1
long,2010/09/02,475,100,461,2010/09/07,479,400,0.2857142857142857,0.8421052631578947,4
short,2010/10/15,450,100,467,2010/10/18,422,2800,1.6470588235294117,6.222222222222222,2
short,2011/10/18,294,100,306,2011/10/20,285,900,0.75,3.061224489795918,3
short,2011/12/06,260,100,273,2011/12/16,253,700,0.5384615384615384,2.6923076923076925,9
long,2012/04/05,352,100,339,2012/04/11,339,-1300,-1.0,-3.6931818181818183,5
short,2012/06/19,277,100,288,2012/06/21,288,-1100,-1.0,-3.9711191335740073,3
long,2012/07/17,266,100,257,2012/07/23,255,-1100,-1.2222222222222223,-4.135338345864661,5
long,2012/09/06,261,100,252,2012/09/07,277,1600,1.7777777777777777,6.130268199233716,2
long,2012/10/16,270,100,260,2012/10/17,282,1200,1.2,4.444444444444445,2
long,2013/05/31,819,100,773,2013/05/31,773,-4600,-1.0,-5.616605616605617,1
long,2013/06/03,750,100,703,2013/06/04,703,-4700,-1.0,-6.266666666666667,2
long,2013/06/05,769,100,716,2013/06/05,716,-5300,-1.0,-6.8920676202860855,1
long,2013/06/11,762,100,708,2013/06/20,742,-2000,-0.37037037037037035,-2.6246719160104988,8
short,2013/07/05,785,100,817,2013/07/08,820,-3500,-1.09375,-4.45859872611465,2
short,2013/07/09,808,100,838,2013/07/26,801,700,0.23333333333333334,0.8663366336633664,13
long,2013/07/30,740,100,717,2013/08/05,784,4400,1.9130434782608696,5.9459459459459465,5
long,2013/08/08,746,100,723,2013/08/12,723,-2300,-1.0,-3.0831099195710454,3
short,2013/09/13,758,100,778,2013/09/18,778,-2000,-1.0,-2.638522427440633,3
long,2013/10/08,710,100,691,2013/10/11,762,5200,2.736842105263158,7.323943661971831,4
short,2014/05/23,650,100,668,2014/05/26,668,-1800,-1.0,-2.769230769230769,2
long,2014/10/02,634,100,621,2014/10/07,622,-1200,-0.9230769230769231,-1.8927444794952681,4
short,2014/11/04,750,100,766,2014/11/27,714,3600,2.25,4.8,17
short,2015/02/17,676,100,691,2015/02/18,691,-1500,-1.0,-2.2189349112426036,2
さらにまとめのようなファイル_statscsvと_stats_for_each_stock.csvも作成される。全取引の結果とそれぞれの銘柄の取引の結果か。
"_stats.csv"
総損益,勝ち数,負け数,分け数,勝率,平均損益,PF,総R倍数,平均R倍数,総損益率,平均損益率,平均期間
942170400.0,64598,70414,2067,0.4712465074883826,6873.19283041166,1.221749837707064,10910.583575992398,0.07959339925147103,47779.89816438704,0.3485573878156905,4.139364891777734
"_stats_for_each_stock.csv"
コード,総損益,勝ち数,負け数,分け数,勝率,平均損益,PF,総R倍数,平均R倍数,総損益率,平均損益率,平均期間
641,900,2,2,0,0.5,225.0,1.6428571428571428,1.7857142857142856,0.4464285714285714,3.318503747846525,0.8296259369616312,2.5
1001,-112700,4,6,0,0.4,-11270.0,0.48040571692023976,-3.058369321253692,-0.3058369321253692,-7.637992947887919,-0.7637992947887919,3.3
1002,4000,3,3,0,0.5,666.6666666666666,1.3846153846153846,1.4213941314230611,0.23689902190384352,4.18282578274235,0.6971376304570583,3.1666666666666665
1301,8200.0,9,5,0,0.6428571428571429,585.7142857142857,2.74468085106383,9.066806722689076,0.6476290516206483,34.86498987808188,2.4903564198629913,3.9285714285714284
1305,5200,3,3,0,0.5,866.6666666666666,1.52,1.7162747162747163,0.28604578604578607,5.4942369821917545,0.9157061636986258,3.3333333333333335
1306,3500,3,3,0,0.5,583.3333333333334,1.2991452991452992,1.2553061284969178,0.20921768808281963,4.110838660527872,0.6851397767546453,4.333333333333333
1308,9300,4,2,0,0.6666666666666666,1550.0,2.1772151898734178,3.3225490196078433,0.5537581699346406,9.438062935948395,1.5730104893247325,4.5
1309,1038000,10,7,1,0.5555555555555556,57666.666666666664,2.5492537313432835,9.24437917542577,0.5135766208569872,36.4675963188846,2.025977573271367,4.333333333333333
1310,17100,7,3,0,0.7,1710.0,4.053571428571429,8.702810347547189,0.8702810347547189,22.852670747864895,2.2852670747864896,3.6
1311,7000,5,3,0,0.625,875.0,2.4,3.8293491881878614,0.4786686485234827,6.32970433100028,0.791213041375035,3.375
1312,-16000,3,4,0,0.42857142857142855,-2285.714285714286,0.8933333333333333,0.7277826465062871,0.10396894950089816,0.7333184041556025,0.10475977202222893,4.0
1313,-41200,10,15,0,0.4,-1648.0,0.5447513812154696,-8.928404176253718,-0.3571361670501487,-29.998989083879202,-1.199959563355168,3.64
1314,-18100,3,7,0,0.3,-1810.0,0.31954887218045114,-5.662408424908425,-0.5662408424908425,-15.20820345215637,-1.520820345215637,3.5
1316,-8500,1,7,0,0.125,-1062.5,0.16666666666666666,-4.369165302782324,-0.5461456628477905,-11.809797358516334,-1.4762246698145418,3.25
1317,-15900,4,8,0,0.3333333333333333,-1325.0,0.5152439024390244,-1.8136186541750687,-0.1511348878479224,-11.377717636534255,-0.9481431363778546,4.333333333333333
1318,-12400,2,5,0,0.2857142857142857,-1771.4285714285713,0.31868131868131866,-1.9203296703296704,-0.27433281004709575,-9.402738876322628,-1.3432484109032325,4.857142857142857
1319,200.0,6,8,0,0.42857142857142855,14.285714285714286,1.0363636363636364,2.4189560439560434,0.1727825745682888,1.63513675260198,0.11679548232871285,3.5
1320,0,5,5,0,0.5,0.0,1.0,-0.5001055329413537,-0.050010553294135375,1.8164753436824732,0.18164753436824732,3.4
...
これはすごい...
ここまでで1銘柄に対して取引シミュレーションができるようになった。
https://fanblogs.jp/systemtradelab/archive/26/0
さらに動作チェックをすすめていく。サンプルスクリプト"simulation_check.rb"を以下の太字のように変更し、Pan Active Market Databaseから株価が取得できるように変更する。
”simulation_check.rb”
# coding: Windows-31J
require "./lib/simulation"
require "./lib/base"
require "./lib/pan_database_to_stock"
text_to_stock =
PanDatabaseToStock.new(stock_list: "./data/tosho_list.txt")
estrangement_system =
TradingSystem.new(entries: EstrangementEntry.new(span: 20, rate: 5),
exits: [StopOutExit.new,
EstrangementExit.new(span: 20, rate: 3)],
stops: AverageTrueRangeStop.new(span: 20),
filters: MovingAverageDirectionFilter.new(span: 30))
recorder = Recorder.new
recorder.record_dir = "result/estrangement/test_simulation"
simulation =
Simulation.new(trading_system: estrangement_system,
data_loader: text_to_stock,
recorder: recorder)
recorder.create_record_folder
#simulation.simulate_a_stock(8604) コメントにする
simulation.simulate_all_stocks
また、
https://fanblogs.jp/systemtradelab/archive/25/0
で作成したスクリプトの中のprint文を以下のように少し修正したものを実行して、出力を”tosho_list.txt"にリダイレクトする。
print(i,",", prices.Name,",",100,"\n")
これで”tosho_list.txt"内の全銘柄が、”証券コード, 証券名, 100”という形になった。値100は取引株数だと思われるが、今はスクリプトを動かすことを目指しているので特に意味は無い。
"tosho_list.txt"
641,日経・東工取商品指数,100
1001,日経225,100
1002,TOPIX(東証指数),100
1003,NYドル円,100
1007,東京米ドル円,100
1008,東京ユーロ円,100
1009,東京英ポンド円,100
1013,東京豪ドル円,100
1061,-- unregistered --,100
1062,-- unregistered --,100
1063,-- unregistered --,100
1301,極洋,100
1305,ダイワTOPIX ETF,100
1306,野村TOPIX ETF,100
1308,日興TOPIX ETF,100
1309,上海株式指数・上証50ETF,100
1310,ダイワコア30ETF,100
1311,野村コア30ETF,100
1312,ラッセル野村小型コアETF,100
1313,KODEX200ETF,100
1314,-- unregistered --,100
1316,TOPIX100日本大型株,100
1317,TOPIXMid400日本中型株,100
1318,TOPIX Small日本小型株,100
1319,日経300 ETF,100
1320,ダイワ225 ETF,100
1321,野村225 ETF,100
1322,中国A株(パンダ)CSI300,100
1323,NEXT南アフリカ株ETF,100
1324,NEXTロシア株ETF,100
1325,NEXTブラジル株ETF,100
1326,SPDRゴールド・シェア,100
1327,-- unregistered --,100
...
これをdataフォルダ内に保存。
早速変更したスクリプトを実行してみる。
$ ruby check/simuation_check.rb
実行すると
”記録フォルダ result/estrangement/test_simulationは存在しません。新しく作りますか? y/n"
というメッセージが出る。
yと入力すると処理が始まる。
証券コードとデータの順番?のようなものが次々と出力されていく。およそ25分で全部の処理が終了。現在では取引されていないような銘柄もあるはずだが、特にエラーも出ない。
result/estrangement/test_simulation以下に大量のcsvファイルが作成される。
"証券コード".csvには取引履歴が出力されるようだ。例えば野村8604は以下のようになっている。
"8604.csv"
取引種別,入日付,入値,数量,初期ストップ,出日付,出値,損益(円),R倍数,%損益,期間
long,2006/01/19,2040,100,1963,2006/01/27,2285,24500,3.1818181818181817,12.009803921568627,7
short,2006/08/16,2200,100,2258,2006/08/17,2295,-9500,-1.6379310344827587,-4.318181818181818,2
long,2006/09/15,2125,100,2075,2006/09/20,2070,-5500,-1.1,-2.588235294117647,3
long,2006/09/21,2065,100,2015,2006/09/28,2125,6000,1.2,2.9055690072639226,6
short,2006/12/07,2095,100,2149,2006/12/15,2175,-8000,-1.4814814814814814,-3.8186157517899764,7
long,2007/10/26,1858,100,1784,2007/10/30,2005,14700,1.9864864864864864,7.911733046286329,3
short,2008/02/18,1625,100,1703,2008/02/19,1699.0,-7400.0,-0.9487179487179487,-4.5538461538461545,2
short,2008/02/20,1697,100,1772,2008/02/26,1800,-10300,-1.3733333333333333,-6.069534472598703,5
long,2008/03/10,1535,100,1464,2008/03/11,1452,-8300,-1.1690140845070423,-5.407166123778501,2
short,2008/04/03,1643,100,1716,2008/04/04,1716,-7300,-1.0,-4.443091905051735,2
short,2008/04/07,1687,100,1761.0,2008/04/10,1562,12500,1.6891891891891893,7.409602845287493,4
short,2008/07/25,1648,100,1706,2008/07/29,1530,11800,2.0344827586206895,7.160194174757281,3
short,2008/09/11,1471,100,1521,2008/09/12,1443,2800,0.56,1.9034670292318152,2
short,2008/09/25,1470,100,1546,2008/09/30,1300,17000,2.236842105263158,11.564625850340136,4
short,2008/10/16,1281,100,1389,2008/10/17,1270,1100,0.10185185185185185,0.858704137392662,2
short,2008/12/22,700,100,747,2008/12/22,747,-4700,-1.0,-6.714285714285714,1
short,2008/12/24,737,100,784,2009/01/09,728,900,0.19148936170212766,1.2211668928086838,10
long,2009/01/21,616,100,580,2009/02/02,585,-3100,-0.8611111111111112,-5.032467532467533,9
short,2009/03/16,474,100,497,2009/03/17,497,-2300,-1.0,-4.852320675105485,2
short,2009/03/18,519,100,543,2009/03/23,543,-2400,-1.0,-4.624277456647398,3
short,2009/03/24,557,100,582,2009/04/01,505,5200,2.08,9.33572710951526,7
long,2009/07/09,731,100,695,2009/07/13,692,-3900,-1.0833333333333333,-5.33515731874145,3
short,2009/07/28,820,100,851,2009/08/06,783,3700,1.1935483870967742,4.512195121951219,8
short,2009/10/21,671,100,708,2009/10/28,644,2700,0.7297297297297297,4.023845007451564,6
short,2009/12/04,691,100,714,2009/12/07,714,-2300,-1.0,-3.3285094066570187,2
long,2010/02/01,684,100,661,2010/02/03,709,2500,1.0869565217391304,3.654970760233918,3
long,2010/02/04,683,100,659,2010/02/04,659,-2400,-1.0,-3.513909224011713,1
long,2010/09/02,475,100,461,2010/09/07,479,400,0.2857142857142857,0.8421052631578947,4
short,2010/10/15,450,100,467,2010/10/18,422,2800,1.6470588235294117,6.222222222222222,2
short,2011/10/18,294,100,306,2011/10/20,285,900,0.75,3.061224489795918,3
short,2011/12/06,260,100,273,2011/12/16,253,700,0.5384615384615384,2.6923076923076925,9
long,2012/04/05,352,100,339,2012/04/11,339,-1300,-1.0,-3.6931818181818183,5
short,2012/06/19,277,100,288,2012/06/21,288,-1100,-1.0,-3.9711191335740073,3
long,2012/07/17,266,100,257,2012/07/23,255,-1100,-1.2222222222222223,-4.135338345864661,5
long,2012/09/06,261,100,252,2012/09/07,277,1600,1.7777777777777777,6.130268199233716,2
long,2012/10/16,270,100,260,2012/10/17,282,1200,1.2,4.444444444444445,2
long,2013/05/31,819,100,773,2013/05/31,773,-4600,-1.0,-5.616605616605617,1
long,2013/06/03,750,100,703,2013/06/04,703,-4700,-1.0,-6.266666666666667,2
long,2013/06/05,769,100,716,2013/06/05,716,-5300,-1.0,-6.8920676202860855,1
long,2013/06/11,762,100,708,2013/06/20,742,-2000,-0.37037037037037035,-2.6246719160104988,8
short,2013/07/05,785,100,817,2013/07/08,820,-3500,-1.09375,-4.45859872611465,2
short,2013/07/09,808,100,838,2013/07/26,801,700,0.23333333333333334,0.8663366336633664,13
long,2013/07/30,740,100,717,2013/08/05,784,4400,1.9130434782608696,5.9459459459459465,5
long,2013/08/08,746,100,723,2013/08/12,723,-2300,-1.0,-3.0831099195710454,3
short,2013/09/13,758,100,778,2013/09/18,778,-2000,-1.0,-2.638522427440633,3
long,2013/10/08,710,100,691,2013/10/11,762,5200,2.736842105263158,7.323943661971831,4
short,2014/05/23,650,100,668,2014/05/26,668,-1800,-1.0,-2.769230769230769,2
long,2014/10/02,634,100,621,2014/10/07,622,-1200,-0.9230769230769231,-1.8927444794952681,4
short,2014/11/04,750,100,766,2014/11/27,714,3600,2.25,4.8,17
short,2015/02/17,676,100,691,2015/02/18,691,-1500,-1.0,-2.2189349112426036,2
さらにまとめのようなファイル_statscsvと_stats_for_each_stock.csvも作成される。全取引の結果とそれぞれの銘柄の取引の結果か。
"_stats.csv"
総損益,勝ち数,負け数,分け数,勝率,平均損益,PF,総R倍数,平均R倍数,総損益率,平均損益率,平均期間
942170400.0,64598,70414,2067,0.4712465074883826,6873.19283041166,1.221749837707064,10910.583575992398,0.07959339925147103,47779.89816438704,0.3485573878156905,4.139364891777734
"_stats_for_each_stock.csv"
コード,総損益,勝ち数,負け数,分け数,勝率,平均損益,PF,総R倍数,平均R倍数,総損益率,平均損益率,平均期間
641,900,2,2,0,0.5,225.0,1.6428571428571428,1.7857142857142856,0.4464285714285714,3.318503747846525,0.8296259369616312,2.5
1001,-112700,4,6,0,0.4,-11270.0,0.48040571692023976,-3.058369321253692,-0.3058369321253692,-7.637992947887919,-0.7637992947887919,3.3
1002,4000,3,3,0,0.5,666.6666666666666,1.3846153846153846,1.4213941314230611,0.23689902190384352,4.18282578274235,0.6971376304570583,3.1666666666666665
1301,8200.0,9,5,0,0.6428571428571429,585.7142857142857,2.74468085106383,9.066806722689076,0.6476290516206483,34.86498987808188,2.4903564198629913,3.9285714285714284
1305,5200,3,3,0,0.5,866.6666666666666,1.52,1.7162747162747163,0.28604578604578607,5.4942369821917545,0.9157061636986258,3.3333333333333335
1306,3500,3,3,0,0.5,583.3333333333334,1.2991452991452992,1.2553061284969178,0.20921768808281963,4.110838660527872,0.6851397767546453,4.333333333333333
1308,9300,4,2,0,0.6666666666666666,1550.0,2.1772151898734178,3.3225490196078433,0.5537581699346406,9.438062935948395,1.5730104893247325,4.5
1309,1038000,10,7,1,0.5555555555555556,57666.666666666664,2.5492537313432835,9.24437917542577,0.5135766208569872,36.4675963188846,2.025977573271367,4.333333333333333
1310,17100,7,3,0,0.7,1710.0,4.053571428571429,8.702810347547189,0.8702810347547189,22.852670747864895,2.2852670747864896,3.6
1311,7000,5,3,0,0.625,875.0,2.4,3.8293491881878614,0.4786686485234827,6.32970433100028,0.791213041375035,3.375
1312,-16000,3,4,0,0.42857142857142855,-2285.714285714286,0.8933333333333333,0.7277826465062871,0.10396894950089816,0.7333184041556025,0.10475977202222893,4.0
1313,-41200,10,15,0,0.4,-1648.0,0.5447513812154696,-8.928404176253718,-0.3571361670501487,-29.998989083879202,-1.199959563355168,3.64
1314,-18100,3,7,0,0.3,-1810.0,0.31954887218045114,-5.662408424908425,-0.5662408424908425,-15.20820345215637,-1.520820345215637,3.5
1316,-8500,1,7,0,0.125,-1062.5,0.16666666666666666,-4.369165302782324,-0.5461456628477905,-11.809797358516334,-1.4762246698145418,3.25
1317,-15900,4,8,0,0.3333333333333333,-1325.0,0.5152439024390244,-1.8136186541750687,-0.1511348878479224,-11.377717636534255,-0.9481431363778546,4.333333333333333
1318,-12400,2,5,0,0.2857142857142857,-1771.4285714285713,0.31868131868131866,-1.9203296703296704,-0.27433281004709575,-9.402738876322628,-1.3432484109032325,4.857142857142857
1319,200.0,6,8,0,0.42857142857142855,14.285714285714286,1.0363636363636364,2.4189560439560434,0.1727825745682888,1.63513675260198,0.11679548232871285,3.5
1320,0,5,5,0,0.5,0.0,1.0,-0.5001055329413537,-0.050010553294135375,1.8164753436824732,0.18164753436824732,3.4
...
これはすごい...
2015年05月06日
Rubyではじめるシステムトレード6
書籍"Rubyではじめるシステムトレード”のシステムトレードシミュレーションのサンプルコードを、Pan Active Market Databaseより株価を取得して、動かすことを目指している。
以下のようにRubyで
https://fanblogs.jp/systemtradelab/archive/25/0
Pan Active Market Databaseの証券名と証券コードの一覧が取得できたので、これを新たに"tosho_list.txt"としてdataフォルダに保存する。そして証券コードと証券名の間にコロン、さらに証券名の後にコロンを付け加え、数値(例えば100)を以下のように付け加える。トレードシミュレーションスクリプトでは、この数値が取引株数として、読み込まれるようだ。
"tosho_list.txt"
…
8573 三洋信販
8574 プロミス
8577 ロプロ(日栄)
8579 東京リース
8583 三菱UFJニコス(日本信販)
8584 ジャックス
8585 オリコ
8586 日立キャピタル
8588 セントラルファイナンス
8589 アプラスフィナンシャル
8591 オリックス
8592 住商リース
8593 三菱UFJリース
8595 ジャフコ
8597 SFCG(商工ファンド)
8599 UFJセントラルリース
8600 トモニHD
8601 大和証券G本社
8603 日興コーディアルG
8604,野村HD(野村證券),100
8606 新光証券
8607 みずほインベスターズ証券
8609 岡三証券HD(岡三証券)
8611 コスモ証券(大阪屋証券)
8613 丸三証券
8614 東洋証券
8615 三菱UFJ証券(国際証券)
8616 東海東京証券(東京証券)
8617 光世証券
8621 UFJつばさ証券
8622 水戸証券
8623 SMBCフレンド証券(明光)
8624 いちよし証券(一吉証券)
8625 高木証券
8628 松井証券
8630 損保ジャパン日本興亜HD
8634 JPモルガン・チェース
8637 オーストラリア銀行
8640 トロントドミニオン銀行
8641 ウエストパック銀行
8642 バークレイズ
8648 バンクオブアメリカ
8651 ドイツ銀行
…
書籍のサンプルコード"trading_system_check.rb"を本の記述に基づいて、Pan Active Data Baseから株価を取得するように、以下の太字のように変更した。
# coding: Windows-31J
require "./lib/trading_system"
require "./lib/base"
require "./lib/pan_database_to_stock"
require "pp"
@data = PanDatabaseToStock.new(stock_list: "./data/tosho_list.txt")
@trading_system =
TradingSystem.new(entries: EstrangementEntry.new(span: 20, rate: 5),
exits: [StopOutExit.new,
EstrangementExit.new(span:20, rate: 3)],
stops: AverageTrueRangeStop.new(span: 20),
filters: MovingAverageDirectionFilter.new(span: 30))
def simulate(code)
stock = @data.generate_stock(code)
@trading_system.set_stock(stock)
@trading_system.calculate_indicators
trade = nil
trades = []
stock.prices.size.times do |i|
if trade
@trading_system.set_stop(trade, i)
trade.length += 1
end
unless trade
trade = @trading_system.check_entry(i)
trade.volume = stock.unit if trade
end
if trade
@trading_system.check_exit(trade, i)
if trade.closed?
trades << trade
trade = nil
end
end
end
trades
end
trades = simulate(8604)
pp trades
puts
trades.each {|trade| puts trade.profit}
puts 総資産 #{trades.map {|trade| trade.profit}.sum}"
このスクリプトを実行すると、
$ ruby .check/trading_system_check.rb
トレードの履歴が出力される。@volumeの値が、上記のようにtosho_list.txt内の証券名の横に挿入した取引株数と思われる。
そしてトレードによる資産の変動が正常に出力されるようになった。
書籍の条件(野村8604、2010年1月から2011年8月)で実行をして結果を比較したいのだが、トレード期間の指定方法がわからない。証券コードを変えれば、シミュレーションのようなことができそうだ。確かに”なかなかの感動”がある。
とうとうシミュレーションスクリプトが動くようになってきた!
課題
以下のようにRubyで
https://fanblogs.jp/systemtradelab/archive/25/0
Pan Active Market Databaseの証券名と証券コードの一覧が取得できたので、これを新たに"tosho_list.txt"としてdataフォルダに保存する。そして証券コードと証券名の間にコロン、さらに証券名の後にコロンを付け加え、数値(例えば100)を以下のように付け加える。トレードシミュレーションスクリプトでは、この数値が取引株数として、読み込まれるようだ。
"tosho_list.txt"
…
8573 三洋信販
8574 プロミス
8577 ロプロ(日栄)
8579 東京リース
8583 三菱UFJニコス(日本信販)
8584 ジャックス
8585 オリコ
8586 日立キャピタル
8588 セントラルファイナンス
8589 アプラスフィナンシャル
8591 オリックス
8592 住商リース
8593 三菱UFJリース
8595 ジャフコ
8597 SFCG(商工ファンド)
8599 UFJセントラルリース
8600 トモニHD
8601 大和証券G本社
8603 日興コーディアルG
8604,野村HD(野村證券),100
8606 新光証券
8607 みずほインベスターズ証券
8609 岡三証券HD(岡三証券)
8611 コスモ証券(大阪屋証券)
8613 丸三証券
8614 東洋証券
8615 三菱UFJ証券(国際証券)
8616 東海東京証券(東京証券)
8617 光世証券
8621 UFJつばさ証券
8622 水戸証券
8623 SMBCフレンド証券(明光)
8624 いちよし証券(一吉証券)
8625 高木証券
8628 松井証券
8630 損保ジャパン日本興亜HD
8634 JPモルガン・チェース
8637 オーストラリア銀行
8640 トロントドミニオン銀行
8641 ウエストパック銀行
8642 バークレイズ
8648 バンクオブアメリカ
8651 ドイツ銀行
…
書籍のサンプルコード"trading_system_check.rb"を本の記述に基づいて、Pan Active Data Baseから株価を取得するように、以下の太字のように変更した。
# coding: Windows-31J
require "./lib/trading_system"
require "./lib/base"
require "./lib/pan_database_to_stock"
require "pp"
@data = PanDatabaseToStock.new(stock_list: "./data/tosho_list.txt")
@trading_system =
TradingSystem.new(entries: EstrangementEntry.new(span: 20, rate: 5),
exits: [StopOutExit.new,
EstrangementExit.new(span:20, rate: 3)],
stops: AverageTrueRangeStop.new(span: 20),
filters: MovingAverageDirectionFilter.new(span: 30))
def simulate(code)
stock = @data.generate_stock(code)
@trading_system.set_stock(stock)
@trading_system.calculate_indicators
trade = nil
trades = []
stock.prices.size.times do |i|
if trade
@trading_system.set_stop(trade, i)
trade.length += 1
end
unless trade
trade = @trading_system.check_entry(i)
trade.volume = stock.unit if trade
end
if trade
@trading_system.check_exit(trade, i)
if trade.closed?
trades << trade
trade = nil
end
end
end
trades
end
trades = simulate(8604)
pp trades
puts
trades.each {|trade| puts trade.profit}
puts 総資産 #{trades.map {|trade| trade.profit}.sum}"
このスクリプトを実行すると、
$ ruby .check/trading_system_check.rb
トレードの履歴が出力される。@volumeの値が、上記のようにtosho_list.txt内の証券名の横に挿入した取引株数と思われる。
そしてトレードによる資産の変動が正常に出力されるようになった。
書籍の条件(野村8604、2010年1月から2011年8月)で実行をして結果を比較したいのだが、トレード期間の指定方法がわからない。証券コードを変えれば、シミュレーションのようなことができそうだ。確かに”なかなかの感動”がある。
とうとうシミュレーションスクリプトが動くようになってきた!
課題
- シミュレーションスクリプトのトレード期間の設定方法の理解
Rubyでの例外処理
Pan Active Market Databaseで、証券コードと証券名の一覧が出力されるRubyのスクリプトを作成した。証券名を出力させるにはReadメソッドで証券コードを指定した後、Nameメソッドを実行する。しかしReadメソッドは、指定した証券コードに該当する証券がないと、エラーが発生する(code C1010010)。証券コードを総当りで変化させていく時に、エラーが出ては途中でプログラムが中断してしまうので、例外処理を”Rubyではじめるシステムトレード”を参考に記述した。Rubyでの例外処理は、begin ~ rescue ~ endのような構造である。コードは以下のとおりで、
require "win32ole"
calendar = WIN32OLE.new("ActiveMarket.Calendar")
prices = WIN32OLE.new("ActiveMarket.Prices")
CANT_READ = /C1010010/
for i in 500..10000
begin
prices.Read(i)
rescue WIN32OLERuntimeError => e
next if e.message =~ CANT_READ
raise
end
print(i," ", prices.Name,"\n")
end
641の日経・東工取商品指数から9997のベルーナまで、これで証券名と証券コードの対応がわかるようになった。
require "win32ole"
calendar = WIN32OLE.new("ActiveMarket.Calendar")
prices = WIN32OLE.new("ActiveMarket.Prices")
CANT_READ = /C1010010/
for i in 500..10000
begin
prices.Read(i)
rescue WIN32OLERuntimeError => e
next if e.message =~ CANT_READ
raise
end
print(i," ", prices.Name,"\n")
end
641の日経・東工取商品指数から9997のベルーナまで、これで証券名と証券コードの対応がわかるようになった。