內置交易策略

qteasy提供了70多種內置交易策略,用戶可以很容易地直接使用這些交易策略,同時,qteasy提供了一套交易策略組合機制,用戶可以將多個簡單的交易策略組合成一個比較複雜的交易策略,策略的組合方式是可以靈活設定的。將多個簡單交易策略組合成一個複雜的策略後,同樣可以使用策略優化工具搜索整個複雜策略的最佳參數。

在這篇教程中,您將瞭解如何使用內置交易策略,如何組合策略,如何設定組合規則實現複雜策略,以及如何優化策略。

內置交易策略的使用

qt.get_built_in_strategy(id)

qt.built_in_list(stg_id=None)

上面三個方法的輸出是一樣的,都用一個dict列出所有的內置交易策略,dictkey是交易策略的ID,value是交易策略對象。 如果給出stg_id,則列印出指定的交易策略的詳細資訊。例如:

# 获取内置交易策略的清单
stg_list = qt.built_ins('dma')

列印如下資訊:

DMA择时策略

策略参数:
    s, int, 短均线周期
    l, int, 长均线周期
    d, int, DMA周期
信号类型:
    PS型:百分比买卖交易信号
信号规则:
    在下面情况下产生买入信号:
    1, DMA在AMA上方时,多头区间,即DMA线自下而上穿越AMA线后,输出为1
    2, DMA在AMA下方时,空头区间,即DMA线自上而下穿越AMA线后,输出为0
    3, DMA与股价发生背离时的交叉信号,可信度较高

策略属性缺省值:
默认参数:(12, 26, 9)
数据类型:close 收盘价,单数据输入
采样频率:天
窗口长度:270
参数范围:[(10, 250), (10, 250), (8, 250)]
策略不支持参考数据,不支持交易数据

qteasy中,可以直接使用策略的ID獲取內置交易策略

除了使用qt.get_built_in_strategy()獲取交易策略以外,在創建Operator對象的時候,將內置交易策略的ID作爲參數傳入,也可以直接創建交易策略。

# 获取内置交易策略的ID
strategy_ids = qt.built_ins().keys()
print(list(strategy_ids)[:10])
['crossline', 'macd', 'dma', 'trix', 'cdl', 'bband', 's-bband', 'sarext', 'ssma', 'sdema']
# 使用策略ID获取交易策略
stg = qt.get_built_in_strategy('trix')
# 显示策略的相关信息
stg.info()
Strategy_type:      RuleIterator
Strategy name:      TRIX
Description:        TRIX strategy, determine long/short position according to triple exponential weighted moving average prices
Strategy Parameter: (25, 125)

Strategy Properties     Property Value
---------------------------------------
Parameter count         2
Parameter types         ['int', 'int']
Parameter range         [(2, 50), (3, 150)]
Data frequency          d
Sample frequency        d
Window length           270
Data types              ['close']
# 通过策略ID直接生成Operator
op = qt.Operator(strategies='dma, macd')
# 通过op.get_stg或op[]获取交易策略
stg_dma = op.get_stg('dma')
stg_macd = op['macd']

# 查看两个交易策略的相关信息
stg_dma.info()
stg_macd.info()
Strategy_type:      RuleIterator
Strategy name:      DMA
Description:        Quick DMA strategy, determine long/short position according to differences of moving average prices with simple timing strategy
Strategy Parameter: (12, 26, 9)

Strategy Properties     Property Value
---------------------------------------
Parameter count         3
Parameter types         ['int', 'int', 'int']
Parameter range         [(10, 250), (10, 250), (10, 250)]
Data frequency          d
Sample frequency        d
Window length           270
Data types              ['close']

Strategy_type:      RuleIterator
Strategy name:      MACD
Description:        MACD strategy, determine long/short position according to differences of exponential weighted moving average prices
Strategy Parameter: (12, 26, 9)

Strategy Properties     Property Value
---------------------------------------
Parameter count         3
Parameter types         ['int', 'int', 'int']
Parameter range         [(10, 250), (10, 250), (10, 250)]
Data frequency          d
Sample frequency        d
Window length           270
Data types              ['close']

目前qteasy支持的內置交易策略如下:

ID

策略名稱

說明

crossline

TimingCrossline

crossline擇時策略類,利用長短均線的交叉確定多空狀態
1,當短均線位於長均線上方,且距離大於l*m%時,設置倉位目標爲1
2,當短均線位於長均線下方,且距離大於l*m%時,設置倉位目標爲-1
3,當長短均線之間的距離不大於l*m%時,設置倉位目標爲0

macd

TimingMACD

MACD擇時策略類,運用MACD均線策略,生成目標倉位百分比:
1,當MACD值大於0時,設置倉位目標爲1
2,當MACD值小於0時,設置倉位目標爲0

dma

TimingDMA

DMA擇時策略
1, DMA在AMA上方時,多頭區間,即DMA線自下而上穿越AMA線後,輸出爲1
2, DMA在AMA下方時,空頭區間,即DMA線自上而下穿越AMA線後,輸出爲0

trix

TimingTRIX

TRIX擇時策略,使用股票價格的三重平滑指數移動平均價格進行多空判斷:
計算價格的三重平滑指數移動平均價TRIX,再計算M日TRIX的移動平均:
1, TRIX位於MATRIX上方時,設置倉位目標爲1
2, TRIX位於MATRIX下方時,設置倉位目標位-1

cdl

TimingCDL

CDL擇時策略,在K線圖中找到符合要求的cdldoji模式
搜索歷史數據窗口內出現的cdldoji模式(匹配度0~100之間),加總後/100,計算 等效cdldoji匹配數量,以匹配數量爲交易信號。

bband

TimingBBand

布林帶線交易策略,根據股價與布林帶上軌和布林帶下軌之間的關係確定多空,在價格上穿或下穿布林帶線上下軌時產生交易信號。布林帶線的均線類型不可選
1,當價格上穿上軌時,產生全倉買入信號
2,當價格下穿下軌時,產生全倉賣出信號

s-bband

SoftBBand

布林帶線漸進交易策略,根據股價與布林帶上軌和布林帶下軌之間的關係確定多空,交易信號不是一次性產生的,而是逐步漸進買入和賣出。計算BBAND,檢查價格是否超過BBAND的上軌或下軌:
1,當價格大於上軌後,每天產生10%的比例買入交易信號
2,當價格低於下軌後,每天產生33%的比例賣出交易信號

sarext

TimingSAREXT

擴展拋物線SAR策略,當指標大於0時發出買入信號,當指標小於0時發出賣出信號

ssma

SCRSSMA

單均線交叉策略——SMA均線(簡單移動平均線):根據股價與SMA均線的相對位置設定持倉比例

sdema

SCRSDEMA

單均線交叉策略——DEMA均線(雙重指數平滑移動平均線):根據股價與DEMA均線的相對位置設定持倉比例

sema

SCRSEMA

單均線交叉策略——EMA均線(指數平滑移動均線):根據股價與EMA均線的相對位置設定持倉比例

sht

SCRSHT

單均線交叉策略——HT(希爾伯特變換瞬時趨勢線):根據股價與HT線的相對位置設定持倉比例

skama

SCRSKAMA

單均線交叉策略——KAMA均線(考夫曼自適應移動均線):根據股價與KAMA均線的相對位置設定持倉比例

smama

SCRSMAMA

單均線交叉策略——MAMA均線(MESA自適應移動平均線):根據股價與MAMA均線的相對位置設定持倉比例

st3

SCRST3

單均線交叉策略——T3均線(三重指數平滑移動平均線):根據股價與T3均線的相對位置設定持倉比例

stema

SCRSTEMA

單均線交叉策略——TEMA均線(三重指數平滑移動平均線):根據股價與TEMA均線的相對位置設定持倉比例

strima

SCRSTRIMA

單均線交叉策略——TRIMA均線(三重指數平滑移動平均線):根據股價與TRIMA均線的相對位置設定持倉比例

swma

SCRSWMA

單均線交叉策略——WMA均線(加權移動平均線):根據股價與WMA均線的相對位置設定持倉比例

dsma

DCRSSMA

雙均線交叉策略——SMA均線(簡單移動平均線):
基於SMA均線計算規則生成快慢兩根均線,根據快與慢兩根均線的相對位置設定持倉比例

ddema

DCRSDEMA

雙均線交叉策略——SMA均線(簡單移動平均線):
基於DEMA均線計算規則生成快慢兩根均線,根據快與慢兩根均線的相對位置設定持倉比例

dema

DCRSEMA

雙均線交叉策略——SMA均線(簡單移動平均線):
基於EMA均線計算規則生成快慢兩根均線,根據快與慢兩根均線的相對位置設定持倉比例

dkama

DCRSKAMA

雙均線交叉策略——SMA均線(簡單移動平均線):
基於KAMA均線計算規則生成快慢兩根均線,根據快與慢兩根均線的相對位置設定持倉比例

dmama

DCRSMAMA

雙均線交叉策略——SMA均線(簡單移動平均線):
基於MAMA均線計算規則生成快慢兩根均線,根據快與慢兩根均線的相對位置設定持倉比例

dt3

DCRST3

雙均線交叉策略——SMA均線(簡單移動平均線):
基於T3均線計算規則生成快慢兩根均線,根據快與慢兩根均線的相對位置設定持倉比例

dtema

DCRSTEMA

雙均線交叉策略——SMA均線(簡單移動平均線):
基於TEMA均線計算規則生成快慢兩根均線,根據快與慢兩根均線的相對位置設定持倉比例

dtrima

DCRSTRIMA

雙均線交叉策略——SMA均線(簡單移動平均線):
基於TRIMA均線計算規則生成快慢兩根均線,根據快與慢兩根均線的相對位置設定持倉比例

dwma

DCRSWMA

雙均線交叉策略——SMA均線(簡單移動平均線):
基於WMA均線計算規則生成快慢兩根均線,根據快與慢兩根均線的相對位置設定持倉比例

slsma

SLPSMA

均線斜率交易策略——SMA均線(簡單移動平均線):
基於SMA計算規則生成移動均線,根據均線的斜率設定持倉比例目標

sldema

SLPDEMA

均線斜率交易策略——DEMA均線(雙重指數平滑移動平均線):
基於DEMA計算規則生成移動均線,根據均線的斜率設定持倉比例目標

slema

SLPEMA

均線斜率交易策略——EMA均線(指數平滑移動平均線):
基於EMA計算規則生成移動均線,根據均線的斜率設定持倉比例目標

slht

SLPHT

均線斜率交易策略——HT均線(希爾伯特變換——瞬時趨勢線線):
基於HT計算規則生成移動均線,根據均線的斜率設定持倉比例目標

slkama

SLPKAMA

均線斜率交易策略——KAMA均線(考夫曼自適應移動平均線):
基於KAMA計算規則生成移動均線,根據均線的斜率設定持倉比例目標

slmama

SLPMAMA

均線斜率交易策略——MAMA均線(MESA自適應移動平均線):
基於MAMA計算規則生成移動均線,根據均線的斜率設定持倉比例目標

slt3

SLPT3

均線斜率交易策略——T3均線(三重指數平滑移動平均線):
基於T3計算規則生成移動均線,根據均線的斜率設定持倉比例目標

sltema

SLPTEMA

均線斜率交易策略——TEMA均線(三重指數平滑移動平均線):
基於TEMA計算規則生成移動均線,根據均線的斜率設定持倉比例目標

sltrima

SLPTRIMA

均線斜率交易策略——TRIMA均線(三重指數平滑移動平均線):
基於TRIMA計算規則生成移動均線,根據均線的斜率設定持倉比例目標

slwma

SLPWMA

均線斜率交易策略——WMA均線(加權移動平均線):
基於WMA計算規則生成移動均線,根據均線的斜率設定持倉比例目標

adx

ADX

ADX指標(平均定向運動指數)選股策略:
基於ADX指標判斷當前趨勢的強度,從而根據趨勢強度產生交易信號
1, 當ADX大於25時,判斷趨勢向上,設定持倉比例爲1
2, 當ADX介於20到25之間時,判斷爲中性趨勢,設定持倉比例爲0
3, 當ADX小於20時,判斷趨勢向下,設定持倉比例爲-1

apo

APO

APO指標(絕對價格震盪指標)選股策略:
基於APO指標判斷當前股價變動的牛熊趨勢,從而根據趨勢產生交易信號
1, 當APO大於0時,判斷爲牛市趨勢,設定持倉比例爲1
2, 當ADX小於0時,判斷爲熊市趨勢,設定持倉比例爲-1

aroon

AROON

AROON指標選股策略:
通過計算AROON指標趨勢的強弱程度輸出強多/空頭和弱多/空頭
1, 當UP在DOWN的上方時,輸出弱多頭
2, 當UP位於DOWN下方時,輸出弱空頭
3, 當UP大於70且DOWN小於30時,輸出強多頭
4, 當UP小於30且DOWN大於70時,輸出強空頭

aroonosc

AROONOSC

AROON Oscillator (AROON震盪指標) 選股策略:
當AROONOSC大於0時表示價格趨勢向上,反之趨勢向下,絕對值大於50時表示強烈的趨勢
1, 當AROONOSC大於0時,輸出弱多頭
2, 當AROONOSC小於0時,輸出弱空頭
3, 當AROONOSC大於50時,輸出強多頭
4, 當AROONOSC小於-50時,輸出強空頭

cci

CCI

CCI (Commodity Channel Index商品渠道指數) 選股策略:
CCI商品渠道指數被用來判斷當前股價位於超賣還是超買區間,本策略使用這個指標生成投資倉位目標
1, 當CCI大於0時,輸出弱多頭
2, 當CCI小於0時,輸出弱空頭
3, 當CCI大於50時,輸出強多頭
4, 當CCI小於-50時,輸出強空頭

cmo

CMO

CMO (Chande Momentum Oscillator 錢德動量振盪器) 選股策略:
CMO 是一個在-100到100之間波動的動量指標,它被用來判斷當前股價位於超賣還是超買區間,本策略使用這個指標生成投資倉位目標
1, 當CMO大於0時,輸出弱多頭
2, 當CMO小於0時,輸出弱空頭
3, 當CMO大於50時,輸出強多頭
4, 當CMO小於-50時,輸出強空頭

macdext

MACDEXT

MACDEXT (Extendec MACD 擴展MACD指數) 選股策略:
本策略使用MACD指標生成持倉目標,但是與標準的MACD不同,MACDEXT的快、慢、及信號均線的類型均可選
1, 當hist>0時輸出多頭
2, 當hist<0時輸出空頭

mfi

MFI

MFI (Money Flow Index 貨幣流向指數) 交易策略:
MFI指數用於判斷股價屬於超買還是超賣狀態,本策略使用MFI指標生成交易信號
1, 當MFI>20時,持續不斷產生10%買入交易信號
2, 當MFI>80時,持續不斷產生30%賣出交易信號,持續賣出持倉股票

di

DI

DI (Directory Indicator 方向指標) 交易策略:
DI 指標包含負方向指標與正方向指標,它們分別表示價格上行和下行的趨勢強度,本策略使用±DI指標生成交易信號
1, 當+DI > -DI時,設置持倉目標爲1
2, 當+DI < -DI時,設置持倉目標爲-1

dm

DM

DM (Directional Movement 方向運動指標) 交易策略:
DM 指標包含負方向運動指標(Negative Directional Movement)與正方向運動指標(Positive Directional Movement),它們分別表示價格上行和下行的趨勢,本策略使用±DM指標生成交易信號
1, 當+DM > -DM時,設置持倉目標爲1
2, 當+DM < -DM時,設置持倉目標爲-1
3, 其餘情況設置持倉目標爲0

mom

MOM

MOM (momentum indicator 動量指標) 交易策略:
MOM 指標可以用於識別價格的上行或下行趨勢的強度,當前價格高於N日前價格時,MOM爲正,反之爲負。
1, 當MOM > 0時,設置持倉目標爲1
2, 當MOM < 0時,設置持倉目標爲-1
3, 其餘情況設置持倉目標爲0

ppo

PPO

PO (Percentage Price Oscillator 百分比價格振盪器) 交易策略:
PPO 指標表示快慢兩根移動均線之間的百分比差值,用於判斷價格的變化趨勢。長短均線的計算週期和均線類型均爲策略參數。
1, 當PPO > 0時,設置持倉目標爲1
2, 當PPO < 0時,設置持倉目標爲-1
3, 其餘情況設置持倉目標爲0

rsi

RSI

RSI (Relative Strength Index 相對強度指數) 交易策略:
RSI 指標度量最近價格變化的幅度,從而判斷目前股票屬於超賣還是超買狀態
1, 當RSI > ulim時,設置持倉目標爲1
2, 當RSI < llim時,設置持倉目標爲-1
3, 其餘情況設置持倉目標爲0

stoch

STOCH

STOCH (Stochastic Indicator 隨機指數) 交易策略:
STOCH 指標度量價格變化的動量,並且動量的大小判斷價格趨勢,並生成比例買賣交易信號。
1, 當k > 80時,產生逐步賣出信號,每週期賣出持有份額的30%
2, 當k < 20時,產生逐步買入信號,每週期買入總投資額的10%

stochf

STOCHF

STOCHF (Stochastic Fast Indicator 快速隨機指標) 交易策略:
STOCHF 指標度量價格變化的動量,與STOCH策略類似,使用快速隨機指標判斷價格趨勢,並生成比例買賣交易信號。
1, 當k > 80時,產生逐步賣出信號,每週期賣出持有份額的30%
2, 當k < 20時,產生逐步買入信號,每週期買入總投資額的10%

stochrsi

STOCHRSI

STOCHRSI (Stochastic Relative Strength Index 隨機相對強弱指標) 交易策略:
STOCHRSI 指標度量價格變化的動量,該指標在0~1之間波動,表示相對的價格趨勢強弱程度,並生成比例買賣交易信號
1, 當k > 0.8時,產生逐步賣出信號,每週期賣出持有份額的30%
2, 當k < 0.2時,產生逐步買入信號,每週期買入總投資額的10%

ultosc

ULTOSC

ULTOSC (Ultimate Oscillator Indicator 終極振盪器指標) 交易策略:
ULTOSC 指標通過三個不同的時間跨度計算價格動量,並根據多種不同動量之間的偏離值生成交易信號。
1, 當ULTOSC > u時,產生逐步賣出信號,每週期賣出持有份額的30%
2, 當ULTOSC < l時,產生逐步買入信號,每週期買入總投資額的10%

willr

WILLR

WILLR (William’s %R 威廉姆斯百分比) 交易策略:
WILLR 指標被用於計算股價當前處於超買還是超賣區間,並用於生成交易信號
1, 當WILLR > -l時,產生逐步賣出信號,每週期賣出持有份額的30%
2, 當WILLR < -u時,產生逐步買入信號,每週期買入總投資額的10%

signal_none

SignalNone

空交易信號策略:不生成任何交易信號的策略

sellrate

SellRate

變化率賣出信號策略:當價格的變化率超過閾值時,產生賣出信號
1,當change > 0,且day日漲幅大於change時,產生-1賣出信號
2,當change < 0,且day日跌幅大於change時,產生-1賣出信號

buyrate

BuyRate

變化率買入信號策略:當價格的變化率超過閾值時,產生買入信號
1,當change > 0,且day日漲幅大於change時,產生1買入信號
2,當change < 0,且day日跌幅大於change時,產生1買入信號

long

TimingLong

簡單擇時策略,整個歷史週期上固定保持多頭全倉狀態

short

TimingShort

簡單擇時策略,整個歷史週期上固定保持空頭全倉狀態

zero

TimingZero

簡單擇時策略,整個歷史週期上固定保持空倉狀態

all

SelectingAll

保持歷史股票池中的所有股票都被選中,投資比例平均分配

select_none

SelectingNone

保持歷史股票池中的所有股票都不被選中,投資倉位爲0

random

SelectingRandom

在每個歷史分段中,按照指定的比例(p<1時)隨機抽取若干股票,或隨機抽取指定數量(p>=1)的股票進入投資組合,投資比例平均分配

finance

SelectingAvgIndicator

以股票過去一段時間內的財務指標的平均值作爲選股因子選股,基礎選股策略:以股票的歷史指標的平均值作爲選股因子,因子排序參數可以作爲策略參數傳入,改變策略數據類型,根據不同的歷史數據選股,選股參數可以通過pars傳入

ndaylast

SelectingNDayLast

以股票N天前的價格或數據指標作爲選股因子選股

ndayavg

SelectingNDayAvg

以股票過去N天的價格或數據指標的平均值作爲選股因子選股

ndayrate

SelectingNDayRateChange

以股票過去N天的價格或數據指標的變動比例作爲選股因子選股

ndaychg

SelectingNDayChange

以股票過去N天的價格或數據指標的變動值作爲選股因子選股

ndayvol

SelectingNDayVolatility

根據股票以前N天的股價波動率作爲選股因子

如果需要查看每一個內置交易策略的詳細解釋,例如策略參數的含義、信號生成規則,可以查看每一個交易策略的Doc-string

例如:

qt.built_ins('Crossline')

可以看到

Init signature: qt.built_in.TimingCrossline(pars:tuple=(35, 120, 0.02))
Docstring:     
crossline择时策略类,利用长短均线的交叉确定多空状态

策略参数:
    s: int, 短均线计算日期;
    l: int, 长均线计算日期;
    m: float, 均线边界宽度(百分比);
信号类型:
    PT型:目标仓位百分比
信号规则:
    1,当短均线位于长均线上方,且距离大于l*m%时,设置仓位目标为1
    2,当短均线位于长均线下方,且距离大于l*mM时,设置仓位目标为-1
    3,当长短均线之间的距离不大于l*m%时,设置仓位目标为0

策略属性缺省值:
默认参数:(35, 120, 0.02)
数据类型:close 收盘价,单数据输入
采样频率:天
窗口长度:270
参数范围:[(10, 250), (10, 250), (0, 1)]
策略不支持参考数据,不支持交易数据
File:           ~/Library/CloudStorage/OneDrive-Personal/Projects/PycharmProjects/qteasy/qteasy/built_in.py
Type:           type
Subclasses:     

ipython等交互式python環境中,也可以使用?來顯示內置交易策略的詳細資訊,例如:

>>> qt.built_in.SelectingNDayRateChange?

可以看到:

Init signature: qt.built_in.SelectingNDayRateChange(pars=(14,))
Docstring:     
基础选股策略:根据股票以前n天的股价变动比例作为选股因子

策略参数:
    n: int, 股票历史数据的选择期
信号类型:
    PT型:百分比持仓比例信号
信号规则:
    在每个选股周期使用以前n天的股价变动比例作为选股因子进行选股
    通过以下策略属性控制选股方法:
    *max_sel_count:     float,  选股限额,表示最多选出的股票的数量,默认值:0.5,表示选中50%的股票
    *condition:         str ,   确定股票的筛选条件,默认值'any'
                                'any'        :默认值,选择所有可用股票
                                'greater'    :筛选出因子大于ubound的股票
                                'less'       :筛选出因子小于lbound的股票
                                'between'    :筛选出因子介于lbound与ubound之间的股票
                                'not_between':筛选出因子不在lbound与ubound之间的股票
    *lbound:            float,  执行条件筛选时的指标下界, 默认值np.-inf
    *ubound:            float,  执行条件筛选时的指标上界, 默认值np.inf
    *sort_ascending:    bool,   排序方法,默认值: False,
                                True: 优先选择因子最小的股票,
                                False, 优先选择因子最大的股票
    *weighting:         str ,   确定如何分配选中股票的权重
                                默认值: 'even'
                                'even'       :所有被选中的股票都获得同样的权重
                                'linear'     :权重根据因子排序线性分配
                                'distance'   :股票的权重与他们的指标与最低之间的差值(距离)成比例
                                'proportion' :权重与股票的因子分值成正比

策略属性缺省值:
默认参数:(14,)
数据类型:close 收盘价,单数据输入
采样频率:月
窗口长度:150
参数范围:[(2, 150)]
策略不支持参考数据,不支持交易数据
File:           ~/Library/CloudStorage/OneDrive-Personal/Projects/PycharmProjects/qteasy/qteasy/built_in.py
Type:           type
Subclasses:    

多重策略以及策略組合

qteasy中,一個Operator交易員對象可以同時運行多個交易策略。這些交易策略在運行的時候,都會分別提取各自所需的歷史數據,獨立生成不同的交易信號,這些交易信號會被組合成一組交易信號,統一執行。

利用這種特性,用戶可以在一個交易員對象中同時運行多個各有側重的交易策略,例如,一個交易策略監控個股的股價,根據股價產生擇信號,第二個交易策略專門負責監控大盤走勢,通過大盤走勢決定整體倉位。第三個交易策略專門負責止盈止損,在特定時刻止損。最終的交易信號以第一個交易策略爲主,但受到第二個策略的節制,必要時會被第三個策略完全控制。

或者,用戶也可以很容易地制定出一個“委員會”策略,在一個綜合性策略中由多個策略獨立地做出交易決策,最終的交易信號由所有子策略組成的”委員會“投票決定,投票的方式可以是簡單多數、絕對多數、加權投票結果等等。

上述交易策略組合中,每一個獨立的交易策略都很簡單,很容易定義,而將他們組合起來,又能發揮更大的作用。同時每一個子策略都是獨立的,可以自由組合出複雜的綜合性交易策略。這樣可以避免不斷地重複開發策略,只需要對子策略重新排列組合,重新定義組合方式,就可以快速地搭建一系列的複雜綜合性交易策略。相信這樣能夠極大地提高交易策略的搭建效率,縮短週期。時間就是金錢。

不過,在一個Operator對象中,不同策略生成的交易信號可能運行的交易價格是不同的,例如,某些策略生成開盤價交易信號,而另一些策略生成的是收盤價交易策略,那麼不同的交易價格信號當然不應該混合。但除此之外,只要是交易價格相同的信號,都應該全部混合。

交易信號的混合即交易信號的各種運算或函數,從簡單的邏輯運算、加減運算一直到複雜的自定義函數,只要能夠應用於一個ndarray的函數,理論上都可以用於混合交易信號,只要最終輸出的交易信號有意義即可。

定義策略組合方式blender

qteasy中的組合策略是由blender實現的。在一個Operator中,如果策略的數量多於1個,就必須定義一個blender。如果沒有明確定義blender,而策略的數量超過1個時,qteasy會在運行Operator的時候創建一個默認的blender,但是爲了讓多重策略正確運行,用戶需要自行定義blender

blender expression是用戶自行定義的一個組合表達式,用戶使用這個表達式確定不同交易策略的組合方式。這個組合表達式使用四則運算符、邏輯運算符、函數等符號規定策略信號是如何組合的。blender表達式中可以包括以下元素:

blender表達式中支持的函數如下:

元素

示例

說明

策略序號

s1

以s開頭,數字結尾的字符串,數字爲Operator中的策略的序號,代表這個策略生成的交易信號

數字

-1.35

任何合法的數字,參與表達式運算的數字

運算符

+

包括'+-*/^'等四則運算符

邏輯運算符

and

支持`』&

函數

sum()

支持的函數參見後表

括號

()

組合運算

blender示例

當一個Operator對象中有三個交易策略時(其序號分別爲0/1/2),按照以下方式定義的blender都是合法可用的,同時使用Operator.set_blender()來設置blender

使用四則運算符定義blender表達式

's0 + s1 + s2'

此時三個交易策略生成的交易信號會被加起來,成爲最終的交易信號,如果策略0的結果爲買入10%,策略1結果爲買入10%,策略2結果爲買入30%,則最終的結果爲買入50%

使用邏輯運算符定義blender表達式:

's0 and s1 and s2'

表示只有當交易策略1、2、3都出現交易信號的時候,纔會最終形成交易信號。如策略1的結果爲買入,策略2結果爲買入,而策略3沒有交易信號,則最終的結果爲沒有交易信號。

blender表達式中還可以包含括號和一些函數:

'max(s0, s1) + s2'

表示策略1、2的結果中最大值與策略3的結果相加,成爲最終交易信號。如果策略1的結果爲買入10%,策略2結果爲買入20%,策略3結果爲買入30%,最終的結果爲買入50%

blender 表達式中每個策略可以出現不止一次,也可以出現純數字:

'(0.5 * s0 + 1.0 * s1 + 1.5 * s2) / 3 * min(s0, s1, s2)'

上面的blender表達式表示:首先計算三個策略信號的加權平均(權重分別爲0.5、1.0、1.5),然後再乘以三個信號的最小值

blender 表達式中函數的操作參數在函數名中定義:

'clip_-0.5_0.5(s0 + s1 + s2) + pos_2_0.2(s0, s1, s2)'

上面的blender表達式定義了兩種不同的函數操作,分別得到結果後相加得到最終結果。第一個函數是範圍剪切,將三組策略信號相加後,剪切掉小於-0.5的信號值以及大於0.5的信號值,得到計算結果;第二個函數是倉位判斷函數,統計三組信號中持倉大於0.2的時間段,將其定義爲“多頭”,然後再統計每一個時間段三個策略中持多頭建議的數量,如果超過兩個策略持多頭建議,則輸出滿倉多頭,否則輸出空倉。

blender表達式中支持的函數如下:

函數

表達式

說明

abs

abs(*signals)

絕對值函數
計算所有交易信號的絕對值
輸入信號的數量不限

avg

avg(*signals)

平均值函數
計算所有交易信號的平均值
輸入信號的數量不限

avgpos

avgpos_N_T(*signals)

平均值累計函數
當交易信號爲持倉目標信號時,統計同一時間產生非空倉信號(輸出信號絕對值>T)的個數,當空頭/多頭信號的數量大於N時,輸出所有空頭/多頭信號的平均值,否則輸出0.
輸入信號的數量不限

ceil

ceil(signal)

向上取整函數
交易信號向上取整
只能輸入一個交易信號

clip

clip_U_L(signal)

範圍剪切函數
剪切超過範圍的信號值,剪切上下範圍在函數名中定義
只能輸入一個交易信號

combo

combo(*signals)

組合值函數
輸出所有交易信號加總的值
輸入信號的數量不限

committee

cmt_N_T(*signals)

委員會函數(等同於累計持倉函數))
當交易信號爲持倉目標信號時,統計同一時間產生非空倉信號(輸出信號絕對值>T)的個數數,當多頭/空頭信號的數量大於N時,輸出-1/1,否則輸出0.
輸入信號的數量不限

exp

exp(signal)

exp函數
計算e的信號次冪
只能輸入一個交易信號

floor

floor(signal)

向下取整函數
交易信號向下取整
只能輸入一個交易信號

log

log(signal)

對數函數
計算以e爲底的對數值
只能輸入一個交易信號

log10

log10(signal)

以10爲底的對數函數
計算以10爲底的對數值
只能輸入一個交易信號

max

max(*signals)

最大值函數
計算所有交易信號的最大值
輸入信號的數量不限

min

min(*signals)

最小值函數
計算所有交易信號的最小值
輸入信號的數量不限

pos

pos_N_T(*signals)

累計持倉函數
當交易信號爲持倉目標信號時,統計同一時間產生非空倉信號(輸出信號絕對值>T)的個數數,當多頭/空頭信號的數量大於N時,輸出-1/1,否則輸出0.
輸入信號的數量不限

position

position_N_T(*signals)

累計持倉函數
當交易信號爲持倉目標信號時,統計同一時間產生非空倉信號(輸出信號絕對值>T)的個數數,當多頭/空頭信號的數量大於N時,輸出-1/1,否則輸出0.
輸入信號的數量不限

pow

pow(*signals)

冪函數
計算第一個交易信號的第二個信號次冪即sig0^sig1
輸入信號的數量只能爲兩個

power

power(*signals)

冪函數
計算第一個交易信號的第二個信號次冪即sig0^sig1
輸入信號的數量只能爲兩個

sqrt

sqrt(signal)

平方根函數
交易信號的平方根
只能輸入一個交易信號

str

str_T(*signals)

強度累計函數
將所有交易信號加總,當信號強度超過T時,輸出1,否則輸出0
輸入信號的數量不限

strength

strength_T(*signals)

強度累計函數
將所有交易信號加總,當信號強度超過T時,輸出1,否則輸出0
輸入信號的數量不限

sum

sum(*signals)

組合值函數
輸出所有交易信號加總的值
輸入信號的數量不限

unify

unify(signal)

均一化函數
均一化交易信號,等比縮放同一行的交易信號使每一行的總和爲1
只能輸入一個交易信號

vote

vote_N_T(*signals)

委員會投票函數(等同於累計持倉函數)
當交易信號爲持倉目標信號時,統計同一時間產生非空倉信號(輸出信號絕對值>T)的個數數,當多頭/空頭信號的數量大於N時,輸出-1/1,否則輸出0.
輸入信號的數量不限

以下方法可以被用來設置或獲取策略的blender

operator.set_blender(blender=None, price_type=None)

設置blender,直接傳入一個表達式,這個表達式會被自動解析後用於組合交易策略。

operator.view_blender()

查看blender

blender使用示例

下面使用一個例子來演示blender的工作方式:

# 创建一个交易员对象,同时运行五个相同的dma交易策略,这些交易策略运行方式相同,但是设置不同的参数后,会产生不同的交易信号。我们通过不同的策略组合方式,得到不同的回测结果
op = qt.Operator('dma, dma, dma, dma, dma')
# 分别给五个不同的交易策略设置不同的策略参数,使他们产生不同的交易信号
op.set_parameter(stg_id=0, pars=(132, 200, 24))
op.set_parameter(stg_id=1, pars=(124, 187, 51))
op.set_parameter(stg_id=2, pars=(103, 81, 16))
op.set_parameter(stg_id=3, pars=(48, 111, 148))
op.set_parameter(stg_id=4, pars=(104, 127, 58))

# 第一种组合方式:加权平均方式:分别给每一个不同的策略设置不同的权重:
# s0: 权重0.8
# s0: 权重1.2
# s0: 权重2.0
# s0: 权重0.5
# s0: 权重1.5
# 将五个交易策略生成的交易信号加权平均后得到最终的交易信号
op.set_blender('(0.8*s0+1.2*s1+2*s2+0.5*s3+1.5*s4)/5')

# 运行策略
res = qt.run(op, mode=1)
# 得到结果如下:年化收益12.19,夏普率1.053
     ====================================
     |                                  |
     |       BACK TESTING RESULT        |
     |                                  |
     ====================================

qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 130.5ms
time consumption for operation back looping:  523.8ms

investment starts on      2016-04-05 00:00:00
ends on                   2021-02-01 00:00:00
Total looped periods:     4.8 years.

-------------operation summary:------------

          Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH   478      421    899   89.7%      0.0%     10.3%   

Total operation fee:     ¥    2,615.40
total investment amount: ¥  100,000.00
final value:              ¥  174,263.46
Total return:                    74.26% 
Avg Yearly return:               12.19%
Skewness:                         -0.31
Kurtosis:                         10.31
Benchmark return:                65.96% 
Benchmark Yearly return:         11.06%

------strategy loop_results indicators------ 
alpha:                            0.007
Beta:                             1.408
Sharp ratio:                      1.053
Info ratio:                       0.000
250 day volatility:               0.111
Max drawdown:                    12.26% 
    peak / valley:        2019-04-19 / 2020-02-03
    recovered on:         2020-07-06
===========END OF REPORT=============

png

# 第二种组合方式:将五个交易策略看成一个“委员会”,最终的持仓仓位由委员会投票决定:
# 当同一时间累计五个策略中至少三个输出多头满仓使,输出多头满仓,否则空仓
op.set_blender('pos_3_0(s0, s1, s2, s3, s4)')
# 运行策略
res = qt.run(op, mode=1)
# 得到结果如下:年化收益13.39,夏普率1.075
     ====================================
     |                                  |
     |       BACK TESTING RESULT        |
     |                                  |
     ====================================

qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 540.1ms
time consumption for operation back looping:  435.8ms

investment starts on      2016-04-05 00:00:00
ends on                   2021-02-01 00:00:00
Total looped periods:     4.8 years.

-------------operation summary:------------

          Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH    11       10     21   55.4%      0.0%     44.6%   

Total operation fee:     ¥      585.88
total investment amount: ¥  100,000.00
final value:              ¥  183,485.41
Total return:                    83.49% 
Avg Yearly return:               13.39%
Skewness:                         -0.43
Kurtosis:                         14.75
Benchmark return:                65.96% 
Benchmark Yearly return:         11.06%

------strategy loop_results indicators------ 
alpha:                            0.046
Beta:                             1.003
Sharp ratio:                      1.075
Info ratio:                       0.006
250 day volatility:               0.124
Max drawdown:                    15.71% 
    peak / valley:        2019-04-19 / 2020-02-03
    recovered on:         2020-07-31
===========END OF REPORT=============

png

# 第三种组合方式:同样是委员会策略,但输出满仓多头的投票门槛变为2票,即只要有两个策略认为输出多头即可
op.set_blender('pos_2_0(s0, s1, s2, s3, s4)')
# 运行策略
res = qt.run(op, mode=1)
# 得到结果如下:年化收益12.88,夏普率0.824
     ====================================
     |                                  |
     |       BACK TESTING RESULT        |
     |                                  |
     ====================================

qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 133.8ms
time consumption for operation back looping:  500.0ms

investment starts on      2016-04-05 00:00:00
ends on                   2021-02-01 00:00:00
Total looped periods:     4.8 years.

-------------operation summary:------------

          Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH    15       14     29   71.4%      0.0%     28.6%   

Total operation fee:     ¥      707.30
total investment amount: ¥  100,000.00
final value:              ¥  179,532.76
Total return:                    79.53% 
Avg Yearly return:               12.88%
Skewness:                         -0.45
Kurtosis:                         10.45
Benchmark return:                65.96% 
Benchmark Yearly return:         11.06%

------strategy loop_results indicators------ 
alpha:                            0.029
Beta:                             1.000
Sharp ratio:                      0.824
Info ratio:                       0.007
250 day volatility:               0.144
Max drawdown:                    15.94% 
    peak / valley:        2018-01-24 / 2019-01-03
    recovered on:         2019-02-25
===========END OF REPORT=============

png