Pandas 株式データ分析

株式データ分析において、pandasは非常に強力なツールであり、株式市場のデータを処理・分析するのに役立ちます。

この章では、yfinance(Yahoo Financeライブラリ)を使用して過去の株式データをダウンロードし、データクリーニング、可視化、テクニカル指標の計算などのさまざまな分析を行います。

yfinanceはPythonライブラリで、Yahoo Financeから株式、ファンド、暗号通貨などの資産の過去およびリアルタイムデータを簡単に取得できます。

pandasを使用することで、これらのデータをDataFrameとして保存し、その後の分析を行うことができます。

  • データクリーニング:欠損値の処理、不要な列の削除など。
  • データ可視化:株式の時系列グラフ、移動平均線、RSIなどの描画。
  • テクニカル指標の計算:移動平均線(SMA)、相対力指数(RSI)など。
  • 日次リターンと累積リターンの分析:株式の短期および長期のパフォーマンス評価に役立ちます。
  • ボラティリティ分析:株価の変動性を測定します。

その他の金融ライブラリやクォンツ分析については、以下を参照してください:Python クォンツ取引

yfinance のインストール

まず、yfinanceライブラリをインストールする必要があります。方法は次のとおりです:

pip install yfinance --upgrade --no-cache-dir

yfinanceをインストールすると、通常pandasが依存関係として自動的にインストールされます。つまり、yfinanceを使用する際、pandasが提供するデータ構造と機能を直接利用してデータを処理・分析できます。

必要なライブラリをインポートします:

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

株式データの取得

yfinanceライブラリを使用すると、簡単に株式データをダウンロードできます。

通常、yf.download()関数を使用してYahoo Financeから特定の株式の過去データを取得します。

茅台(マオタイ)の株式コードは600519.SSで、そのうち.SSは上海証券取引所の接尾辞です。

yfinanceを使用して株式データを取得します:

例

import yfinance as yf

# 茅台(600519.SS)の株式データを取得、期間は2020-01-01から2021-01-01まで
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# データの最初の数行を表示
print(stock_data.head())

出力データは次のようになります:

返されるデータには以下の列が含まれます:

  • Open:始値
  • High:高値
  • Low:安値
  • Close:終値
  • Adj Close:調整済み終値(配当や株式分割などの要素を考慮)
  • Volume:出来高

yf.download()関数は、指定した株式の過去データを含むpandas.DataFrameを返します:

例

import yfinance as yf

# 茅台株式(600519.SS)のデータを取得
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# データ型を確認
print(type(stock_data))  # 出力は <class 'pandas.core.frame.DataFrame'> になるはず

出力は次のとおりです:

[*********************100%%**********************]  1 of 1 completed
<class 'pandas.core.frame.DataFrame'>

データクリーニングと処理

株式データを分析する際、通常はデータクリーニングと処理を行う必要があります。

一般的な手順には、欠損値の補完、不要な列の削除、データ型の変換などが含まれます。

一部のバージョンのyfinanceでは、pandasが自動的にインポートされるため、再度インポートする必要はありません。そのため、yfinanceを使用する際、pandasが提供するデータ構造と機能を直接利用してデータを処理・分析できます。

欠損値を確認して補完する:

例

import yfinance as yf

# 茅台(600519.SS)の株式データを取得、期間は2020-01-01から2021-01-01まで
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# 欠損値を確認
print(stock_data.isnull().sum())

# 前方補完を使用して欠損値を置き換える
stock_data.ffill(inplace=True)

# または後方補完を使用
# stock_data.bfill(inplace=True)

# 欠損値が処理されたか確認
print(stock_data.isnull().sum())

出力結果は次のようになります:

[*********************100%%**********************]  1 of 1 completed
Open         0
High         0
Low          0
Close        0
Adj Close    0
Volume       0
dtype: int64
Open         0
High         0
Low          0
Close        0
Adj Close    0
Volume       0

不要な列の削除:

例

import yfinance as yf

# 茅台(600519.SS)の株式データを取得、期間は2020-01-01から2021-01-01まで
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# "Volume"列と"Adj Close"列を削除
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])
print(stock_data_cleaned.head())

出力結果は次のようになります:


データ可視化:株価チャートの描画

matplotlibまたはseabornを使用すると、株式データを可視化でき、トレンドや変動を識別するのに役立ちます。

終値の時系列グラフを描画する:

例

import yfinance as yf
import matplotlib.pyplot as plt
# 茅台(600519.SS)の株式データを取得、期間は2020-01-01から2021-01-01まで
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# "Volume"列と"Adj Close"列を削除
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])

# 茅台の終値チャートを描画
plt.figure(figsize=(10, 6))
plt.plot(stock_data_cleaned['Close'], label='Close Price')
plt.title('Maotai Stock Price (2020)', fontsize=14)
plt.xlabel('Date', fontsize=12)
plt.ylabel('Close Price (CNY)', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()

出力は次のようになります:


株式のテクニカル指標の計算

株式分析では、テクニカル指標(移動平均線、相対力指数RSIなど)が意思決定を支援するために頻繁に使用されます。pandasはこれらの指標の計算に役立ちます。

1. 移動平均線(SMA)

単純移動平均線(SMA)は最も一般的なテクニカル指標の1つで、過去N日間の平均終値を表します。

例

import yfinance as yf
import matplotlib.pyplot as plt
# 茅台(600519.SS)の株式データを取得、期間は2020-01-01から2021-01-01まで
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# "Volume"列と"Adj Close"列を削除
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])

# 50日と200日の移動平均線を計算
stock_data_cleaned['SMA_50'] = stock_data_cleaned['Close'].rolling(window=50).mean()
stock_data_cleaned['SMA_200'] = stock_data_cleaned['Close'].rolling(window=200).mean()

# 終値と移動平均線を描画
plt.figure(figsize=(12, 6))
plt.plot(stock_data_cleaned['Close'], label='Close Price')
plt.plot(stock_data_cleaned['SMA_50'], label='50-Day SMA')
plt.plot(stock_data_cleaned['SMA_200'], label='200-Day SMA')
plt.title('Maotai Stock Price with Moving Averages', fontsize=14)
plt.xlabel('Date', fontsize=12)
plt.ylabel('Price (CNY)', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()

出力は次のようになります:

2. 相対力指数(RSI)

RSIは、株式が買われすぎか売られすぎかを評価するテクニカル指標です。一般的に、RSIが70を超えると買われすぎ、30未満だと売られすぎを示します。

例

import yfinance as yf
import matplotlib.pyplot as plt
# 茅台(600519.SS)の株式データを取得、期間は2020-01-01から2021-01-01まで
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# "Volume"列と"Adj Close"列を削除
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])

# RSI指標を計算
delta = stock_data_cleaned['Close'].diff(1)
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)

# 平均利益と平均損失を計算
avg_gain = gain.rolling(window=14).mean()
avg_loss = loss.rolling(window=14).mean()

# 相対力指数RSIを計算
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))

# RSIをデータに追加
stock_data_cleaned['RSI'] = rsi

# RSI曲線を描画
plt.figure(figsize=(12, 6))
plt.plot(stock_data_cleaned['RSI'], label='RSI')
plt.axhline(y=70, color='r', linestyle='--', label='Overbought (70)')
plt.axhline(y=30, color='g', linestyle='--', label='Oversold (30)')
plt.title('RSI Indicator for Maotai Stock', fontsize=14)
plt.xlabel('Date', fontsize=12)
plt.ylabel('RSI', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()

出力は次のようになります:


株式データ分析の応用

実際の株式データ分析では、Pandasを使用して以下のような一般的な操作を行うことができます:

1、日次リターンと累積リターン

株式の日次リターンと累積リターンを計算すると、長期的なパフォーマンスを評価するのに役立ちます。

例

import yfinance as yf
import matplotlib.pyplot as plt
# 茅台(600519.SS)の株式データを取得、期間は2020-01-01から2021-01-01まで
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# "Volume"列と"Adj Close"列を削除
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])

# 日次リターンを計算
stock_data_cleaned['Daily_Return'] = stock_data_cleaned['Close'].pct_change()

# 累積リターンを計算
stock_data_cleaned['Cumulative_Return'] = (1 + stock_data_cleaned['Daily_Return']).cumprod()

# 累積リターンを描画
plt.figure(figsize=(10, 6))
plt.plot(stock_data_cleaned['Cumulative_Return'], label='Cumulative Return')
plt.title('Cumulative Return of Maotai Stock (2020)', fontsize=14)
plt.xlabel('Date', fontsize=12)
plt.ylabel('Cumulative Return', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()

出力は次のようになります:

2、株式のボラティリティ

ボラティリティは株価の変動を測定する指標です。

通常、リターンの標準偏差を使用して株式のボラティリティを測定できます。

例

import yfinance as yf
import matplotlib.pyplot as plt
# 茅台(600519.SS)の株式データを取得、期間は2020-01-01から2021-01-01まで
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# "Volume"列と"Adj Close"列を削除
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])

# 日次リターンを計算
stock_data_cleaned['Daily_Return'] = stock_data_cleaned['Close'].pct_change()

# 累積リターンを計算
stock_data_cleaned['Cumulative_Return'] = (1 + stock_data_cleaned['Daily_Return']).cumprod()

# 日次リターンの標準偏差(ボラティリティ)を計算
volatility = stock_data_cleaned['Daily_Return'].std()

# ボラティリティを表示
print(f"Daily Volatility: {volatility:.4f}")

出力は次のようになります:

[*********************100%%**********************]  1 of 1 completed
Daily Volatility: 0.0181
その他の拡張