はじめに
久しぶりの「AI投資システム構築」についての投稿です。
時系列データの学習方法については、過去の投稿でまとめています。
今回は学習モデルの再学習方法について まとめようと思います。
また、再学習の自動化方法についてもまとめます。
再学習の重要性について
時系列データの厄介な点が、
過去に有効だったパターンが、現在では通用しないという点です。
特に金融・マーケット系では、
- ボラティリティの変化
- 参加者層の変化
- レジーム(相場状態)の切り替わり
が頻繁に起きます。
その結果、
学習時には高精度だったモデルが時間経過とともに静かに劣化するという現象が起こります。
精度が急に悪化しないのが、逆に厄介です。
そのため、最新の時系列データを用いた、再学習が必要となります。
学習期間の更新(忘れることも大事)
ここでよくある誤解が、
再学習するなら、過去データをすべて使うべき という考え方です。
自然言語処理や画像認識の分野では、
既存の学習済みモデルに対して、
追加学習(ファインチューニング) を行う手法が一般的です。
これは、
- 言語の構造
- 物体の形状や特徴
といった、時間によって大きく変わりにくいデータは継続的に積み上げていくことが有効だからです。
一方で、時系列データ、特にマーケットのような分野では事情が異なります。
過去に有効だったパターンが、
現在ではむしろ誤った判断の原因になることがあり、古いデータを保持し続けること自体がリスクになります。
そのため本システムでは、
既存モデルへの追加学習は行わず
学習期間をあらためて定義し直し、あえて新規学習を行う 、
という手法を採っています。
これは精度向上を目的とした再学習ではなく、
不要になった過去の知識を忘れさせ、
現在の状況に適応し直すための学習です。
ある意味「忘却」を取り入れた形となります。
学習期間の決め方
過去何年分のデータが学習させるのかという話です。
経済周期(景気循環)を参考に決める方法があります。
下記の経済周期が有名なようです。
-
キチンの波(短期): 約3〜4年周期
在庫投資の増減が主な原因 -
ジュグラーの波(中期): 約10年周期
設備投資の変動が要因で、一般的に「景気循環」と言うとこれを指すことが多い -
クズネッツの波(中期~長期): 約20年周期
建設投資(住宅・公共投資など)の建て替え需要が要因 -
コンドラチェフの波(長期): 約50年周期
技術革新(イノベーション)(蒸気機関、鉄道、ITなど)がけん引役となり、産業構造全体を変化させる
ただ私は上記の波には詳しくないので、
「オリンピックやサッカーワールドカップは4年に1回だな」とか、
「アメリカ大統領選も4年に1回だな」とか、
何となく決めました。
間違った感覚ではないと思います。
また、下記記事で投稿した通り、
個人で集められる過去データは10年分程度が限界なので、
学習期間は4,5年とするのが妥当だと思います。
再学習の自動化方法
理想をいえば、
常時、最新のデータを収集し、
学習モデルを最新化したいところですが、
個人の実行環境ではそうもいきません。
そこで私は、
FXトレードが停止される土日に、
自動的に再学習を行うような仕組みを、
タスクスケジューラとバッチ処理を駆使し構築しました。
つまり、月曜~金曜は予測を行い、
土曜と日曜は学習するというAI予測システムとなりました。
ちなみに、下記記事のように、PADを用いて自動化することももちろん可能ですが、
今回は簡単なフローなのでバッチで実現しています。
以下に流れを記載します。
Coffee Break ☕️
このことを家族に話したら、
「うわ~ブラック。休ませてあげて」
と言われました。たしかに笑
投資AIに感情がなくてよかったです。
1. MT4/MT5のEAで為替データを出力
土曜の朝、1週間分の為替データをCSVファイルに出力します。
下記のようなEAを作成し、任意の通貨ペアの日足(D1)に、設定すればOKです。
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
// 時刻設定
datetime nowTime = TimeLocal();
int tWeek = TimeDayOfWeek(nowTime); // 曜日
int tYear = TimeYear(nowTime); // 年
int tMonth = TimeMonth(nowTime); // 月
int tDay = TimeDay(nowTime); // 日
int tHour = TimeHour(nowTime); // 時
// 0:日曜 1:月曜,,6:土曜日
if (tWeek == 6)
{
if ((tHour == 7) && (flgOutput == false))
{
// 土曜 7時から再学習開始
Print("通貨データ出力開始:", tHour);
// データ取得処理を実行します。
// CSVファイル出力処理を実行します。
flgOutput = true;
Print("通貨データ出力終了");
}
if (tHour != 7)
{
flgOutput = false;
}
}
}
2. Windowsタスクスケジューラで再学習の自動実行
上記1.でCSVファイルの出力が完了した後、
自動実行するタスクをWindowsタスクスケジューラに登録します。
たっぷりの余裕を見て、30分後とかにしたらいいです。
あとは下記流れでタスクを実行します。
① MT4/MT5で出力したCSVファイルを既存データと統合する
👉 この時、定義した学習期間以前の古いデータは削除する(検証用に退避させておく)
② 学習実行(前処理、新規学習)
👉 個人用PCでも、複数のモデルを同時に学習できると思います。
③ 月曜6時にMT4/MT5を起動
以上
簡単ですね。
これで24時間365日、忙しいAI投資システムができてしまいましたが、
このシステムを最優先にしていたら、Windowsアップデートの実行もできませんし、他の常駐アプリのキャッシュクリーンもできません。
そこで、上記1.の実行直前、タスクスケジューラでPC再起動するようにしています。
スタートアップアプリに上記1.を実行するMT4/MT5を設定すれば、
再起動後にCSVファイル出力が開始されます。
AI投資システムの小休憩ですね。
まとめ
為替データ(時系列データ)の再学習の考え方について説明し、
再学習の自動化方法についても簡単にまとめました。
これで、週に1回、学習モデルを更新し、平日に為替予測ができるようになりました。
同じようなシステムを検討している人にとって、
少しでも参考にして頂けますと幸いです。
おわりに(新年のご挨拶)
およそ11年ほど前から、AI(DeepLearning)の学習を個人的に開始し、
為替を予測する投資AIの研究開発に着手し、
2025年2月から、この「AI投資システム構築」シリーズの投稿を開始しました。
当初は私の開発の備忘録のための投稿でしたが、
気づいたら、シリーズ平均 1,500 [views] を超えていて、驚いております。
個人的なメッセージを送ってくれる方もいらっしゃいました。
リアクションを下さり、ありがとうございます。励みになります。
(超マニアックな内容なので、ほとんど閲覧されないと思っていました)
これだけ読んでもらえるなら、電子書籍化してもいいかも…?
と調子に乗ってしまったため、
いまひそかに、Kindleで電子書籍化しよう、執筆作業中です。
実はこれまで投稿した内容以外にも、
記事にできるネタはたっくさんあるので、
それらを盛り込もうとしています。
(特に失敗談。記事にしたのは成功した内容しか記載していないので)
今後の新しい試みについては、サマリ版をQiitaに投稿し、
詳細は電子書籍版に記載するような方法を考えています。
新年早々、夢を語ったところで、今回の投稿はここまで。
最後まで読んで下さりありがとうございました。
皆様にとって、良い年となりますように。
