iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
AI/ ML & Data

打開就會 AI 與數據分析的投資理財術系列 第 5

Day4:金融指標計算與策略開發基礎

  • 分享至 

  • xImage
  •  

在這一節中,我們將結合金融指標計算和策略開發的基礎知識。首先,我們會計算基本的金融指標,如收益率、累計收益率和波動率,並深入理解夏普比率和最大回撤等風險調整指標。接著,我們將運用這些指標來設計簡單的交易策略,例如均線交叉策略,並了解策略開發的流程與注意事項。本日 Colab 連結


一、金融指標計算

1. 收益率(Returns)

  • 每日收益率

    收益率是衡量資產價格變化的基本指標。計算公式為:

    https://ithelp.ithome.com.tw/upload/images/20240919/2012054904pGDKcAk7.png

    其中,P_t 是第 t 天的收盤價, R_t 是第 t 天的收益率。

  • 累計收益率

    累計收益率(Cumulative Reward, CR)表示資產在一段時間內的總收益,計算公式為:

    https://ithelp.ithome.com.tw/upload/images/20240919/20120549I8TfQgZMco.png

2. 波動率(Volatility)

波動率衡量資產收益的變動程度,通常使用收益率的標準差來表示。

https://ithelp.ithome.com.tw/upload/images/20240919/201205491jXR0lhygk.png

其中, \bar{R} 是平均收益率。

3. 夏普比率(Sharpe Ratio)

夏普比率衡量單位風險下的超額收益,計算公式為:

https://ithelp.ithome.com.tw/upload/images/20240919/201205497qNBC8ak99.png

其中, R_f 是無風險利率,常見為某一假設數字,例如存在銀行利息1% or 直接設成 0。可以想成機會成本的概念

4. 最大回撤(Max Drawdown)

最大回撤衡量投資組合從最高點到最低點的最大損失,計算公式為:

https://ithelp.ithome.com.tw/upload/images/20240919/20120549F6zfSyVdBj.png

其中, H_t 是截至第 t 天的歷史最高價。

抱上又抱下,白忙 QQ
https://ithelp.ithome.com.tw/upload/images/20240919/20120549Aq9e4LCQWH.jpg

5. Python實現

以下是使用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%}')

可以得到:
https://ithelp.ithome.com.tw/upload/images/20240919/20120549uStDA9C3Mh.png

二、策略開發基礎

1. 策略開發流程

我們在設計策略時可以按照下面的流程來思考:

  1. 策略構思:根據市場觀察或金融理論,提出交易策略的基本概念。

  2. 數據收集與處理:獲取相關的市場數據,並進行清洗和預處理。

  3. 策略實現:使用編程語言(如Python)將策略邏輯編碼。

  4. 回測:在歷史數據上測試策略的表現。

  5. 評估與優化:使用金融指標評估策略,並進行參數調整。

  6. 實時交易:在真實市場中部署策略,並進行監控。

2. 均線交叉策略示例

我們已昨天介紹的**移動平均(SMA)**來當作我們策略判斷基礎

策略概念

  • 短期均線(如10日移動平均線)代表近期價格趨勢。
  • 長期均線(如50日移動平均線)代表長期價格趨勢。
  • 短期均線上穿長期均線時,產生買入信號;反之,產生賣出信號。

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()

可以得到下圖,看起來這個基礎判斷的買跟賣的時機還不錯:
https://ithelp.ithome.com.tw/upload/images/20240919/20120549ZNE69ZUC3p.png

策略評估

  • 收益對比:比較策略的累計收益率與基準指數(如標普500指數)的累計收益率。

  • 風險指標:計算策略的波動率、夏普比率和最大回撤。

注意事項

  • 滑點和交易成本:在真實交易中,需要考慮買賣差價和手續費對策略收益的影響。

  • 過擬合:避免在歷史數據上過度調整策略參數,以免在未來市場中表現不佳。

  • 風險管理:設置止損和止盈點,控制單筆交易的風險。

3. 策略優化

  • 參數調整:測試不同的移動平均線期間組合,尋找最佳表現。

  • 加入過濾器:如交易量、其他技術指標(RSI、MACD)等,提高信號的可靠性。

  • 多資產組合:將策略應用於不同的資產,分散風險。


三、綜合應用:從指標到策略

將金融指標計算與策略開發結合,能夠更全面地評估和優化交易策略。

1. 使用夏普比率優化策略

  • 目標:在多組參數下,選擇夏普比率最高的策略。

  • 方法

    • 遍歷不同的短期和長期均線組合。
    • 對每組組合計算策略的夏普比率。
    • 選擇夏普比率最高的組合。

示例代碼

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}')

https://ithelp.ithome.com.tw/upload/images/20240919/20120549LiktVwxDIj.png

2. 風險調整後的收益

  • 考慮風險因素:不僅關注收益率,還要關注策略的風險水平。

  • 風險調整後的收益:使用夏普比率或Sortino比率等指標進行評估。


四、第四天任務

在這一節中,我們:

  • 計算了基本的金融指標,如收益率、波動率、夏普比率和最大回撤,為策略評估打下基礎。

  • 設計並實現了一個簡單的交易策略,即均線交叉策略,並探討了如何利用金融指標來優化策略。

  • 強調了策略開發中的重要考慮因素,如交易成本、風險管理和過擬合問題。

接下來,我們將深入學習回測框架,進一步完善和測試我們的交易策略。


Appendix.作業

  1. 指標計算:選擇一支股票,計算其過去一年的收益率、波動率、夏普比率和最大回撤。

  2. 策略實現:嘗試設計一個基於其他技術指標(如RSI、MACD)的簡單交易策略。

  3. 策略優化:使用所學的金融指標,評估並優化你的交易策略。

透過實踐,你將更深入地理解金融指標在策略開發中的重要性。


上一篇
Day3:數據清洗、處理與技術指標計算
下一篇
Day5:回測框架介紹
系列文
打開就會 AI 與數據分析的投資理財術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言