在這一節中,我們將結合金融指標計算和策略開發的基礎知識。首先,我們會計算基本的金融指標,如收益率、累計收益率和波動率,並深入理解夏普比率和最大回撤等風險調整指標。接著,我們將運用這些指標來設計簡單的交易策略,例如均線交叉策略,並了解策略開發的流程與注意事項。本日 Colab 連結
每日收益率:
收益率是衡量資產價格變化的基本指標。計算公式為:
其中,P_t
是第 t
天的收盤價, R_t
是第 t
天的收益率。
累計收益率:
累計收益率(Cumulative Reward, CR)表示資產在一段時間內的總收益,計算公式為:
波動率衡量資產收益的變動程度,通常使用收益率的標準差來表示。
其中, \bar{R} 是平均收益率。
夏普比率衡量單位風險下的超額收益,計算公式為:
其中, R_f 是無風險利率,常見為某一假設數字,例如存在銀行利息1% or 直接設成 0。可以想成機會成本的概念
最大回撤衡量投資組合從最高點到最低點的最大損失,計算公式為:
其中, H_t 是截至第 t 天的歷史最高價。
抱上又抱下,白忙 QQ
以下是使用Python計算這些指標的範例:
import pandas as pd
import numpy as np
import yfinance as yf
# 獲取數據
data = yf.download('AAPL', start='2020-01-01', end='2021-01-01')
prices = data['Adj Close']
# 計算每日收益率
returns = prices.pct_change().dropna()
# 累計收益率
cumulative_return = (1 + returns).prod() - 1
# 波動率
volatility = returns.std()
# 假設無風險利率為0.01
risk_free_rate = 0.01
# 夏普比率
sharpe_ratio = (returns.mean() - risk_free_rate/252) / returns.std() * np.sqrt(252)
# 最大回撤
rolling_max = prices.cummax()
drawdown = (prices - rolling_max) / rolling_max
max_drawdown = drawdown.min()
print(f'累計收益率: {cumulative_return:.2%}')
print(f'波動率: {volatility:.2%}')
print(f'夏普比率: {sharpe_ratio:.2f}')
print(f'最大回撤: {max_drawdown:.2%}')
可以得到:
我們在設計策略時可以按照下面的流程來思考:
策略構思:根據市場觀察或金融理論,提出交易策略的基本概念。
數據收集與處理:獲取相關的市場數據,並進行清洗和預處理。
策略實現:使用編程語言(如Python)將策略邏輯編碼。
回測:在歷史數據上測試策略的表現。
評估與優化:使用金融指標評估策略,並進行參數調整。
實時交易:在真實市場中部署策略,並進行監控。
我們已昨天介紹的**移動平均(SMA)**來當作我們策略判斷基礎
策略概念:
近期
價格趨勢。長期
價格趨勢。Python實現:
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
# 獲取數據
data = yf.download('AAPL', start='2020-01-01', end='2021-01-01')
# 計算短期和長期移動平均線
data['SMA_short'] = data['Adj Close'].rolling(window=10).mean()
data['SMA_long'] = data['Adj Close'].rolling(window=50).mean()
# 產生交易信號
data['Signal'] = 0
data['Signal'][10:] = np.where(data['SMA_short'][10:] > data['SMA_long'][10:], 1, 0)
# 建立持倉狀態
data['Position'] = data['Signal'].diff()
# 標示買入和賣出點
buy_signals = data[data['Position'] == 1]
sell_signals = data[data['Position'] == -1]
# 繪製價格、均線、買賣信號圖
plt.figure(figsize=(14, 8))
plt.plot(data['Adj Close'], label='AAPL 調整後收盤價', alpha=0.5)
plt.plot(data['SMA_short'], label='10日均線', alpha=0.75)
plt.plot(data['SMA_long'], label='50日均線', alpha=0.75)
# 繪製買入信號(綠色點)
plt.scatter(buy_signals.index, buy_signals['Adj Close'], marker='^', color='green', label='買入信號', alpha=1)
# 繪製賣出信號(紅色點)
plt.scatter(sell_signals.index, sell_signals['Adj Close'], marker='v', color='red', label='賣出信號', alpha=1)
plt.title('AAPL 均線交叉策略:買賣信號圖')
plt.xlabel('日期')
plt.ylabel('價格')
plt.legend()
plt.grid(True)
plt.show()
可以得到下圖,看起來這個基礎判斷的買跟賣的時機還不錯:
策略評估:
收益對比:比較策略的累計收益率與基準指數(如標普500指數)的累計收益率。
風險指標:計算策略的波動率、夏普比率和最大回撤。
注意事項:
滑點和交易成本:在真實交易中,需要考慮買賣差價和手續費對策略收益的影響。
過擬合:避免在歷史數據上過度調整策略參數,以免在未來市場中表現不佳。
風險管理:設置止損和止盈點,控制單筆交易的風險。
參數調整:測試不同的移動平均線期間組合,尋找最佳表現。
加入過濾器:如交易量、其他技術指標(RSI、MACD)等,提高信號的可靠性。
多資產組合:將策略應用於不同的資產,分散風險。
將金融指標計算與策略開發結合,能夠更全面地評估和優化交易策略。
目標:在多組參數下,選擇夏普比率最高的策略。
方法:
示例代碼:
short_windows = [5, 10, 15]
long_windows = [20, 50, 100]
best_sharpe = -np.inf
best_params = (None, None)
for short_window in short_windows:
for long_window in long_windows:
if short_window >= long_window:
continue
data['SMA_short'] = data['Adj Close'].rolling(window=short_window).mean()
data['SMA_long'] = data['Adj Close'].rolling(window=long_window).mean()
data['Signal'] = 0
data['Signal'][long_window:] = np.where(data['SMA_short'][long_window:] > data['SMA_long'][long_window:], 1, 0)
data['Position'] = data['Signal'].diff()
data['Strategy_Returns'] = data['Adj Close'].pct_change() * data['Position'].shift(1)
strategy_returns = data['Strategy_Returns'].dropna()
sharpe_ratio = (strategy_returns.mean() - risk_free_rate/252) / strategy_returns.std() * np.sqrt(252)
if sharpe_ratio > best_sharpe:
best_sharpe = sharpe_ratio
best_params = (short_window, long_window)
print(f'最佳參數組合: 短期均線={best_params[0]}, 長期均線={best_params[1]}, 夏普比率={best_sharpe:.2f}')
考慮風險因素:不僅關注收益率,還要關注策略的風險水平。
風險調整後的收益:使用夏普比率或Sortino比率等指標進行評估。
在這一節中,我們:
計算了基本的金融指標,如收益率、波動率、夏普比率和最大回撤,為策略評估打下基礎。
設計並實現了一個簡單的交易策略,即均線交叉策略,並探討了如何利用金融指標來優化策略。
強調了策略開發中的重要考慮因素,如交易成本、風險管理和過擬合問題。
接下來,我們將深入學習回測框架,進一步完善和測試我們的交易策略。
Appendix.作業:
指標計算:選擇一支股票,計算其過去一年的收益率、波動率、夏普比率和最大回撤。
策略實現:嘗試設計一個基於其他技術指標(如RSI、MACD)的簡單交易策略。
策略優化:使用所學的金融指標,評估並優化你的交易策略。
透過實踐,你將更深入地理解金融指標在策略開發中的重要性。