無料版のGithub Copilot? VSCodeの拡張機能「Codeium」を使って株価の分析スクリプトを作成する

# 目的
コード生成AIである「Codeium」は、VSCodeの拡張機能としても提供されている。ChatGPTのように対話形式で自然言語からスクリプトを生成できる他、自分のコードを参照させて回答させたり、Github Copilotのように書いている最中のスクリプトの先を予測し、サジェストする機能がついている。このサジェスト機能が楽しいので、感動を共有するためにメモ。
やりたいことは、yahoo financeから株価を取得し、下図のようにmatplotlibで描画して、月ごとの株価の推移を俯瞰したい。
![price_ratios_ACWI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/0a47995f-4c89-fc04-9062-7809c696b2e8.png)


# 準備
VSCodeの拡張機能から「Codeium」と検索し、流れに身を任せてインストール。途中でアカウント作成が必要なので、Gmailで認証した。

# Codeiumを使用して、スクリプトを作成する様子
ネットでちらっと見かけた株価分析記事を思い出しながら、殴り書きでスクリプトを作成した。処理の流れは、下記。
1. yahoo financeから株価を取得
2. 月毎に並んでいるデータを、縦軸=year、横軸=monthにピボット
3. ピボットしたデータをグラフ化
## plt.plot⇨fig,axに修正
matplotlibでグラフを描画する際に、好みとして、plt.plotで書くよりfig,axで書いた方が微調整ができるので、この形式に統一したい。元のスクリプトは下記の通り。
![スクリーンショット 2024-01-05 22.08.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/0bff33ec-6519-3204-eca5-1f2ec0977d36.png)
画面左側のチャット欄に「@関数名」と書き、その後に指示を記載すると、コードを参照して回答する。
(今回は、下記のようにした)
```bash
@plot_data fig, axに書き換えて。
```
![スクリーンショット 2024-01-05 22.09.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/0cf002f1-7bb6-e725-bcf8-919381b11d68.png)
適当に指示しても、正しくリファクタリングされた。
画面上部の「+Insert Code」をクリックすると、スクリプト内にペーストされる。
![スクリーンショット 2024-01-05 22.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/be91527f-3b0c-9589-639b-4321e08b1abf.png)

## classへのリファクタリング
元のコードでは、必要そうな関数をいくつか適当に書き、それらを順次実行していた。
使い回しできるようにデータと処理をclassにまとめたい。
王道の手法があるのかも知れないが、知らないのでCodeiumのサジェスト機能を使いながら書いていく。
まず、class名を記載すると、コントラクタがすぐにサジェストされた(def _init__以降の灰色文字)。
まさしく書こうと思っていた内容なので、「tab」で候補を確定。
![スクリーンショット 2024-01-05 22.13.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/4c9c7a29-43d7-3495-259a-fed6f4df2521.png)
classにすることで、変数がインスタンス変数にな理、各関数や変数にselfをつける必要がある。修正が面倒なので、Codeiumにリファクタリングしてもらう。
画面左側のチャット欄に、下記のようにざっくり指示する。
```bash
@plot_data 関数からクラス内のメソッドに書き換えて
```
![スクリーンショット 2024-01-05 22.25.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/25955615-d94a-e12a-3e79-a70817fe66c3.png)

変数が正しくインスタンス変数に変更されていたことを確認し、「+Insert Code」をクリックして確定。
![スクリーンショット 2024-01-05 22.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/4ede9508-e2e9-f995-928e-732b854a3e75.png)

いくつかメソッドを作成したので、一連の流れを実行するメソッドを生成したい。
class内にdef analyze(self):という文字を書くと、書こうと思っていた内容がサジェストされた。完全に期待通りであり、ぷよぷよで連鎖が決まった時のような爽快感がある。

![スクリーンショット 2024-01-05 22.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/e28e525a-dc8c-530b-a122-206381acc14b.png)

## Docstringの生成
せっかくなので、関数の上部に表示される「Generate Docstring」ボタンを押してみる。
![スクリーンショット 2024-01-05 22.30.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/e8bfd331-8cca-20bb-219e-2eaf1285a608.png)
左側のチャット欄に生成したDocstringを挿入すると、関数の機能を記載することができた。
![スクリーンショット 2024-01-05 22.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/d3390ec5-aace-ebb1-d7a0-d22c3b0be40b.png)
# if \_\_name__ == '\_\_main__'の生成
"おまじない"であるif \_\_name__ == '\_\_main__'を書いてみる。
一行目を書くだけで、自動で中身がサジェストされる。
![スクリーンショット 2024-01-05 22.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/d370dbbc-4bcb-df82-e396-fef4d17eea20.png)
先読み能力が素晴らしいが、引数は別途定めたいので、少し修正する。
あらかじめ引数の内容を変数として定義しておくと、その後にインスタンスを生成するスクリプトがサジェストされた。サジェストは的確であり、大変ありがたい。
![スクリーンショット 2024-01-05 22.36.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/92ab4bd9-1efb-7636-0c9a-1880b2f9ade7.png)

## グラフの微調整
チャットとサジェスト機能を使いながら、グラフの微調整をする。
凡例を右外に出したり、titleやファイル名をtickerに紐付ける、などした。
処理が簡単なためエラーもなく、またサジェスト機能のおかげでスペルミスが激減した。
![price_ratios_ACWI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/86692738-76fe-a9aa-a245-82bbd410bcbc.png)
## おまけ(グラフの解説)
+ グラフ自体は、その年の1月の株価を基準(=1)にして、月ごとの推移をプロットしている。
+ tickerはACWIで、いわゆるオルカン。
+ 基準価格(=1月)のデータを下回ったのは、14年間で4回。2018年、2021年、2022年のいずれもかなり株価が下がった印象があるが、それでもせいぜい10%しか下落していないので驚きだった。
+ 基本的には年の後半にかけて上昇傾向がある。毎年定期的に購入するつもりなら、前半に購入した方が良さそう。個人的にはグローバルマクロ戦略なので、多少は相場を見てトレードしている。

# まとめ
+ ITの非専門家である自分にとって、Codeiumは素晴らしい。特にサジェスト機能が便利。
+ 自分の記載しようと思っているスクリプトがサジェストに表示されると、爽快感がある。