ラベル php の投稿を表示しています。 すべての投稿を表示
ラベル php の投稿を表示しています。 すべての投稿を表示

2017年1月4日水曜日

日経平均株価の過去の4本値データの取得

日経225平均株価の過去の4本値データが欲しかったので探した。Yahooファイナンス等の無料でダウンロードできるようなサイトもあるが、データの信頼性に疑問が残る。日経平均株価を算出している日本経済新聞社のサイトにヒストリカルデータが掲載されていたのでこれを利用することにする。

日本経済新聞社の日経平均株価ヒストリカルデータのURLは以下の通り。

http://indexes.nikkei.co.jp/nkave/archives/data

1949年5月16日から掲載されているので東京証券取引所が「東証修正平均株価」を算出開始した時からの全データが存在するようだ。途中までは終値のみの掲載ではあるが。

掲載されているのは良いのだが、CSV形式でダウンロードできるとかではなく、サイト上に月毎に掲載されているので利用し難い。そこでPHPでこのページを読み込み日経平均の4本値データを取り出すプログラムを作成してみた。

プログラムは以下の通り。Webスクレイピング部のみの抜粋。

    $dt = new DateTime();
    if ( $ym != NULL ) {
      $year = intval( substr( $ym, 0, 4 ) );
      $month = intval( substr( $ym, 4, 2 ) );
      $dt->setDate( $year, $month, 1 );
    }
    $year = $dt->format( 'Y' );
    $month = $dt->format( 'n' );

    // 日経平均算出開始(1949年5月16日)からのデータ
    $url = 'http://indexes.nikkei.co.jp/nkave/statistics/dataload?list=daily&year=' . $year . '&month=' . $month;
    echo "$url". PHP_EOL;

    //  Windows8.1 IE11
    $useragent = "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko";
    ini_set( 'user_agent', $useragent );
    $dom = new DOMDocument('1.0', 'UTF-8');
    libxml_use_internal_errors( true );
    $dom->loadHTMLfile( $url );
    $xpath = new DOMXPath( $dom );
    $tr = $xpath->query( '//tr' );
    for ( $idx = 1; $idx < $tr->length; $idx++ ) {
      $td = $xpath->query( './td', $tr->item($idx) );
      echo $td->item(0)->nodeValue . ", " . $td->item(1)->nodeValue . ", "
         . $td->item(2)->nodeValue . ", " . $td->item(3)->nodeValue . ", "
         . $td->item(4)->nodeValue . PHP_EOL;
    }

    echo "Complete." . PHP_EOL . PHP_EOL;

変数$ymに取り出したい年月を設定して呼び出すと、その年月の日経平均4本値データを「,」区切りで標準出力に出力。

DOMDocumentでページを読み込んで、DOMXPathを使ってHTMLをパースしてます。CentOSでの実行には「php-xml」パッケージのインストールが必要。

実際にはDBに登録するようにし、cronから起動して使ってます。

2016年11月6日日曜日

久々の東証の空売り集計(空売り比率)の取り込み失敗

前回(東証の空売り集計(空売り比率)ページの年月日がおかしい)の修正からしばらく動いていたが、また取り込みが失敗。原因はやはり空売り集計のPDFファイルのファイル名の形式。今度は年月日の後についているはずの"-"が無いパターン。

正規表現を利用するようにして今まで現れた全てのパターンに対応するように修正。

プログラムを手動で実行してみると動きました。空売り集計(空売り比率)のデータ取り込み完了。

しかし次々と新たに現れるPDFファイルのファイル名の形式。去年というか今年の8月初めまではずっと同一パターンだったのに8月以降どうなっているのだろう?うっかりものの担当者が手作業で間違えているだけなのだろうか。迷惑なのでしっかり仕事して欲しいものだ。

2016年8月29日月曜日

東証の空売り集計(空売り比率)ページの年月日がおかしい

8月10日の東京証券取引所が公表している空売り集計を取り込みが失敗から始まって今月は何度も取り込みが失敗している。原因はやはり空売り集計のPDFファイルのファイル名の日付(年月日)部分。時々月と日の間に"0"が入るパターンになる。

しかたがないのでPHPのプログラムを両方のパターンに対応するように修正。

プログラムを手動で実行してみると動きました。空売り集計(空売り比率)のデータ取り込み完了。

参考までに8月で今日までで月と日の間に"0"が入っていつ日は
 2016年08月10日(水)
 2016年08月17日(水)
 2016年08月23日(火)
 2016年08月29日(月)
の4日間。この日付に何か意味があるのだろうか?相場の動きと何らかの関係があるのだろうか?知ってる人がいたら教えて。

2016年8月12日金曜日

また東証の空売り集計(空売り比率)の取り込みが失敗

8月10日の東京証券取引所が公表している空売り集計を取り込みが失敗していたので修正したのだが、予定通り(?)8月12日も失敗している。

やはり空売り集計のPDFファイルのファイル名を見つけられていない。空売り集計のPDFファイルのファイル名のパターンが元(月と日の間に"0"が入っていない)に戻っている。

PHPのプログラムの修正を元に戻す。

$dt->format( 'ym0d' )

$dt->format( 'ymd' )

と変更。

プログラムを手動で実行してみると動きました。空売り集計(空売り比率)のデータ取り込み完了。

8月10日分の空売り集計のPDFファイルのファイル名が間違いだったということだね。現在も8月10日分の空売り集計のPDFファイルは"1508010-m.pdf"のままだが、このまま放置するのかな。

参考までに今月に入ってからの空売り比率の推移は
 2016年08月01日(月) 41.4%
 2016年08月02日(火) 42.0%
 2016年08月03日(水) 43.6%
 2016年08月04日(木) 43.7%
 2016年08月05日(金) 42.2%
 2016年08月08日(月) 39.7%
 2016年08月09日(火) 39.0%
 2016年08月10日(水) 40.0%
 2016年08月12日(金) 38.7%

日経平均が17,000円に近付いてきたのに空売り比率は低下傾向。まだまだ上を目指しているということか。

2016年8月11日木曜日

東証の空売り集計(空売り比率)の取り込みが失敗していた

PHPでプログラムを作成して東京証券取引所が公表している空売り集計を取り込んでいたのだが、8月10日分が失敗していた。cronで月曜から金曜の16時10分に動くように設定しているのだが、これまでも東証側の公表が遅れて失敗することがあった。が、今回は原因が違うようだ。データ取り込みプログラムを手動で起動しても失敗する。

調べるしかないので調査。

PHPプログラムでやっていることの流れは
 1)curlで東証の空売り集計ページの読み込み
 2)空売り集計のPDFファイルのファイル名特定
 3)curlで空売り集計のPDFファイル読み込み
 4)pdftotextでPDFファイルをテキストに変換してデータ取り出し
 5)データのDB登録
という感じ。

調べてみると空売り集計のPDFファイルのファイル名を見つけられていないようだ。次期デリバティブ売買システム(J-GATE)稼動時には、東京証券取引所が公表している先物の取引参加者別建玉残高、取引参加者別取引高のファイルの中身が大きく変わっていたが・・・今回は何も変わっていないように見える。でも、動かない。ん・・・分からない。困った。

と思っていると、違いに気付いた。空売り集計のPDFファイルのファイル名が今までのパターンと違っている。今までは"150809-m.pdf"だったのに、8月10日は"1508010-m.pdf"だ。月と日の間に"0"が入っている。

これなら修正は簡単。

$dt->format( 'ymd' )

$dt->format( 'ym0d' )

と変更。修正箇所は1行のみ。

修正したプログラムを手動で実行してみる。動きました。空売り集計(空売り比率)のデータ取り込めたよ。

しかしだ、これおかしいよね?東証のミスだよなあ。月と日の間に"0"が入るなんて。というか、なぜこんな間違いをするんだ?もしかして東証って、手作業でデータ公表しているのか?だから公表される時間にバラツキがあるのか。