Python

株探、みん株からスクレイピングして本日の高騰銘柄を分析する方法

Python

株探、みん株からスクレイピングして本日の高騰銘柄を分析する方法を解説します。

以下のURLからそれぞれ必要な情報をスクレイピングして、本日の高騰銘柄のPER,PBRに何か特徴がないか把握することを目的とします。

結論

分析結果より、東証の銘柄であれば、以下の銘柄の中から投資するのが良い。

  • PBR:1倍以下
  • PER:15倍前後

スクレイピングとは?

コンピュータ, コンピューター, コンピューター技術, ルーム, 技術, インターネット, キーボード, 仕事

スクレイピングに関しては、こちらの記事を参考にしてみてください。

robots.txtの確認

スクレイピングしていいサイトかどうかを確認します。

株探

株探のスクレイピングは/94446337/以外はOKですね。

User-agent: *

Sitemap: https://kabutan.jp/sitemap-index.xml

Disallow: /94446337/
https://kabutan.jp/robots.txt

みん株

みん株は、/financial_item_ranking/アクセスするのですが、禁止されていないですね。

User-Agent: *

Allow: /
Sitemap: https://assets.minkabu.jp/concerns/sitemap/sitemap.xml.gz
Sitemap: https://assets.minkabu.jp/concerns/sitemap/news/sitemap.xml.gz
Sitemap: https://minkabu.jp/hikaku/sitemap.xml
Sitemap: https://minkabu.jp/beginner/sitemap.xml

Disallow: /user/follow/
Disallow: /user/unfollow/
Disallow: /user/add_favorite_user/
Disallow: /user/add_favorite_stock/
Disallow: /user/add_respect_user/
Disallow: /user/switch/
Disallow: /user/resign/
Disallow: /message/to/
Disallow: /blog/edit
Disallow: /stocks/pick/open_form
Disallow: /stock/*/community/edit
Disallow: /simulation/simple/start
Disallow: /community/join/
Disallow: /groups/topic/edit
Disallow: /invite/group/
Disallow: /home
Disallow: /top/report/
Disallow: /94446337/
Disallow: /hikaku/redirect/
https://minkabu.jp/robots.txt

目的/解析方法

技術, 情報, デジタル, ビジネス, 近代的な, 通信, コンセプト, コンピュータ, インターネット

目的

本日の高騰銘柄のPER,PBRに何か特徴がないか把握することを目的とします。

  • 例えば、現在の高騰銘柄は、高PERの企業が多いなどです。

解析方法

本日の高騰銘柄は、「株探」の「本日の株価上昇率ランキング」よりスクレイピングします。
スクレイピングした企業のPBR、PERに何か特徴がないか分析するために、「みん株」のPBRランキングとPERランキングから東証の企業の全データを抽出します。

環境構築

  • Anacondaのインストール方法
  • requestsBeautifulSoupのインストール方法

スクレイピングのコード

株探からスクレイピング

  • requestsBeautifulSoupをインポート
  • pandasnumpyのインポート
  • url = requests.get(urlName+page)で”https://kabutan.jp/warning/?mode=2_1&market=1&capitalization=-1&stc=&stm=0&page=”にpageの数字を追加して、スクレイピングする。これはランキングのページが複数にまたがっているため
  • tableデータを抽出し、pandasDataFrameに変換
import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np

files = []
urlName = "https://kabutan.jp/warning/?mode=2_1&market=1&capitalization=-1&stc=&stm=0&page="
def table(soup):
    # セレクタ(タグ:table、クラス:test)
    table = soup.findAll("table",class_="stock_table st_market")[0]
    trs = table.findAll("tr")
    data_files = []
    for tr in trs:
        data = []
        # 1行ごとにtd, tr要素のデータを取得してCSVに書き込み
        for cell in tr.findAll(['td', 'th']):
            data.append(cell.get_text().replace("\n",""))
        data_files.append(data)
    return data_files
for i in range(20):
    page =  str(i+1)
    url = requests.get(urlName+page)
    soup = BeautifulSoup(url.content, "html.parser")
    if i+1 ==1:
        df_all_pages = pd.DataFrame(table(soup))
    else:
        df_new_page = pd.DataFrame(table(soup))
        df_new_page = df_new_page.drop([0] , axis=0)
        df_all_pages = pd.concat([df_all_pages , df_new_page])    

df = pd.DataFrame(df_all_pages)
df = df.reset_index() 
df = df.drop(0 , axis=0)
df.columns = ["","コード","銘柄名","市場","","","株価","S高","前日との差","前日比","出来高","PER","PBR","利回り"]

#データ整形
df = df.drop(["",""], axis=1)
df = df.replace('-', 0)
#floatに変換
df["PER"]= df["PER"].astype("float")
df["PBR"]= df["PBR"].astype("float")

#一旦0にしたあとに0のデータを欠損値にする
df["PER"]= df["PER"].replace(0, np.nan)#欠損値に変換
df["PBR"]= df["PBR"].replace(0, np.nan)#欠損値に変換

ヒストグラムで可視化

PERの可視化結果
import matplotlib.pyplot as plt
%matplotlib inline

# ヒストグラムを出力
plt.hist(df["PER"] , range = (0,40), bins=300 )
本日の急騰企業のPER
PBRの可視化結果
# ヒストグラムを出力
plt.hist(df["PBR"] , range = (0,5), bins=300 )
本日の急騰企業のPBR

みん株からスクレイピング

PERの可視化結果

#per
files = []
urlName = "https://minkabu.jp/financial_item_ranking/per?exchange=tokyo&order=desc&page="
def table(soup):
    # セレクタ(タグ:table、クラス:test)
    table = soup.findAll("table",class_="md_table")[0]
    trs = table.findAll("tr")
    data_files = []
    for tr in trs:
        data = []
        # 1行ごとにtd, tr要素のデータを取得してCSVに書き込み
        for cell in tr.findAll(['td', 'th']):
            data.append(cell.get_text().replace("\n",""))
        data_files.append(data)
    return data_files
for i in range(152):#確認したら152ページだった
    page =  str(i+1)
    url = requests.get(urlName+page)
    soup = BeautifulSoup(url.content, "html.parser")
    if i +1==1:
        df_all_per = pd.DataFrame(table(soup))
    else:
        df_new_per = pd.DataFrame(table(soup))
        df_new_per = df_new_per.drop([0] , axis=0)
        df_all_per = pd.concat([df_all_per , df_new_per])    

df_per = pd.DataFrame(df_all_per)
df_per_n = df_per
df_per_n = df_per.drop(0 , axis=0)
df_per_n.columns = ["順位","銘柄名","現在値","PER","目標株価"]
df_per_n = df_per_n.reset_index() 
df_per_n = df_per_n.drop(['index'],axis = 1)
df_per_n["PER"]  = df_per_n["PER"].str.replace('倍', '')
df_per_n["PER"]  = df_per_n["PER"].str.replace(',', '')
df_per_n["PER"] = df_per_n["PER"].astype("float")
東証の企業のPER

PBRの可視化結果

files = []
urlName = "https://minkabu.jp/financial_item_ranking/pbr?exchange=tokyo&order=desc&page="
def table(soup):
    # セレクタ(タグ:table、クラス:test)
    table = soup.findAll("table",class_="md_table")[0]
    trs = table.findAll("tr")
    data_files = []
    for tr in trs:
        data = []
        # 1行ごとにtd, tr要素のデータを取得してCSVに書き込み
        for cell in tr.findAll(['td', 'th']):
            data.append(cell.get_text().replace("\n",""))
        data_files.append(data)
    return data_files
for i in range(182):#確認したら182ページだった
    page =  str(i+1)
    url = requests.get(urlName+page)
    soup = BeautifulSoup(url.content, "html.parser")
    if i +1==1:
        df_all_pbr = pd.DataFrame(table(soup))
    else:
        df_new_pbr = pd.DataFrame(table(soup))
        df_new_pbr = df_new_pbr.drop([0] , axis=0)
        df_all_pbr = pd.concat([df_all_pbr , df_new_pbr])    

df_pbr = pd.DataFrame(df_all_pbr)

#データ整形
df_pbr_n = df_pbr
df_pbr_n = df_pbr.drop(0 , axis=0)
df_pbr_n.columns = ["順位","銘柄名","現在値","PBR","目標株価"]
df_pbr_n = df_pbr_n.reset_index() 
df_pbr_n = df_pbr_n.drop(['index'],axis = 1)
df_pbr_n["PBR"]  = df_pbr_n["PBR"].str.replace('倍', '')
df_pbr_n["PBR"] = df_pbr_n["PBR"].astype("float")

# ヒストグラムを出力
plt.hist(df_pbr_n["PBR"],range=(0,5), bins=100)
東証の企業のPBR

分析

正規化して、PERとPBRをそれぞれ比較してみる。

コード

  • density = Trueで正規化
def per_plot(x_1,x_2):
    plt.title("per") 
    plt.xlabel('per')
    plt.ylabel('num')
    plt.hist(x_1,alpha=0.5,label='1',range=(0,100), bins=100,density = True) 
    plt.hist(x_2,alpha=0.5,label='2',range=(0,100), bins=100,density = True) 
    plt.legend()
    plt.show()

def pbr_plot(x_1,x_2):
    plt.title("pbr") 
    plt.xlabel('pbr')
    plt.ylabel('num')
    plt.hist(x_1,alpha=0.5,label='1',range=(0,10), bins=100,density = True) 
    plt.hist(x_2,alpha=0.5,label='2',range=(0,10), bins=100,density = True) 
    plt.legend()
    plt.show()

per_plot(df_per_n["PER"],df["PER"] )
pbr_plot(df_pbr_n["PBR"],df["PBR"] )

ヒストグラムの結果

  • 本日の高騰銘柄は、東証全企業のPERと比較して5程度高い企業が多い
  • PER15前後の企業が本日の急騰銘柄には多い
  • PBRは1倍以下に本日の急騰銘柄には多い

PER

  • 青:東証全企業のPER
  • オレンジ:本日の高騰銘柄のPER
画像に alt 属性が指定されていません。ファイル名: image-49.png

PBR

  • 青:東証全企業のPBR
  • オレンジ:本日の高騰銘柄のPBR
画像に alt 属性が指定されていません。ファイル名: image-50.png

まとめ

今は、東証の銘柄であれば、以下の銘柄の中から投資するのが良い。

  • PBR1倍以下
  • PER15倍前後

なぜなら、本日の急騰銘柄と市場全体のPERとPBRをヒストグラムより比較すると以下の傾向が確認されたためです。

  • 本日の高騰銘柄は、東証全企業のPERと比較して5程度高い企業が多い
  • PER15前後の企業が本日の急騰銘柄には多い
  • PBRは1倍以下に本日の急騰銘柄には多い

Pythonについてもっと学びたい方は以下の記事も参考にしてみてください。

株式投資についてもっと学びたい方は以下の記事も参考にしてみてください。

コメント

  1. […] 株探、みん株からスクレイピングして本日の高騰銘柄を分析する方法株探、みん株からスクレイピングして本日の高騰銘柄を分析する方法を解説します。以下のURLからそれぞれ必要な情 […]

タイトルとURLをコピーしました