概要

PBR等で割安な株を抽出するために単独決算推移を取得するプログラムを作成する。手始めにアルゴリズムのチェックとしてPerlにより、ダウンロードされたhtmlファイルより単独決算情報推移を抜き出し標準出力に出力するプログラムを作ってみた。

2007/10/02 22:50

昨日、確認したところYahoo!ファイナンスのページの構成が変わっていたため、読み込みできなくなりました。

2007/05/04 AM12:51

二次元配列の代わりににハッシュを使ってみた。文字コードはeuc形式でcsv形式で出力される。Windowsで取り込むにはSJISに変換しなければならない。FedoraCore6のOpenOfficeならばeuc形式で読み込みできる。jcode.plが必要。

実行方法

./kabu_s.sh 7203 7203.csv

出力

トヨタ自動車 (株)
7203
単独決算推移,前期 ,2期前 ,3期前 
決算年月日,2006年3月期,2005年3月期,2004年3月期
(決算発表日),2006年5月10日,2005年5月10日,2004年5月11日
決算月数 ,12か月,12か月,12か月
売上高,10191838000000,9218386000000,8963712000000
営業利益,847998000000,701390000000,833791000000
経常利益,1104781000000,856231000000,915728000000
当期利益 ,765961000000,529329000000,581470000000
1株当り当期利益,235.20,160.38,171.08
調整1株当り利益,235.13,160.35,171.06
1株当り配当,90.00,65.00,45.00
配当区分, , , 
1株当り株主資本,2062.51,1853.42,1796.75
発行済み株式総数,3241757000,3268078000,3330470000
総資産,9909010000000,9070991000000,8817164000000
株主資本,6686895000000,6057810000000,5984675000000
資本金,397049000000,397049000000,397049000000
有利子負債,500000000000,500600000000,500600000000
繰越損益,584710000000,512778000000,497867000000
株主資本比率,67.5,66.8,67.9
含み損益,---,---,---
ROA,8.07,5.92,6.68
ROE,12.02,8.79,9.95
総資産経常利益率,11.64,9.57,10.52
,,,

OpenOfficeに取り込んだ状態

プログラム

#! /usr/local/bin/perl
# Yahoo!ファイナンス企業情報より単独決算推移を取得する

require 'jcode.pl';

$f=0;
$d=",";
$cram=1;
$cram_max=0;
$row_top=0;
$row=0;


%str;

while(<STDIN>){
	chomp;
	if($f==1){
		if(/<TD BGCOLOR="#ffffff" WIDTH="20%" ALIGN="CENTER">/){	# 前期 2期前 3期前
			s/<TD BGCOLOR="#ffffff" WIDTH="20%" ALIGN="CENTER">//;
			s/<\/TD>//;
			$key=sprintf("%02i %02i",$cram,$row_top);
			$str{$key}=$_;
			$cram++;
			$cram_max++;
		}
		if(/<TD BGCOLOR="#ffffff" NOWRAP VALIGN="TOP">/){
			$cram=0;
			$row_top++;
			$row=0;
			$f=2;
		}
	}else{
		if($f==2){ # 決算年月日,決算発表日,決算月数
			s/<BR>//;
			s/<\/TD>//;
			if(/<TD BGCOLOR="#ffffff" NOWRAP ALIGN="RIGHT" VALIGN="TOP">/){
				$f=3;
				$cram=1;
				$row=0;
			}else{
				if($_ ne ""){
					$key=sprintf("%02i %02i",$cram,$row_top+$row);
					$str{$key}=$_;
					$row++;
				}
			}
		}else{
			if($f==3){
				if(/<TD BGCOLOR="#ffffff" NOWRAP ALIGN="RIGHT" VALIGN="TOP">/){
					$f=3;
					$cram++;
					$row=0;
				}else{
					if(/<TD BGCOLOR="#ffffff" NOWRAP VALIGN="TOP">/){
						$f=3;
						$cram=0;
				$row_top+=$row;
						$row=0;
					}else{
						if(/<\/TABLE>/){
							print $name,"\n";
							print $code,"\n";	# 企業名と証券コードを表示
							for my $i( 0 .. $row_top+$row ){
							    for $j ( 0 .. $cram_max){
									$key=sprintf("%02i %02i",$j,$i);
									print $str{$key};
									if($j != $cram_max){
										printf $d;
									}
							    }
							   print "\n";
							}
							
							exit;
						}else{
							s/<BR>//;
							s/<\/TD>//;
							s/<\/TR>//;
							s/<TR>//;
							if($_ ne ""){
								$key=sprintf("%02i %02i",$cram,$row_top+$row);
								if(0 < $cram){
									s/百/00/;
									s/万/0000/;
									s/,//;
									s/,//;
									s/千/000/;
									s/円//;
									s/株//;
									s/%//;
								}
								$str{$key}=$_;
								$row++;
							}
						}
					}
				}
			}
		}
	}
	if($f==0){
		if(/<FONT size=/){	# 企業名(コード)
			s/\<FONT size=//g;
			s/\"\+1\"//g;
			s/>//g;
			s/\<B//g;
			s/\<\/B\<\/FONT//g;
			/[0-9]{4}/;
			$code=$&;
			$name=$`;
			jcode::tr(\$name, '()','{}');
			$name=~ s/{//g;
			$name=~ s/^ //g;
			push @str,$name;
		}
		if(/<TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="2">/){
			$f=1;
			$key=sprintf("%02i %02i",0,0);
			$str{$key}="単独決算推移";
		}
	}
}

実行ファイルとソースファイルのダウンロード

2007/05/03 PM11:35

二次元配列をうまく扱えなかったので、下記のような出力ができるプログラムを作ってみた。実行環境はFedoraCore6(Perl 5.8+jcode.pl)である。

実行方法

wget http://profile.yahoo.co.jp/biz/independent/7203.html
perl test.pl < 7203.htm

出力

0	トヨタ自動車 (株)
1	7203
0	単独決算推移
1	前期 
2	2期前 
3	3期前 
0	決算年月日
0	(決算発表日)
0	決算月数 
1	2006年3月期
1	2006年5月10日
1	12か月
2	2005年3月期
2	2005年5月10日
2	12か月
3	2004年3月期
3	2004年5月11日
3	12か月
0	売上高
0	営業利益
0	経常利益
0	当期利益 
1	10,191,838百万円
1	847,998百万円
1	1,104,781百万円
1	765,961百万円
2	9,218,386百万円
2	701,390百万円
2	856,231百万円
2	529,329百万円
3	8,963,712百万円
3	833,791百万円
3	915,728百万円
3	581,470百万円
0	1株当り当期利益
0	調整1株当り利益
0	1株当り配当
0	配当区分
0	1株当り株主資本
1	235.20円
1	235.13円
1	90.00円
1	 
1	2,062.51円
2	160.38円
2	160.35円
2	65.00円
2	 
2	1,853.42円
3	171.08円
3	171.06円
3	45.00円
3	 
3	1,796.75円
0	発行済み株式総数
0	総資産
0	株主資本
0	資本金
0	有利子負債
0	繰越損益
0	株主資本比率
0	含み損益
0	ROA
0	ROE
0	総資産経常利益率
1	3,241,757千株
1	9,909,010百万円
1	6,686,895百万円
1	397,049百万円
1	500,000百万円
1	584,710百万円
1	67.5%
1	---
1	8.07%
1	12.02%
1	11.64%
2	3,268,078千株
2	9,070,991百万円
2	6,057,810百万円
2	397,049百万円
2	500,600百万円
2	512,778百万円
2	66.8%
2	---
2	5.92%
2	8.79%
2	9.57%
3	3,330,470千株
3	8,817,164百万円
3	5,984,675百万円
3	397,049百万円
3	500,600百万円
3	497,867百万円
3	67.9%
3	---
3	6.68%
3	9.95%
3	10.52%

プログラム

#! /usr/local/bin/perl
# Yahoo!ファイナンス企業情報より単独決算推移を取得する

require 'jcode.pl';

$f=0;
$d="\t";
$cram=1;
$str_tbl[0][0]="";

while(<STDIN>){
	chomp;
	if($f==1){
		if(/<TD BGCOLOR="#ffffff" WIDTH="20%" ALIGN="CENTER">/){	# 前期 2期前 3期前
			s/<TD BGCOLOR="#ffffff" WIDTH="20%" ALIGN="CENTER">//;
			s/<\/TD>//;
			print $cram,$d,$_,"\n";
#			$str_tbl[$row[$cram]++,$cram]=$_;
			$cram++;
		}
		if(/<TD BGCOLOR="#ffffff" NOWRAP VALIGN="TOP">/){
			$cram=0;
			$f=2;
		}
	}else{
		if($f==2){ # 決算年月日,決算発表日,決算月数
			s/<BR>//;
			s/<\/TD>//;
			if(/<TD BGCOLOR="#ffffff" NOWRAP ALIGN="RIGHT" VALIGN="TOP">/){
				$f=3;
				$cram=1;
			}else{
				if($_ ne ""){		
					print "0",$d,$_,"\n";
#					$str_tbl[$row[0]++,0]=$_;
				}
			}
		}else{
			if($f==3){
				if(/<TD BGCOLOR="#ffffff" NOWRAP ALIGN="RIGHT" VALIGN="TOP">/){
					$f=3;
					$cram++;
				}else{
					if(/<TD BGCOLOR="#ffffff" NOWRAP VALIGN="TOP">/){
						$f=3;
						$cram=0;
					}else{
						if(/<\/TABLE>/){
#							print "row=",$row[0],"\n";
#							print "row=",$row[1],"\n";
#							print $str_tbl[0][0],"\n";
#							foreach $row (@stb_tbl){
#								foreach $t ( @{ $row } ){
#									print $t,$d;
#								}
#								print "\n";
#							}
							#for my $i( 0 .. $#str_tbl ){
							#    for $j ( 0...$#{$str_tbl[$i]} ){
							#	   print "$i $j : $str_tbl[$i][$j]\n";
							#    }
							#}
							exit;
						}else{
							s/<BR>//;
							s/<\/TD>//;
							s/<\/TR>//;
							s/<TR>//;
							if($_ ne ""){
								print $cram,$d,$_,"\n";
#								$str_tbl[$row[$cram]++,$cram]=$_;
							}
						}
					}
				}
			}
		}
	}
	if($f==0){
		if(/<FONT size=/){	# 企業名(コード)
			s/\<FONT size=//g;
			s/\"\+1\"//g;
			s/>//g;
			s/\<B//g;
			s/\<\/B\<\/FONT//g;
			/[0-9]{4}/;
			$code=$&;
			$name=$`;
			jcode::tr(\$name, '()','{}');
			$name=~ s/{//g;
			$name=~ s/^ //g;
			print "0",$d,$name,"\n";
			print "1",$d,$code,"\n";	# 企業名と証券コードを表示
#			$str_tbl[$row[0]++,0]=$name;
#			$str_tbl[$row[1]++,1]=$code;
#			push @str_tbl[0],$name;
		}
		if(/<TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="2">/){
			$f=1;
			print "0",$d,"単独決算推移\n";
#			$str_tbl[$row[0]++,0]="単独決算推移";
		}
	}
}