Bot トレードロジック 機械学習・データサイエンス

開発記録#125(2024/11/17)「サウンドマネーの考察と価格予測プログラム」

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

今回は「サウンドマネー」について気になったことをまとめました。

Yodaka

私自身はビットコインがサウンドマネーとしての資質を持つことには懐疑的な立場ですが、曖昧な根拠のままでいるのは良くないと思ったので、これまでぼんやりした理解でしかなかったものを掘り下げることにしました。ついでにビットコインの価格予測プログラムのアイデアも3つまとめました。

解決したかったこと

・サウンドマネーの概念を理解する

・サウンドマネーの概念を仮想通貨界隈に当てはめてその妥当性を検討する

・ビットコインの価格予測プログラムを作ってみる

サウンドマネーとは

「サウンドマネー」(sound money)とは、その価値が安定しており、長期間にわたって信頼性が保たれる通貨を指します。この用語は、通貨の購買力が長期にわたって一定している状態、つまりインフレーションや価値の急激な変動が少ない状態を表すために使われることが多いです。

Yodaka

「サウンドマネー」の特徴は以下の通りです。

  1. 価値の安定性:インフレーションやデフレーションが少なく、時間を通じて価値が安定している。
  2. 信頼性:経済的な不安定さや政治的な影響が少ないことから、幅広い市場で広く信頼されている。
  3. 普遍性:国際的に広く受け入れられ、利用されている。

金や銀のような貴金属は伝統的にサウンドマネーと見なされていますが、一部の人々はビットコインのようなデジタル通貨も新しい形のサウンドマネーとして考えています。これは、その供給が限られており、政府の介入による影響を受けにくいためです。

より厳密な定義

Yodaka

「サウンドマネー」をより厳密に定義すると、以下の要素を含んでいます。

  1. 価値の保存:長期にわたりその価値を保持する能力があります。つまり、インフレーションやその他の経済的変動による価値の損失が最小限である通貨を意味します。
  2. 交換手段としての信頼性:広く受け入れられ、取引において信頼される通貨であること。これには、偽造が難しく、分割可能で、移動や取引が容易である性質が含まれます。
  3. 希少性:供給が限定されており、市場での供給増加が予測可能、または制御可能である特性。この点が、通貨の価値を安定させる重要な要因です。
  4. 公的な干渉の最小限:政府や中央銀行による無計画な供給増加や政策変更の影響を受けにくいこと。サウンドマネーは、政治的な意思決定から独立してその価値が保たれるべきです。
  5. 普遍的な受け入れ:国境を越えて広く認められ、使用されること。これにより、国際貿易や個人間の取引での利用が促進されます。

金や銀が歴史的にサウンドマネーとされる理由は、これらの特性を兼ね備えているからです。最近では、ビットコインなどの暗号通貨が、そのプログラムにより制御された供給量と、中央集権的なコントロールからの自由を理由に、新たな形のサウンドマネーとして注目されています。

成り立ち

「サウンド」という言葉は、もともと「健全な」や「堅実な」という意味を持ちます。この言葉が「サウンドマネー」(sound money)として用いられる際には、「経済的に健全で信頼できる通貨」という意味で使われます。つまり、その通貨が長期にわたって価値を安定的に維持し、経済的な不安定さや政治的な干渉の影響を受けにくいことを示しています。

「サウンド」という形容詞が使われる理由は、この通貨が経済システム内で「健康的な基盤」を提供すると考えられているからです。インフレーションや財政危機のような経済的な問題に強い耐性を持つことで、個人や企業が長期的な計画を立てやすくなり、経済全体の安定と成長を支える重要な役割を果たします。このように、サウンドマネーはその信頼性と安定性により、経済的な「健全さ」を象徴するものとされています。

ビットコインはサウンドマネーか

Yodaka

私はビットコインがサウンドマネーとは思えないので、その立場からの論点を整理しました。

ビットコインがサウンドマネーとしての資質を持つかどうかは、その特性をどう評価するかに依存します。以下に、ビットコインがサウンドマネーと見なされるのが難しいとする立場からの論理的・数学的な根拠を提示します。

1. 価値の高い変動性

ビットコインはその誕生から現在に至るまで非常に高い価格変動を経験しています。通貨としての主要な機能の一つは価値の保存ですが、ビットコインの価格は短期間で大きく上下することが多く、保存手段としての信頼性に疑問が生じます。数学的には、ビットコインの価格変動は標準偏差やボラティリティの指標を用いて測定され、これが他の伝統的な通貨や資産と比べて格段に高いことが示されています。

2. 普遍的な受け入れ度

サウンドマネーは広く受け入れられる必要がありますが、ビットコインの使用はまだ限定的です。特に日常の小売取引での受け入れは限られており、多くの場合、法定通貨への換金が必要となります。これは、ビットコインがまだ普及の初期段階にあり、普遍的な交換手段としての地位を確立していないことを示しています。

3. 経済的な干渉と規制の不確実性

ビットコインは分散型であるため、特定の政府や機関による直接的な干渉から自由ですが、その規制環境は国によって大きく異なり、これが経済的な不確実性を生じさせています。規制の変更がビットコインの価格や使用に大きな影響を与える可能性があり、これはサウンドマネーとしての安定性を損なう要因です。

4. 希少性と新たな技術の進展

ビットコインの供給は2100万枚に限定されているという希少性は、理論的には価値の安定に寄与するはずですが、新たな仮想通貨の登場や技術的な変革がこの希少性を相対的なものに変える可能性があります。例えば、量子コンピューティングの進展がビットコインのセキュリティモデルに影響を与える可能性が指摘されています。

これらの点から、ビットコインが伝統的なサウンドマネーの特性を完全に満たしているとは言い難いという見解があります。

Yodaka

ビットコインが将来的にどのように進化し、これらの問題にどう対処するかによって、その評価は変わるかもしれません。

反論(ビットコインはサウンドマネーである)

Yodaka

上記の論に対する反論をChat GPTに挙げさせてみました。

ビットコインをサウンドマネーとして擁護する立場から、上記の批判に対して以下のように反論することができます:

1. 価値の高い変動性について

ビットコインの価値の変動性は、その成熟過程における自然な現象と見ることができます。新しい技術や資産クラスが市場に受け入れられる過程で、初期の不安定さは避けられないものです。歴史的に見ても、金や銀など他のサウンドマネーも初期には価値の変動が激しかったことを考慮すると、時間が経つにつれて市場が成熟し、ビットコインの価格変動も安定してくると期待されます。さらに、ビットコインのボラティリティはその希少性と不可逆性に起因する部分が大きく、これは長期的に見れば価値保存の手段として機能する可能性を秘めています。

2. 普遍的な受け入れ度について

ビットコインの普及は確かに現段階では限定的かもしれませんが、デジタル通貨としての利便性と効率性が徐々に認識されつつあり、多くの企業や国がビットコインを取引手段として受け入れ始めています。これはビットコインが将来的により広範な受け入れを得るための基盤を築いていることを示しており、普遍的な交換手段としての役割は時間とともに増していくでしょう。

3. 経済的な干渉と規制の不確実性について

ビットコインはその分散型の性質により、単一の政府や機関の影響を受けにくいという大きな利点を持っています。規制の不確実性はあるものの、これがビットコインの透明性と公正性を高め、ユーザーにより大きな自由と権利を提供する一因にもなっています。長期的には、規制が整備されることでビットコインの安全性と信頼性がさらに向上すると考えられます。

4. 希少性と新たな技術の進展について

ビットコインの希少性はプログラムによって保証されており、新たな技術が登場してもその基本的な属性は変わりません。量子コンピューティングのような技術的進展に対しても、ビットコインはアップグレードやアダプテーションを通じて対応可能です。これにより、将来的にも安全で信頼性の高い通貨としての地位を保つことができるでしょう。

これらの反論を通じて、ビットコインがサウンドマネーとしての潜在能力を持つという立場を支持することができます。

深掘り

Yodaka

この場合、その時々の社会が通貨や貨幣といったものをどのように受容するかということが論点になると考えられます。その受容状態を正当に評価するためにはどのような事象を観測するのが有効であると考えられるのかをChatGPTに考案させてみました。

通貨や貨幣の受容度を評価するためには、いくつかの重要な指標や事象を観測することが有効です。これらは通貨が経済内でどのように機能しているか、または将来的にどう受け入れられる可能性があるかを理解するのに役立ちます:

1. 市場での採用度

  • 取引所やプラットフォームでの取り扱い: 通貨が主要な取引所や決済プラットフォームでどの程度サポートされているか。
  • 企業による採用: 日常の商取引で通貨がどれだけ受け入れられているか。大手小売業者やサービス業者がその通貨を決済手段として採用しているかどうか。

2. 規制環境の整備

  • 法的枠組み: 政府や金融当局が通貨に対してどのような法的枠組みを提供しているか。規制の明確性や整合性が高いほど、その通貨の信頼性や安全性が向上し、より広く受け入れられる可能性が高まります。
  • 政策動向: 金融政策や税制において通貨がどのように扱われるか。例えば、暗号通貨に対する税制が整備されることで、より多くの企業や個人がその使用を検討するかもしれません。

3. 経済的・社会的影響

  • インフレーションへの耐性: 通貨がインフレーションや他の経済的変動にどれだけ効果的に対応しているか。特に伝統的な通貨と比較して、その安定性を観察する。
  • 危機時の反応: 経済危機や市場の大幅な変動時に通貨がどのように機能するか。危機時に信頼性が保たれる通貨は、よりサウンドマネーと見なされる傾向があります。

4. 技術的進展と革新

  • セキュリティとプライバシーの向上: 通貨のセキュリティ機能が進化し、利用者のプライバシーをどれだけ守ることができるか。
  • アクセシビリティの改善: 通貨を利用するための技術的ハードルが低く、より多くの人々が簡単にアクセスできるようになっているか。

これらの観測点を通じて、通貨が現在どの程度社会に受け入れられているか、またその受け入れが将来どのように進展する可能性があるかを正確に評価することができます。

ビットコインの価格予測プログラム

Yodaka

上記の要素を観測しながらビットコインの価格予測を行うプログラムを作成したいと考えたので、そのプロトタイプを作ってみようと思います。

ビットコインの価格予測プログラムを作成する際には、以下のステップで構築を進めることができます。このプログラムは、機械学習モデルを利用してビットコインの将来価格を予測し、市場の動向やその他の要因を考慮するよう設計されます。

1. データ収集

  • 市場データ: ビットコインの歴史的価格、取引量、市場キャップなどの基本的な市場データを収集します。
  • 規制および政策変更: 各国の規制情報や政策変更のニュース記事、公式声明などを収集します。
  • 経済指標: インフレ率、金利、経済成長率などのマクロ経済指標を収集します。
  • 技術的進展: ビットコインの技術的アップデートやセキュリティ関連のニュースを追跡します。

2. データ前処理

  • データクリーニング: 欠損データの処理、異常値の削除などを行います。
  • 特徴量エンジニアリング: 日付データから曜日や祝日などの情報を抽出し、テクニカル指標(例:移動平均、RSIなど)を計算します。
  • データの正規化: モデルのトレーニング効率を向上させるために、データをスケーリングします。

3. モデル選択とトレーニング

  • モデル選択: 時系列予測に適したモデル(例:ARIMA、LSTM、Prophetなど)を選択します。
  • クロスバリデーション: 過学習を防ぐために、クロスバリデーションを使用してモデルのパラメータを調整します。
  • モデルトレーニング: 収集したデータセットを使用してモデルをトレーニングします。

4. モデル評価とチューニング

  • 評価指標: RMSE、MAE、MAPEなどの評価指標を用いてモデルの予測精度を評価します。
  • パラメータチューニング: ハイパーパラメータを調整してモデルのパフォーマンスを最適化します。

5. デプロイメントとモニタリング

  • デプロイメント: 予測モデルをプロダクション環境にデプロイします。
  • リアルタイムデータの統合: リアルタイムの市場データやニュースフィードを統合して、予測精度を維持します。
  • モデルのモニタリング: モデルのパフォーマンスを定期的に評価し、必要に応じて再トレーニングやパラメータの調整を行います。

プログラムの雛形

ビットコイン価格予測のためのプログラムを作成するにあたり、ここではLSTM(Long Short-Term Memory)モデルを用いた時系列予測の例をPythonで示します。この例では、まず必要なライブラリをインストールし、その後、データの取得、前処理、モデルの構築とトレーニング、予測までの手順を踏みます。

1. 必要なライブラリのインストール

まずは、必要なPythonライブラリをインストールします。ここではpandasnumpymatplotlibtensorflowを使用します。

pip install pandas numpy matplotlib tensorflow

2.データの取得と前処理

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

# データの読み込み
url = "your-dataset-url.csv"
data = pd.read_csv(url)
data['date'] = pd.to_datetime(data['date'])
data.set_index('date', inplace=True)

# データの正規化
scaler = MinMaxScaler(feature_range=(0, 1))
data['close'] = scaler.fit_transform(data['close'].values.reshape(-1, 1))

# 訓練データとテストデータに分割
train_size = int(len(data) * 0.8)
test_size = len(data) - train_size
train, test = data.iloc[0:train_size], data.iloc[train_size:len(data)]

3.データセットの準備

def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset) - look_back):
        a = dataset[i:(i + look_back), 0]
        X.append(a)
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)

look_back = 60  # 過去60日分のデータを用いて次の日を予測
X_train, y_train = create_dataset(train.values, look_back)
X_test, y_test = create_dataset(test.values, look_back)

# LSTM用にデータ形状を変更
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

4.LSTMモデルの構築とトレーニング

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# モデルの構築
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(look_back, 1)))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mean_squared_error')

# モデルのトレーニング
model.fit(X_train, y_train, epochs=20, batch_size=32, verbose=1)

5.予測と評価

# 予測
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# 予測データのスケールを元に戻す
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)

# 実際の価格と予測価格のプロット
trainPredictPlot = np.empty_like(data)
trainPredictPlot[:, :] = np.nan
trainPredictPlot[look_back:len(train_predict) + look_back, :] = train_predict

testPredictPlot = np.empty_like(data)
testPredictPlot[:, :] = np.nan
testPredictPlot[len(train_predict) + (look_back * 2) + 1:len(data) - 1, :] = test_predict

plt.plot(scaler.inverse_transform(data))
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()
Yodaka

これで、ビットコインの価格予測モデルが完成します。実際のデータソースやパラメータはプロジェクトの具体的な要求に応じて調整する必要があります。

関連記事
開発記録#117(2024/10/21)MMbot開発「LSTMとの組み合わせ6種」

続きを見る

ビットコインの価格予測プログラム②「Prophet」

ここでは、Facebookが開発した時系列予測モデル「Prophet」を使用して、ビットコインの価格予測を行う例を示します。Prophetは季節性などの時間的変動をモデル化するのに特に優れており、少ないデータ点からでも優れた予測を行うことができます。

1. 必要なライブラリのインストール

Prophetを使用するには、以下のライブラリをインストールします。

pip install pandas numpy matplotlib prophet

2.データの取得と前処理

import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt

# データの読み込み
url = "your-dataset-url.csv"  # あなたのビットコイン価格データのURL
data = pd.read_csv(url)
data['ds'] = pd.to_datetime(data['date'])  # Prophetでは日付列を'ds'と名付ける必要があります
data['y'] = data['close']  # 価格情報を'y'として設定

# データフレームの整理
data = data[['ds', 'y']]

3.モデルの構築とトレーニング

# Prophetモデルの構築
model = Prophet(daily_seasonality=True)
model.fit(data)

# 未来365日のデータフレームを作成
future = model.make_future_dataframe(periods=365)

4.予測

# 予測の実行
forecast = model.predict(future)

# 予測結果のプロット
fig1 = model.plot(forecast)
plt.show()

# トレンドと季節性の成分をプロット
fig2 = model.plot_components(forecast)
plt.show()

5. 評価

Prophetの結果を評価するには、実際の価格データと予測価格を比較することができます。また、過去のデータを分割して、一部を使ってモデルをトレーニングし、残りのデータでモデルのパフォーマンスを評価するクロスバリデーションを行うことも可能です。

from prophet.diagnostics import cross_validation
from prophet.diagnostics import performance_metrics

# クロスバリデーションを実施
df_cv = cross_validation(model, initial='730 days', period='180 days', horizon = '365 days')

# パフォーマンスメトリクスの計算
df_p = performance_metrics(df_cv)
print(df_p.head())
Yodaka

このProphetモデルは特に日次のデータで効果を発揮し、ビットコインのような価格変動が激しいマーケットに対しても強力な予測能力を提供します。ビットコインのデータに合わせて、モデルの構成を調整することでさらに精度の高い予測が可能になります。

Prophetを選んだ理由

Prophetを選んだ理由は、特に時系列データに対して柔軟かつ強力な予測を提供するためです。具体的には、以下のような特徴が挙げられます:

1. 季節性と休日効果のモデリング

Prophetは季節性パターン(年次、週次、日次)を自動で検出し、休日や特別なイベントがデータに与える影響をモデル化することができます。これは、ビットコインの価格変動においても、特定の時期に見られるパターンや突発的な出来事が価格に与える影響を捉えるのに役立ちます。

2. 欠損データや外れ値の扱い

Prophetは欠損データや外れ値をうまく処理する能力があり、時系列データの一般的な問題を自動で処理します。これにより、データの前処理にかかる手間を減らしながらも、信頼性の高い予測が可能です。

3. 使いやすさと拡張性

ProphetはPythonやRといった一般的なデータサイエンスの環境で容易に使用でき、パラメータの調整も直感的です。これにより、非専門家でも高度な時系列分析を行うことが可能となります。

4. 透明性と解釈性

モデルの結果が解釈しやすく、どの成分が予測にどのように影響しているのかを明確に示します。これにより、予測の根拠を理解しやすく、改善点を特定しやすくなります。

他の有効なアプローチ

Prophet以外にも、ビットコインの価格予測にはいくつかのアプローチが有効です:

  • ARIMAモデル: 自己回帰積分移動平均モデルは、線形の時系列データに対して強力な予測能力を提供しますが、季節性や外れ値のモデリングには限界があります。
  • 機械学習モデル: ランダムフォレスト、勾配ブースティングマシン(GBM)、サポートベクターマシン(SVM)などのアルゴリズムを使用して、非線形関係や複雑なパターンを捉えることができます。
  • ディープラーニング: LSTMやCNNといったディープラーニングのアプローチは、非線形な関係や長期の依存性をモデル化するのに適しており、特に市場データのように複雑な時系列を扱う場合に有効です。

各モデルの選択は、使用するデータの特性、必要とする予測の精度、モデルの複雑さ、リソースの可用性などに基づいて行われるべきです。各手法の利点と限界を考慮に入れつつ、最も適切なモデルを選定することが重要です。

ビットコインの価格予測プログラム③「ARIMA」

ARIMA(自己回帰積分移動平均)モデルは、非季節性のデータの時系列予測に特に適しています。ビットコインの価格データのような金融時系列データの予測にARIMAを適用する例を示します。

1. 必要なライブラリのインストール

ARIMAモデルを実行するために、以下のPythonライブラリをインストールします:

pip install pandas numpy matplotlib pmdarima

2.データの取得と前処理

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pmdarima import auto_arima

# データの読み込み
url = "your-dataset-url.csv"
data = pd.read_csv(url, parse_dates=['date'], index_col='date')
data = data[['close']]  # 'close'列のみを使用

# データをプロットして確認
data.plot()
plt.title('Bitcoin Price')
plt.show()

3.ARIMAモデルのパラメータ設定

# 自動ARIMAモデルを使用して最適なパラメータを見つける
model = auto_arima(data['close'], seasonal=False, stepwise=True,
                   suppress_warnings=True, error_action="ignore", max_order=None, trace=True)

print(model.summary())

4.モデルのフィッティングと予測

# モデルのフィッティング
model.fit(data['close'])

# 未来の価格を予測
future_periods = 30
forecast = model.predict(n_periods=future_periods)
forecast_index = pd.date_range(start=data.index[-1], periods=future_periods + 1, freq='D')[1:]

# 予測結果をプロット
plt.figure(figsize=(10, 5))
plt.plot(data.index, data['close'], label='Historical Daily Price')
plt.plot(forecast_index, forecast, label='Forecasted Price')
plt.title('Bitcoin Price Forecast')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()

5. 評価と調整

ARIMAモデルの予測結果を評価するには、実際のデータと予測データを比較することが重要です。また、モデルのパラメータ(p, d, q)を調整してさらに精度を向上させることが可能です。予測性能を向上させるために、データの非定常性を解消するための差分を取る回数(d)や、季節性の影響を考慮した季節性ARIMA(SARIMA)への拡張も検討する価値があります。

Yodaka

段階的にプログラムを組むことを通じて、ARIMAモデルを用いてビットコインの価格予測を行う基本的なフレームワークを構築できます。

まとめ

今回は「サウンドマネーと価格予測プログラム」についてまとめました。

私自身はビットコインがサウンドマネーであるという主張には懐疑的ですが、トレーダーとしては仮想通貨はボラを生み出す構造を持っていると思っているので、引き続き仮想通貨botの開発は続けていきます。

Yodaka

今後は、仮想通貨botで作った資金を株式や債券、為替や先物などにスケールさせていきたいですね。やはり、市場規模の大きいところで戦っていた方が、長期間の安定感があるという意味では安心感が段違いです。

今後もこの調子で開発の状況をアウトプットしていきます。

-Bot, トレードロジック, 機械学習・データサイエンス