皆さん、魚群探知機って知ってますよね
魚群がいるところを示してくれるもの
あれと同じ、株価探知機、ってのがあったら良いなっていうのが、この考えの始まり
サーフィンでいう、ビッグウェーブが来たというのを先に気づき、波に乗りたいわけ
波を定義できて、それをプログラムで自動実行できたら
後は、テック系、ヘルスケア系の会社のティッカーシンボル(数百?)を入れて、現在の波の状態を調べるだけ
ティッカーシンボルとは、会社を区別するもので、日本の銘柄コードに相当するもの
そして、第一波が来てて、波の高い順に並べて(ここまではプログラムで)、あとはどこに投資しようか、検討するというわけ
ティッカーシンボルの例
マイクロソフト: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()