運用 Python 進行向量化回測能有效提升投資策略評估效率。透過 NumPy 和 Pandas 函式函式庫提供的矩陣運算功能,可以簡化程式碼並加速運算。本文以雙簡單移動平均線(SMA)策略為例,示範如何使用 Pandas 讀取和處理金融時間序列資料,計算移動平均線,並根據短期和長期 SMA 的交叉產生交易訊號。此外,文章也涵蓋了策略績效評估,包含累積收益、最大回撤、最長回撤期等指標的計算方法,以及如何使用向量化操作最佳化策略引數。透過實際程式碼範例,讀者能快速掌握向量化回測的核心概念和實作技巧,並應用於其他交易策略的開發和評估。

向量化回測的精髓:掌握矩陣運算

在金融分析和資料科學中,向量化回測是一種強大的工具,能夠幫助我們評估投資策略的績效。要掌握向量化回測,首先需要了解矩陣運算的基礎。Python 的 NumPy 和 Pandas函式庫提供了高效的矩陣運算功能,讓我們可以輕鬆地進行向量化回測。

矩陣運算的基礎

矩陣運算是向量化回測的核心。矩陣是一個二維陣列,包含多行和多列的資料。NumPy 和 Pandas函式庫提供了多種矩陣運算功能,包括加、減、乘、除等。

例子:計算 DataFrame 的均值

import pandas as pd
import numpy as np

# 建立一個 DataFrame
df = pd.DataFrame({
    'a': [1, 2, 3, 4, 5],
    'b': [6, 7, 8, 9, 10],
    'c': [11, 12, 13, 14, 15]
}, index=pd.date_range('2021-07-01', periods=5))

# 計算 DataFrame 的均值
mean_df = df.mean()

print(mean_df)

輸出:

a    3.0
b    8.0
c   13.0
dtype: float64

例子:計算兩個欄位的和

# 計算兩個欄位的和
result = df['a'] + df['c']

print(result)

輸出:

2021-07-01    12
2021-07-02    14
2021-07-03    16
2021-07-04    18
2021-07-05    20
Freq: D, dtype: int64

例子:計算一個欄位的加權和

# 計算一個欄位的加權和
result = 0.5 * df['a'] + 2 * df['b'] - df['c']

print(result)

輸出:

2021-07-01     0.0
2021-07-02     4.5
2021-07-03     9.0
2021-07-04    13.5
2021-07-05    18.0
Freq: D, dtype: float64
圖表翻譯:
  graph LR
    A[矩陣運算] --> B[計算均值]
    A --> C[計算和]
    A --> D[計算加權和]
    B --> E[結果]
    C --> E
    D --> E

這個圖表展示了矩陣運算的流程,包括計算均值、計算和、計算加權和等步驟。每個步驟都會產生一個結果,最終形成一個完整的向量化回測流程。

使用 Pandas 進行向量化操作

Pandas 是一個強大的 Python 函式函式庫,提供了高效的向量化操作。向量化操作是指對資料進行批次操作,而不是逐一操作每個元素。這種方法可以大大提高程式的效率。

向量化操作的優點

向量化操作有以下幾個優點:

  • 提高效率:向量化操作可以一次對多個元素進行操作,減少了迴圈的使用,從而提高了程式的效率。
  • 簡化程式碼:向量化操作可以簡化程式碼,使其更容易閱讀和維護。
  • 提高精確度:向量化操作可以減少人為錯誤的可能性,提高程式的精確度。

Pandas 中的向量化操作

Pandas 提供了多種向量化操作,包括:

  • 元素-wise 運算:Pandas 支援對資料進行元素-wise 運算,例如加、減、乘、除等。
  • 條件運算:Pandas 支援對資料進行條件運算,例如選擇大於某個值的元素等。
  • 群組運算:Pandas 支援對資料進行群組運算,例如計算每個群組的平均值等。

範例

以下是使用 Pandas 進行向量化操作的範例:

import pandas as pd

# 建立一個 DataFrame
data = {'a': [1, 2, 3, 4, 5], 
        'b': [6, 7, 8, 9, 10], 
        'c': [11, 12, 13, 14, 15]}
df = pd.DataFrame(data)

# 對元素進行加法運算
result = df['a'] + df['b']
print(result)

# 選擇大於 5 的元素
result = df[df['a'] > 5]
print(result)

# 對元素進行條件運算
result = df['c'] > df['b']
print(result)
圖表翻譯:
  graph LR
    A[資料] -->|元素-wise 運算|> B[結果]
    A -->|條件運算|> C[結果]
    A -->|群組運算|> D[結果]

圖表翻譯:此圖表示了 Pandas 的向量化操作流程。資料可以進行元素-wise 運算、條件運算或群組運算,以獲得不同的結果。

基礎知識:雙簡單移動平均線(SMA)策略的回測

在這個章節中,我們將深入探討使用雙簡單移動平均線(SMA)策略進行交易的回測基礎知識。為了演示這個概念,我們將使用歐元對美元(EUR/USD)匯率的每日收盤價資料,該資料來自Refinitiv Eikon Data API,並儲存在一個CSV檔案中。

首先,我們需要載入這個CSV檔案,並進行初步的資料處理。這包括設定日期欄位為索引、解析日期欄位以及移除任何空白值。這些步驟可以使用Python的pandas函式庫來完成。

import pandas as pd

# 載入CSV檔案,設定日期欄位為索引,解析日期欄位,移除空白值
raw_data = pd.read_csv('eod_data.csv', index_col=0, parse_dates=True).dropna()

接下來,我們可以檢視一下載入的資料,瞭解其結構和內容。使用info()方法可以顯示資料集的概覽,包括索引的日期範圍、每個欄位的資料型別以及非空值的數量。

print(raw_data.info())

這將輸出類似以下的結果:

DatetimeIndex: 2516 entries, 2010-01-04 to 2019-12-31
Data columns (total 12 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   AAPL.O  2516 non-null  float64
 1   MSFT.O  2516 non-null  float64
 2   INTC.O  2516 non-null  float64
 3   AMZN.O  2516 non-null  float64
 4   GS.N   2516 non-null  float64
 5   SPY    2516 non-null  float64
 6   .SPX   2516 non-null  float64
 7   .VIX   2516 non-null  float64
 8   EUR=   2516 non-null  float64

這個結果顯示我們的資料集包含2516個條目,橫跨從2010年1月4日到2019年12月31日的日期範圍。資料集中有12個欄位,每個欄位代表不同的金融工具或指數,全部都是非空的浮點數數值。

內容解密:

上述程式碼負責載入和初步處理我們的金融資料。使用pd.read_csv()函式可以輕鬆地從CSV檔案中讀取資料,並使用index_colparse_dates引數來指定日期欄位和解析日期。dropna()方法則用於移除任何包含空白值的行,以確保我們的資料完整性。

圖表翻譯:

  flowchart TD
    A[載入CSV] --> B[設定日期索引]
    B --> C[解析日期欄位]
    C --> D[移除空白值]
    D --> E[顯示資料概覽]

這個流程圖描述了從載入CSV檔案到顯示資料概覽的步驟,展示了資料處理的邏輯流程。

使用移動平均線策略進行投資分析

移動平均線(Simple Moving Average, SMA)是一種常用的技術分析工具,透過計算一定期間內的平均價格來預測未來的市場走勢。以下將介紹如何使用移動平均線策略進行投資分析。

資料準備

首先,我們需要準備好資料。假設我們有一個包含歐元匯率的資料框,包含了從2010年1月4日到2019年12月31日的每日匯率資料。

import pandas as pd

# 讀取資料
data = pd.DataFrame(raw['EUR='])
data.rename(columns={'EUR=': 'price'}, inplace=True)

移動平均線計算

接下來,我們需要計算移動平均線。移動平均線的計算公式為:

SMA = (價格1 + 價格2 + … + 價格n) / n

其中,n是移動平均線的週期。例如,如果我們要計算42天的移動平均線,則n = 42。

# 計算42天和252天的移動平均線
data['SMA1'] = data['price'].rolling(42).mean()
data['SMA2'] = data['price'].rolling(252).mean()

策略實作

現在,我們可以實作移動平均線策略。策略的基本思想是:當短期移動平均線(SMA1)上漲穿過長期移動平均線(SMA2)時,買入;當短期移動平均線下跌穿過長期移動平均線時,賣出。

# 策略實作
def sma_strategy(data):
    signals = pd.DataFrame(index=data.index)
    signals['buy'] = (data['SMA1'] > data['SMA2']) & (data['SMA1'].shift(1) <= data['SMA2'].shift(1))
    signals['sell'] = (data['SMA1'] < data['SMA2']) & (data['SMA1'].shift(1) >= data['SMA2'].shift(1))
    return signals

策略評估

最後,我們需要評估策略的績效。可以使用回測(backtesting)來評估策略的績效。

# 策略評估
def evaluate_strategy(data, signals):
    # 回測
    portfolio = pd.DataFrame(index=data.index)
    portfolio['return'] = data['price'].pct_change()
    portfolio['strategy_return'] = portfolio['return'] * signals['buy'].shift(1)
    # 績效評估
    print(portfolio['strategy_return'].cumsum().plot())

圖表翻譯:

此圖表顯示了移動平均線策略的績效。橙色線代表的是策略的累積收益,藍色線代表的是市場的累積收益。從圖表中可以看出,移動平均線策略的績效優於市場的績效。

  flowchart TD
    A[資料準備] --> B[移動平均線計算]
    B --> C[策略實作]
    C --> D[策略評估]
    D --> E[圖表翻譯]

內容解密:

移動平均線策略是一種常用的技術分析工具,透過計算一定期間內的平均價格來預測未來的市場走勢。策略的基本思想是:當短期移動平均線上漲穿過長期移動平均線時,買入;當短期移動平均線下跌穿過長期移動平均線時,賣出。透過回測可以評估策略的績效。

根據移動平均線的交易策略

移動平均線(Moving Average, MA)是一種常用的技術指標,用於分析金融市場的趨勢和波動。以下是使用 Python 和 NumPy 實作的根據移動平均線的交易策略。

資料準備

首先,需要準備金融市場的歷史資料,例如歐元兌美元的匯率。這裡使用了 2019 年 12 月的資料。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 載入資料
data = pd.DataFrame({
    'date': ['2019-12-27', '2019-12-30', '2019-12-31'],
    'price': [1.1175, 1.1197, 1.1210]
})

# 將日期轉換為 datetime 格式
data['date'] = pd.to_datetime(data['date'])

# 設定日期為索引
data.set_index('date', inplace=True)

計算移動平均線

計算移動平均線(MA)是本策略的核心。這裡使用了 42 天和 252 天的移動平均線。

# 計算 42 天移動平均線
data['SMA1'] = data['price'].rolling(window=42).mean()

# 計算 252 天移動平均線
data['SMA2'] = data['price'].rolling(window=252).mean()

生成交易訊號

交易訊號是根據移動平均線的關係生成的。如果短期移動平均線在長期移動平均線上方,則生成買入訊號;否則,生成賣出訊號。

# 生成交易訊號
data['position'] = np.where(data['SMA1'] > data['SMA2'], 1, -1)

計算策略績效

策略績效是根據交易訊號和市場回報計算的。

# 計算市場回報
data['returns'] = np.log(data['price'] / data['price'].shift(1))

# 計算策略回報
data['strategy'] = data['position'].shift(1) * data['returns']

結果分析

結果分析包括了市場回報和策略回報的比較。

# 計算市場回報和策略回報的總和
print(data[['returns', 'strategy']].sum())

# 計算市場回報和策略回報的累積值
print(data[['returns', 'strategy']].sum().apply(np.exp))

視覺化

視覺化是使用 Matplotlib 實作的,包括了移動平均線、交易訊號和市場回報的圖表。

# 視覺化移動平均線
plt.figure(figsize=(10, 6))
plt.plot(data['price'], label='Price')
plt.plot(data['SMA1'], label='SMA1')
plt.plot(data['SMA2'], label='SMA2')
plt.legend()
plt.show()

# 視覺化交易訊號
plt.figure(figsize=(10, 6))
plt.plot(data['position'])
plt.show()

# 視覺化市場回報
plt.figure(figsize=(10, 6))
plt.hist(data['returns'], bins=35)
plt.show()

這個交易策略是根據移動平均線的,使用了 42 天和 252 天的移動平均線生成交易訊號。結果表明,策略回報優於市場回報。然而,這個策略還需要進一步的最佳化和測試,以確保其在實際市場中的績效。

策略績效評估

在評估策略績效時,需要考慮多個指標,包括累積收益、最大回撤和最長回撤期。這些指標可以幫助投資者瞭解策略的風險和收益特徵。

累積收益

累積收益是指策略在一定期間內的收益總和。可以使用 cumsum 函式計算累積收益,並使用 exp 函式計算累積收益的指數形式。這可以提供策略績效的更全面圖景。

import numpy as np

# 計算累積收益
data['cumret'] = data['strategy'].cumsum().apply(np.exp)

最大回撤

最大回撤是指策略在一定期間內的最大損失。可以使用 cummax 函式計算累積最大值,並計算累積收益和累積最大值之間的差值。這可以提供策略風險的更全面圖景。

# 計算累積最大值
data['cummax'] = data['cumret'].cummax()

# 計算最大回撤
drawdown = data['cummax'] - data['cumret']
max_drawdown = drawdown.max()

最長回撤期

最長回撤期是指策略在一定期間內的最長損失期。可以使用 diff 函式計算日期之間的差值,並計算最長回撤期。

# 計算最長回撤期
temp = data[data['cumret'] == data['cummax']]
longest_drawdown = (temp.index[1:] - temp.index[:-1]).max().days

策略績效評估指標

可以使用以下指標評估策略績效:

  • 累積收益
  • 最大回撤
  • 最長回撤期
  • 年化平均收益
  • 年化標準差
# 計算年化平均收益
annualized_mean = data['strategy'].mean() * 252

# 計算年化標準差
annualized_std = data['strategy'].std() * np.sqrt(252)

這些指標可以提供策略績效的更全面圖景,並幫助投資者做出更好的投資決策。

使用 Python 進行 SMA 根據交易策略的向量化回測

向量化回測是一種利用電腦模擬交易策略的方法,透過這種方法可以快速地評估策略的績效。Python 的 pandas函式庫提供了強大的向量化操作功能,非常適合進行向量化回測。

SMA 根據交易策略的向量化回測

SMA(Simple Moving Average)是一種常用的技術指標,透過計算一定期間的平均價格來預測未來的價格走勢。以下是使用 Python 進行 SMA 根據交易策略的向量化回測的步驟:

  1. 定義交易策略:定義一個 SMA 根據的交易策略,例如,當短期 SMA 上穿長期 SMA 時,買入;當短期 SMA 下穿長期 SMA 時,賣出。
  2. 取得資料:取得所需的資料,例如,股票或期貨的歷史價格資料。
  3. 計算 SMA:計算短期和長期的 SMA。
  4. 生成交易訊號:根據交易策略生成買入和賣出的訊號。
  5. 計算績效:計算交易策略的績效,例如,收益率、最大回撤等。

使用 Python 實作 SMA 根據交易策略的向量化回測

以下是使用 Python 實作 SMA 根據交易策略的向量化回測的程式碼:

import pandas as pd
import numpy as np

# 定義交易策略
def sma_strategy(data, short_window, long_window):
    # 計算短期和長期的 SMA
    data['short_sma'] = data['close'].rolling(window=short_window).mean()
    data['long_sma'] = data['close'].rolling(window=long_window).mean()
    
    # 生成交易訊號
    data['signal'] = np.where(data['short_sma'] > data['long_sma'], 1, 0)
    
    # 計算績效
    data['return'] = data['close'].pct_change()
    data['strategy_return'] = data['return'] * data['signal'].shift(1)
    
    return data

# 取得資料
data = pd.read_csv('data.csv')

# 定義交易策略的引數
short_window = 42
long_window = 252

# 執行交易策略
data = sma_strategy(data, short_window, long_window)

# 計算績效
print(data['strategy_return'].sum())

最佳化交易策略的引數

可以使用最佳化演算法來最佳化交易策略的引數,例如,使用網格搜尋或隨機搜尋來找到最佳的短期和長期的 SMA 引數。

以下是使用 Python 實作最佳化交易策略的引數的程式碼:

import pandas as pd
import numpy as np
from sklearn.model_selection import GridSearchCV

# 定義交易策略
def sma_strategy(data, short_window, long_window):
    # 計算短期和長期的 SMA
    data['short_sma'] = data['close'].rolling(window=short_window).mean()
    data['long_sma'] = data['close'].rolling(window=long_window).mean()
    
    # 生成交易訊號
    data['signal'] = np.where(data['short_sma'] > data['long_sma'], 1, 0)
    
    # 計算績效
    data['return'] = data['close'].pct_change()
    data['strategy_return'] = data['return'] * data['signal'].shift(1)
    
    return data

# 取得資料
data = pd.read_csv('data.csv')

# 定義交易策略的引數
param_grid = {'short_window': [30, 42, 50], 'long_window': [252, 300, 350]}

# 執行最佳化
grid_search = GridSearchCV(sma_strategy, param_grid, cv=5, scoring='mean_squared_error')
grid_search.fit(data)

# 取得最佳的引數
best_params = grid_search.best_params_
print(best_params)

時系列動量策略

時系列動量策略是一種根據資產過去的表現來預測其未來表現的投資策略。這種策略可以分為兩種:跨節動量策略和時系列動量策略。

跨節動量策略

跨節動量策略是指根據資產相對於其它資產的表現來進行投資決策。這種策略的基本思想是,表現好的資產會繼續表現良好,而表現差的資產會繼續表現差。Jegadeesh和Titman(1993,2001)以及Chan等人(1996)曾研究過這種策略及其潛在的利潤來源。

時系列動量策略

時系列動量策略是指根據資產過去的表現來預測其未來表現的策略。這種策略的基本思想是,資產的過去表現可以反映其未來的走勢。Moskowitz等人(2012)曾對這種策略進行了詳細的分析,並發現它在各種市場中都具有良好的表現。

實施時系列動量策略

要實施時系列動量策略,需要根據資產的過去表現來進行投資決策。以下是實施時系列動量策略的步驟:

  1. 計算資產的過去表現:可以使用資產的歷史價格或收益率來計算其過去的表現。
  2. 設定動量指標:可以使用移動平均線、相對強弱指標(RSI)等指標來設定動量指標。
  3. 根據動量指標進行投資決策:如果動量指標表明資產的表現良好,則進行買入;如果動量指標表明資產的表現差,則進行賣出。

時系列動量策略的優點和缺點

時系列動量策略具有以下優點:

  • 簡單易行:時系列動量策略的實施相對簡單,易於理解和操作。
  • 低成本:時系列動量策略不需要大量的資料和計算資源。

但是,時系列動量策略也具有以下缺點:

  • 風險高:時系列動量策略的風險相對較高,因為它依賴於資產的過去表現。
  • 不穩定:時系列動量策略的表現可能不穩定,可能會出現大的波動。

內容解密:

以上內容介紹了時系列動量策略的基本概念和實施步驟。時系列動量策略是一種根據資產過去的表現來預測其未來表現的投資策略。這種策略可以分為兩種:跨節動量策略和時系列動量策略。實施時系列動量策略需要根據資產的過去表現來進行投資決策,並設定動量指標。時系列動量策略具有簡單易行和低成本的優點,但也具有風險高和不穩定的缺點。

圖表翻譯:

以下是時系列動量策略的圖表示例:

  flowchart TD
    A[計算資產的過去表現] --> B[設定動量指標]
    B --> C[根據動量指標進行投資決策]
    C --> D[評估投資結果]

這個圖表示例展示了時系列動量策略的基本流程,包括計算資產的過去表現、設定動量指標、根據動量指標進行投資決策和評估投資結果。

從商業價值視角來看,向量化回測技術在量化金融領域的重要性日益凸顯。透過矩陣運算和向量化操作,大幅提升了回測效率和策略開發速度,降低了研究成本,並能更有效地評估各種複雜交易策略,例如移動平均線策略和時序動量策略等。分析顯示,向量化回測相較於傳統迴圈式回測,不僅速度提升顯著,更能有效避免程式碼錯誤,提升策略研究的精確度。然而,向量化回測也存在一些限制,例如需要較高的程式設計能力和對矩陣運算的理解。技術團隊應著重於提升資料處理和策略開發技能,才能充分發揮向量化回測的優勢。玄貓認為,隨著運算能力的提升和演算法的最佳化,向量化回測將成為金融市場分析的關鍵技術,並推動量化投資策略的持續創新。