NBLOG_20231120 PYTHON量化交易;Back Testing_2
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)) 執行之後輸出圖形應該是這樣;
一個特斯拉汽車的50天K線含成交量,以及附加的4、9、18天的移動平均線。這大概就是之前我們最常列舉使用的樣子。而這也是我說這只是基本款的原因;在繪製移動平均上面,被限制在SMA簡易平均線。想畫個EMA、WMA或複雜點的布林格、凱特通道之類的?對不起沒門!所以這個幾乎就是個固定模板,客製的自由度是很低的。然後、除了成交量之外,其他技術指標嘛;也是謝謝再聯絡。當我們需要做回測時,上面說的這些功能又幾乎是非要不可,所以大家都必須咬牙硬上。不過歷經半個月的韜光養晦之後,決定把它切成上下兩部分來跟大家介紹。如此應該可以讓大家更容易吸收明白。上下兩部分就是上半部的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’]),設定天數為20(windows=20),最後將結果放在df的ma20這一列。接下來就是重點啦! add_plot=mpl.make_addplot(df['ma20']) 首先、我們呼叫mpf的make_addplot方法來創建add_plot。這裡看到代入要顯示的項目是df的ma20列;這裡存放之前計算的平均價數據。如果需要多個數據;則以逗號分開。 mpl.plot(df,addplot=add_plot,type='candle',volume=True,title='TSLA
StockChart & 20SMA') 這是mplfinance的繪圖指令;跟之前大同小異,不同的便是增加addplot部分。 歸納一下可以讓我們放鬆來使用與理解。整個圖形的製作,就是透過一切可能找到所有的資料,然後透過mplfinance來繪圖輸出。當中除基本K線設計外,都必須透過addplot來完整呈現。當然這裡個別的數據要求長度必須一致。最後、打鐵趁熱來上個特別的。有那麼個價格指標叫“凱特通道 Keltner Channel”;我發現無論是Talib或pandasTA,不是錯誤(標準差取代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來圍事,計算需要的20天EMA。這裡的貓膩,其實藏在最後那個“1”裡頭。Talib的均線,無論是SMA、EMA、WMA甚至高難度的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) 使用方法
凱特通道主要用於判斷趨勢和波動幅度。當價格突破上線時,表示趨勢向上;當價格突破下線時,表示趨勢向下。此外,凱特通道的寬度也可以用來判斷市場波動性。
原來方丈大師也是性情中人。 |
留言
張貼留言