NBLOG_20231120 PYTHON量化交易;Back Testing_2

Translator

 

NBLOG_20231120 PYTHON量化交易;Back Testing_2

思前想後;如果介紹BackTesting,實在沒有一丁點機會繞過這道彎子。啥東東呢?可不就是交易訊號與圖形顯示的設計;這裡說的是真刀真槍的東西。為什麼這樣說呢?因為上一大章節,談K線辨識的部分。其實我們用到的mplfinance的繪圖,基本上都是它小打小鬧的基本功;嚴格來說都還沒接觸到核心。本來尋思著依照國際慣例,處理這一段也能撿個便宜。可沒想到;自閉了半個月,苦思無果硬著頭皮還是得上。這事關乎一個童年夢魘;在那個從前從前、好遠的時候,確實來說就是mplfinance還沒出現的日子。那時統治地球的是mplfinance它殘暴的老爸;人稱K線鬼見愁的matplotlib。每每提到這個名字,至今仍覺得背後冷汗直流。沒辦法。被它欺負的,太慘了。一般圖形表現,你還真覺得它有些許的親和力。可是一上K線,它馬上就翻臉不認起人來。那個刁難的程度,真的不知道怎麼去形容。所以、能不去用到它;就堅決不碰它。

不過早晚總是要面對的。聽說現在這個當家的,人性多了;也溫和多了。既然要勇敢面對了;那我們就老老實實地把它從頭溜一遍。

讓我們先來看這段程式碼、、

import pandas as pd

import yfinance as yf

import mplfinance as mpl

 

df = yf.download('TSLA',period='50d')

mpl.plot(df,type='candle',volume=True,mav=(4,9,18))

執行之後輸出圖形應該是這樣;



 

一個特斯拉汽車的50K線含成交量,以及附加的4918天的移動平均線。這大概就是之前我們最常列舉使用的樣子。而這也是我說這只是基本款的原因;在繪製移動平均上面,被限制在SMA簡易平均線。想畫個EMAWMA或複雜點的布林格、凱特通道之類的?對不起沒門!所以這個幾乎就是個固定模板,客製的自由度是很低的。然後、除了成交量之外,其他技術指標嘛;也是謝謝再聯絡。當我們需要做回測時,上面說的這些功能又幾乎是非要不可,所以大家都必須咬牙硬上。不過歷經半個月的韜光養晦之後,決定把它切成上下兩部分來跟大家介紹。如此應該可以讓大家更容易吸收明白。上下兩部分就是上半部的K線價格圖與下半部的傳統技術指標部分。既然確立目標了,就立馬開始!

在上段價格圖方面,我們必須先了解一個觀念;雖然之前的是基本款,但是它也是唯唯一。就是說之後加入的任何圖形都將被視為“外來物種”,都必須透過另一個通道進出。基本上就是必須先通報,才可以出將入相、粉墨登場。

所以我們必須先來了解這個通道的用法;這個通道就是使用addplot的方法。Addplot望文生義就是增加繪圖,增加一條均線或增加一個指標;都歸它管。直接來段程式碼瞧瞧、、

 

import pandas as pd

import yfinance as yf

import mplfinance as mpl

 

df = yf.download('TSLA',period='50d')

df['ma20']=df['Close'].rolling(window=20).mean()

add_plot=mpl.make_addplot(df['ma20'])

mpl.plot(df,addplot=add_plot,type='candle',volume=True,title='TSLA StockChart & 20SMA')

 



 

現在我們得到了一張有著20天均線的特斯拉股價圖。代碼中比較重要的部分是這幾行;

df['ma20']=df['Close'].rolling(window=20).mean()

這是使用pandas計算平均價的方法。代入收盤價(df[‘Close’],設定天數為20windows=20,最後將結果放在dfma20這一列。接下來就是重點啦!

add_plot=mpl.make_addplot(df['ma20'])

首先、我們呼叫mpfmake_addplot方法來創建add_plot。這裡看到代入要顯示的項目是dfma20列;這裡存放之前計算的平均價數據。如果需要多個數據;則以逗號分開。

mpl.plot(df,addplot=add_plot,type='candle',volume=True,title='TSLA StockChart & 20SMA')

這是mplfinance的繪圖指令;跟之前大同小異,不同的便是增加addplot部分。

歸納一下可以讓我們放鬆來使用與理解。整個圖形的製作,就是透過一切可能找到所有的資料,然後透過mplfinance來繪圖輸出。當中除基本K線設計外,都必須透過addplot來完整呈現。當然這裡個別的數據要求長度必須一致。最後、打鐵趁熱來上個特別的。有那麼個價格指標叫“凱特通道 Keltner Channel”;我發現無論是TalibpandasTA,不是錯誤(標準差取代ATR)就是沒有;這引起我的好奇,所以嘗試自己弄個來玩玩。程式碼如下;

 

import pandas as pd

import numpy as np

import yfinance as yf

import mplfinance as mpf

import talib as ta

 

df=yf.download('NVDA',period='50d')

df['ema20']=ta.MA(df['Close'],20,1)

df['atr2']=ta.ATR(df['High'],df['Low'],df['Close'],20)*2

df['KCup']=df['ema20']+df['atr2']

df['KCdn']=df['ema20']-df['atr2']

df.tail()

 

add_plot=mpf.make_addplot(df[['KCup','ema20','KCdn']])

mpf.plot(df,addplot=add_plot,type='candle',volume=True,title=NVDA Keltner Channel')

 



 

稍微解說一下這段代碼;

df['ema20']=ta.MA(df['Close'],20,1)

這裡咱們直接請出Talib來圍事,計算需要的20EMA。這裡的貓膩,其實藏在最後那個“1”裡頭。Talib的均線,無論是SMAEMAWMA甚至高難度的AMA;都是呼叫這個MA函數。它的叄數使用方法為:

MA_Type: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3 (Default=SMA)。這裡是計算EMA,所以我們設定為1。如果你不嫌麻煩,這裡有直接計算的方式:

df['ema20']=df['Close'].ewm(span=20,adjust=False).mean()

不過呢、、接下來的ATR這個骨頭,可就沒那麼好啃啦。

add_plot=mpf.make_addplot(df[['KCup','ema20','KCdn']])

這裡就可以看到在addplot加入多個數據的實例。別問我;現在看到[]還會頭昏。反正就這麼搞,凱特通道就直接到手啦!好吧、我們就在此先打住,暫時先說聲再見了;祝大家早安、午安、晚安!



 


後記:

遇事不決;問Google。結果谷大師靈籤賜下:

凱特通道是指位於英國倫敦的一條專用於皇室成員的通道,以連接肯辛頓宮和溫莎城堡。這條通道的正式名稱是「凱特皇妃通道」,以紀念威廉王子的妻子,即現任的凱特·米德爾頓(Kate Middleton)皇妃。見鬼啦!這是真的嗎?正解如下:

 

凱特通道

 

定義

 

凱特通道(Keltner Channel)是由美國交易員 Chester W. Keltner 1960 年代開發的技術指標,由三條線組成:中線、上線、下線。中線是指數移動平均線(EMA)的 20 日平均值,上線和下線分別是中線加上或減去兩倍的平均真實波幅(ATR)。

 

計算公式

 

copy code

中線 = EMA(Close, n)

上線 = 中線 + 2 * ATR(n)

下線 = 中線 - 2 * ATR(n)

使用方法

 

凱特通道主要用於判斷趨勢和波動幅度。當價格突破上線時,表示趨勢向上;當價格突破下線時,表示趨勢向下。此外,凱特通道的寬度也可以用來判斷市場波動性。

 

原來方丈大師也是性情中人。





留言

熱門文章