Skip to content

Instantly share code, notes, and snippets.

@Kouhei-Takagi
Created October 26, 2024 10:16
Show Gist options
  • Save Kouhei-Takagi/a1a9b073f6cd6dacb7eb1ea871d8fd3c to your computer and use it in GitHub Desktop.
Save Kouhei-Takagi/a1a9b073f6cd6dacb7eb1ea871d8fd3c to your computer and use it in GitHub Desktop.
Correlation between NASDAQ price, Corn and Gold(Corr=0.945)
# データの取得ライブラリ
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)
# 機械学習を用いて最適な相関係数を算出
# 目的関数の定義: 相関係数を最大化
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