
モメンタム効果に基づくクオンツ戦略
モメンタム効果は金融市場でよく見られる現象の一つで、過去に好調だった資産が将来の一定期間にわたって引き続き好調に推移する傾向を指します。本稿では、ある…
モメンタム効果は金融市場でよく見られる現象の一つで、過去に好調だった資産が将来の一定期間にわたって引き続き好調に推移する傾向を指します。本稿では、モメンタム効果に基づくクオンツ戦略を紹介し、Pythonコードを使ってその実装プロセスを示します。
戦略ロジック
この戦略の中核となるロジックは次のとおりです:過去の一定期間における上昇率が最も大きいN銘柄を選び、将来の一定期間保有することで、上昇トレンドが継続することを期待します。
データ準備
まず、AllTickのインターフェースから株式の過去の価格データを取得します。
import time
import requests
import pandas as pd
# 過去のローソク足データを取得する関数
def get_historical_data(symbol, kline_type=1, kline_timestamp_end=0, query_kline_num=100, adjust_type=0):
url = 'http://quote.alltick.io/quote-stock-b-api/kline'
token = 'YOUR_API_TOKEN'
# クエリパラメータを作成
query = {
"trace": "python_http_test1",
"data": {
"code": symbol,
"kline_type": kline_type, # ローソク足種別:1は日足
"kline_timestamp_end": kline_timestamp_end, # 終了タイムスタンプ。0は最新
"query_kline_num": query_kline_num, # 取得するローソク足の本数
"adjust_type": adjust_type # 価格調整種別:0は無調整
}
}
# リクエストを送信
response = requests.get(
url=url,
params={"token": token, "query": json.dumps(query)},
headers={'Content-Type': 'application/json'}
)
# レスポンスを解析
if response.status_code == 200:
data = response.json()
if data.get("code") == 0: # リクエストが成功したか確認
kline_data = data["data"]["kline"]
df = pd.DataFrame(kline_data, columns=["timestamp", "open", "high", "low", "close", "volume"])
df["timestamp"] = pd.to_datetime(df["timestamp"], unit="s") # タイムスタンプを日時に変換
df.set_index("timestamp", inplace=True)
return df
else:
print(f"Error: {data.get('message')}")
return None
else:
print(f"Request failed with status code: {response.status_code}")
return None
# 複数銘柄の過去データを取得
symbols = ["700.HK", "UNH.US", "AAPL.US"] # 銘柄コードの例
start_date = "2022-01-01"
end_date = "2023-01-01"
# 過去データを取得してリターンを計算
data = {}
for symbol in symbols:
df = get_historical_data(symbol, query_kline_num=252) # 252取引日分のデータを取得
if df is not None:
df['returns'] = df['close'].pct_change() # 日次リターンを計算
data[symbol] = df
# 全銘柄のデータを1つのDataFrameに結合
all_data = pd.concat(data.values(), keys=data.keys(), names=['symbol'])
モメンタムの計算
次に、各銘柄の過去の一定期間における累積収益率を計算し、そのモメンタム指標とします。
lookback_period = 20 # モメンタムのルックバック期間
all_data['momentum'] = all_data.groupby('symbol')['returns'].rolling(window=lookback_period).apply(lambda x: (x + 1).prod() - 1).reset_index(level=0, drop=True)
戦略の構築
各リバランス日に、モメンタムが最も大きいN銘柄を選び、等ウェイトで保有します。
import numpy as np
N = 5 # 保有銘柄数
rebalance_freq = 'M' # 毎月リバランス
# 各リバランス日のモメンタム順位を計算
all_data['rank'] = all_data.groupby('date')['momentum'].rank(ascending=False)
# 売買シグナルを生成
all_data['signal'] = np.where(all_data['rank'] <= N, 1, 0)
# 戦略リターンを計算
all_data['strategy_return'] = all_data.groupby('symbol')['signal'].shift(1) * all_data['returns']
# ポートフォリオリターンを計算
portfolio_return = all_data.groupby('date')['strategy_return'].sum() / N
戦略の評価
最後に、戦略の年率リターンや最大ドローダウンなどの指標を計算し、戦略の純資産曲線を描画できます。
# 年率リターンを計算
annual_return = portfolio_return.mean() * 252
# 最大ドローダウンを計算
cumulative_return = (1 + portfolio_return).cumprod()
peak = cumulative_return.cummax()
drawdown = (cumulative_return - peak) / peak
max_drawdown = drawdown.min()
# 戦略パフォーマンスを表示
print(f"年率リターン: {annual_return:.2%}")
print(f"最大ドローダウン: {max_drawdown:.2%}")
# 資産曲線を描画
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(cumulative_return)
plt.title('Strategy Cumulative Return')
plt.xlabel('Date')
plt.ylabel('Cumulative Return')
plt.show()
まとめ
モメンタム効果は、クオンツ取引における古典的かつ有効な戦略の一つです。本稿では、モメンタム効果に基づくシンプルな戦略を紹介し、Pythonコードを使ってその実装プロセスを示しました。ただし、この戦略はあくまで例としてのものであり、実際に適用する際には、取引コストやリスク管理など、より多くの要素を考慮する必要があります。