Perlで簡単データ加工

2000年7月2日記

はじめに

株ソフトを運用する場合、最大の難点は日々データの確保でしょう。 文字放送レシーバで取得したり、インターネット上の 合法サイトに 掲載されているページからデータを抽出したりというのが定石です。 これらの方法では、当日のデータは取得できますが、当日取得でき なかった時、過去に遡ってデータを取得することはできません。

合法な過去データは、例えば、東洋経済から購入できます。 東洋経済の株価CD-ROM は、過去11年分で9.8万円もします。しかも、株価CD-ROMを購入 したとしても、このデータを自分が使用している株ソフトが読み込み 可能なフォーマットに変換する必要があります。これは一般ユーザには 難しいかも。

非合法なデータでよければ、株ソフトを販売しているシェアウエア作者から 購入するという手はありますが...この場合、対象のシェアウエアで すぐに使える形式になっているので、素人には便利ですが、データほしさに 1000円級シェアウエアを2万円とかで購入するというのも考えもの。 2年分程度のデータがついてくる場合もあるので、データ代という考えも できるが...

でも、未来永劫までデータ供給が保証されている訳ではありませんし、例えば、 シェアウエア作者が事故か病気になっただけで、データの供給は止まります。

それにしても、非合法データを売っている連中はどういう神経をしているのだろうか。 テレビから音楽を録音してMP3でエンコードして、自分の「ホームページ」 (Webサイトにあらず)で売るようなのりなのか。はたまた市販パッケージソフト をCD-Rで焼いて秋葉原の路上でキャッチ販売するようなのりなのか。 まぁ、所詮は、それに群がるユーザあってのこと。

それじゃ、シェアウエア作者のお世話にならず、もっともらしい会社組織のサイト で日々データを公開しているとことから、入手したらどうだろう。 例えば、 パンローリング株価データ情報 など。

もっともらしい会社組織であっても、公開しているデータは合法データとは 限りません。合法データを不特定多数に公開するためには、相当のコストが かかるはずですから、無料で公開しているというのはどう考えても... もっとも、略記した銘柄名とかを入れなければ、合法データも非合法データも 区別つかないんですけどね。(「だから、公開されているデータは合法データ」 という論法は通用するのかな。)

これらのデータはテキスト形式なので、エディタなどで変換することは可能です。 ChartScapeのユーザにも「パンローリングのデータはどうやって変換するんですか?」 といった、まぬけなメールを出してくる輩がいまだにおります。 ChartScapeは、これらのデータを読み込むような「親切な」機能はありません。 (やろうとおもえば超簡単なのですが。)

しかし、このようなデータをかたくなに拒んでも、結局非合法データを売っている 連中を太らせるだけなので、簡単な変換方法を紹介しておきます。

やっと本題、Perlをインストール

まずは、Perlを入手する。ここで、Perlとはなんぞやとか、どこから入手したら よいのかなどの疑問がわいてくる方もおられるかも知れません。 このとき、バカの一つ覚えのように、本ページ作者に 「Perlって何ですか?」とか「Perlはどこから入手したらよいのですか?」などの メールをしようなどど考えている輩は、これ以上読み進めるのはやめてください。 検索サイトを使えば、Perlとは何でどこにあるのかはいくらでも探すことが できますし、本屋にいけば、Perlの本は腐るほどあります。 CD-ROM付きのPerl本の中から、よさそうなものを選ぶのがよいでしょう。

Macintoshの場合は、MacPerlの 最新バージョンを、ここ から入手。

で、入手したPerlをインストールする。 あとは、4本値+出来高程度の株データであれば、簡単な変換スクリプトを書くだけで変換できる。

例1:株取虫フォーマットから株取虫もどきフォーマットへの変換

株取虫フォーマットも、株取虫もどきフォーマットどちらもChartScapeで読み込むことができますので、この変換はあまり意味はないのですが、とりあえず、例としてとりあげます。

テキストエディタで以下のPerlスクリプトを作成し、"KD2DS.PL"という名前でセーブしてください。(名前は何でもよいのですが、拡張子はPerlスクリプトをあらわす .PLとしておいた方がよいでしょう。)

変換スクリプト1:KD2DS.PL

# /usr/bin/perl
@market{"東証1部", "東証2部", "大証", "名証", "店頭"} = (1,2,3,4,5) ;
open(INPUTFILE,  "KD20000612");
$n=0;
while(<INPUTFILE>){
    $n++;
}
$n = $n - 4 ;
seek(INPUTFILE, 0, 0);
open(OUTPUTFILE,  ">DS000612.DAT");
<INPUTFILE>;
<INPUTFILE>;
<INPUTFILE>;
<INPUTFILE>;
<INPUTFILE>;
print OUTPUTFILE "000612\n" ;
print OUTPUTFILE $n, "\n" ;
while(<INPUTFILE>){
    @rec = split;
    printf OUTPUTFILE "%d,%d,%s,%d,%d,%d,%d,%d\n",
    $rec[0], @market{$rec[1]}, $rec[2], $rec[3], $rec[4], $rec[5], $rec[6], $rec[7]/1000 ;
}
close(OUTPUTFILE);
close(INPUTFILE);

このスクリプトは、株取虫フォーマットのファイル"KD20000612"を読み込み、株取虫もどきフォーマットのファイル"DS0612.DAT"を出力します。

Macintoshの場合は、スクリプトファイル"KD2DS.PL"をMacPerlアイコンにドラッグし、ScriptメニューのRunにより、実行させます。一瞬で、(68kMacならばしばらくたった後)、株取虫もどきフォーマットのファイル"DS000612.DAT"が作成されます。

Windowsの場合は、DOS窓で、以下のコマンドを実行させます。はじめに、perl.exeのPATHが通しておいてください。


perl KD2DS.PL 

赤字のファイル名部分を変更すれば、別のファイルでも使用できます。

スクリプト実行の結果は、次のようになります。

変換元:KD20000612
株取虫 株価データ
2000年	6月	12日	12時	13分
銘柄数
エラー数	0
銘柄コード	市場	銘柄名	始値	高値	安値	終値	出来高
1001	東証1部	平均株価	16876	16920	16791	16920	0
1002	東証1部	TOPIX	1587	1587	1580	1586	0
1301	東証1部	極洋	148	151	147	149	262000
1331	東証1部	ニチロ	180	184	180	182	1199000
出力結果:DS000612.DAT
000612
4204
1001,1,平均株価,16876,16920,16791,16920,0
1002,1,TOPIX,1587,1587,1580,1586,0
1301,1,極洋,148,151,147,149,262
1331,1,ニチロ,180,184,180,182,1199

例2:syyyymmdd.txtから株取虫もどきフォーマットへの変換

変換スクリプト2:S2DS.PL

次の例は、syyyymmdd.txtのファイルを株取虫もどきフォーマットのファイルに変換します。 市場コードが常に0である点に注意してください。ChartScapeで読み込ませる場合は、 新規登録時しか、市場コードを銘柄辞書に反映させませんから、問題はありません。

市場コードも正しく設定するようなスクリプトを書くには、株取虫フォーマットのファイル 自身を辞書として読み込み、連想配列にでも格納しておけば、証券コードから市場を容易に 逆引きするスクリプトが書けます。本見ながらやってみるか、できなかったら 親戚の理系の学生でもつかまえて、1万円程バイト料を払って、作ってもらったら よいでしょう。

変換元:s19990712.txt
19990712
1001	日経平均	17921	18274	17843	18274	53300
1002	東証指数	1465	1485	1464	1484	53300
1003	円相場	12240	12240	12240	12240	0
1007	東京円相場	12237	12253	12199	12206	0
1301	極洋	180	185	176	185	193
出力結果:DS990712.DAT
990712
2242
1001,0,日経平均,17921,18274,17843,18274,53300
1002,0,東証指数,1465,1485,1464,1484,53300
1003,0,円相場,12240,12240,12240,12240,0
1007,0,東京円相場,12237,12253,12199,12206,0
1301,0,極洋,180,185,176,185,193

このスクリプトは次のようになります。

# /usr/bin/perl
open(INPUTFILE,  "s19990712.txt");
$n=0;
while(<INPUTFILE>){
    $n++;
}
$n = $n - 1 ;
seek(INPUTFILE, 0, 0);
open(OUTPUTFILE,  ">DS990712.DAT");
$date=<INPUTFILE>;
print OUTPUTFILE substr($date,2,6), "\n" ;
print OUTPUTFILE $n, "\n" ;
while(<INPUTFILE>){
    @rec = split;
    printf OUTPUTFILE "%d,%d,%s,%d,%d,%d,%d,%d\n",
    $rec[0], 0, $rec[1], $rec[2], $rec[3], $rec[4], $rec[5], $rec[6] ;
}
close(OUTPUTFILE);
close(INPUTFILE);

例3:CSVファイルから株取虫もどきフォーマットへの変換

変換スクリプト3:CSV2DS.PL

次の例は、CSVファイルを株取虫もどきフォーマットのファイルに変換します。

変換元:20000621.CSV
"取引年月日","銘柄コード","銘柄名","始値","高値","安値","終値","出来高"
"2000/06/21",1301,"極洋",151,154,150,154,209000
"2000/06/21",1331,"ニチロ",176,179,176,178,220000
"2000/06/21",1332,"日本水産",183,183,180,182,410000
"2000/06/21",1333,"マルハ",151,155,151,154,406000
出力結果:DS000621.DAT
000621
3437
1301,0,極洋,151,154,150,154,209
1331,0,ニチロ,176,179,176,178,220
1332,0,日本水産,183,183,180,182,410
1333,0,マルハ,151,155,151,154,406

このスクリプトは次のようになります。この例では、出来高の単位を1株から千株に変更しています。

# /usr/bin/perl
open(INPUTFILE,  "20000621.CSV");
$n=0;
while(<INPUTFILE>){
    $n++;
}
$n = $n - 1 ;
seek(INPUTFILE, 0, 0);
open(OUTPUTFILE,  ">DS000621.DAT");
<INPUTFILE>;
print OUTPUTFILE "000621\n" ;
print OUTPUTFILE $n, "\n" ;
while(<INPUTFILE>){
    @rec = split(/,/);
    printf OUTPUTFILE "%d,%d,%s,%d,%d,%d,%d,%d\n",
    $rec[1], 0, substr($rec[2],1, length($rec[2])-2), $rec[3], $rec[4], $rec[5], $rec[6], $rec[7]/1000 ;
}
close(OUTPUTFILE);
close(INPUTFILE);


1000円級シェアウエア:

「エディタ作りました!1000円のシェアウエアです。みなさん、使ってください!」 のようなのりのシェアウエア。 vectorにいっぱいあります。 私なりの定義をすれば、実開発工数が1人月未満のシェアウエアか。 株ソフトは、一見高そうに見えるかも知れませんが、本質は1000円級シェアウエア そのものでしょう。もちろん、ChartScapeも例外ではなく。

もっとも、もし、ChartScapeをシェアウエアにしたとしても、1000円の値段はつけず、 やはり2万円にするでしょうね。商売の鉄則は「取れるところから取る」。 1000円にしたとしても、2万円にしたときの20倍の売り上げは見込めませんから。 この世界、パイは小さいんです。

パイは小さいんですが、株ソフトは、1000円級シェアウエアを10倍〜100倍の値段で ふっかけられる、数少ないジャンルですので、これからも続々参入者は増えるでしょうね。 ここは、要チェックです。ここには、シェアウエア代金が6万円もするものもあるぞ!

たまたま購入したシェアウエア株ソフトが気に入らなくなっても、一般ユーザでは、 それまで蓄積したデータを、別の株ソフトにもっていけないでしょうから、選択は 慎重に。


戻る