發表文章

目前顯示的是 2019的文章

【每日更新】多空儀表板

圖片

跟著外資進出,賺的到錢嗎? [附程式碼]

圖片
金融爬蟲系列文(一 ~ 三)已經詳細介紹,如何抓取證交所報酬指數及三大法人數據。

有了這些數據,我們試著利用三大法人數據建立交易策略。

三大法人當中,本篇要研究對台股影響力最大的「外資」。

首先,由於外資每天在台股的成交量變化很大,直接觀察「外資買賣超」容易失真。

於是,量化操盤手建構「外資多空比」指標,用來衡量「外資買賣超」佔外資成交量的比例。

外資多空比 = 外資買賣超 ÷ 外資買進金額 (若外資買超)
                     = 外資買賣超 ÷ 外資賣出金額 (若外資賣超)

接著,繪製「報酬指數」及「外資多空比」:


乍看之下,訊號似乎有點雜亂,稍微仔細看一下,應該可以發現「報酬指數」與「外資多空比」時常呈現同向走勢,也就是說當外資買超,大盤傾向上漲;反之,當外資賣超,大盤傾向下跌。

以上現象,其實再自然不過了,股價本來就是由市場供需決定,而外資持股約佔台股40%,這麼大量的買賣,當然足以牽動股市。

所以,光是知道同向變動,尚不足以獲利,讓我們繼續看下去。


如果我們把任意一段「外資多空比」放大,會發現外資常常連續買超或賣超,也就是「外資買賣超」存在叢聚現象(Clustering),買賣方向具有慣性。

結合「與大盤同向變動」及「叢聚現象」,一個可能的交易策略就浮現了。

我們可以嘗試跟單(持有與外資同向部位),由於外資買賣超具有慣性,很可能會帶動一波上漲或下跌,我們就能夠藉此獲利。


上圖是2015年以來,跟單策略的損益績效,雖然是正報酬,但波動很大,表現不甚理想。

切記,研發交易策略,千萬不要輕易放棄,往往再多深入研究一下,就會有嶄新的收穫。

量化操盤手常常會做一個動作,將多單及空單損益分開來看。


將多空損益分別畫出來,可以看到「多單損益」比「空單損益」要好上很多,從2016年到目前為止,報酬率為35%,而且績效曲線還算穩定。

總結下來,「只跟外資多單」是一個值得進一步探索的研究方向。

最後,在看程式碼之前,簡單說明兩點:

1. 第一張圖的X座標軸採用「序號」而非「日期」(df.index),是為了避免繪圖時,出現假日(非交易日)沒有數據的問題。

2. 回測採用「報酬指數」,實際操作時,最接近回測的做法是在證交所公布「三大法人買賣金額統計表」後,依「外資買賣超」方向建立期貨多單或空單(夜盤),因期貨數據處理較為複雜,這裡僅用「報酬指數」做為回測數…

金融爬蟲(三):如何更新數據 [附程式碼]

圖片
在進行分析之前,先做個更新數據的教學。

上一篇抓取了三大法人數據之後,每天證交所仍會公布新數據,要如何持續更新資料庫呢?

其實很簡單,把程式碼稍做修改即可。

首先,先讀取資料庫,看看上次數據更新到哪一天。

接著,從上次更新那天直到今日,這段時間就是要更新的日期了。

程式碼:
# 載入需要用到的函式庫 import time # 時間函式庫 import sqlalchemy # SQL資料庫ORM函式庫 import numpy as np # 科學計算函式庫 import pandas as pd # 數據分析函式庫 from io import StringIO # 記憶體文字檔案函式 from requests import get # HTTP請求函式 from datetime import datetime # 日期函式 from dateutil.relativedelta import relativedelta # 日期增減函式 # 連結SQLite資料庫 engine = sqlalchemy.create_engine('sqlite:///data.db') # 讀取最後更新日期 df_fini = pd.read_sql('fini', engine, index_col='table_index', parse_dates=['table_index']) # 讀取外資數據 last_date = df_fini.index[-1] # 取得最後一筆資料日期 # 資料區間 start = last_date + relativedelta(days=1) # 起始日期 end = datetime.today() # 結束日期 # 建立空白DataFrame df_fini = pd.DataFrame(columns=['買進金額', '賣出金額', '買賣差額'], dtype=np.int64) # 外資數據 df_fund = pd.DataFrame(columns=['買進金額', '賣出金額', '買賣差額'], dtype=np.int64) # 投信數據 …

金融爬蟲(二):三大法人 [附程式碼]

圖片
很多人都會關注三大法人進出數據,可是很少人有系統性的去研究它。

本篇先帶各位用爬蟲抓取證交所三大法人數據,之後的文章會進一步分析法人邏輯,看看能不能發展出可用的交易策略。

在看程式碼之前,先簡單說明一下,這份程式碼適用於抓取2015年至今的三大法人資料。

證交所一共變更過三次格式,從程式碼中可以看到2017/12/18變更過一次,在2015年之前,證交所還變更過兩次,有需要更久遠數據的讀者,只要簡單修改程式,就可以抓取所有年份的資料,這邊為了程式碼的簡潔,採用2015年之後的版本。

此外,2017/12/18之後的資料,證交所將「外資自營商」從「外資」中分離出來統計,為了保持前後數據的一致性,我們把「外資自營商」數據加回到「外資」數據當中。

其實,好像直接看程式碼,比較容易理解以上說明。

OK,程式碼這就來了:
# 載入需要用到的函式庫 import time # 時間函式庫 import sqlalchemy # SQL資料庫ORM函式庫 import numpy as np # 科學計算函式庫 import pandas as pd # 數據分析函式庫 from io import StringIO # 記憶體文字檔案函式 from requests import get # HTTP請求函式 from datetime import datetime # 日期函式 from dateutil.relativedelta import relativedelta # 日期增減函式 # 資料區間 start = datetime(2019, 10, 1) # 起始日期 end = datetime(2019, 10, 15) # 結束日期 # 建立空白DataFrame df_fini = pd.DataFrame(columns=['買進金額', '賣出金額', '買賣差額'], dtype=np.int64) # 外資數據 df_fund = pd.DataFrame(columns=['買進金額', '賣出金額', '買賣差額'], dtype=np.int64) # 投信數據 df_prop_hedge = pd.DataFrame(columns=[&…

金融爬蟲(一):大盤報酬指數 [附程式碼]

圖片
前兩篇快速地介紹了資料庫的存取,是為了接下來的「金融爬蟲」教學做準備。

不熟資料庫的讀者,請參考:
Python資料庫(上)
Python資料庫(下)

做量化交易,必須先取得歷史資料,這時候就需要網路爬蟲上場了。

哇!還要學網路爬蟲喔!會不會很難啊?

「別怕!!」

首先恭喜你,在爬蟲領域,Python也是首選的程式語言!

而且,用Python做爬蟲,很簡單喔!

跟著量化操盤手,手把手的教學,新手也能實作出網路爬蟲。

「金融爬蟲」第一篇,先來小試身手,教大家怎麼抓證交所的大盤報酬指數。

之前量化操盤手文章中的範例,大盤指數都是直接採用加權指數,因為大多數網站都只有提供加權指數,為方便教學,使用像是ffn等套件時,只能將就使用了。

但是,若要回測大盤策略,其實應該要用「報酬指數」或是「期貨數據」,會比較準確。

這是因為加權指數會受到除息影響,而產生點數蒸發現象,由於沒有計入現金股利,通常會造成多頭策略的報酬率被低估。

(關於除息點數影響,可參考這篇)

報酬指數就是為了解決這個問題而誕生的,它將現金股利計入報酬率,使得報酬指數更加貼近持有股票的真實報酬率。

趕快來看看怎麼把報酬指數爬下來:
# 載入需要用到的函式庫 import time # 時間函式庫 import sqlalchemy # SQL資料庫ORM函式庫 import pandas as pd # 數據分析函式庫 from io import StringIO # 記憶體文字檔案函式 from requests import get # HTTP請求函式 from datetime import datetime # 日期函式 from dateutil.relativedelta import relativedelta # 日期增減函式 # 資料區間 start = datetime(2019, 1, 1) # 起始月份 end = datetime(2019, 10, 1) # 結束月份 # 爬資料 df_total = pd.DataFrame() # 用來放報酬指數 date = start # 從起始月份開始 while date <= end: # 跑迴圈     str_date = date.strftime('%Y%m%d') # 日期轉字串     url = …

Python資料庫(下):分段說明 [附程式碼]

圖片
接續上一篇,本篇把程式碼分段,每段分開說明。

希望透過實作,對資料庫存取不熟的讀者可以快速上手,利用SQLite資料庫,將資料集中存放,便於管理。

Python資料庫(上):完整程式碼

# 載入需要用到的函式庫 import pandas as pd # 數據分析函式庫 import sqlalchemy # SQL資料庫ORM函式庫 import ffn # 金融函式庫 這應該不用多說,pandas是數據分析的神級套件,sqlalchemy是常用的ORM套件,ffn這裡是拿來下載歷史資料用的。

# 連結SQLite資料庫 engine = sqlalchemy.create_engine('sqlite:///data.db') # 資料庫檔案(.db)會生成在程式碼(.py)所在資料夾 使用sqlalchemy連結SQLite資料庫,如果要連結的檔案不存在,會自動建立檔案,如果檔案已經存在,則會和檔案建立連結。

stock_1 = ffn.get('^TWII', column_names=['price'], start='2018-1-1', end='2018-12-31') # 下載加權指數歷史資料(2018) stock_1.to_sql('stock', engine, if_exists='replace', index_label='table_index') # 將資料存入SQLite資料庫(建立Table: stock) output_1 = pd.read_sql('stock', engine, index_col='table_index', parse_dates=['table_index']) # 讀取SQLite資料庫(Table: stock) 第一行:下載加權指數2018歷史資料。
第二行:將加權指數2018歷史資料存入data.db檔案裡名為stock的table。
(if_exists='replace'表示如果data.db已經存在名稱為stock的table,用新建立的table取代舊的table)
第三行:讀取data.db…

Python資料庫(上):別再用csv檔存資料了! [附程式碼]

圖片
近期發現,竟然還有很多人在用csv或是excel檔案存歷史數據,每次做交易研究時,再一個個讀取載入,這樣做不但速度慢,檔案分散各處也難以管理,一不小心資料就遺失了!

今天,量化操盤手寫了一篇Python資料庫速成教學,讓你從此以後擺脫資料七零八落的窘境。

既然是用Python,當然要用最精簡的方法,處理資料存取的問題,從頭開始教SQL語法,太不符合Python精神(Pythonic)!

本篇教學,一個SQL語法都沒用到,並且完美結合Pandas + SQLite,趕快來看看怎麼做!

Python資料庫(下):程式碼分段解說

透過練習以下程式碼,很快就能熟悉Python的資料庫操作:
# 載入需要用到的函式庫 import pandas as pd # 數據分析函式庫 import sqlalchemy # SQL資料庫ORM函式庫 import ffn # 金融函式庫 # 連結SQLite資料庫 engine = sqlalchemy.create_engine('sqlite:///data.db') # 資料庫檔案(.db)會生成在程式碼(.py)所在資料夾 # SQLite資料庫Table操作(建立、更新、讀取) stock_1 = ffn.get('^TWII', column_names=['price'], start='2018-1-1', end='2018-12-31') # 下載加權指數歷史資料(2018) stock_1.to_sql('stock', engine, if_exists='replace', index_label='table_index') # 將資料存入SQLite資料庫(建立Table: stock) output_1 = pd.read_sql('stock', engine, index_col='table_index', parse_dates=['table_index']) # 讀取SQLite資料庫(Table: stock) stock_2 = ffn.get('^TWII', column_names=[…

月K策略 [附程式碼]

圖片
〈Python程式碼在文章最下方〉

說到看盤,許多人都習慣看K線圖,但是看K線圖到底在看什麼呢?

除了尋找特定型態、畫趨勢線、找支撐/壓力…

我們還可以直接觀察K線特性,今天分享的策略,就是觀察月K得來的,量化操盤手觀察到月K有一個特性:月K下影線比上影線更常出現,而且下影線比較長。

於是,每個月當中「如果跌深,就搶反彈」這個策略就浮現了,因為下影線就是跌深反彈造成的。

〈定義〉
最大跌幅:(Low / Open - 1) * 100%
反彈:(Close / Low - 1) * 100%
最大漲幅:(High / Open - 1) * 100%
拉回:(Close / High - 1) * 100%

首先,當然要拿數據驗證這個想法,下圖第二象限畫的是(最大跌幅, 反彈),第四象限畫的是(最大漲幅, 拉回)。


我們可以觀察到月K的最大跌幅極端值要比最大漲幅極端的多,這就是一般來說Put都比Call貴的原因,因為莊家要承受的風險較大。

我們先看第四象限(紅點),呈現出一種明顯趨勢:漲得越多、拉回越少。

我們再看第二象限(綠點),不難看出:跌深反彈高。

根據初步分析的結果,除了搶反彈策略,也可加入追漲策略。

嘗試了幾組數字後,決定採用-4%及1%當作策略參數。

交易策略:
1.從月初起算,當月跌幅達到-4%時,做多搶反彈。
2.從月初起算,當月漲幅達到1%時,做多追漲。

接下來,進行績效分析,下圖綠線是搶反彈策略的累積報酬,紅線是追漲策略的累積報酬,藍線代表兩個策略都執行。


乍看之下,有兩個(暫時)結論:
第一,追漲策略績效比搶反彈策略好多了。
第二,兩個策略合計7年多下來賺了90%,績效似乎差強人意。

如果研究只做到這邊,往往會得到錯誤的結論,我們再繼續看下去。

下圖一,綠線是搶反彈策略每次執行的平均報酬,紅線是追漲策略每次執行的平均報酬,隨著樣本增加,兩個策略的平均報酬都非常穩定。

下圖二,綠柱表示搶反彈機會出現,紅柱表示追漲機會出現。


平均下來,搶反彈策略每次可賺1.33%,與追漲策略的0.77%相比之下高多了。

但由於月K跌深出現的機率不高,所以造成搶反彈策略累積報酬較小。

但這只代表大賺的交易機會較少出現,不過一旦機會降臨,賺錢效率可是非常高的。

最後,累積報酬不等於這7年多的交易總收入,因為這兩個策略都是屬於「機會型策略」,也就是當機會出現時,才出…

Python畫K線圖 [附程式碼]

圖片
今天來跟大家分享,如何用Python畫K線圖。

網路上已經有幾篇類似的文章,不過我還是想自己寫一篇,走極簡風的教學。

首先,如果你還沒裝mpl_finance套件,請先用pip安裝(與ffn安裝方法相同)

直接上程式碼:
# 載入需要用到的函式庫 import ffn # 金融函式庫 import IPython # 互動模組 import matplotlib.pyplot as plt # 繪圖函式庫 import mpl_finance as mpf # 金融繪圖模組 # 取得歷史資料 stock = ffn.get('2330.TW:Open, 2330.TW:High, 2330.TW:Low, 2330.TW:Close, 2330.TW:Volume', column_names=['open', 'high', 'low', 'close', 'volume'], start='2019-1-1', end='2019-10-8') # 下載台積電股價資料 # 設定圖片輸出位置 IPython.get_ipython().enable_matplotlib(gui='qt') # 圖片輸出於新視窗 # 繪圖 plt.figure() # 開啟新圖 space = 10 # X軸(日期)座標間距 ax1 = plt.subplot2grid((3, 1), (0, 0), rowspan=2, colspan=1) # 佔全圖2/3的子圖一 ax1.set_xticks(range(0, len(stock.index), space)) # 設定X軸座標 ax1.set_xticklabels(stock.index[::space].strftime('%Y-%m-%d')) # 設定X軸標籤 mpf.candlestick2_ohlc(ax1, stock['open'], stock['high'], stock['low'], stock['close'], width=0.6, colorup='r&#…

常見Q&A

圖片
Q1:「多空儀表板」每天什麼時間更新?

Ans: 大約下午4點,視期交所數據公布時間而定。

每日最快最即時的「多空儀表板」獨家公布於量化操盤手官方網站!



Q2: 近月契約在結算日用的是哪一個月份?

Ans: 結算日當天收盤後,無論期貨、選擇權,一律都是用新的近月契約計算各項指標。

可參考「散戶多空比」中的指標公式及計算方法。



Q3: 範例程式碼去哪裡找?

Ans: 左側選單「文章分類」中的「Python程式碼」。



Q4: Python是什麼? 我是程式新手怎麼辦?

Ans: Python是量化交易領域最熱門的程式語言!

新手可以先從這裡開始:
Python從零開始(1): 為何選擇Python
Python從零開始(2): 動手做



Q5: 請問網站上程式碼的執行環境?

Ans: Anaconda Python 3.7 應該都能執行成功。

以下是量化操盤手自己執行的環境:

Anaconda版本: Anaconda 2019.03 for Windows(3.7 version 64-Bit)

Spyder版本: 3.3.3

Python版本: 3.7.3

IPython版本: 7.4.0

額外安裝套件: ffn

量化交易 ≠ 自動化交易

圖片
今天來寫一點關於交易的想法,主題是「量化交易≠自動化交易」

“克服人性、嚴格執行停損、免盯盤、電腦幫你賺錢,你只要等著收錢就好…”
有接觸過程式交易的人,對上述的說法應該都不陌生,以上這些說法都是「自動化交易」的特色。
而我所說的「量化交易」指的是“採用量化研究,來開發交易策略”,而非「自動化交易」。
事實上,在【量化操盤手】,我壓根兒不想談自動化交易,因為大多數人進行交易的瓶頸,都是找不到可獲利的交易策略,這裡說的「可獲利」都是指考慮風險後,交易策略有足夠好的風險報酬率。
道理很簡單,如果你拿一個風險承擔過大,甚至負期望值的交易策略,下去跑自動化交易,只會得到一個自動地、穩定地幫你賠錢的程式。
此外,如果你研究出了「可獲利」的交易策略,要下去跑自動化交易,那先跟你說聲恭喜,你的工作才剛剛要開始,任何一個真正佈署過自動化交易的人,都知道要運行一個「不出錯、不出錯、不出錯」的自動交易程式,工程有多浩大、有多困難。
「不出錯」很重要,所以要說三次。
「不出錯」哪裡重要?
如果你有寫過程式,應該都有聽過一個東西,叫做「無窮迴圈」,如果自動交易程式出現這個Bug,真的就不好玩了。
其他的疑難雜症,諸如「報價、下單、回報」的不同步,掛單失敗的處理等…
喔!對了!會出錯的不只是你寫的程式,各種軟體、電腦設備、網路、券商API都可能出錯,甚至連交易所都曾經大當機。
你可能會說,手動下單也會遇到電腦當機等問題啊!完全沒錯,但是手動下單不會因為程式Bug而去「放大」交易損失,例如重複下單。
況且,遇到當機問題,一般只要電腦重開機,改用手機下單,甚至電話下單,就可以輕易解決問題,自動交易程式遇到異常狀況,往往得要花上不少功夫來處理,例如盤中即時資料的回補。
寫到這裡,並不是要阻止大家從事自動化交易,而是要說這玩意兒很複雜,如果你要開始,真的要投入不少心力在上面,才能獲得成果。
基於上述原因,【量化操盤手】不談自動化交易,而把重點放在「量化交易」,畢竟除了高頻交易,還有很多獲利方法,許多當沖、波段交易策略都有很好的表現。
如果你要上班,無法盯盤,也可以學習【量化操盤手】的量化交易策略,進行波段交易,一樣可以有很好的交易成果!

選擇權指標(二):莊家通吃價

圖片
「莊家通吃價」延續「最大未平價」的賣方觀點,分析對於賣方而言,最佳的結算價落點。

為了找出莊家通吃價,我們必須把不同履約價的選擇權全部納入分析之中。
當每週三結算價公布後,所有履約價低於結算價的買權(Call),以及所有履約價高於結算價的賣權(Put)都有結算價值,也就是買方可以獲得一定金額(履約價與結算價之差距×50)。
若結算價越高,Call的總結算價值就越高,Put的總結算價值就越低。
反之,結算價越低,Put的總結算價值就越高,Call的總結算價值就越低。
找出莊家通吃價的方法,就是計算出結算價落在哪個價位,會使Call+Put的總結算價值合計最低。
一般來說,我們會分別觀察「週選擇權」及「近月選擇權」,下面兩張圖分別是「週選擇權結算價落點分析」和「近月選擇權結算價落點分析」:
週選擇權結算價落點分析:
月選擇權結算價落點分析:
上圖中,紅色長條代表在不同結算價之下的Call總結算價值(億元),綠色長條代表在不同結算價之下的Put總結算價值(億元)。

選擇權指標(一):最大未平價

圖片
「最大未平價」指的是選擇權最大未平倉量所對應的履約價格(Strike Price),由買權(Call)對應的稱為Call最大未平價,由賣權(Put)對應的稱為Put最大未平價。

一般來說,我們會分別觀察「週選擇權」及「近月選擇權」,下面兩張圖分別是「週選擇權未平倉量分布狀況」和「近月選擇權未平倉量分布狀況」:
週選擇權未平倉量分布狀況:
月選擇權未平倉量分布狀況:
上圖中,紅色長條代表不同履約價的Call未平倉量,綠色長條代表不同履約價的Put未平倉量。
對於最大未平價的解讀,Call最大未平價可視為上方壓力,是選擇權賣方認定短期內不會漲破的股價壓力位置。
反之,Put最大未平價可視為下方支撐,是選擇權賣方認定短期內不會跌破的股價支撐位置。
量化操盤手接下來會解釋,最大未平價背後的原理:
最大未平價通常會出現在價外位置,這是由於許多選擇權買方喜歡購買價格便宜的價外選擇權,以發揮選擇權以小搏大的特性,所以對價外選擇權的需求一向都很旺盛。
然而真正決定未平倉量多寡的,並非選擇權買方,而是賣方。這是由於買方只需付出價外選擇權便宜的權利金,賣方卻必須準備高額的保證金,以及承擔行情波動的風險,交易門檻遠高於買方。
選擇權賣方願意賣出最多口數的履約價格(最大未平價),代表賣方認定股價近期不會突破此價位,而賣出比最大未平價更接近價內的選擇權,賠錢損失的風險大,賣出比最大未平價更價外的選擇權,獲利(權利金收入)不如最大未平價選擇權。
從市場力道的角度來看,最大未平價可視為「賣方防守線」。當行情試圖接近最大未平價時,選擇權賣方有相當大的動機,在現貨市場買賣股票,將指數推回去,以守住「賣方防守線」,防止行情突破造成選擇權賣方部位鉅額損失,這種利用現貨買賣去保護選擇權部位的作法,也就是俗稱的「控盤」。

終極指標

圖片
(一)指標原理

量化操盤手透過AI演算法,大數據分析多種指標,並將其整合成單一指標,命名為「終極指標」。
參考:
大盤多空指標(一):大戶多空比
大盤多空指標(二):散戶多空比
大盤多空指標(三):莊家多空比

「終極指標」充分利用各類指標的特性,截長補短,進而達成「報酬上升、風險下降、資金更有效率」,這三項對交易策略來說最重要的目標。
此外,量化操盤手透過演算法,將「終極指標」簡化成{1、0、-1}三類,將大盤區分為{做多、中立、做空}三種走勢,簡單明瞭,方便判斷。
(二)指標用法
終極指標 = 1 ,做多 終極指標 = 0 ,中立 終極指標 = -1,做空
指標的用法非常直覺,該多該空,沒有模糊地帶,一點都不含糊,這就是量化交易的好處。
「終極指標」顯示中立時,代表多空混沌,股市偏向震盪格局,可考慮將資金撤出股市,或是慎選個股進行操作,不需要盲目進行賭博(沒有根據的交易就是賭博),當沒有勝算時保持空手,可將資金另做他用,提升資金運用效率。
(三)多空範例
[2015年~2016年]大盤/終極指標對照圖
[2017年~2018