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
【このカテゴリーの最新記事】
-
no image
-
no image
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/3653193
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック