AIとファイナンス

AIとファイナンスの架け橋、それがこのブログの目指すところです。兼業投資家向けに、Pythonを駆使して株やFXの分析を「自分で」行えるようになるための情報を提供します。ニューラルネットワークを活用した市場予測から、実証済みの金融理論まで、全てのコードを公開し、誰もが活用できるように!是非色々なコードで遊んでみてください!

【米国株】IPO企業の株価変動をスクレイピングして分析しよう!【Python】

皆さんこんにちは!今日は、ここ最近米国市場に上場した新興企業たちの株価の変動を調査し、そのデータを視覚化してみたいと思います。このようなデータは、新興企業の成長性や市場の反応を理解する上で非常に価値がありますよね。

しかし、問題はこのデータをどのように収集するかという点です。市場のデータを一つ一つ手作業で集めるのは非効率的で、時間もかかってしまいます。そこで今回は、Pythonスクレイピング技術を使って、IPO企業の株価データを自動で集める方法を皆さんにご紹介します。

スクレイピングとは?

スクレイピングとは、ウェブサイトから情報を収集する技術のことです。特定のパターンをもとに自動で情報を抽出し、それを分析しやすい形に整理します。この技術を使えば、大量のデータを迅速かつ正確に収集することができるのです。

Pythonを使ったスクレイピング

Pythonにはスクレイピングを簡単に行うためのライブラリがいくつかあります。今回はその中でも特に人気のあるrequestsとBeautifulSoupを使ってみます。requestsはウェブサイトへのアクセスを簡単に行い、BeautifulSoupはウェブページのHTMLを解析して必要なデータを抽出することができます。

実際にスクレイピングしてみよう

実際には、StockAnalysis.comにアクセスして、2020年以降にNasdaqIPOした企業のリストを取得します。このサイトには最新のIPO情報が定期的に更新されており、私たちのプロジェクトには欠かせない情報源となります。

では、以下にスクレイピングのサンプルコードを示しましょう。注意点として、スクレイピングはウェブサイトの利用規約に違反しないように行う必要があります。また、サーバーに負担をかけないよう、アクセスの間隔を適宜あけてくださいね。

 

ライブラリのインポート

まずは毎度おなじみですね!requestsとBeautifulSoupは、ウェブページからデータを取得し、HTMLを解析するために使用します。

import requests
import pandas as pd
from bs4 import BeautifulSoup
import re
from datetime import datetime

現在の年を取得し、年ごとのループを実行

今回のデータのダウンロード先は各年ごとにIPOした企業のTickerが載っていました。なのでPythonのdatetimeモジュールを使用して現在の年を取得します。取得した現在の年から遡って、過去の年ごとにURLにアクセスし、そのページが存在するかを確認します。

current_year = datetime.now().year # 現在の年を取得
data = []  # スクレイピングしたデータを保存するリスト

while True:
    url = f'https://stockanalysis.com/ipos/{current_year}/'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # ページが存在しない場合、ループを終了
    if response.status_code != 200:
        break 

データの抽出と保存

ページが存在する場合は、BeautifulSoupを使ってHTMLを解析し、'const data'を含むJavaScriptスクリプトタグを見つけます。そのスクリプトから、ティッカーシンボル(ticker)、IPO日(ipo_date)、企業名(name)、IPO価格(ipo_price)の情報を含む部分を正規表現を使って検索し、マッチした各部分から情報を抽出します。抽出したデータをリストに格納し、そのリストをpandas.DataFrameに変換します。最終的に、このデータフレームをCSVファイルとして保存します。

    # 'const data'が含まれているスクリプトタグを探す
    # DeprecationWarningを避けるために'string'を使用
    script = soup.find('script', string=lambda t: t and 'const data' in t)

    # スクリプトタグからデータ部分を抽出
    data_str = script.string.split('const data = ')[1].split(';')[0]

    # 正規表現を使用して、必要なデータを抽出
    pattern = r'\{s:"(?P<ticker>[^"]+)",ipoDate:"(?P<ipo_date>[^"]+)",n:"(?P<name>[^"]+)",ipoPrice:(?P<ipo_price>\d+\.?\d*)'
    matches = re.finditer(pattern, data_str)

    # 抽出したデータをリストに格納
    for match in matches:
      data.append(match.groupdict())
   
    current_year -= 1  # 次のループで前年のデータをチェック

# 最後に、全てのデータをDataFrameに変換し、CSVファイルとして保存
ipo_df = pd.DataFrame(data)
ipo_df.to_csv('ipo_data.csv', index=False)

結果

ご覧の通り、2019年以降2096社がIPOしたことがわかります。次回の記事ではこのデータを使って何か面白い発見が無いか見ていこうと思います。

いつも読んでいただきありがとうございます!是非クリックお願いします!

※注意事項

このコードは、指定されたウェブサイトの特定の年のIPO情報を自動的に収集し、整理する強力なツールです。ただし、スクレイピングは対象ウェブサイトの負荷に注意し、利用規約を遵守することが重要です。また、ウェブサイトの構造が変更されると、このスクリプトを更新する必要があるかもしれません。

 

参考サイト

200 Most Recent IPOs - Stock Analysis

https://www.crummy.com/software/BeautifulSoup/bs4/doc/