用Python投資加密貨幣(3):交易策略訊號實做

這篇文章中,
我們將用 pandas 來做一個簡易的交易訊號,

pandas 是一個 python 的 package,
專門用來做資料處理,
你可以想像它是 python 裡面的 excel,
可以產生並且處理各式各樣的表格

Pandas 操作介紹

承接著上一篇文章
我們繼續在 google colab 上進行程式的實驗
此時的 df 已經是歷史資料

就是一個 pandas.DataFrame 物件
這個物件就像是 excel 表格一樣
有很多的行跟列

每一個列都可以簡單的呼叫出來,
以我們的例子,每一列都是一個時間序列:

1
df.Close

由上圖可知,每一列也是一種物件
叫做 pd.Series
這種物件,就是一條序列,
可以想像是excel的單一一列的意思

製作簡易的均線策略

pd.Series有很多特別的功能
例如計算移動窗格,我們可以用
pd.Series.rolling()
來產生移動窗格,並且用
pd.Series.rolling().mean()
來產生這個移動窗格的平均數
從時間序列的角度
這個就是「均線」

1
2
3
4
5
6
sma1 = df.Close.rolling(20).mean()
sma2 = df.Close.rolling(60).mean()

df.Close.plot()
sma1.plot()
sma2.plot()

上圖中,我們將BTCUSDT的歷史紀錄 與兩條均線畫出來
會發現,時間跨度太大,導致價格跟均線看不清楚,
我們可以額外 zoom in 選取「某年」來觀察,
可以使用中括號來選取時間範圍:

1
2
3
df.Close['2020'].plot()
sma1['2020'].plot()
sma2['2020'].plot()

接下來,我們來設計交易訊號
我們希望做一個簡單的均線策略:

假如短週期均線 sma1 超過 長週期 sma2 -> 做多
反之做空

要怎麼做出這樣的訊號呢?我們可以用不等式來進行,

不等式條件

不等式,就是所謂的「大於等於小於」,
我們假如將兩條時間序列做不等式運算,

在這兩條時間序列中,每一個元素會被一一拿出來比對,
並且產生出新的「布林」時間序列:

1
2
condition = sma1 > sma2
condition

上圖中就是布林時間序列,每個時間點對映到「Ture」或是「False」
假如今天條件成立,也就是「sma1 > sma2」的話
該時間點對映到的就會是 True
反之則是 False

因為我們是均線突破策略,
要怎麼結合不等式,來產生均線突破條件呢?我們還需要
pd.Series.shift
這個功能

調用「昨天」的價格 pd.Series.shift

pd.Series.shift是一個好用的function,
可以將時間序列全部都往後延遲一天,例如以下的例子

1
2
print(df.Close)
print(df.Close.shift(1))

你會發現兩者相差一天,
所以在做策略時,我會傾向於,將pd.Series.shift(n)
當作是「n個時間單位前的價格」,
這邊我們用的是 ‘4h’ 4小時的歷史價格
所以
pd.Series.shift(1)
就是4小時前,

pd.Series.shift(2)
就是8小時前
以此類推

假如我們只使用
pd.Series.shift()
n 不設定參數的話
pandas 會預設 n=1 喔!

結合上述的範例,產生策略訊號

我們希望的做出來的邏輯:
做多: 當(今天短週期均線 > 今天長週期均線) 且 (昨天短週期均線 < 昨天長週期均線)
做空: 當(今天短週期均線 < 今天長週期均線) 且 (昨天短週期均線 > 昨天長週期均線)

我們可以將上述中文,對映到以下的程式碼:

1
2
signal_long = (sma1 > sma2) & (sma1.shift() < sma2.shift())
signal_short = (sma1 < sma2) & (sma1.shift() > sma2.shift())

上述程式碼中的 & 就是「且」的意思

我們可以將訊號繪製出來:

1
2
signal_long.astype(int).plot()
(-signal_short.astype(int)).plot()

以上這張圖我用 -1 顯示 賣出訊號,而 1 是買進訊號
當我們將 True False 轉換成 int 時,
會轉換成「1」跟「0」的數值

製作策略

然而我們怎麼知道
照著這個交易訊號操作
實際的績效是怎麼樣呢?
下一個單元中,會教大家怎麼用 backtesting 這個 package
來實做回測,
模擬這個策略的績效
敬請期待!

文章不錯,影音課程更讚:


或我們按個 鼓勵一下吧!