はじめに
この記事では、ある企業のニュース記事が掲載された際、良いニュースなのかどうかを判断させるための準備です。記事が掲載された後、株価の上昇が続いた場合はそのニュースは企業にとって「株価の上昇を期待できるニュース」である可能性があります(因果関係は特定できませんので可能性の発見までです)。このデータを集めていくことで「こういう内容のニュース記事が出るとその企業の株価が上昇することが多い」という傾向の予測につなげられそうです。
株価が上昇し始めた日付を調べる
ここでは一日の中での変動は気にせず、5日間連続で始値が上昇したらその企業にとって「株価上昇のきっかけがあった」と判断することにします。以下のsqliteデータベースがあるとします。 stock_data.dbはデータベースファイル名です。株価データを格納するテーブルが存在します。テーブルには、以下のカラムを持たせています。始値を基準にして、「銘柄と5日連続始値が上昇した最初の日付」を新しいテーブルとして作成して格納します。
import sqlite3
import pandas as pd
# データベースに接続
conn = sqlite3.connect("stock_data.db")
# データベースから株価データを取得
sql = "SELECT * FROM stock_table"
df = pd.read_sql_query(sql, conn)
# 日付でソート
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(by=['ticker', 'date'])
# 銘柄ごとに5日連続で始値が上昇しているかどうかを判定
df['is_rising'] = df.groupby('ticker')['open'].apply(lambda x: x.pct_change().gt(0)).rolling(5).apply(lambda x: x.all())
# 条件を満たす最初の日付を取得
result = df[df['is_rising']].groupby('ticker')['date'].min().reset_index()
# 結果を新しいテーブルに格納
result.to_sql("rising_stocks", conn, if_exists="replace", index=False)
# データベースとの接続を閉じる
conn.close()
このコードは、データベースから株価データを取得し、条件に基づいて新しいテーブルを作成し、そのテーブルにデータを格納します。指定された条件は、「銘柄と5日連続始値が上昇した最初の日付」です。このコードを実行することで、新しいテーブルrising_stocksに結果が格納されます。
ニュース記事の掲載日が株価上昇開始日と一致するか調べる
次に、企業名を含むニュース記事を参照します。rising_stocksテーブルと、企業コード、日付、ニュース記事本文が格納されたテーブル(ここではnews_tableとします)を結合し、「株価上昇に関連するニュース」テーブルを作成します。
import sqlite3
import pandas as pd
# データベースに接続
conn = sqlite3.connect("stock_data.db")
# rising_stocksテーブルを取得
sql = "SELECT * FROM rising_stocks"
rising_stocks = pd.read_sql_query(sql, conn)
# news_tableテーブルを取得
sql = "SELECT * FROM news_table"
news_table = pd.read_sql_query(sql, conn)
# 日付の型を揃える
rising_stocks['date'] = pd.to_datetime(rising_stocks['date'])
news_table['date'] = pd.to_datetime(news_table['date'])
# rising_stocksテーブルとnews_tableテーブルを結合
rising_news = pd.merge(rising_stocks, news_table, on=['ticker', 'date'])
# 結果を新しいテーブルに格納
rising_news.to_sql("rising_news_table", conn, if_exists="replace", index=False)
# データベースとの接続を閉じる
conn.close()
このコードは、データベースからrising_stocks
テーブルとnews_table
テーブルを取得し、ticker
(企業コード)とdate
(日付)をキーにして結合します。その結果を新しいテーブルrising_news_table
に格納します。このテーブルには、株価上昇に関連するニュースが含まれます。
まとめ
「株価上昇に関連するニュース」を抽出するコードを作成しました。日経平均株価を大きく動かすような外的要因がある場合など、短期的な変動の影響を受けないように始値で5日連続、としましたが実際には反落の傾向などを踏まえて「この期間、この企業の株価が上昇するような事があった」というパラメータ-の調整は必要になってくるかと思います。始値と終値、連続で上昇した期間、企業の評価と無関係な一時的な値下がりなど。
ただ、ニュース記事から見るとその記事によって株の下落はなかったことになり、「株価への影響がないまたは株価上昇につながっている」ニュースは見つけられそう、と考えてよさそうです。