移動平均 メモ

楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用してリアルタイムで株価などのデータを取り込んでいます。リアルタイムで売買ができるように Python で強化学習のアルゴリズムを利用したシステム開発に日々取り込んでいます。

毎日のように生成 AI とのやりとりをしていますが、残しておきたい内容を備忘録としてまとめました。


移動平均の算出(リアルタイム用)

移動平均を Python で算出するとすれば Pandas の利用を考えますが、リアルタイムで逐次取得するデータで算出する場合はそうもいきません。

それでも deque を利用すれば、なんてことはないと考えていたのですが、生成 AI とやり取りをすると計算量やらメモリの使用量やらをこまめにチェックしてチューニングしてくれます。自力でスクラッチから作るより、ずっと効率の良いコードが短時間でできてしまいます。

生成 AI が提案してくれた移動平均を算出するクラスは、下記のようなスグレモノです。

  • deque.popleft() → O(1)
  • running_sum の更新 → O(1)
  • 除算 → O(1)

つまり、どれだけ window_size が大きくても、毎回の update は一定時間!

コードを下記に示しました。deque は FIFO のバッファに使っているだけです。

class MovingAverage:
    def __init__(self, window_size: int):
        self.window_size = window_size
        self.queue = deque()
        self.running_sum = 0.0
        self.ma = 0.0

    def clear(self):
        self.queue.clear()
        self.running_sum = 0.0
        self.ma = 0.0

    def getValue(self) -> float:
        return self.ma

    def update(self, value: float) -> float:
        # 古い値を取り除く
        if len(self.queue) >= self.window_size:
            self.running_sum -= self.queue.popleft()

        # 新しい値を追加
        self.queue.append(value)
        self.running_sum += value

        # 移動平均を計算
        self.ma = self.running_sum / len(self.queue)
        return self.ma

参考サイト

  1. pandasで窓関数を適用するrollingを使って移動平均などを算出 | note.nkmk.me
にほんブログ村 株ブログ 株日記へ
PVアクセスランキング にほんブログ村

0 件のコメント:

コメントを投稿