Created
October 28, 2024 22:25
-
-
Save Kouhei-Takagi/5becaf7c3a24d63ac9c56856e81297f2 to your computer and use it in GitHub Desktop.
Correlation between NASDAQ price, Corn and Gold(Corr=0.945)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# データの取得ライブラリ | |
from yahoo_fin import stock_info as si | |
import pandas as pd | |
# 日付の取得ライブラリ | |
from datetime import datetime | |
# 相関関係の高い数式を見つけるライブラリ | |
from scipy.optimize import minimize | |
from scipy.stats import pearsonr | |
# モデルの訓練ライブラリ | |
from sklearn.model_selection import train_test_split | |
import numpy as np | |
from sklearn.ensemble import GradientBoostingRegressor | |
# モデルの性能評価ライブラリ | |
from sklearn.metrics import mean_absolute_error | |
# モデルの保存ライブラリ | |
import os | |
from joblib import dump | |
# 結果の可視化ライブラリ | |
import matplotlib.pyplot as plt | |
# 出力のハイライト化 | |
from termcolor import colored | |
# データの取得開始日と終了日、データの目標 | |
data_start_date = "2022-03-01" #2023-05-01, 2022-03-01 | |
today = datetime.today() | |
formatted_date = today.strftime("%Y-%m-%d") | |
data_end_date = formatted_date | |
target = "Close" #Low, High, Closeから選択 | |
# データと目的 | |
corn_target = f"corn_{target}" | |
gold_target = f"Gold_{target}" | |
nasdaq_target = f"Nasdaq_{target}" | |
# 列名を変数として定義 | |
corn_close_col = "corn_Close" | |
corn_high_col = "corn_High" | |
corn_low_col = "corn_Low" | |
gold_close_col = "Gold_Close" | |
gold_high_col = "Gold_High" | |
gold_low_col = "Gold_Low" | |
nasdaq_close_col = "nasdaq_Close" | |
nasdaq_high_col = "nasdaq_High" | |
nasdaq_low_col = "nasdaq_Low" | |
# データ取得のためのクラス | |
class Data: | |
def __init__(self, symbol, start_date, end_date): | |
self.symbol = symbol | |
self.start_date = start_date | |
self.end_date = end_date | |
def get_data(self): | |
data = si.get_data(self.symbol, start_date=self.start_date, end_date=self.end_date, interval="1d") | |
return data | |
# CORNのデータの取得 | |
corn_instance = Data("ZC=F", data_start_date, data_end_date) | |
corn_data = corn_instance.get_data() | |
# 金のデータの取得 | |
gold_instance = Data("GC=F", data_start_date, data_end_date) | |
gold_data = gold_instance.get_data() | |
# NASDAQのデータの取得 | |
nasdaq_instance = Data("^IXIC", data_start_date, data_end_date) | |
nasdaq_data = nasdaq_instance.get_data() | |
# データの列を抽出してデータフレームに結合 | |
merged_data = pd.concat([ | |
corn_data["close"].rename("corn_Close"), | |
corn_data["high"].rename("corn_High"), | |
corn_data["low"].rename("corn_Low"), | |
gold_data["close"].rename("Gold_Close"), | |
gold_data["high"].rename("Gold_High"), | |
gold_data["low"].rename("Gold_Low"), | |
nasdaq_data["close"].rename("Nasdaq_Close"), | |
nasdaq_data["high"].rename("Nasdaq_High"), | |
nasdaq_data["low"].rename("Nasdaq_Low"), | |
], axis=1).dropna() | |
#corn_targetとnasdaq_targetとの相関係数 | |
corr_corn_nasdaq = merged_data[corn_target].corr(merged_data[nasdaq_target]) | |
print(corr_corn_nasdaq) | |
#gold_targetとnasdaq_targetとの相関係数 | |
corr_gold_nasdaq = merged_data[gold_target].corr(merged_data[nasdaq_target]) | |
print(corr_gold_nasdaq) | |
#各変数の規格化 | |
#print(merged_data[corn_target]) | |
#print(merged_data[gold_target]) | |
#print(merged_data[nasdaq_target]) | |
#merged_data[corn_target] = merged_data[corn_target] ** 2 | |
#merged_data[gold_target] = merged_data[gold_target] ** 1.2 | |
merged_data[nasdaq_target] = merged_data[nasdaq_target] ** 3.3 | |
# 機械学習を用いて最適な相関係数を算出 | |
# 目的関数の定義: 相関係数を最大化 | |
def objective(params): | |
p_a, p_b = params # 各商品価格に対する係数と冪乗 | |
# 混合要素の計算 | |
mixed_close = -merged_data[corn_target] ** p_a + \ | |
merged_data[gold_target] ** p_b | |
# 終値との相関係数 | |
corr, _ = pearsonr(mixed_close, merged_data[nasdaq_target]) | |
return -corr # 最大化のための負の相関係数 | |
# 初期係数と冪乗 | |
initial_params = [1, 1] # 係数と冪乗の初期値 | |
# 最適化の実行 | |
result = minimize(objective, initial_params, method='BFGS') | |
# 結果の表示 | |
print(colored(f"Optimized Coefficients and Powers: {result.x}","red")) | |
rounded_corr = round(result.fun, 3) | |
print(colored(f"Maximum Correlation with nasdaq {target}: ", "blue") + | |
colored(f"{-rounded_corr}", "black", "on_blue")) | |
optimized_params = result.x | |
print(optimized_params[0]) | |
print(optimized_params[1]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment