內置交易策略
qteasy提供了70多種內置交易策略,用戶可以很容易地直接使用這些交易策略,同時,qteasy提供了一套交易策略組合機制,用戶可以將多個簡單的交易策略組合成一個比較複雜的交易策略,策略的組合方式是可以靈活設定的。將多個簡單交易策略組合成一個複雜的策略後,同樣可以使用策略優化工具搜索整個複雜策略的最佳參數。
在這篇教程中,您將瞭解如何使用內置交易策略,如何組合策略,如何設定組合規則實現複雜策略,以及如何優化策略。
內置交易策略的使用
qt.get_built_in_strategy(id)
qt.built_in_list(stg_id=None)
上面三個方法的輸出是一樣的,都用一個dict列出所有的內置交易策略,dict的key是交易策略的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 |
|
crossline擇時策略類,利用長短均線的交叉確定多空狀態 |
macd |
|
MACD擇時策略類,運用MACD均線策略,生成目標倉位百分比: |
dma |
|
DMA擇時策略 |
trix |
|
TRIX擇時策略,使用股票價格的三重平滑指數移動平均價格進行多空判斷: |
cdl |
|
CDL擇時策略,在K線圖中找到符合要求的cdldoji模式 |
bband |
TimingBBand |
布林帶線交易策略,根據股價與布林帶上軌和布林帶下軌之間的關係確定多空,在價格上穿或下穿布林帶線上下軌時產生交易信號。布林帶線的均線類型不可選 |
s-bband |
SoftBBand |
布林帶線漸進交易策略,根據股價與布林帶上軌和布林帶下軌之間的關係確定多空,交易信號不是一次性產生的,而是逐步漸進買入和賣出。計算BBAND,檢查價格是否超過BBAND的上軌或下軌: |
sarext |
|
擴展拋物線SAR策略,當指標大於0時發出買入信號,當指標小於0時發出賣出信號 |
ssma |
|
單均線交叉策略——SMA均線(簡單移動平均線):根據股價與SMA均線的相對位置設定持倉比例 |
sdema |
|
單均線交叉策略——DEMA均線(雙重指數平滑移動平均線):根據股價與DEMA均線的相對位置設定持倉比例 |
sema |
|
單均線交叉策略——EMA均線(指數平滑移動均線):根據股價與EMA均線的相對位置設定持倉比例 |
sht |
|
單均線交叉策略——HT(希爾伯特變換瞬時趨勢線):根據股價與HT線的相對位置設定持倉比例 |
skama |
|
單均線交叉策略——KAMA均線(考夫曼自適應移動均線):根據股價與KAMA均線的相對位置設定持倉比例 |
smama |
|
單均線交叉策略——MAMA均線(MESA自適應移動平均線):根據股價與MAMA均線的相對位置設定持倉比例 |
st3 |
|
單均線交叉策略——T3均線(三重指數平滑移動平均線):根據股價與T3均線的相對位置設定持倉比例 |
stema |
|
單均線交叉策略——TEMA均線(三重指數平滑移動平均線):根據股價與TEMA均線的相對位置設定持倉比例 |
strima |
|
單均線交叉策略——TRIMA均線(三重指數平滑移動平均線):根據股價與TRIMA均線的相對位置設定持倉比例 |
swma |
|
單均線交叉策略——WMA均線(加權移動平均線):根據股價與WMA均線的相對位置設定持倉比例 |
dsma |
|
雙均線交叉策略——SMA均線(簡單移動平均線): |
ddema |
|
雙均線交叉策略——SMA均線(簡單移動平均線): |
dema |
|
雙均線交叉策略——SMA均線(簡單移動平均線): |
dkama |
|
雙均線交叉策略——SMA均線(簡單移動平均線): |
dmama |
|
雙均線交叉策略——SMA均線(簡單移動平均線): |
dt3 |
|
雙均線交叉策略——SMA均線(簡單移動平均線): |
dtema |
|
雙均線交叉策略——SMA均線(簡單移動平均線): |
dtrima |
|
雙均線交叉策略——SMA均線(簡單移動平均線): |
dwma |
|
雙均線交叉策略——SMA均線(簡單移動平均線): |
slsma |
|
均線斜率交易策略——SMA均線(簡單移動平均線): |
sldema |
|
均線斜率交易策略——DEMA均線(雙重指數平滑移動平均線): |
slema |
|
均線斜率交易策略——EMA均線(指數平滑移動平均線): |
slht |
|
均線斜率交易策略——HT均線(希爾伯特變換——瞬時趨勢線線): |
slkama |
|
均線斜率交易策略——KAMA均線(考夫曼自適應移動平均線): |
slmama |
|
均線斜率交易策略——MAMA均線(MESA自適應移動平均線): |
slt3 |
|
均線斜率交易策略——T3均線(三重指數平滑移動平均線): |
sltema |
|
均線斜率交易策略——TEMA均線(三重指數平滑移動平均線): |
sltrima |
|
均線斜率交易策略——TRIMA均線(三重指數平滑移動平均線): |
slwma |
|
均線斜率交易策略——WMA均線(加權移動平均線): |
adx |
|
ADX指標(平均定向運動指數)選股策略: |
apo |
|
APO指標(絕對價格震盪指標)選股策略: |
aroon |
|
AROON指標選股策略: |
aroonosc |
|
AROON Oscillator (AROON震盪指標) 選股策略: |
cci |
|
CCI (Commodity Channel Index商品渠道指數) 選股策略: |
cmo |
|
CMO (Chande Momentum Oscillator 錢德動量振盪器) 選股策略: |
macdext |
|
MACDEXT (Extendec MACD 擴展MACD指數) 選股策略: |
mfi |
|
MFI (Money Flow Index 貨幣流向指數) 交易策略: |
di |
|
DI (Directory Indicator 方向指標) 交易策略: |
dm |
|
DM (Directional Movement 方向運動指標) 交易策略: |
mom |
|
MOM (momentum indicator 動量指標) 交易策略: |
ppo |
|
PO (Percentage Price Oscillator 百分比價格振盪器) 交易策略: |
rsi |
|
RSI (Relative Strength Index 相對強度指數) 交易策略: |
stoch |
|
STOCH (Stochastic Indicator 隨機指數) 交易策略: |
stochf |
|
STOCHF (Stochastic Fast Indicator 快速隨機指標) 交易策略: |
stochrsi |
|
STOCHRSI (Stochastic Relative Strength Index 隨機相對強弱指標) 交易策略: |
ultosc |
|
ULTOSC (Ultimate Oscillator Indicator 終極振盪器指標) 交易策略: |
willr |
|
WILLR (William’s %R 威廉姆斯百分比) 交易策略: |
signal_none |
|
空交易信號策略:不生成任何交易信號的策略 |
sellrate |
|
變化率賣出信號策略:當價格的變化率超過閾值時,產生賣出信號 |
buyrate |
|
變化率買入信號策略:當價格的變化率超過閾值時,產生買入信號 |
long |
|
簡單擇時策略,整個歷史週期上固定保持多頭全倉狀態 |
short |
|
簡單擇時策略,整個歷史週期上固定保持空頭全倉狀態 |
zero |
|
簡單擇時策略,整個歷史週期上固定保持空倉狀態 |
all |
|
保持歷史股票池中的所有股票都被選中,投資比例平均分配 |
select_none |
|
保持歷史股票池中的所有股票都不被選中,投資倉位爲0 |
random |
|
在每個歷史分段中,按照指定的比例(p<1時)隨機抽取若干股票,或隨機抽取指定數量(p>=1)的股票進入投資組合,投資比例平均分配 |
finance |
|
以股票過去一段時間內的財務指標的平均值作爲選股因子選股,基礎選股策略:以股票的歷史指標的平均值作爲選股因子,因子排序參數可以作爲策略參數傳入,改變策略數據類型,根據不同的歷史數據選股,選股參數可以通過pars傳入 |
ndaylast |
|
以股票N天前的價格或數據指標作爲選股因子選股 |
ndayavg |
|
以股票過去N天的價格或數據指標的平均值作爲選股因子選股 |
ndayrate |
|
以股票過去N天的價格或數據指標的變動比例作爲選股因子選股 |
ndaychg |
|
以股票過去N天的價格或數據指標的變動值作爲選股因子選股 |
ndayvol |
|
根據股票以前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表達式中支持的函數如下:
元素 |
示例 |
說明 |
|---|---|---|
策略序號 |
|
以s開頭,數字結尾的字符串,數字爲 |
數字 |
|
任何合法的數字,參與表達式運算的數字 |
運算符 |
|
包括 |
邏輯運算符 |
|
支持`』& |
函數 |
|
支持的函數參見後表 |
括號 |
|
組合運算 |
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 |
|
絕對值函數 |
avg |
|
平均值函數 |
avgpos |
|
平均值累計函數 |
ceil |
|
向上取整函數 |
clip |
|
範圍剪切函數 |
combo |
|
組合值函數 |
committee |
|
委員會函數(等同於累計持倉函數)) |
exp |
|
exp函數 |
floor |
|
向下取整函數 |
log |
|
對數函數 |
log10 |
|
以10爲底的對數函數 |
max |
|
最大值函數 |
min |
|
最小值函數 |
pos |
|
累計持倉函數 |
position |
|
累計持倉函數 |
pow |
|
冪函數 |
power |
|
冪函數 |
sqrt |
|
平方根函數 |
str |
|
強度累計函數 |
strength |
|
強度累計函數 |
sum |
|
組合值函數 |
unify |
|
均一化函數 |
vote |
|
委員會投票函數(等同於累計持倉函數) |
以下方法可以被用來設置或獲取策略的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=============

# 第二种组合方式:将五个交易策略看成一个“委员会”,最终的持仓仓位由委员会投票决定:
# 当同一时间累计五个策略中至少三个输出多头满仓使,输出多头满仓,否则空仓
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=============

# 第三种组合方式:同样是委员会策略,但输出满仓多头的投票门槛变为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=============
