
主成分分析とクラスター分析
今回はpythonで機械学習の回となります。ずっとガッツリやってみたかった主成分分析がメインとなります。FXなどでトレードをしていると、いろんな情報を取得してエントリーに役立てばサイコーと思いつつ情報がありすぎて迷ってエントリーできない!あるあるだと思ってます。
今回の結果
手っ取り早く結果を紹介します。以下の通りの分析結果となりました。
ちなみに主成分分析をした後、さらにk-means分類法を使用し、このデータが作成されました。ポジティブに受け取るとこれでトレンドがわかる!かもしれない。しかし、当然意識されるラインがないのであくまでも参考に留めおくべきですね。

今回使用した主成分分析したコード
# 必要なライブラリのインポート
import datetime
import ta
import IPython.display
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas_datareader as pdr
import pandas as pd
import numpy as np
import yfinance as yf
yf.pdr_override()
import seaborn as sns
sns.set()
%matplotlib inline
from scipy.stats import linregress
#USDJPY=X,
ticker_info = 'USDJPY=X'
# 株価データの読み込み
start = '2015-01-01'
end = datetime.datetime.now()
df = pdr.data.get_data_yahoo(ticker_info,start,end)
# データフレームに特徴量を追加
df['SMA_5'] = ta.trend.sma_indicator(df['Close'], window=5)
df['SMA_10'] = ta.trend.sma_indicator(df['Close'], window=10)
df['SMA_20'] = ta.trend.sma_indicator(df['Close'], window=20)
df['SMA_50'] = ta.trend.sma_indicator(df['Close'], window=50)
df['RSI'] = ta.momentum.rsi(df['Close'], window=14)
df['BB_High'], df['BB_Mid'], df['BB_Low'] = ta.volatility.bollinger_mavg(df['Close'], window=20), ta.volatility.bollinger_hband(df['Close'], window=20), ta.volatility.bollinger_lband(df['Close'], window=20)
# 主成分分析(PCA)の実行
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# データのクリーニング(欠損値の削除)
df_clean = df.dropna()
# 特徴量の定義
features = ['SMA_5', 'SMA_10', 'SMA_20', 'SMA_50', 'RSI', 'BB_High', 'BB_Mid', 'BB_Low']
# 特徴量の分離
x = df_clean.loc[:, features].values
# 特徴量の標準化
x = StandardScaler().fit_transform(x)
# PCAの実行
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(x)
# 主成分をデータフレームに変換
principalDf = pd.DataFrame(data = principalComponents, columns = ['principal component 1', 'principal component 2'])
# データの可視化
plt.figure(figsize=(8,6))
sns.scatterplot(x='principal component 1', y='principal component 2', data=principalDf)
plt.title('2 component PCA')
plt.show()
# 最新の日付を赤くマーク
principalDf.index = df_clean.index
latest_date = principalDf.index[-1]
principalDf['is_latest'] = (principalDf.index == latest_date)
plt.figure(figsize=(8,6))
sns.scatterplot(x='principal component 1', y='principal component 2', hue='is_latest', data=principalDf, palette=['blue', 'red'])
plt.title('2 component PCA with latest date marked')
plt.show()
# 最新の日付からの日数を表す新しい列を作成
principalDf['days_from_latest'] = (latest_date - principalDf.index).days
# 最後の30日間のデータを選択
last_30_days = principalDf[principalDf['days_from_latest'] <= 30]
# 最後の30日間のデータを色グラデーションで可視化
plt.figure(figsize=(8,6))
sns.scatterplot(x='principal component 1', y='principal component 2', hue='days_from_latest', palette='coolwarm_r', data=last_30_days)
plt.title('2 component PCA with color gradient for the last 30 days')
plt.show()
# 株価とPCAのプロット
fig, ax1 = plt.subplots(figsize=(12, 6))
color = 'tab:blue'
ax1.set_xlabel('Date')
ax1.set_ylabel('Stock Price', color=color)
ax1.plot(df_clean.index, df_clean['Close'], color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax2 = ax1.twinx()
color = 'tab:red'
ax2.set_ylabel('PCA', color=color)
ax2.scatter(principalDf.index, principalDf['principal component 1'], color=color, s=1)
ax2.tick_params(axis='y', labelcolor=color)
fig.tight_layout()
plt.show()
# Select the last 30 days of stock price data
last_30_days_price = df_clean['Close'].iloc[-30:]
# Create a new figure with two subplots: one for the stock price and one for the PCA plot
fig, ax1 = plt.subplots(figsize=(12, 6))
# Plot the stock price in the first subplot
color = 'tab:blue'
ax1.set_xlabel('Date')
ax1.set_ylabel('Stock Price', color=color)
ax1.plot(last_30_days_price.index, last_30_days_price, color=color)
ax1.tick_params(axis='y', labelcolor=color)
# Create a second y-axis for the PCA plot
ax2 = ax1.twinx()
# Plot the PCA on the second y-axis
color = 'tab:red'
ax2.set_ylabel('PCA', color=color)
ax2.scatter(last_30_days.index, last_30_days['principal component 1'], color=color)
ax2.tick_params(axis='y', labelcolor=color)
# Show the plot
fig.tight_layout()
plt.show()
追加でクラスター分類するためのコード
ここから先は
4,522字
¥ 1,200
この記事が気に入ったらチップで応援してみませんか?