Python程式交易︱比特幣短炒策略Back Test方法 手把手教你點睇python program(三)
在這系列的第二篇文章,提到使用 python 的「yfinance」library,從雅虎財經讀取加密貨幣資產的價格數據後,如何以表格形式進行圖像可視化,及開始構建相關短炒策略。在這篇文章,也是繼續構建相關短炒策略,講解是如何在讀取數據後,利用它們一步步演變出我們想要的更多數據。
我們來重溫相關 python 編碼:
手把手教學(一):https://bit.ly/3SFsnpb
手把手教學(二):https://bit.ly/48kMnSy
這次,我們集中解說第 15 至 20 行,當中涉及如何剝離不需要的數據、繪製圖表和利用讀取的數據演算出其他數據。
第 15 行「price = price.drop([‘Volume’, ‘Adj Close’], 1)」,「price.drop」是指對「price」這個變數使用「drop」這個功能,舊文章有提及,price 儲存了通過「yfinance」讀取的比特幣價格數據,由此得來的數據自動以名為「pandas dataframe」的數據結構來構成,而 drop 適用於 pandas dataframe 數據,顧名思義,就是刪除東西。
使用 drop 功能,還要告訴程式我們要刪除什麼,所以 drop 後面有一個括號 (),讓我們說明刪除對象,括號裏有兩個位置,第一個位置是指明要改動的對象,第二個位置是指明改動的方法。
第一個位置,是用中括號裹起的 ‘Volume’ 和 ‘Adj Close'([‘Volume’, ‘Adj Close’]),用中括號裹着的都是 pandas dataframe 裏的東西。第二個位置,是「1」,對於 drop 這個功能,是指「列軸」(column),假如這裏是「0」,則代表「行軸」(row)。第一與第二個位置之間,用 , 分隔。
所以,「price = price.drop([‘Volume’, ‘Adj Close’], 1)」的意思,就是對 price 這個 pandas dataframe 裏名為 Volume 和 Adj Close 的 column,進行刪除的動作。
第16行,price.tail(),tail 的功能是顯示 pandas dataframe 數據,當沒有在 tail 後面的括號代入 argument 說明要顯示多少,程式會預設顯示最後 5 項。如下圖:
第 17 行至 19 行,是使用「plt」這個功能把數據以圖形顯示,「plt」與其他功能的使用方法有所不同,以「drop」為例,是先指明「price」這個 dataframe,然後再用「.drop」,但「plt」是先直接輸入,然後再一步一步說明圖形的樣式,以及要把什麼作為圖像等。
第 17 行「plt.style.use(‘seaborn-muted’)」,用於設置圖表的外觀和風格,plt 之下還有多個分支功能,其中有 style,style 之下還有 use,在 use 之中代入 argument 產生特定效果。seaborn-muted 是一個預定義的樣式,它模仿了 Seaborn 繪圖庫的一個特定風格,muted 是 Seaborn 的其中一個種主題風格,特點是使用柔和、不鮮豔的顏色,這樣可以使圖表看起來更加平滑。
第 18 行「plt.plot(price.Close)」,表示使用 plt 的分支功能 plot,plot 之後可以代入 argument,指明要把什麼數據圖像化,我們的程式寫的是「price.Close」,即是顯示「price」這個 pandas dataframe 之下的「Close」列。
第 19 行「plt.show()」,指明顯示圖形,如下圖:
第 20 行「price[‘Return’] = price.Close / price.Close.shift(1)」,這裏是在利用從 yfinance 讀取的比特幣價格數據,去生成其他我們想要的數據,如第一篇文章介紹,這短炒策略是要在訊號發出時以收市價買入、以翌日收市價賣出,那麼當要統計策略的勝率時,自然需要應用策略下、翌日收市價相對收市價的變幅了,即是要知道是升還是跌。
「price[‘Return’] 」,是設立一個變數,這變是是對「price」的 dataframe 新增一項名為「Return」的 column,由「price.Close / price.Close.shift(1)」來構成數值。
price.Close.shift(1) 是指對 price 之下的「Close」列,使用 shift 的功能,shift 的功能是把列向下移動,移動多少格是通過在括號裏代入 arugment 來指明,這裏的括號輸入了 1,即是向下移動一格,這相當於在 price 的 dataframe 中,以暫存形式新增了昨日收市價,那麼,在這個公式中,price.Close 相當於翌日收市價,用 price.Close 除以 price.Close.shift(1),便是翌日收市價除以昨日收市價,得出的結果若是大於 1,代表股價有升幅,反之則是跌幅。
其他待續。