バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回は、極大値と極小値の特定のMATLABコードを作成した。
一部、最初に極小値が来ることを想定しているコードになっていることが問題点としてあるが、
最初に買付をする想定なので、むしろ今回のコードの方が都合が良いという判断をした。
今回は、これのPython(Numpy)版を作成する。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
極大値と極小値の特定する(Python版)

今回は、Python(Numpy)で極大値と極小値の特定するコードだね。

早速コードを見せよう。
import numpy as np
import matplotlib.pyplot as plt
N=512;
x=np.linspace(-np.pi,np.pi,N)
fx=np.sin(x)+np.sin(3*x)+np.sin(5*x)
ft=fx;
max_fx=np.max(fx)
max_ft=np.max(ft)
plt.plot(fx)
# 極大値、極小値特定
maxima = np.zeros(N)
minima = np.zeros(N)
fxTmp=fx[0]
mode = 0
for i in range(1,N):
if mode == 0:
if fx[i]>fxTmp:
minima[i]=ft[i]*(max_fx/max_ft)
mode = 1
fxTmp=fx[i]
if mode == 1:
if fx[i]<fxTmp:
maxima[i]=ft[i]*(max_fx/max_ft)
mode = 0
fxTmp=fx[i];
maxima[maxima==0]=np.nan # 極大値だけを残す
minima[minima==0]=np.nan # 極小値だけを残す
plt.plot(maxima,'ro') # 極大値をplot
plt.plot(minima,'bo') # 極大値をplot
plt.show()
動作結果

そして動作結果だ。


MATLAB版と同じく、極大値が赤丸、極小値が青丸だね。

ついでに、入力波形を反転したものも出しておこう。


当然と言えば当然だけど、こっちもMATLABの時と同じ結果だ。
これからの話

あとは、サンプル信号じゃなくて実際のVTIチャートを入れるようにすればOKってことかな?

そうだね。
ただし、実際には赤丸、青丸のプロットした値を出力する必要があるので、
その分のコード修正は必要になるが、
プロット位置が分かってるんで、本番コード作成時に入れ込めばOKだろう。

あと、入力のVTIチャート自体はドル単位なんで、
イメージ湧きやすいように円単位に変換しようと思う。
とりあえずは、$1=\127程度で良いだろう。

確かに円で出してもらった方がイメージ湧きやすいよね。
まとめ

まとめだよ。
- 極大値と極小値の特定するコードのPython(Numpy)版を作成。
- 動作としては反転波形も含めてMATLABと同一。
- 実際にはこれらコードに向けて以下が必要だが、本番コード作成時に盛り込む。
- 各プロット時の値の取得。
- ドルから円へ変換。
- $1=\127で計算する予定。
バックナンバーはこちら。
コメント