引言:
邢不行的系列帖子“量化小講堂”,通過實際案例教初學者使用python進行量化投資,瞭解行業研究方向,希望能對大家有幫助。
【歷史文章彙總】請點擊此處
【必讀文章】EOS期現套利,一週時間,15%無風險收益
個人微信:xingbuxing0807,有問題歡迎交流。
量化投資中經常使用Excel,可能會被同事打
這是邢不行第 54 期量化小講堂的分享
作者 | 方寧、邢不行
在量化研究中,使用Python處理數據之前,常常需要要先肉眼看一下數據,形成最直觀的認識。
當你打開數據文件,99%的情況系統會默認幫你選擇Excel打開,這是初學者最常用的表格工具,沒有之一。確實在多數情況下,Excel可以很好的顯示數據,也方便我們做初步的排序、篩選、作圖。
但使用Excel也有一些隱藏的深坑,不注意的話很容易帶來麻煩。
本文就來細數Excel的那些坑,並且提供解決方法。同時,也會推薦更適合在量化投資中,用來查看數據的工具。
下面這張圖就是上證指數日K線的一小段,注意看最後兩列數據:
Excel 列太窄的時候,會顯示成“###”或省略掉小數部分
- 倒數第二列沒有正常顯示成交量數字,而是顯示爲“####”;
- 最後一列開盤價應該精確到小數點後三位,但圖中只有整數部分。
這是數據的問題嗎?要不要檢查下數據來源重新採集數據?
答案是不需要。讓我們看看文件數據本來的樣子:
真實csv數據的樣子
我們發現原始數據跟Excel顯示的很不一樣,是不是感覺 Excel 吃掉了很多細節?如果我們不知道的話,很容易覺得是數據有問題,然後費勁心思重新爬了一遍,還是顯示成這個樣子。
但是其實數據好着呢,有問題的是Excel顯示格式:你的數字太寬了,Excel忽略顯示了部分內容。
這種情況也很好辦:把你覺得顯示不完整的列拉寬即可。
上文中倒數兩列成交額和開盤價不是顯示不完整嘛,我們手動拉寬這兩列,然後成交額就顯示成了下圖中類似於1.2E+10這種格式:
Excel 會使用科學記數法顯示長數字
這和我們原始數據的中展示的仍然不一樣。Excel這麼顯示的原因是因爲當數字過大時,會默認使用科學計數法展示數字,以節省屏幕上顯示的空間。
很多人不習慣用科學計數法來看數字,確實科學計數法只顯示前幾位有效數字,不方便我們形成對數據的直觀感受。
不想看到科學計數法也很好辦,分兩步走:
- 把顯示成科學計數法的列拉寬;
- 拉寬還不行的,選中整列,手動調整單元格格式,推薦直接設成文本。
選中整列設置單元格格式
推薦把單元格格式設成文本
我們再來看一個日期格式的例子。
在原始數據中,日期是“年-月-日”這樣的格式:
原始csv數據,日期格式爲 “年-月-日”
但是到了Excel裏打開,日期就從“年-月-日”,變成了 “年/月/日”。
用Excel查看csv文件,日期格式爲“年/月/日”
這麼顯示是因爲 Excel 會自動判斷單元格的格式,一旦判斷成日期的數據,就會自動轉換成“年/月/日”的格式。
這個坑副作用很大:如果用Excel打開並保存了,日期的格式就會從“年-月-日”變成“年/月/日”,原本是我們常用的pandas可以直接識別的日期格式,轉換之後就需要手動調用 pd.to_datetime 函數來處理。
針對這個問題,可以只用 Excel 打開,不用 Excel 保存,這樣就只是看着不一樣了,數據還是不變的。或者在單元格格式裏設成“日期”類別裏的“年-月-日”格式。
有的時候,我們用Excel打開的歷史數據所有中文都是亂碼,遇到過的人都知道那是怎樣一種絕望的體驗:
用Excel看某些csv文件中文是亂碼
這是因爲不同系統下中文的編碼格式不同,unix/linux家族,包括mac、linux、ios、android系統默認使用utf8編碼,windows使用的是GBK/GB2312編碼。這兩種編碼的中文字符都是互不兼容的。
當我們使用Python讀入導出數據時默認使用utf8編碼,而不管是mac還是windows下的Excel都使用GBK編碼,這就導致了Python導出的文件用Excel讀中文會亂碼的問題。
不同編碼問題的例子和原因
只要不使用Excel修改文件,對我們用Python量化分析就沒有影響。不可避免地會干擾我們看數據:中文亂碼了之後,我們就不知道每一列數據對應的是什麼了,連哪列是開盤價哪列是前收盤價都不知道,很難形成對數據的直觀認識。
而一旦用Excel打開發現是亂碼,然後用Excel保存了之後,在Python裏面讀取中文也是亂碼,到了這一步基本上就無藥可救了。
Excel 存在最大行數限制,顧名思義,Excel只能顯示到一定行數,超過這個最大行數的部分就不顯示了。不知道這個坑的時候,就會“咦,我的數據怎麼沒了?”。
2003版本只能顯示到65536行,之後的版本可以顯示到1048576行。同樣的,也存在最大列數限制。超出這個範圍的數據Excel不會顯示。
好在最大行數限制沒有副作用,只是顯示問題,不影響數據。就算用 Excel 打開再保存了,也不會丟掉沒有顯示的數據。
以上Excel的問題,導致在用它來查看數據時不是很順手。更好的做法是使用專業的文本編輯器來查看數據。
下面推薦三個方案供大家選擇:
- Notepad++
- Visual Studio Code
- Pycharm
另外,因爲絕大多數文本編輯器不能讀Excel格式的文件。所以在數據工作中,大家千萬不要把數據保存成Excel格式,而是推薦使用csv格式存儲原始數據。csv本質上就是一個純文本文件,用文本編輯器和Excel都能方便打開。
Notepad++是一款強大的文本編輯器,只支持Windows,不支持mac。軟件很小,非常輕便。使用Notepad++可以看到csv數據原始的樣子:
使用notepad++查看csv文件
用notepad++根本不會遇到剛剛上文說的5個坑。可以顯示出csv數據最原始的樣子,沒有行數限制,能自動識別文件使用的是GBK還是UTF8編碼。自動識別不出來的時候也可以手動指定編碼,基本不用擔心遇到亂碼的問題。
當然,跟Excel比起來,缺點也很明顯:
- 沒有對齊,想要對應哪列是什麼數據比較費勁。特別是數據的位數變化比較大的時候,整體看起來會很亂;
- 不能篩選、排序等等;
- 只能讀取csv格式,不能讀xls、xlsx等格式;
- 僅限Windows系統使用。
我們下面推薦另一款軟件,可以解決 Notepad++ 的這幾個缺陷。
VSCode(Visual Studio Code)是近幾年興起的編輯器。特點是插件強大,通過自帶的市場安裝一些插件,可以達到極值的體驗。
直接用 VSCode 打開csv文件就和 Notepad++ 顯示的結果一樣:
一旦裝上“Excel viewer”插件,就可以實現接近Excel的顯示效果,甚至還可以篩選和排序。
VSCOde 安裝 Excel viewer 插件
安裝好插件之後,我們就可以使用插件來查看csv和xlsx格式的數據文件了。
使用Excel viewer 插件查看文件的方法
使用Excel Viewer查看文件的效果
配合Excel viewer插件,使用VSCode查看數據的體驗非常接近Excel。
總結下,使用VSCode配合插件有以下幾個優點:
- 不用擔心單元格格式問題,顯示的就是數據原本的樣子;
- 不存在最大行數限制;
- 可以方便地更改文件編碼;
- 可以查看csv和xlsx格式;
- 可以像 Excel 一樣篩選和排序;
- 全平臺制霸。不管是Windows、macOS還是Linux,都可以使用VSCode和絕大多數插件。
另外,如果是參與了邢不行Python量化交易課程的同學,會看到邢不行經常使用Pycharm 來做量化分析。其實 Pycharm 功能也很強大,可以當做文本編輯器來使用。讓我們看看在Pycharm中怎麼查看 csv 格式的數據文件。
通常我們做Python量化都會使用Pycharm來寫程序,所以如果能直接用Pycharm來查看就更好了。
事實上是可以的。csv就是純文本,直接用Pycharm打開看就和notepad++一樣。另外,我們也可以給Pycharm裝插件,讓Pycharm看csv的體驗接近Excel。
Pycharm 安裝csv插件
安裝完後需要重啓Pycharm讓插件生效,我們打開一個csv文件,看起來沒有什麼變化。仔細觀察就會發現最下面多了一個選項:
Pycharm查看csv文件
Pycharm表格視圖查看csv文件
稍微調整下顯示格式之後,就可以像在Excel裏面一樣看csv格式的文件。
使用Pycharm來查看數據文件,除了不會遇到前面說到 Excel 的五個坑之外還有以下幾個優點:
- 表格視圖接近 Excel 的體驗;
- 使用Pycharm 同學可以不用另外裝軟件了;
- 全平臺制霸,通吃Windows、macOS和Linux。
相對而言,缺點也明顯:
- 對不用pycharm的同學來說,就要另外裝一個重量級的軟件;
- 不支持篩選、排序;
- 只能讀取csv格式。
前面說到的Excel坑,都是很多人會問起的。編碼問題、顯示問題和最大行數限制,如果不是事先知道這些坑,碰上了都會覺得是數據的問題,然後大費周章不止一次地重採數據,結果問題並沒有解決。
由於我們使用Excel僅僅是爲了查看數據形成對數據的直觀感受,實在沒必要浪費力氣跟Excel死磕。
建議查看數據的時候不要用Excel,換文本編輯器來看數據。前面說到的notepad++、VSCode、Pycharm就是很好的選擇,可以根據自己的情況選擇合適的。
推薦閱讀
歷年排名前10的基金,在第2年表現如何?Python告訴你答案
聯繫邢不行
如果你想入門量化,但是始終找不到方向,可以加入我的知識星球。我會在裏面解答你的問題,分享我的感悟,不論是投資、技術,還是職業選擇、思維方式。
-- 學習和成長從來都不是一個人的事 --