2024年最新!C/C++で始めるllama.cppによるLLM推論入門ガイド
2024年最新のllama.cppを使い、C/C++で軽量なLLM推論をローカル環境で実現する方法を解説。CPUだけで高速動作可能な技術を紹介します。
Shelled AI (日本)
© 2025 Shelled Nuts Blog. All rights reserved.
Capture your moments quietly and securely
2024年最新のllama.cppを使い、C/C++で軽量なLLM推論をローカル環境で実現する方法を解説。CPUだけで高速動作可能な技術を紹介します。
Shelled AI (日本)
マルチモーダルRAGシステムの設計を基礎から解説。埋め込み技術や実装のコツ、具体的なコード例で初心者も理解しやすい内容です。
Shelled AI (日本)
ベクトル検索エンジンのセキュリティとアクセス制御の重要ポイントを解説。認証・暗号化・RBACなどの実践的対策で安全運用を実現します。
Shelled AI (日本)
あ、またお会いしましたね!前回の「自然言語処理(NLP)と金融データ解析」、どうでしたか?「金融時系列データの前処理や特徴量エンジニアリングをもっと詳しく知りたい!」という声がたくさん届いたので、今回はそのリクエストにしっかり応えていきます。
金融時系列データ――株価、為替、金利など、毎日ニュースで目にするあの数字たち。実は、その裏には膨大なノイズやパターンが隠れているんです。私も最初は「データをそのまま突っ込めば何とかなるでしょ」と思っていたんですが、これが大間違い。モデルが変な学習をしたり、予測がブレブレになったり…痛い目を見ました。実際、前処理や特徴量エンジニアリングこそが、分析・予測の精度を大きく左右するカギなんですよね。
この記事では、金融時系列データの具体的な前処理(欠損値処理やノイズ除去など)から、分析や機械学習モデルで効く特徴量の作り方まで、実践的なノウハウをわかりやすく解説します。途中で「え、これどうやるの?」と迷うことがあっても大丈夫。私も日々試行錯誤しながら一緒に学んでいます。読み終わった頃には、「このデータ、どうやって処理しよう?」と悩んだときのヒントや、自分なりの工夫のコツがきっと見つかるはず。さあ、一歩ずつ進んでいきましょう!
金融時系列データ、名前は聞いたことありますよね?例えば「日経平均株価が今日は上がった」「ドル円が深夜に動いた」なんてニュース、見たことありませんか?これらはすべて金融時系列データの一種です。具体的には、株価の終値や出来高、為替レート、CDSスプレッドのような信用リスク指標など、時間ごとに記録される金融データのこと。日本市場だと、東証の株価や円相場、JGB(日本国債)の利回りなどが代表的ですね。
さて、この金融時系列データにはクセがあります。まず「非定常性」。最初は「何それ?」って思いますよね。要するに、平均や分散が時間とともにコロコロ変わるってことです。例えば、リーマンショックの前後で株価の変動の大きさが全然違う…投資経験がある方ならピンとくるかもしれません。他にも、為替レートは「月末だけ妙に動く」とか「金曜夜は荒れやすい」みたいな季節性や周期性もよく出てきます。
ここで前処理と特徴量エンジニアリングが登場します。私も最初、データをそのままモデルに突っ込んで「全然当たらないじゃん…」と失敗したことがあります。実は、差分を取ったり、移動平均やボラティリティといった特徴量を追加することで、モデルが「変なノイズ」に惑わされず本質をつかみやすくなるんです。例えば、株価の上昇トレンドを捉えたい場合、単純な終値だけじゃなく、5日間平均や過去1週間の変動幅を特徴量として入れると、モデルの予測がグッと安定したりします。
実務では「どの特徴量が効くか」は正直トライ&エラー。私も何度も失敗しながら調整しています。でも、こうした前処理と特徴量エンジニアリングが、最終的なモデルの精度を左右する――これは本当に実感しています。
じゃあ、次は具体的にどんな前処理や特徴量を作ればいいのか、一緒に見ていきましょうか。
実際にやってみると痛感するんですが、金融データの前処理って本当に大変。皆さんも「なんでここだけデータが抜けてるの?」とか、「この値、どう考えてもおかしいよね?」と悩んだこと、ありませんか?私も最初は何が正解かわからず、何度もやり直しました。
それでですね、今回は欠損値と異常値をどうやって扱うか、一緒に整理していきましょう。
金融時系列データだと、欠損値の理由は様々です。たとえば「祝日」で市場が休みだったり、システム障害でデータが記録されなかったり。
ここで重要なのは「なぜ欠損したか」を知ることです。
私の場合、祝日や取引停止日を知らずに単純補完してしまい、後でトレンドが崩れてしまったことがありました。皆さんもお気をつけて。
じゃあ、どう処理するか?
実際のPythonコード例、Pandasでやってみましょう。
import pandas as pd
df = pd.read_csv('japan_stock.csv', index_col=0, parse_dates=True)
# 欠損値を前の値で埋める(フォワードフィル)
df_ffill = df.fillna(method='ffill')
# 平均値で補完
df_mean = df.fillna(df.mean())
最初は全部平均値で埋めてたんですが、実はフォワードフィルの方が株価データには自然なケースが多かったです。これ、やってみると「おお、ちゃんとつながった!」と実感できます。
「え、この値マイナス?」みたいなデータ、たまに出てきますよね(笑)。
異常値はZスコアやIQRでチェックできます。
でも、どこからが「異常」か?これは業務知識も重要なんです。
import numpy as np
z = (df['close'] - df['close'].mean()) / df['close'].std()
# Zスコアが3以上なら異常値
outlier_idx = np.where(abs(z) > 3)
もっと複雑なパターンなら、Isolation Forestもおすすめです。
from sklearn.ensemble import IsolationForest
iso = IsolationForest(contamination=0.01, random_state=0)
df['outlier'] = iso.fit_predict(df[['close']])
私も最初、異常値を全部削除してしまい、データがスカスカになったことがありました…。
「本当に除去すべきか?」一度立ち止まって考えるのが大事です。
私もまだ勉強中ですが、クレンジングでモデル精度が劇的に変わること、何度も経験しています。
皆さんもぜひ、自分のデータで試してみてください!
時系列データの整形って、最初は本当に戸惑いますよね。私も「リサンプリングって何? ウィンドウ集計って難しそう…」と感じていました。でも実は、これらをしっかり押さえることで、モデルがグッと賢くなるんです。
じゃあ、さっそくリサンプリングとウィンドウ集計について一緒に見ていきましょう!
リサンプリングは、時系列データの頻度を変える操作のこと。
たとえば、1分ごとの株価データ(1分足)を5分ごと(5分足)にまとめる場合、「ダウンサンプリング」と呼びます。反対に、日次データを時間単位に細かくしたいときは「アップサンプリング」です。
実際のPythonコード例(pandas使用):
import pandas as pd
# 1分足のダミーデータ作成
df = pd.DataFrame({
'price': [100, 102, 101, 103, 105]
}, index=pd.date_range('2024-06-01 09:00', periods=5, freq='T'))
# 5分ごとにダウンサンプリング(終値を使う例)
downsampled = df.resample('5T').last()
# 日次データを1時間ごとにアップサンプリング(線形補間)
daily = pd.DataFrame({'price': [100, 105]}, index=pd.date_range('2024-06-01', periods=2, freq='D'))
upsampled = daily.resample('1H').interpolate('linear')
「え、こんなに簡単なの?」と思った方、私も最初そうでした。
でも、ここで注意点。アップサンプリング時には補完方法を意識しないと、とんでもない値が入り込んでしまうことがあります。私も最初、前方埋めしたら不自然なフラットな線になってしまって…。「あれ?」と首をかしげました。
次はウィンドウ集計です。これは、一定期間のデータをまとめて特徴量を作る方法。代表例は「移動平均」や「移動中央値」。
例えば、5分間の移動平均を計算すると、短期的な値動きのノイズが減り、全体のトレンドが見やすくなります。
Pythonでの移動平均例:
# 3期間の移動平均
df['rolling_mean'] = df['price'].rolling(window=3).mean()
「お?これで何が嬉しいの?」
実際に私も最初はピンときませんでしたが、ローソク足チャートの上に移動平均線を重ねてみると、「あ、これがよく見る“トレンドライン”か!」と納得しました。
金融現場では、例えば楽天証券やSBI証券のチャートにもこの移動平均線がよく使われていますよね。
最後に、時間粒度を統一する理由です。皆さんも「データの時間間隔がバラバラで困った!」経験ありませんか?
私も過去、「1分足と日次データを一緒に学習させたら、モデルが全然うまくいかなかった」苦い思い出があります。
粒度を統一すると、特徴量の一貫性が保てて、モデルがしっかり学習してくれます。
さらに、リサンプリング+ウィンドウ集計でノイズを減らしつつ有意味な情報を抽出できるので、分析の精度もアップ。
これは本当にすごいです!
実際にやってみてのアドバイス
私もまだまだ勉強中ですが、こうして一歩ずつ理解が深まっていくのが楽しいですよ!
さあ、次はどんな特徴量を作っていけるか、一緒に考えてみませんか?
まずは、「時系列特徴量」って何?というところからお話ししましょう。時系列データ、特に金融のデータ分析をやっていると、ただ生データをそのまま使うだけではモデルの精度が伸び悩むこと、よくありますよね。私も最初は「データがたくさんあるから大丈夫だろう」と思っていたんですが、実際はちょっと工夫しないとダメだなと痛感しました。
時系列分析の基本といえばラグ特徴量(Lag Features)です。これは「過去の値を現在の特徴量として使う」というもの。例えば、株価の予測をしたい場合、「昨日の終値」「一昨日の終値」などを新しいカラムとして追加します。
具体的な実装例を見てみましょう。Pandasを使った日本株(例えばトヨタ自動車の株価データ)でのコードです。
import pandas as pd
# 株価データを読み込み
df = pd.read_csv('toyota_stock.csv', parse_dates=['Date'], index_col='Date')
# 1日遅れ、5日遅れのラグ特徴量を追加
df['close_lag1'] = df['Close'].shift(1)
df['close_lag5'] = df['Close'].shift(5)
「え、たったこれだけ?」と思った方、私も最初は拍子抜けしました。でも、これが実はかなり効果的なんです。過去の値を加えることで、モデルが「最近の動き」を学習できるんですよね。
次に、金融データ分析で欠かせない「移動平均」と「移動標準偏差」についてです。皆さんもテクニカル分析で「5日移動平均線」なんて聞いたことありませんか?これは、直近5日間の終値の平均を毎日計算して線でつないだものです。
Pandasならrolling関数で簡単に計算できます。
# 5日移動平均と5日移動標準偏差
df['ma5'] = df['Close'].rolling(window=5).mean()
df['std5'] = df['Close'].rolling(window=5).std()
これ、最初は「window=5って何?」と思いますよね。これは「期間」を指定する引数です。短期・中期・長期で期間を変えてみると、傾向が違って見えて面白いですよ。
私の場合、移動平均を特徴量に加えたら、モデルの予測のノイズがだいぶ減りました。逆に、移動標準偏差を使うと、ボラティリティが高まるタイミングをうまく捉えられることも。
じゃあ、もっと時系列の「構造」を活かしたいときはどうするか?ここで使うのがトレンド抽出や季節性分解です。statsmodelsのSTL分解を使うと、データを「トレンド」「季節性」「残差」に分解できます。
実際のPythonコード例がこちら:
from statsmodels.tsa.seasonal import STL
stl = STL(df['Close'], period=20) # 20日周期の季節性を仮定
result = stl.fit()
df['trend'] = result.trend
df['seasonal'] = result.seasonal
df['resid'] = result.resid
「おや? period=20って何?」と疑問に思った方。これは一つの季節性サイクルの長さです。日本の株式市場だと1か月営業日が20日前後なので、こういう設定にしています。
私も最初はこの分解の意味がピンとこなかったんですが、トレンド成分だけを特徴量にしたり、逆に季節性を除去してみたりすると、モデルの精度が変わるんですよ。これ、試してみる価値あります!
「たくさん特徴量を増やせば精度も上がるのでは?」と思いがちですが、ここが落とし穴。私も実際、ラグや移動平均、分解成分を20個以上ガンガン足してみたら、学習時はやたら精度が高いのに、実運用で全く当たらない…という「過学習」地獄にはまったことがあります。
このとき学んだのは、「必要な特徴量だけを選ぶ」ことの大切さ。特徴量選択や交差検証を使って、本当に効いているものだけを残しましょう。Pandasやscikit-learnの機能選択機能、正則化も活用できます。
時系列特徴量の生成は、モデルの性能を左右する超重要ポイントです。
私もまだまだ勉強中ですが、失敗から学んだことがたくさんあります。皆さんも「これ、どうなんだろう?」と思ったら、ぜひ一度実装して検証してみてくださいね。
次は、生成した特徴量をどう評価するか?について、一緒に考えてみましょうか。
さて、ここでは「スケーリング処理」と「非定常性への対応」について、実際の金融時系列データの前処理を例にとりながら詳しく見ていきましょう。
皆さんも「データを正規化しろ」「標準化しろ」と言われて戸惑った経験ありませんか?
私も最初は「0から1にするだけで本当に意味あるの?」と半信半疑でした。でも、スケーリングをちゃんとやると、機械学習モデルの学習スピードや精度がグッと良くなるんです。
Min-Max正規化は、データを0〜1の範囲に収める方法です。たとえば株価データだと、100円〜5000円など幅が広いので、これを0〜1に収めてあげると、ニューラルネットワークなんかは特に学習しやすくなります。
from sklearn.preprocessing import MinMaxScaler
import numpy as np
prices = np.array([[1200], [1500], [3000], [4500], [5000]])
scaler = MinMaxScaler()
scaled = scaler.fit_transform(prices)
print(scaled)
ちなみに私、最初にテストデータも一緒にfit_transformしちゃって、未来情報リークで大失敗したことがあります。fitは訓練データだけ、これは鉄則です!
一方、Zスコア標準化は、データを「平均0、分散1」に揃える方法。外れ値にちょっと強いのが特徴で、正規分布っぽいデータには特におすすめです。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
z_scaled = scaler.fit_transform(prices)
print(z_scaled)
「非定常性」…なんだか難しそうですが、要は平均や分散が時間で変わるデータのこと。日本の株式市場、為替レート、どれも非定常な動きをしますよね。
私も初めて時系列予測をやったとき、「やけに精度が出ないな」と思ったら、データが非定常で予測不能になっていた…なんて経験があります。
トレンドや季節性を除去してデータを定常化するのが差分変換。
たとえば日経平均株価の「前日比」を計算するのが一次差分です。
import pandas as pd
df = pd.DataFrame({'price': [1200, 1250, 1300, 1280, 1350]})
df['diff'] = df['price'].diff()
print(df.dropna())
価格データの変動幅が大きいときは対数変換が有効。データのばらつきを抑えてくれます。ただし、値が0以下だとエラーになるので注意!
df['log_price'] = np.log(df['price'])
print(df)
ここが一番大事。スケーリングや変換のパラメータは絶対に訓練データだけで算出しましょう。
私も最初は全部まとめて計算してしまい、「やたら精度が高いな…」と思ったら未来情報が混ざっていた、なんてことがありました。
実運用を想定するなら、訓練→パラメータ算出→テストに適用の順序で!
皆さんも「エラーが出る」「精度が上がらない」など悩んだら、前処理を疑ってみてくださいね。私もまだまだ勉強中ですが、失敗から学んだこのポイントだけはお伝えしたかったです。
本記事では、金融時系列データの基礎から前処理、特徴量エンジニアリングの実践まで、データクレンジングやリサンプリング、非定常性への対応といった重要な手法を体系的に解説しました。これで、株価予測のような実践的なモデル設計に不可欠な知識と技術が身についたはずです。
「NLPで培ったデータ処理力を金融データ解析にも応用したい」――そんな方にも、より精度の高い分析や予測モデルの構築が期待できます。
ぜひ、今日学んだ内容を実際のデータセットやプロジェクトに積極的に取り入れてみてください。継続的な実践こそが、データサイエンスのスキルを飛躍的に伸ばす最良の方法です。失敗しても大丈夫。私も何度もやらかしてます(笑)。挑戦を恐れず、最先端の金融データ解析に一歩踏み出しましょう!
金融時系列データでは欠損値や異常値が頻繁に発生するため、適切な前処理が不可欠です。
異なる粒度のデータで分析が必要な場合や、ノイズを除去するための前処理手法として重要です。
移動平均やボリンジャーバンドなど、金融データに特有の特徴量設計が分析の精度向上に寄与します。
「難しそう…」と思った方も、まずは一歩。失敗しても大丈夫。私も3時間くらいデータクレンジングで迷子になったこと、何度もあります(笑)。一緒に、金融データ分析の世界を楽しみましょう!