皆さん、魚群探知機って知ってますよね
魚群がいるところを示してくれるもの
あれと同じ、株価探知機、ってのがあったら良いなっていうのが、この考えの始まり

サーフィンでいう、ビッグウェーブが来たというのを先に気づき、波に乗りたいわけ

波を定義できて、それをプログラムで自動実行できたら
後は、テック系、ヘルスケア系の会社のティッカーシンボル(数百?)を入れて、現在の波の状態を調べるだけ
ティッカーシンボルとは、会社を区別するもので、日本の銘柄コードに相当するもの
そして、第一波が来てて、波の高い順に並べて(ここまではプログラムで)、あとはどこに投資しようか、検討するというわけ


ティッカーシンボルの例
マイクロソフト:MSFT
アップル:AAPL

雑誌とか、記事に取り上げられるときって、ビッグウェーブが何波も来て、十分上がりきったころじゃない

その頃になると、そう長くは続かないかもしれないし、後は落ちるだけかもしれない
やっぱり、第1波の高い波を途中で掴みたいよね

例えば1日に1回、自動で調べてくれて、LINEででもその情報を教えてくれたらベスト

例えば、こんな波
これは、ヘルスケア系のSLNOという会社(7倍ぐらいまで高くなってる)




考えは、壮大なんだけど、先ず1st STEPとして、株価の波ってどう定義すればよいのかをAI(ChatGPT)に聞いてみました

そこで、教えてくれたのがエリオット波動、紹介ページはこちら
https://www.oanda.jp/lab-education/technical_analysis/elliott_wave/index-2/

https://www.matsui.co.jp/fx/study/article/analysis/elliott/

ひとまず、やってみよ

結果がこちら(プログラムも最後に公開)
まだ、実験レベルでやることは、まだたくさんあります



2023年初めから現在までの、マイクロソフトの株価上昇をエリオット波動でプログラミング(今回も、かなりChatGPTの力を借りました)

横軸は、2023年初めからの市場が開いてる日(土日祝を除いた日)をカウントしています
エリオット波動は、上昇5波、下降3波を表すんだけど、それなりに掴んでるように思えませんか

図では、最後の上がり下がりがくっついて見えてるね

このプログラムの問題として感じてるもの
・ノイズフィルタの定数設定によって掴む波は変わってくる
 細かく見ると、第一波の中でも上がり下がりの波があるし
 これ、波によっては値を変えたほうが良いんじゃないかと思ってる
・このプログラム、第一波からしか、探し始めません
 たまたま、2023年の初めが、周期の切れ目だったから良いものの
 波(上昇5波、下降3波)の切れ目を探すプログラムを追加する必要あります

では、現時点のプログラムです
プログラムの実行は、グーグルコラボが便利です
Gmailのアカウント持ってる人だったら、誰でも無料で、グーグルのGPUサーバーを利用できます、Chromeとか、Edgeがあればこのプログラムが実行可能
(つまり、自分のPC、スマホにPythonのインストール、必要なし)

--------------------------------
!pip install yfinance mplfinance
import yfinance as yf
import mplfinance as mpf
from datetime import datetime
from scipy.signal import find_peaks
import pandas as pd
import matplotlib.pyplot as plt

ticker_info = 'MSFT'

# 株価データの読み込み
start = '2023-01-01'

# end = 現在の日付を取得
end = now.strftime('%Y-%m-%d')

data = yf.download(ticker_info, start, end)
# 終値を取得
prices = data['Close'].values

# ノイズフィルタリングを行うためにprominenceパラメータを設定
prominence_value = 10
peaks, _ = find_peaks(prices, prominence=prominence_value)
troughs, _ = find_peaks(-prices, prominence=prominence_value)

# エリオット波動の基本パターン(5波上昇、3波下降)の検出
wave_pattern = []
prev_idx = 0
is_peak = True

for p, t in zip(peaks, troughs):
    if is_peak:
        if p > prev_idx:
            wave_pattern.append(p)
            prev_idx = p
            is_peak = False
    else:
        if t > prev_idx:
            wave_pattern.append(t)
            prev_idx = t
            is_peak = True
 
# チャートにプロット
plt.figure(figsize=(12, 6))
plt.plot(prices, label='MSFT')
plt.plot(peaks, prices[peaks], "x", label="Peaks")
plt.plot(troughs, prices[troughs], "o", label="Troughs")

if len(wave_pattern) >= 8:
    for idx in wave_pattern[:8]:
        plt.axvline(x=idx, color='gray', linestyle='--')

plt.title("Elliott Wave Analysis with Noise Filtering")
plt.xlabel("Date")
plt.ylabel("Price")
plt.legend()
plt.show()