caution
內含 fugle_trade 下單套件,該套件已不再更新,下單語法請改用 合作券商 之 SDK
歡迎來到 程式交易實戰 的最後ㄧ堂課,在本系列文章中介紹了許多交易策略,可以發現不同的策略會有不同的特性,您還在尋找策略聖杯嗎?也許多個策略組合能夠有效幫助您降低風險,得到更平穩的報酬,我們不妨試著組合多個策略,進一步打造更平穩的報酬吧!
讀完本篇文,您將學會...
- 透過庫存個股進行移動停損停利實單演練
多策略組合介紹
在程式交易實戰系列文章中,介紹了許多交易策略,可以發現不同的策略各有特色,有些策略是獲利高、回檔大、交易次數多,有些策略是獲利普通、回檔小、交易次數少。通常不同策略所帶來的獲利週期往往也不一致。在開發策略時會希望將策略調整到完美的狀態,但同時也相當容易掉入過度擬和(Overfitting)的陷阱中,我們可以試著將多個策略組合起來,觀察策略之間是否有互補性,進而降低單一策略容易遇到的潛在風險。
假設有A、B兩支交易策略,他們的損益曲線如下圖,我們可以觀察到:
- 策略A:絕對獲利大,回檔大
- 策略B:絕對獲利小,回檔小

通常我們會認為策略B是一個較差的策略,因為他最後的報酬不理想,但事實上可以觀察到兩個策略的【獲利分布是不一樣的】,可以將兩個策略疊合起來會看得更清楚。可以發現疊合後的獲利雖然不如策略A,但是它的回檔降低了非常多,如此以來我們就可以較有信心使用這個策略組合。

以下我們就一樣以 0050 為標的,試著建構 2 種策略將它們組合起來並討論組合後的效果。
- 策略1:MACD 柱狀翻紅買進1張、翻黑賣出1張
- 策略2:紅 K 並且收盤突破昨日高點就買進1張、收黑K賣出1張。
首先取得 0050 的日 K 歷史資料,回測期間為 2010/1/1 至 2022/12/22!
策略回測
step1. 載入相關套件
# 載入富果 API 相關套件
from fugle_marketdata import (WebSocketClient, RestClient)
from configparser import ConfigParser
from fugle_trade.sdk import SDK
from fugle_trade.order import OrderObject
from fugle_trade.constant import (APCode, Trade, PriceFlag, BSFlag, Action)
# 載入相關套件
import matplotlib.pyplot as plt
import numpy as np
import requests
import pandas as pd
import time
step2. 取得歷史數據
# 輸入行情 API Token
key = 'INPUT_YOUR_API_KEY'
client = RestClient(api_key = key)
stock = client.stock # Stock REST API client
symbol = "0050" # 股票代碼
candles_list = []
for y in range(2010,2023):
start_date = str(y)+"-01-01" # 選擇資料起始日期
end_date = str(y)+"-12-31" # 選擇資料結束日期
history_options = {"symbol": symbol, "from": start_date, "to": end_date,
"timeframe":"D", "fields":"open,high,low,close,volume,change,turnover"}
historical_data = stock.historical.candles(**history_options)
# 將資料轉為 dataframe 方便回測
candles_list = candles_list + historical_data['data']
df = pd.DataFrame(candles_list).sort_values('date').set_index('date')