2017年8月8日 星期二
台指閃崩
8/3開盤沒多久的台指閃崩,在那短短的時間裡如果中停損或翻空是會損失慘重的,這情況非常少見,但運氣不好出一次可能就讓整年獲利消失,而在系統中需要作幾項事情可以避免這次的損傷。
最單純就是別用市價下單,使用較大讓點的限價單,如果有自己的下單機可以輕鬆作好這個設定。也可區分進場單或是停損單,停損單讓的滑價點數應該設定更大。
但這作法是比較消極的,如果要完整的避免這種風險,需要的是選擇權,買方。以台指來說,隨時保有深價外的Call及Put作保險,只要買價格一點兩點的就夠用了,週選月選都可以,當出現閃崩時完全不用擔心,選擇權就等同期指的速度。
在程式的設計上,也可以更有彈性,比如價格突然波動3%以上時,就不要作動作,因為你知道有外部的選擇權會cover這件事。
當然一直買這種保險是要成本,看各人部位不同,需要衡量所需口數,也許每個月都需要幾百或千元,但閃崩發生時一口大台可能就要損失20萬,值不值得呢?
況且,如果某天不是閃崩,是真的崩,那會很慶幸有買保險。
2015年11月4日 星期三
對選擇權的敏感度-2
延續上篇的讀友提問討論,這篇再分享一點看法,以下先貼讀友留言。
請教L大,L大在文中提到的 GreekS 的內容,
GreekS 背後數學間推導的意義,實為困難,
文中您提到有一方法是增進敏感度就是,
其實理解Greeks的意思不是理解公式,上篇文中可能寫的不夠清楚,BS MODEL的公式很難,如果能懂是很好,但不懂也只要會用就好,"理解"的意思是指這些 Greeks會帶來什麼影響。說直接一點,是要知道每個Greeks的損益影響,要深刻理解的是這個,例如今天買了10口8700的Call,N點,付了N*10*50的權利金,這部位的Delta 是 ? ,假如明天盤勢沒什麼動,我將會損失 ? 錢的時間價值(Theta),假如明天波動率下跌了1%,我將會損失 ? 錢的波動率價值(Vega),同時盤勢上漲了1%,此時我部位的Delta會變成 ? (Gamma),知道這些 ?,就比較能夠掌握部位的損益狀況了。
同時,因為知道這些 ? ,就能夠去對應市場上的變化,敏感度所說的就是這個,市場上價格、時間、波動率的變化對應自己部位的損益可以掌握,比起單純觀察價格的投資人有更多體會,例如沒什麼事而波動率上漲,或大波段後波動率急跌,都是有隱含的意義在。學習,就向市場學習了。
每月開倉時把價平Call、Put各買一口,這是用損益來逼自己看出變化的方式,如果看不懂或無法掌握部位損益的話,以後要作後續部位就很難處理,那還是別作選擇權的好。
券商提供的Greeks資訊我不清楚,我是用自己寫的程式來計算,舊文中有些參考資料可以拿去利用試試,( 選擇權評價-BS MODEL (with Excel) 、 選擇權GREEKS實作(C#) ),免費提供,但確實是要花一些時間研究,而且設計時還要處理麻煩的報價,程式設計就不在這篇寫了。
謝謝回應參與討論。
2015年10月30日 星期五
對選擇權的敏感度
選擇權價格和期貨是有連動關係的,舊文可以參考一下 選擇權評價-BS MODEL (with Excel) 、 期權套利 & put-call parity 、隱含波動率 (with EXCEL VBA、C#) 。
這篇特別再說明是和朋友聊到,想要掌握選擇權價格的變化該如何學習,以L的經驗來說,一開始當然要去瞭解GREEKS的內容,對於Delta、Theta、Gamma、Vega的變化能夠理解並實際運算得出結果,代入不同的隱含波動率時價位會如何變化,這些是初步的工夫。
這些基本功紮的好,在判斷價格時才會敏銳,反過來說,操作選擇權時能夠分辨損益中哪部份是因為Delta、哪些是因為Vega、哪些是因為vol而產生的,再來,才能有效的去想策略,例如想要Long Vol + Short Theta 或是Long Delta+Long Gamma+Short Vol之類的,由開始的發想到策略的執行才能夠完成,舉實際例子來說,最近交易日台指波動率很低,連兩天黑K,預期可能波動率會上升(Long Vol),期貨價格可能走弱(short Delta),但是這跌的速度不知道會快或慢,可能是緩跌,所以想搭配收權利金(Short Theta),那以上述整體的考量,可能是 buy 遠月Put+sell 近月 Put這樣的組合會符合要求。
在想要怎麼組合的先決考慮上,L自己是先確定Theta,主買方或主賣方,而Theta與Gamma必定相反,所以只有幅度的考慮沒有正負號的問題,再來是看Vega,有時需要由近遠月搭配來達到想作的Vega,空近買遠是Long Vega,買近空遠是Short Vega,最後是調Delta選擇履約價。
熟練之後,進市場執行就邊觀察盤勢價格、波動率走勢是不是符合自己所想,如果不是,那損失是否符合預期。當然,選擇權部位可能會越作越多,這時候更需要對每個Greeks精通,因為比較困難的來了,時間的影響,隨著到期時間的接近,Delta的變化越大,要能夠掌握,不然可能會變成不是我們想要的部位,這部份要舉例也蠻麻煩的,先說到這邊就好了,如果不是很能掌握的,建議必須先模擬好或有一套風控程式再作複雜的組合。
回到主題,那初期可以作什麼加深對選擇權敏感度,不然就每月開倉時把價平Call、Put各買一口好了,每天去看看它的損益最直接能夠感受,這個方法還有一個好處是,可以保持對開倉時期價位、波動率的看法,例如某天當沖好像很弱,很想瘋狂作空的時候,回頭看到這個月Call是賺的,才清醒一下,這可能是極短空而已。
以上一些小經驗分享給讀友囉。
2015年5月16日 星期六
程式交易利用選擇權避險 – 4
這篇再繼續整理一些選擇哪一種選擇權的觀察。週選的特性是Theta大、Gamma大,也就是時間耗損快、Delta變動也快,而程式交易要搭配的避險選擇權要怎麼選,還是要回過頭看要避險的程式交易是什麼屬性。
持倉越短的中短週期程式單,可能一兩天或一週內的,比較適合使用週選及與程式單同進同出的方式,而持倉越長期的使用週選就有交易成本過高的問題,就比較適合月選及進場後不理的方式,另外月週選也是有價差的,應該照當下的情況選擇合適的選擇權,例如在一個正價差的盤勢,月期貨 > 週選Put-Call Parity > 加權指數,如果這價差很大,那多單要避險時用月選來作Sell Call或Buy Put就稍稍有利一點點。
買賣方也是可以從程式交易本身的特性來搭配,高勝率低盈虧比,就搭配買方;低勝率高盈虧比,就搭配賣方。這樣的好處就是互補,在如何選擇所要搭配的選擇權時,都要記得我們避險的目的是要讓整體組合損益更平滑。
而避險選擇權應當與程式單訊號同進同出或持續持有? L認為要分買賣方,使用買方避險,當程式單損失時,不一定有避險效果,因為必須有一定空間才能顯現避險效果,所以持續持有價外買方(EX. 10點以下)是比較好的選擇,也就是程式單進場時買方一起進場,程式單出場時買方就擺著不管了,一是出場價格極低,二是程式單再次進場仍可使用,三是還有一點點的機會,偶爾出乎意料的行情會賺回來。
使用賣方避險,當程式單損失時,幾乎都有避險效果,當程式單出場時,應同時出場,我們要的避險效果都會有,只是效果大不大要看履約價選擇,一般都是選擇價外2~3檔,並應有30點以上,太少點數的不一定划算,履約價選擇可以利用其它的一些指標來確認,例如市場最大未平倉OI的履約價、加權指數近期區間的上下緣、指數的乖離%數設定這些等等。
以上,是一般情況下的相關選擇想法,下一篇再寫,就台股現象來選擇合適選擇權的整理吧。
2015年4月11日 星期六
程式交易利用選擇權避險 – 3
跳空這件事,是我們想要避險的一大因素,有多少次一覺醒來看到美股大漲大跌,而我們部位是反向時的那種感受,真希望能夠有多一點避險,然後準備開盤被巴。
但是我們怎會知道開盤會跳空大漲大跌呢? 也可以換句話說,我們怎麼知道美股會大漲大跌呢? 除了一些事件因素之外 (數據公布或FOMC會議等等....前文有稍微介紹過,美元與FOMC會議 ),可以多參考 VIX 。
可由網址 http://stockcharts.com/h-sc/ui?s=vix 看到S&P 500 指數期貨的波動程度,如圖。
一般來說,波動率越大,表示盤勢的漲跌幅也會越大,像現在波動率一直掉,那美股的漲跌可能就越小,這樣的話,我們的跳空風險可能也就越小。( 不只跳空,我們的波動率也可能隨著S&P500的VIX跟著變大變小,因素當然是有很多,這只是其中一個。)
再來,我們拿VIX和S&P500期貨價格的走勢來比對看看,如圖。
這是2014/9~2015/2這段期間的比對,很明顯用肉眼就看的出來跌勢時VIX上漲,漲勢時VIX下跌,所以人家都說看VIX就可以看出來市場的氣氛如何,是恐慌還是舒緩。
回到主題,這和選擇權避險有什麼關係?
選擇權的Greeks其中一項重要因素Vega就是波動率,我們真正關心的會影響價格的隱含波動率,很可能會跟著VIX的方向走,那由上圖的關係顯示,假如我們的趨勢程式單能夠跟對空頭盤勢時,期貨是空單,那搭配避險的選擇權應該要選空方波動會趨向大的正Vega,避險要作多而且是正Vega值的是,Buy Call。
另一方面,多頭時趨勢單作多,期貨是多單,搭配的選擇權應該選多方波動會趨向小的負Vega,避險要作空而且是負Vega值的是,Sell Call。
我們再來用實際例子檢視這個想法,為什麼是這個樣子,在空方時期貨作空單,行情真的下去了又急又快,波動率上升,我們的避險單Buy Call可以因為Vega上升而少輸一點,例如急跌兩百點時,Call價格卻掉沒多少或掉不下去,那我們可以有更多彈性來調整避險的Call。
反之,多方趨勢時期作多單,行情慢慢的走上去,波動率下降,我們的避險單Sell Call 可以因為Vega下降而少輸一點,例如今天小漲30點,Call的價格可能只漲一點點或跟本不動,那我們可以有更多彈性來調整避險的Call。
這篇紀錄的是偏重選擇權Vega的特性來搭配程式單的避險,因此要再特別注意,到期日要夠久,Vega才有影響效果,所以別用週選,要用月選較適合,另外,雖然這看起來很合理好用,但也只是眾多因素中的一項而已,換句話說,程式交易利用選擇權避險後面還有好幾篇。
2015年4月3日 星期五
程式交易利用選擇權避險 – 2
先多想想避險是什麼: 我們要的是程式單虧損時能少輸一點,當然我們也要付出一些合理的代價。
等等,好像不只是如此,照以上的定義來作避險,那用小台指來幫大台指避險不就好棒棒了,大台輸時小台賺一點回來,大台贏時小台也必定會損失一些,這不就是理想的避險了嗎? 何必搞複雜的選擇權策略來作避險,還可能越避越險?
看看小台作避險的損益圖如下。
圖右邊表示用小台作大台的避險,這樣的組合可以讓獲利和虧損同比例縮小,而勝率和盈虧比保持不變。這確實是一個避險的好方法,但有多少人會這樣作呢? 這不就是減碼而已,我們想的避險應該要有更好的效果。
是的,要翻一下舊文章了,交易策略評估三項重點中的 交易策略評估-獲利風險比 ,一個組合中若加入不同策略就可能可以提高獲利風險比,使得整體策略品質更好,但是前面說的小台拿來避險後,獲利和風險是同比例減少,也就是獲利風險比是不變的,固定的,而用選擇權來避險則有機會,假如能夠讓獲利不變,風險降低,那獲利風險比就能提升,避險就很有效果了,講白話一點的目標就是,有一個作下去不用賺沒關係,但也不會賠的選擇權策略,拿來作程式交易的避險就會讓 drawdwon縮小。
慢著! 目標為什麼不是用一個會賺的選擇權策略來避險,可以增加整體獲利又可以降低drawdown。嗯,當然是這樣子,但有這種策略很困難,如果選擇權策略那麼會賺還拿來避險作啥? 程式交易不要作了,直接押選擇權不就好了。
回到主題再來看選擇權先區分買賣方拿來作避險的損益圖效果。
上圖買方下圖賣方,損益圖形那麼基本不想描述了。避險就是有一得必有一失,買方用獲利時少賺一點去補貼大賠時的風險,賣方用獲利少賺很多去補貼盤整時的小賠,不過這樣講起來有點不公平,因為這損益圖顯示不出勝率的差別。
圖右邊的獲利風險目標,作買賣方都是一樣的,加上選擇權避險後,希望可以讓組合獲利不變,降低風險。但下面兩項則是大不同,加了買方後的勝率降低,盈虧比增加;加了賣方後的勝率增加,盈虧比減少。
這篇就先到這,下次再續了。
2015年4月2日 星期四
程式交易利用選擇權避險 - 1
前幾篇廢文太多,該是寫點有營養的東西,針對程式交易利用選擇權避險這個主題作多一些分享。
先說好目標程式交易是針對中長期的趨勢策略,如果是短期或當沖的期貨交易對於選擇權避險的需求較小,或有不同作法。而利用選擇權則就是指作Buy方、Sell方、用Call、用Put、或複式合成。
當然期貨+選擇權時就是包含轉換的概念 Future = (Strike) + Call – Put,例如: 期貨作多單 + 避險用 Buy Put = Buy Call,那就先來看看人家所說的,選擇權避險以買一點點權利金作保險的效果吧。
以下是大家的好朋友,台指半年走勢。
不知道各位是不是看了就討厭,近半年往上追就跌,往下殺了又被軋到,波段單難作死了,下圖把一般的趨勢波段策略可能發生Drawdown的區域圈出來。
每一個小框框都是會巴死人的,若你的程式全是中期一兩百點左右的策略,那就GG了,那回到主題,當作多期貨時買一點PUT避險,或作空期貨時買一點CALL避險,會不會比較好?
以像上圖這樣的走勢來說,只會輸更慘,原因是那走勢就仍在一個兩三百點的區間內,程式單翻來翻去的同時,避險單一下買CALL出掉又買PUT出掉,只是賠更多而已。
買一點點的權利金就是比較遠的履約價,當走勢與部位反向時的幅度不夠大,買方權利金甚至可能倒賠,以實例來說,9500買多單時,要買哪裡的PUT? 會買到9300嗎? 那不只20點了,那有人說可以買週選比較便宜,履約價可以買進一點的,嗯,當然是可以,但也可能賠更快就是了,這是之後的一個主題,現在先寫到這。
那這例子就假設買9200PUT好了,10點,當行情走勢跌到9350時,多單停損,此時PUT,就看時間來的快和慢,如果是慢慢跌到9350,那PUT可能還是10點,甚至不到10點也很可能,那就沒有避險效果了。反之,程式9350翻空了,買CALL9600的,如果行情慢慢走的話,當空單輸錢時,CALL還是避不了險。
上述一大段只是說明買方不一定適合趨勢波段策略的避險,我們要來想在什麼情境之下才適合,那就有很多考慮因素,如:
履約價選擇?
到期合約選擇?
與程式單訊號同進同出或持續持有?
是否跟隨市價轉移履約價?
何時轉倉?
部位控制?
小短篇出文章,這個主題大約會寫四篇以上,希望讀友會有建議或討論。
2014年9月14日 星期日
程式交易與選擇權避險
大部份的程式交易都是趨勢型,有波段行情發生時能夠大賺,但是區間震盪的行情則會不斷的虧損,而在虧損時期要怎麼應對是這篇的主題。
遇到虧損時最容易想東想西,而最不該作的事最常去作,就是自己動手去調程式部位,這通常都沒什麼好結果,作程式的人,要謹記在心,程式部位是神聖不可侵犯的,有什麼問題,盤後再修改測試,別在盤中手癢。
而這個修改測試要怎麼作,是否必要改,就要好好想了,因為虧損是正常的,當虧損是在預期的範圍內,那不該改,若很想改,或許該改的是自己的心態,是不是不夠瞭解程式和它的表現狀況。
確定改要怎麼作,我們希望可以在震盪時降低虧損,首先是很常參考的逆勢單策略,把逆勢單加入投資組合裡,佔有小部份的比例,目標是讓整體組合在區間震盪時少輸一點,當然在大賺時應該也會少贏一點點,達到較平穩的目的。
但是逆勢單要寫的好並不簡單,光是要在長期的回測能夠獲利就是一個挑戰,於是標準不能看太高,別賠就好,只要不賺不賠,就能夠對整體策略組合有幫助,能夠降低drawdown。
而效果比逆勢單好的是利用選擇權避險,一個區間,假設就陣子的9200~9600,不停洗刷時,趨勢單虧損哭哭,逆勢單也不一定能獲利,但是選擇權有策略可以降低損失。當然選擇權也不是簡單的東西,而且回測也不容易,L想要紀錄的是實際應用的一些想法。
前提是很重要的,程式單為主,選擇權避險為輔。
目標是很重要的,程式單輸錢時,選擇權加進去可以少輸一點,反之,程式單贏錢時,選擇權會小賠或沒賺賠。
如此強調的原因是,選擇權本身就有很多策略,但把它當作獲利主軸和當作避險角色時,兩者想法是不同的概念。在這邊,需要專注在我們的前提和目標。
以下,都是針對台指市場的交易為例。首先,要確認時機,要利用選擇權避險的時機是特定的還是長駐的? 沒有標準方案,視程式交易特性,如果是有長波段單,或許長駐搭配會適合,若大部份是短單或經常無單,或許特定時間或極短期較好。
再來就看選擇權避險方式,就以這段期間9200~9600上下洗刷的區間為例,假如程式單是在9300點跌破時翻空的情況下,避險方式主要有下面幾種,我們就來看看如何搭配以及優缺點。
- Buy call
- Sell put
- Buy call + Buy put
- Sell call + Sell put
第一種,Buy call 可以擋住急拉時的風險,但是經常會歸零,如果是手動作避險的人,好處是不用去理它,不需要擔心太多,因為風險可以完全鎖住。要不要再作成多頭價差,上面再sell call? L是覺得有點多餘,因為我們目標是避險,上面再多作一個就沒辦法完全鎖住。強調again,經常歸零,買便宜的效果差,買貴的又很花成本,這是另一個要深入的主題。
第二種,Sell put可以增加收入,持有空單再去sell put就是等於sell call,只是履約價較低的sell call,我們程式單原本最大的利基就是能大賺一波,行情走越久我們就抱越久賺越多,但是加了sell put之後,作對的時候會少賺很多,作錯的時候也只是增加一點收入。
為什麼說是一點呢? 因為一般情況下,如果行情馬上反轉,空單被軋,以9300空單被軋到9400或9500時幾乎就停損翻多了,那這個sell put在翻多時也要出場了,這樣避險能賺多少? 當然,這勝率是高的,只是賺賠比需要多加考慮,也要思考自己的程式單是否適合,以單純sell方來說,L的經驗是拿到”加碼”的應用比較好一點。就是空單時想加碼,就同時作sell call,這是另一個要深入的主題,(這句好像重覆再用,為以後鋪梗)。
以上兩種是單腳,與程式單配合,如果程式單反轉時,這個選擇權部位也需要反轉,後兩種則不一定,而且很有趣。
第三第四種,雙buy和雙sell,先想想本質的差異,delta我們確定是要偏正的(初始時),因為是要拿來作期貨空單的避險,而雙buy是long gamma付theta,雙sell 是short gamma 收theta,也就是說,我們需要先確定想要和時間或趨勢作朋友?想不出來的話,不如反著想,不想要和時間或趨勢的哪個作敵人?
當你很害怕程式單被跳來跳去的行情巴的亂七八糟,早上急拉衝高讓空單停損翻多,午盤又下跌又翻空,抱著空單收盤後又看到美股一直漲,覺得明天起床又要面對虧損,這樣的情況下,你害怕的是波動劇烈,肯定作雙buy是好選擇,但不是雙buy了就沒事不管它,可以不管,但要想想,如果9300的期貨空單,搭配我們依區間9200~9600的想法,去buy 9600 call及buy 9200 put,後續要怎麼進出,需要考量一點,你認為9200或9600會不會破?
如果會,就不要管它,但是如果沒破,洗來洗去又回到9300,那完全沒避到險還多輸雙buy權利金,怎麼辦? 如果覺得不會破,但是洗刷又很劇烈,雙buy無誤,但是要管要調,當行情從9300漲到9400時,因為雙buy是long gamma,所以delta會從假設中立到偏多,這樣我們就再把它中立,就是空期貨。空了之後,行情真的又洗回9300,delta又會偏空,那再中立,就是買期貨,以此要訣反之亦然,洗的越快越嚴重,賺的越多,重點是,真的破了9600或9200,也不會輸。
另一方面,假如行情就是不太動,好長一段時間都是在9200~9600了,程式單賺不到錢,偶爾輸輸,也不是很痛,或許就適合與時間當朋友,雙sell收theta。這在台股是特別有利,因為我們的官股行庫都是排球隊的,指數跳上去就往下殺球,指數掉下去就撲去救球,區間操作超級明顯,而且作的還真厲害。我們若作雙sell時,官股行庫是很強的隊友,就假設sell 9200 put 和sell 9600 call,或者是從最大未平倉的合約來選履約價也好,如果這個區間一直沒走出去,這個雙sell就能帶來一些獲利。
以上四種選擇權避險方式只是大致介紹,實際上行情的路徑、波動程度、時間的拿捏、履約價選擇,都是重要因素,這些是另外好幾個要深入的主題。
2014年7月11日 星期五
學習交易選擇權
選擇權市場是個很吸引人的地方,每個人多少都會聽過一些大賺的故事,也相信著獲利的時刻終會降臨到自己身上,於是一直努力著,在這個市場裡,似乎永遠都有機會和方法獲利,而且有許多獲利方法是股票或期貨的交易者無法觸及的。
但是,贏家不多,能夠持續穩定獲利的交易者真的不多,L有幸認識幾位選擇權交易的高手,時常交換想法,其中有一些觀念可以和讀友分享,關於學習交易選擇權。
記得選擇權是怎麼開始接觸的嗎? 大部份人第一印象可能是來自教科書、可能是書名很厲害的交易書籍、可能是某篇贏家的採訪文章、或是某網站的選擇權操盤分享,不論是哪一種,我們得到的關於選擇權交易知識,都只是一個片段,所以為了要加強能力,認真的交易者會開始收集各種片段,慢慢的拼湊,這有哪些片段呢? 由淺至深舉例如下
選擇權基礎部份
- 瞭解商品規格、交易制度及交易費用
- 理論價格評價,Black–Scholes option pricing model
- 選擇權風險評估 (Delta、Gamma、Vega、Theta、Rho)
- 價格波動率,(歷史波動率、隱含波動率)
價差交易部份
- 垂直價差、比例價差
- 跨式、勒式部位
- 蝴蝶價差、禿鷹價差
- 時間價差,近遠月
- 與期貨組合部位
套利及避險部份
- 合成部位
- 套利原理及機會分析
- 轉換與反轉換
- 保護性的call和put
- 市場間的價差交易
策略設計與測試部份
- 台指選測試
- 長短期選擇權策略
- 選擇權應用期貨訊號
- 歷史買方賣方勝率與盈虧比紀錄
- 選擇權在期貨投資組合中的應用
- 選擇權市場籌碼分析
操作系統部份
- 風險評價程式實作
- 下單系統實作
以上,有點像是目錄,每一個主題都是需要花費許多時間和精神去研究的,前面基礎的部份找找書籍或網站資料都可取得,而進階一點的部份可能要自己整理研究或找論文來參考看看。而學習以上的東西之後,大概就能對選擇權運用有所瞭解,只是事情沒那麼簡單,甚至可以說那些都是基本功而已,無法掌握策略獲利,這情況就像是價差交易搞的再懂再熟,不知道什麼時候該用該出也是枉然。
所以準確地說,以上所提到的內容都只是技術性的知識。它們都很重要,熟悉各項策略及特性可以讓我們有更多機會在市場生存與發展,但是真正能夠操作選擇權獲利的主因是對市場的觀察力及思考力。困難的是,書本沒教,也不太有人會專門說這些,最主要的學習來源可能就是交易經驗。
說觀察力及思考力有點抽象,這指的是對市場的觀察及對後勢的思考並配置部位。我們知道現在選擇權市場價格是非常有效率的,若有一丁點的套利機會是馬上被法人啃掉,一般投資人不容易參與這塊,但是在法人積極造市下的好處是讓流動性高,可以輕鬆計算目前的波動率水準,方便觀察。而觀察,就是以方向、波動和時間三個角度去觀察市場,思考,則是建立在現有的觀察上,預期未來對方向、波動和時間三個角度的看法。有了對後勢的看法,再來運用前述某項策略來進行交易。
能思考對未來價位的方向、波動率的方向或是時間的掌握嗎?
舉例來說,選舉,是一個可預期的事件,是有機會對指數造成重大影響的事件,人人都知道波動率應該會上升,而有思考力的交易者會提前就佈局作多波動率,例如作跨式買方,但他也研判選舉一結束後波動率會立刻下降,所以在跨式買方已經獲利的選前最後一個交易的最後一小時,他又進場作遠月的跨式賣方,(補充說明選擇權遠月合約的VEGA比近月大),而且他作了選後的價格預期,在大漲、大跌、小漲、小跌中將最不可能的小跌作了額外賣方布置,其餘加作買方,然後選後開盤時再次進場作空波動率。這是真實的故事,結果行情發展確實照這樣的劇本走,這樣的思考和判斷能力當然讓他比一般人更有競爭力。
除了事件之外,平時也有一些因素可以觀察並思考方向和波動率的走向,在這邊可能不行再說更多了,總之,保持思考方向、波動和時間三個角度去觀察市場,預期在現有水準下是否會上升或下降,進場後部位的各種情境分析,及在各種情境的對應處理,以上,是學習交易選擇權的小建議。
《本文與 Bituzi 同步刊登》
2014年5月30日 星期五
期權價格關係 put-call parity 2
續前篇 期權套利 & put-call parity 介紹了選擇權與期貨價格的關係,這篇再繼續紀錄深入一點的觀察。
因為選擇權與期貨的價格有互相轉換的關係,所以彼此影響是很緊密的,在現在市場非常有效率的情況下,我們可以單從選擇權的報價來瞭解目前市況,而且若是要對選擇權策略作研究和交易,必須要對這些特性掌握到非常熟悉。
以下紀錄由下圖價格來作範例
從選擇權看期貨價格
看價平履約價9100的CALL和PUT,成交價是89及57,如果心算很好的話,不用看期貨報價也知道現在的價格約在9132,算法就是以PutCall Parity來算,9100+89-57。
再來分別看委買賣的價格,
若要合成一個買進期貨,就是buy call + sell put,買90點的call + 賣57點的put,會組成9133的期貨多單(9100+90-57)。
若要合成一個賣出期貨,就是 sell call + buy put,賣89點的call + 買58點的put,會組成9131的期貨空單(9100+89-58)。
因為市場很有效率,所以報價會是 合成買進期貨 (9133) > 期貨市價 (9132) > 合成賣出期貨 (9131) ,不然就會有套利空間。
從期貨看選擇權價格
期貨在9132的位置,
9100的CALL是價內,時間價值是89-32=57點,
9100的PUT是價外,時間價值就是成交價57點,
時間價值由到期時間及波動率這兩個因素影響,也是作選擇權策略很重要的觀察價格,同個履約價的CALL和PUT所計算的時間價值是一樣的,所以波動率也是一樣的,如果不一樣時,也就是有套利空間。
這個特性也有可以利用的地方,在計算較價內的CALL和PUT時,因為沒有成交量,或是買賣價差掛很遠,又想要知道隱含波動率時,就可以利用另一邊來替代,例如8600的CALL很久沒成交,買賣價掛很遠,要去算它理論價時,就直接拿8600的PUT的隱含波動率來算,因為8600的PUT是價外PUT又有成交量很容易算。
選擇權與期貨的轉換
也是由PutCall Parity來反推,由上面合成期貨的例子再延伸,可以知道期貨、CALL和PUT三個,知道兩個就可以推出另一個,所以有以下共六種的轉換。
(F=期貨,B=買,S=賣)
BF = BC + SP
SF = SC + BP
BC = BP + BF
SC = SP + SF
BP = BC + SF
SP = SC + BF
再多補充紀錄,現在選擇權造市非常緊密,所以市場才能有這樣好的流動性,關於造市的機制和辦法可以到期交所網站瞭解,位置是交易制度的連結內如圖。
多瞭解一些關於市場造市制度及交易者也是蠻好的,其中造市辦法會規定造市者當月回應報價請求之報價比率、有效報價累計時間及造市量,達成目標時可以減免其當月應繳之交易經手費、結算服務費,讓造市者成本更降低。
以上所紀錄到的這些價格和關係若一直看、經常看,就會感受到整體期貨和選擇權價格的連動,也可以對時間價值和波動率有直覺的反應,這對選擇權操作會有更深入的理解。
2014年3月14日 星期五
價格波動率與買賣方策略
先前紀錄了幾篇關於波動率及買賣方策略的文章,以及波動率在程式交易上的應用例子。如以下
歷史波動率、隱含波動率 (with EXCEL VBA、C#)、歷史波動率策略設計、台指選擇權結算買賣方損益,不過還並未紀錄操作實務上的重點,這篇再繼續作延伸。
選擇作買方或賣方有很多考慮因素,波動率是其中很重要的因素之一,如果對未來預期波動程度會變大,則作買方有利,如果預期波動程度變小,則作賣方有利。這樣的解釋其實並不夠清楚,而且是有前提的,在持倉的所有期間。
舉個例子說,吳波判斷未來台指期價格波動會加大,決定進行買方策略,假設價平的履約價是8000,則同時買進8000的CALL及8000的PUT,經過一個月漲漲跌跌,最後又回到8000結算,但是吳波最後卻還是獲利,這只有一種可能,在這個月的期間內價格波動確實超過當初他買進時的水準,而且吳波有進行動態調整。
這個動態調整是這樣的,在8000點進場後,市場波動確實加大,很快下跌到7900點時,這比吳波認為的波動來的快,而現在總部位DELTA變成 -1,吳波就買進一口期貨,使總部位DELTA變成0,然後,又下跌到7800,總部位(含加進的一口期貨)又變成 -1,這時吳波又買進一口期貨,然後市場回到7900,總部位DELTA變成 1,這時又賣出一口,之後市場又回到8000,總部位DELTA又變成 1,這時又賣出一口。雖然指數又回到8000,但是期貨買進7900及7800,賣出7900及8000,這個調整的部份就獲利不少。
而後指數往上了,到8200時賣出期貨以平衡DELTA,越往上越賣,往回跌就買回來,所以吳波是被動式買低賣高,總結下來調整的期貨獲利比買方部位的虧損要多。
反過來說,賣出兩邊選擇權在8000,就算最後結算正好在8000點,也不見得會獲利,因為期間內可能漲到8300、8500,可能跌到7800、7700之類的,只要超過預期的波動(也可以說是賣方所能容忍的價位程度),那這個賣方投資人必須在8300買進期貨,在7700賣出期貨,為了保護(避險)被迫買高賣低,最後這個避險的成本超過了選擇權賣方的獲利。
以上數據僅作舉例,若熟悉選擇權跨式部位的損益及GREEKS變動可以很輕易瞭解要說明的內容。另外,避險在例子中是用期貨執行,實際上的選項很多,例如部位平倉、用不同的履約價、搭配不同的買賣方,那就是要繼續看各種價差交易了。
其中更大的學問是如何決定調整的時機,如果在建立前就有預期的波動水準,當到達時很自然就要進行調整,或者是以總部位的DELTA來進行調整,和前面所述的例子一樣,另外一種方式則是依照時間來作DELTA中立,例如每天、每週之類的,時間到就調整一次。
回到開頭所先講的結論,如果對未來預期波動程度會變大,這個未來預期是最重點考量,若要以價格波動程度作為選擇買賣方策略最重要的因素,要小心目前現狀波動率給人先入為主的觀念,因為市場上的價格已經作了反應,例如我們知道現在日經波動程度很大,常常一天2%、3%在跑,那麼作買方再來調整會很好作,這就錯了,那要作買方的權利金是很貴的,除非波動再放大、更大,才能夠獲利。
此文緣由朋友問到外資部位總是買方一大堆,這種盤整區間行情不是賠死了嗎? L只能回說不一定,要看調整的好不好,不是只由買賣方就可判斷損益的。以上,供有同樣疑問的朋友參考囉。
2013年12月29日 星期日
大陸滬深300選擇權商品明年上市
兩岸金融交流越趨緊密,我們雖然無法直接交易對岸商品,但也許哪天當政策開放,大陸商品也將成為我們的投資組合之一,因此隨時保持關注是必要的。
自從大連商品交易所、鄭州商品交易所與上海期貨交易所自一年多前開始期權(選擇權)仿真交易後,今年11月8號大陸中國金融交易所(簡稱中金所),公布 股指期權仿真交易業務規則,形同宣布明年中國衍生性交易市場將全面性進入下一個階段-選擇權的時代來臨,未來也許中國再上市更多選擇權交易商品後,結合既有的大連、鄭州與上海三個商品交易所將成為亞洲衍生性商品交易的重鎮。
然而一般台灣人對指數類選擇權的商品最為熟悉,因此對於滬深300指數推出的選擇權關注度也較其他商品選擇權更為高出許多,下圖即為中金所公布的商品合約規格表。
看完上圖,可能很直觀的了解到每跳種一點大約10人民幣,也差不多相當於台指選擇權1點的價值,而比較特別的是,規則中並沒有如同台灣在不同價格的時候跳動點跟隨改變,例如台指選擇權在50點時,往上跳一ticks是1點,而往下跳一點則是0.5點。讀者可以從下圖仿真交易的畫面中更看出這點的差異。
比較兩岸交易規則差異時,其中有一點差異特別讓J注意到,並可推演到交易策略上,而這交易規則是「履約價的上市規則」。讀者可先行閱讀下圖。
比較早參與台指選擇權交易市場的讀者可能會有印象,以前台灣履約價上市的交易規則跟現在(2010/10/19後)是不同的,可先參考下圖紅框處。
現行的規則修改如下。
現在讀者有沒有發現,中金所目前規劃的交易規則就像以前台灣的交易規則,而這其中隱藏了很好的交易機會與策略,我想經歷過以前08年大波動的時候的讀者可能會想起,當年我們在作交易的時候會出現PUT履約價不足的問題,就算想買便宜的權利金,因為只多開5檔履約價而導致行情大幅變動的時候連最遠的履約價都超級貴,讓許多人無法狠下心去買這保險或利用選擇權作空,而眼睜睜看著行情繼續快速往下而錯失大好賺錢機會。
現在再去看看大陸的交易規則與J的仿真交易截圖,讀者可以發現中金所只多開到當時指數的價外3檔(150點),而其指數的漲跌停還比台灣7%大(滬深指數10%),我們簡單計算一下,如果滬深指數在3000點,若出現稍微大一點的波動例如5%的幅度,就已經讓指數變動150點,因此只要指數高一點或波動再大一點,是非常容易超過3檔價外,所以散戶與法人的行為就可能再次出現與台灣過去一樣的極端狀況,例如昨天的便宜價外,開盤後突然變成很貴的價平,法人大量買進避險,散戶買不下手,而收盤時已經變成深度價內,最後回頭一看,這種讓你貴到買不下手(例如BUY PUT),最後就是眼睜睜看著行情繼續大幅同向波動, 錯失一次賺大錢的機會。
本篇除了簡單的提及了大陸選擇權市場的發展現況外,主要期望提醒讀者,交易制度的研究也是相當重要的,對於每個合約設計的環節都是會影響到交易策略的設計與市場的波動,本篇J的小想法,僅是站在歷史可能重演的角度發想,也許之後其選擇權上市前交易規則有可能再作調整,讀者可持續關注明年的正式上線。
2013年12月11日 星期三
選擇權GREEKS實作(C#)
在能夠計算 選擇權評價-BS MODEL (with Excel) 及 隱含波動率 (with EXCEL VBA、C#) 之後,再來剩GREEKS了,要計算四個影響價格的變數是Delta、Gamma、 Vega、Theta,完成這部份就可以得出目前選擇權部位組合的各項數值。關於這些希臘字母的定義和作用,都需要深入瞭解後才能對選擇權策略有所掌握,進而設計出選擇權策略。
此篇要紀錄的僅是關於系統開發,雖說大部份的交易軟體都會提供GREEKS資料,但總要是自己寫的才能確定正確性,因為券商軟體算的不一定對。當然也有許多人不在意些微差距,或根本沒在觀察GREEKS,但那樣操作選擇權是無法進步的,再說若要自己建立策略模組,這些也只是第一步而已。
大部份設計選擇權監視程式的軟體是EXCEL,因為最簡便,直接利用公式和一些函數設計就可以完成,若要即時串接部位的話,大部份是寫VBA程式和券商API串接,而行情的部份可以用DDE或API來接收。
但是EXCEL會有效能問題,如果接受行情多,再加上運算邏輯複雜,EXCEL很可能會有延遲的狀況,因此比較好的方式還是自己寫程式,可以先由券商API所提供的範例程式來測試,可能是VB、C#、C++或Delphi等等,選一個好寫的來測試收行情、回報、部位。此篇L要紀錄的是以C#來實作選擇權GREEKS。
整段範例程式碼貼在最後面,需要先說明一下前因後果,先有一個DataTable是用來紀錄未平倉的選擇權部位,這個副程式所要處理的是計算目前所有未平倉選擇權部位的GREEKS並寫進DataTable,這個DataTable再與DataGridView串接,就可以顯示在FORM上
這個DataTable,取名dtOI,至少有以下的欄位:
dtOI.Columns.Add(new DataColumn("SettleM", typeof(string))); //月份
dtOI.Columns.Add(new DataColumn("Strike", typeof(double))); //履約價
dtOI.Columns.Add(new DataColumn("CP", typeof(string))); //Call or Put
dtOI.Columns.Add(new DataColumn("BS", typeof(string))); //Buy or Short
dtOI.Columns.Add(new DataColumn("Qty", typeof(string))); //口數
dtOI.Columns.Add(new DataColumn("Match", typeof(double))); //成交價
dtOI.Columns.Add(new DataColumn("Market", typeof(double))); //市價
dtOI.Columns.Add(new DataColumn("VOL(%)", typeof(double))); //隱含波動率
dtOI.Columns.Add(new DataColumn("DELTA", typeof(double))); //DELTA
dtOI.Columns.Add(new DataColumn("GAMMA", typeof(double)));//GAMMA
dtOI.Columns.Add(new DataColumn("THETA", typeof(double))); //THETA
dtOI.Columns.Add(new DataColumn("VEGA", typeof(double))); //VEGA
在執行副程式之前,除了最後五欄之外都是準備好的,然後有一些變數要準備
AssetPrice 期貨價格
Strike 履約價
InterestRate 利率
Expiry 到期因子
Target 選擇權的市價
還有之前紀錄隱含波動率的類別,一開始要NEW一下。
Option op = new Option();
然後就開始了,看片段來說明一下
以下PUT的部份就依此類推。程式碼如後所貼,有一些使用到的參數及關聯FORM的變數沒有仔細說明,不過整個架構已經是可以瞭解的了。以前 L 設計時找不到完整的參考資料,一步步的自己設計,現在若有同樣需求的朋友看到這邊可以自由取用,歡迎參考及指正。
private void Greeks()
{
int i = 0;
AssetPrice = double.Parse(label16.Text);
while (i < dtOI.Rows.Count)
{
Strike = double.Parse(dtOI.Rows[i]["Strike"].ToString());
Target = double.Parse(dtOI.Rows[i]["Market"].ToString());
Qty = double.Parse(dtOI.Rows[i]["Qty"].ToString());
//期貨
if (dtOI.Rows[i]["CP"].ToString() == "")
{
if (dtOI.Rows[i]["BS"].ToString().Trim() == "B")
{
dtOI.Rows[i].SetField("DELTA", 200 * Qty );
}
if (dtOI.Rows[i]["BS"].ToString().Trim() == "S")
{
dtOI.Rows[i].SetField("DELTA", -200 * Qty );
}
}
//CALL civ(double AssetPrice, double Strike, double InterestRate, double Expiry, double Target)
if ((dtOI.Rows[i]["CP"].ToString().Trim()) == "C")
{
if (dtOI.Rows[i]["PId"].ToString().Trim() == "TXO")
{
if (dtOI.Rows[i]["SettleM"].ToString().Trim() == label10.Text.Substring(0, 6)) //近月
{
AssetPrice = double.Parse(label16.Text);
Expiry = Expirynear;
}
if (dtOI.Rows[i]["SettleM"].ToString().Trim() == label11.Text.Substring(0, 6)) //遠月
{
if (label22.Text != "")
{
AssetPrice = double.Parse(label22.Text);
}
else { AssetPrice = double.Parse(label16.Text); }
Expiry = Expiryfar;
}
}
else //週選
{
if (wnFid != "MX")
{
if (dtOI.Rows[i]["PId"].ToString().Trim().Substring(1, 2) == wnFid.Substring(1, 2)) //近週
{
AssetPrice = double.Parse(label23.Text);
Expiry = Expirywn;
}
}
if (wfFid != "MX")
{
if (dtOI.Rows[i]["PId"].ToString().Trim().Substring(1, 2) == wfFid.Substring(1, 2)) //遠週
{
AssetPrice = double.Parse(label22.Text);
Expiry = Expirywf;
}
}
}
civ = op.civ(AssetPrice, Strike, InterestRate, Expiry, Target);
d1 = op.d1(AssetPrice, Strike, InterestRate, Expiry, civ);
nd1 = Math.Exp(-0.5 * d1 * d1) / Math.Sqrt(2 * Math.PI);
nd2 = op.NormsDist(d1 - civ * Math.Sqrt(Expiry));
//DELTA NormsDist(double x) d1(double AssetPrice, double Strike, double InterestRate, double Expiry, double Volatility)
DELTA = op.NormsDist(d1);
GAMMA = nd1 / (AssetPrice * civ * Math.Sqrt(Expiry));
THETA = (-(AssetPrice * nd1 * civ / (2 * Math.Sqrt(Expiry))) - InterestRate * Strike * Math.Exp(-InterestRate * Expiry) * nd2) / 365;
VEGA = (AssetPrice * (Math.Sqrt(Expiry)) * nd1) / 100;
dtOI.Rows[i].SetField("VOL(%)", Math.Round(civ * 100, 4));
if (dtOI.Rows[i]["BS"].ToString().Trim() == "B")
{
dtOI.Rows[i].SetField("DELTA", Math.Round(DELTA * 50 * Qty , 0));
dtOI.Rows[i].SetField("GAMMA", Math.Round(GAMMA * 50 * Qty * AssetPrice / 100, 0));
dtOI.Rows[i].SetField("THETA", Math.Round(THETA * 50 * Qty, 0));
dtOI.Rows[i].SetField("VEGA", Math.Round(VEGA * 50 * Qty, 0));
}
else if (dtOI.Rows[i]["BS"].ToString().Trim() == "S")
{
dtOI.Rows[i].SetField("DELTA", Math.Round(-DELTA * 50 * Qty , 0));
dtOI.Rows[i].SetField("GAMMA", Math.Round(-GAMMA * 50 * Qty * AssetPrice / 100, 0));
dtOI.Rows[i].SetField("THETA", Math.Round(-THETA * 50 * Qty, 0));
dtOI.Rows[i].SetField("VEGA", Math.Round(-VEGA * 50 * Qty, 0));
}
}
//PUT piv(double AssetPrice, double Strike, double InterestRate, double Expiry, double Target)
if ((dtOI.Rows[i]["CP"].ToString().Trim()) == "P")
{
if (dtOI.Rows[i]["PId"].ToString().Trim() == "TXO")
{
if (dtOI.Rows[i]["SettleM"].ToString().Trim() == label10.Text.Substring(0, 6)) //近月
{
AssetPrice = double.Parse(label16.Text);
Expiry = Expirynear;
}
if (dtOI.Rows[i]["SettleM"].ToString().Trim() == label11.Text.Substring(0, 6)) //遠月
{
if (label22.Text != "")
{
AssetPrice = double.Parse(label22.Text);
}
else { AssetPrice = double.Parse(label16.Text); }
Expiry = Expiryfar;
}
}
else //週選
{
if (wnFid != "MX")
{
if (dtOI.Rows[i]["PId"].ToString().Trim().Substring(1, 2) == wnFid.Substring(1, 2)) //近週
{
AssetPrice = double.Parse(label23.Text);
Expiry = Expirywn;
}
}
if (wfFid != "MX")
{
if (dtOI.Rows[i]["PId"].ToString().Trim().Substring(1, 2) == wfFid.Substring(1, 2)) //遠週
{
AssetPrice = double.Parse(label22.Text);
Expiry = Expirywf;
}
}
}
piv = op.piv(AssetPrice, Strike, InterestRate, Expiry, Target);
d1 = op.d1(AssetPrice, Strike, InterestRate, Expiry, piv);
nd1 = Math.Exp(-0.5 * d1 * d1) / Math.Sqrt(2 * Math.PI);
nd2 = op.NormsDist(d1 - piv * Math.Sqrt(Expiry));
//DELTA NormsDist(double x) d1(double AssetPrice, double Strike, double InterestRate, double Expiry, double Volatility)
DELTA = op.NormsDist(d1) - 1;
GAMMA = nd1 / (AssetPrice * piv * Math.Sqrt(Expiry));
THETA = (-(AssetPrice * nd1 * piv / (2 * Math.Sqrt(Expiry))) + InterestRate * Strike * Math.Exp(-InterestRate * Expiry) * nd2) / 365;
VEGA = (AssetPrice * (Math.Sqrt(Expiry)) * nd1) / 100;
dtOI.Rows[i].SetField("VOL(%)", Math.Round(piv * 100, 4));
if (dtOI.Rows[i]["BS"].ToString().Trim() == "B")
{
dtOI.Rows[i].SetField("DELTA", Math.Round(DELTA * 50 * Qty , 0));
dtOI.Rows[i].SetField("GAMMA", Math.Round(GAMMA * 50 * Qty * AssetPrice / 100, 0));
dtOI.Rows[i].SetField("THETA", Math.Round(THETA * 50 * Qty, 0));
dtOI.Rows[i].SetField("VEGA", Math.Round(VEGA * 50 * Qty, 0));
}
else if (dtOI.Rows[i]["BS"].ToString().Trim() == "S")
{
dtOI.Rows[i].SetField("DELTA", Math.Round(-DELTA * 50 * Qty , 0));
dtOI.Rows[i].SetField("GAMMA", Math.Round(-GAMMA * 50 * Qty * AssetPrice / 100, 0));
dtOI.Rows[i].SetField("THETA", Math.Round(-THETA * 50 * Qty, 0));
dtOI.Rows[i].SetField("VEGA", Math.Round(-VEGA * 50 * Qty, 0));
}
}
//dtOI.Rows[i].SetField("VOL(%)", i);
i = i + 1;
}
}
2013年11月8日 星期五
隱含波動率 (with EXCEL VBA、C#)
延續前兩篇 (選擇權評價-BS MODEL (with Excel) 、歷史波動率 )的內容,這篇要來紀錄隱含波動率了。
隱含波動率(implied volatility, iv)是以選擇權市價所倒推回它處在多少的波動率之上, 可以表示市場對於指數波動的看法,這也是重要的選擇權交易策略。而要計算它的方法也有很簡單易懂的,就是去試。
假設要計算一個市價100的選擇權商品的iv,如同前篇紀錄的,我們已經有了選擇權評價的公式,先設定一組高低點(如1和0),取高低點的中位(0.5),把0.5代入選擇權評價的公式,假設得到150,比市價100高,表示0.5太高了,將剛剛的高點1改為0.5,再取高低點的中位(0.25),再算價格再和市價比,就這樣一直比到高低點的差距很小,就得到iv了。
剛剛這段計算的例子寫成程式,以VBA為例就如下:
Function civ(S, K, T, R, Target)
high = 1
low = 0
Do While (high - low) > 0.00001
If PriceC(S, K, T, R, (high + low) / 2) > Target Then
high = (high + low) / 2
Else
low = (high + low) / 2
End If
Loop
civ = (high + low) / 2
End Function
Function piv(S, K, T, R, Target)
high = 1
low = 0
Do While (high - low) > 0.00001
If PriceP(S, K, T, R, (high + low) / 2) > Target Then
high = (high + low) / 2
Else
low = (high + low) / 2
End If
Loop
piv = (high + low) / 2
End Function
Function d1(S, K, T, R, V)
d1 = (Log(S / K) + (R * T) + (V ^ 2 * T / 2)) / (V * Sqr(T))
End Function
Function d2(S, K, T, R, V)
d2 = d1(S, K, T, R, V) - V * Sqr(T)
End Function
Function PriceC(S, K, T, R, V)
PriceC = S * Application.NormSDist(d1(S, K, T, R, V)) - K * Exp(-(R * T)) * Application.NormSDist(d2(S, K, T, R, V))
End Function
Function PriceP(S, K, T, R, V)
PriceP = K * Exp(-R * T) * Application.NormSDist(-d2(S, K, T, R, V)) - S * Application.NormSDist(-d1(S, K, T, R, V))
End Function
其中civ計算call的iv,piv計算put的iv,用到的Function之前有介紹過。
變數名稱
S 現貨價格,我們拿來算台指選的話,就拿台指期市價當作S
K 履約價格
T 距離到期日的時間,要年化
R 年利率
V 年化波動率
Target 標的選擇權的市價
同樣的程式用c#寫,也在這篇紀錄一下。
class Option
{
public double CallPrice;
public double PutPrice;
public void Price(double S, double K, double R, double T, double V)
{
double a = Math.Log(S / K);
double b_call = (R + 0.5 * Math.Pow(V, 2)) * T;
double b_put = (R - 0.5 * Math.Pow(V, 2)) * T;
double c = V * Math.Sqrt(T);
double d1 = (a + b_call) / c;
double d2 = (a + b_put) / c;
CallPrice = S * ND(d1) - K * Math.Exp(-R * T) * ND(d2);
PutPrice = K * Math.Exp(-R * T) * ND(-d2) - S * ND(-d1);
}
public double PriceC(double S, double K, double R, double T, double V)
{
double a = Math.Log(S / K);
double b_call = (R + 0.5 * Math.Pow(V, 2)) * T;
double b_put = (R - 0.5 * Math.Pow(V, 2)) * T;
double c = V * Math.Sqrt(T);
double d1 = (a + b_call) / c;
double d2 = (a + b_put) / c;
CallPrice = S * ND(d1) - K * Math.Exp(-R * T) * ND(d2);
return CallPrice;
}
public double PriceP(double S, double K, double R, double T, double V)
{
double a = Math.Log(S / K);
double b_call = (R + 0.5 * Math.Pow(V, 2)) * T;
double b_put = (R - 0.5 * Math.Pow(V, 2)) * T;
double c = V * Math.Sqrt(T);
double d1 = (a + b_call) / c;
double d2 = (a + b_put) / c;
PutPrice = K * Math.Exp(-R * T) * ND(-d2) - S * ND(-d1);
return PutPrice;
}
public double ND(double d)
{
double L = 0.0;
double K = 0.0;
double dD = 0.0;
const double a1 = 0.31938153;
const double a2 = -0.356563782;
const double a3 = 1.781477937;
const double a4 = -1.821255978;
const double a5 = 1.330274429;
L = Math.Abs(d);
K = 1.0 / (1.0 + 0.2316419 * L);
dD = 1.0 - 1.0 / Math.Sqrt(2 * Convert.ToDouble(Math.PI)) * Math.Exp(-L * L / 2.0) * (a1 * K + a2 * K * K + a3 * Math.Pow(K, 3.0) + a4 * Math.Pow(K, 4.0) + a5 * Math.Pow(K, 5.0));
if (d < 0) {return 1.0 - dD;}else{return dD;}
}
public double d1(double S, double K, double R, double T, double V)
{
double a = Math.Log(S / K);
double b_call = (R + 0.5 * Math.Pow(V, 2)) * T;
double c = V * Math.Sqrt(T);
double d1 = (a + b_call) / c;
return d1;
}
public double civ(double S, double K, double R, double T, double Target)
{
double high = 1;
double low = 0;
while ((high - low) > 0.00001)
{
if (PriceC(S, K, R, T, (high + low) / 2) > Target) { high = (high + low) / 2; }
else {low = (high + low) / 2;}
}
double civ = (high + low) / 2;
return civ;
}
public double piv(double S, double K, double R, double T, double Target)
{
double high = 1;
double low = 0;
while ((high - low) > 0.00001)
{
if (PriceP(S, K, R, T, (high + low) / 2) > Target)
{high = (high + low) / 2;} else {low = (high + low) / 2;}
}
double piv = (high + low) / 2;
return piv;
}
}
上面是一個class,直接加入類別就可以使用了,呼叫 Price(...) 後,可以拿屬性 CallPrice 和 PutPrice來用,或是分別呼叫PriceC(...) 或 PriceP(...) ,計算civ和piv一樣,可以直接得到回傳值iv。跟VBA不同的是,C#要多寫一個常態分配的函數ND。
有了這些,就可以計算出隱含波動率,運用上就看各人解讀了,之後再繼續紀錄。
(註: 範例程式是 L 參考網路上程式後自己撰寫的,讀者可自由複製使用,但程式碼轉載請註明出處 。)
2013年10月23日 星期三
歷史波動率
接續前篇 選擇權評價-BS MODEL (with Excel) ,波動率主要有歷史波動率和隱含波動率兩種,此篇要先要紀錄的是歷史波動率。以 L 自己的交易心得來比喻波動率的話,瞭解波動率之前,看期權交易是方向和時間這二維的平面,瞭解波動率之後,看市場和策略像是立體的三維,方向、時間和波動。
在使用上,這個值不只對選擇權交易很重要,波動率本身就是選擇權評價重要的一個因素,不瞭解它的話,幾乎可以說別玩了。對於期貨交易也非常有參考價值,在期貨程式交易方面,也可以是不錯的濾網,甚至作為主要邏輯也可以。
歷史波動率的計算方法是: 一段期間內的收盤價計算的年化報酬率標準差,這句話不像中文,但其實不會很複雜,拿EXCEL作簡單的五日波動率範例,如下圖。
步驟是
- 列出日期和收盤價
- 把收盤價取Log,紀錄在C欄,例如C7的公式是=LN(B7)
- 計算報酬率,就是Log相減,例如D7的公式是=C7-C6
- 計算五日標準差,例如E7的公式是=STDEV(D3:D7)
- 將標準差年化,例如F7的公式是=E7*SQRT(252)
這樣就計算好了,剛好可以看到這五日台指的歷史波動率算出來只有5.09%,真是低的可怕。
再來補充在Multicharts把歷史波動率寫成指標的語法,如下圖。
計算就和上列的步驟一樣,這個指標可以算兩個期間的歷史波動率,參數是20和60,畫出來的圖如下。
有了圖就可以觀察行情和波動率的走勢,一般來說,多頭時波動率低,空頭時波動率高。或是換個角度說,波動率高行情大,波動低行情小。以這樣的特性來說,就可以作為濾網和交易邏輯了。
深入一點的再紀錄,以上兩個範例計算最近的台指,五日是5.09%,二十日11.97%,表示台指波動是壓縮中(而且壓的很小),那這個波動率的數值意義是什麼?
以波動率10%來舉例,這是年化的(計算中有乘一個根號252),假設台指現在8400點,10%是840點,表示一年之後台指在7560~9240點(8400加減840點)的機率大約是68%,這個時間和空間可能比較沒概念。來算一個月的試試,10%是年化的,月的就再除根號12,等於2.89%,等於8400*2.89%=242點,表示一個月之後的台指在8158~8642點的機率是68%。那麼,假設你覺得台指的波動應該會大於這個幅度時,就應該作多波動率。
以上所述,要再嚴謹一點的說,68%就是正負一個標準差的常態分配下的機率,實際上指數分配並不是常態分配,這是另一個要深入的主題。要簡單明瞭的說,波動率越大就是波動大,比較會有行情,K線也可能比較大根,這樣就好了。
最後再整理一下,之後要繼續紀錄的是波動率在下列幾項的應用
- 作為程式的濾網
- 作為主要交易邏輯的測試 ( 歷史波動率策略設計 )
- 選擇權與隱含波動率 (隱含波動率 (with EXCEL VBA、C#) )
2013年10月5日 星期六
網站介紹_ 程式交易≠HOLY GRAIL _ james選擇權
此篇分享兩個優質網站,對於期貨和選擇權分別都有大量的內容可以參考。
程式交易≠HOLY GRAIL
主題為期貨程式交易,內容包含程式交易測試、策略邏輯介紹、部位規劃、交易經驗等等,內容非常多元且有深度,往往可以從中得到不一樣的思考心得,可應用在自己的交易中。文章數量和更新速度都是國內少見的優質期貨網站。
james 的部落格
主題為選擇權策略的網站,包含各種選擇權策略的模型及建立方式、各個選擇權greeks的應用,除了理論上的介紹外,還有實務上的應用,是很好的選擇權交易參考網站。
2013年8月29日 星期四
選擇權評價-BS MODEL (with Excel)
選擇權的評價是策略的最基礎,瞭解各項因素對選擇權價格的變動後,我們才能進一步討論各項因素的實際運用。我們一開始需要先來應用Black–Scholes option pricing model,經過實際的計算瞭解後,再來看Greeks和波動率,再來才是各種價差和組合策略。
關於選擇權的評價和解說,網路上的資料已經非常豐富,各項變動因素說明的文章也很容易找到,所以為了有些不同的貢獻紀錄,L將偏重在計算函數和程式介紹上面,實作上以EXCEL VBA和C#為主。
另一方面,大部份人看到評價公式後大概就已經懶惰了,但光是看看公式和解釋,其實不如實際寫一次、算一次來的有體會,而且實際上真的很容易,如果對於選擇權有興趣卻沒計算過的朋友們,請跟著一起作看看吧。
首先就看看公式的定義,可以到這兩個網址先大略看看假設和定義,有興趣再詳讀內容
Black–Scholes
Black-Scholes期權定價模型
推導和證明就算了吧,如果有要念財金所的話倒是會出考題,我們只要會用就好了,所以只要看Call和Put的價格是這樣的:
其中d1和d2是這樣的:
參數是這樣的:
所以我們知道計算價格需要五個變數,
s 現貨價格,我們拿來算台指選的話,就拿台指期市價當作s
k 履約價格
t 距離到期日的時間,要年化
r 年利率
v 年化波動率
放到excel上寫寫看了,如下圖,
s,就是期貨價,假設7750。
k,就是履約價,假設我們要算的是7700的call和put。
t,年化的到期餘日,這個地方要注意的是有人一年用日曆日365,也有人一年是用工作日255左右,L自己是慣用工作日的算法。到期餘日就是今日和到期日的差距,可以利用excel的函數 NETWORKDAYS()來計算,以圖中例子就是=NETWORKDAYS(C27,C28)。今日也可以用函數來包,例如=DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW()))。算出到期餘日為16後,拿來除255,就得到年化的t = 0.062745。
r,年利率,拿定存利率一年約一點多%,以1%為例。
v,主觀的波動率,波動率是重要的主題,下篇再以歷史波動率和隱含波動率一起進行介紹紀錄,這邊以15%為例子。
有了這些參數,就可以算價格了,Call算出來理論價是145.23,Put是90.4。用函數 =calloption(F25,F26,F27,F28,F29),這個calloption就是我們要寫的function囉,打開vba或直接在excel按ALT+F11,貼上這段程式碼
Function calloption(s, k, t, r, v)
calloption = s * Application.NormSDist(cal_d1(s, k, t, r, v)) - k * Exp(-(r * t)) * Application.NormSDist(cal_d2(s, k, t, r, v))
End Function
Function putoption(s, k, t, r, v)
putoption = k * Exp(-r * t) * Application.NormSDist(-cal_d2(s, k, t, r, v)) - s * Application.NormSDist(-cal_d1(s, k, t, r, v))
End Function
Function cal_d1(s, k, t, r, v)
cal_d1 = (Log(s / k) + (r * t) + (v ^ 2 * t / 2)) / (v * Sqr(t))
End Function
Function cal_d2(s, k, t, r, v)
cal_d2 = cal_d1(s, k, t, r, v) - v * Sqr(t)
End Function
稍微再解釋一下,公式的N(),就是常態分配的機率,可以用NormSDist()來計算,sqr()就是根號,d1和d2也都各自寫了function,也都是照著公式直接拿進來寫,一個一個填就完成了。
如果跟著作的話,現在就可以試看看這幾個參數的變動對於選擇權價格的影響囉。
接著說明一點,這是不包含股利的評價模式,對於股票選擇權不適用,算指數選擇權剛好。
我們現在是帶入五個變數計算出理論的選擇權價格,實際上市場本來就有市價,那麼五個變數裡只要知道四個,就可以求出剩下來那一個。所以我們有選擇權市價、期貨市價、要求的履約價、到期日、利率之後,就可以算出波動率了,是的,它就是隱含波動率,下篇再繼續寫程式實作它。 ( 隱含波動率 (with EXCEL VBA、C#) )
2013年7月9日 星期二
台指選擇權結算買賣方損益
此篇想要紀錄台指選擇權買方賣方在過去的表現。交易模式很簡單,每次近月合約一開倉後就進場,然後就都不動一直放給它結算,這樣的交易方法,各位可以先想看看,在台指選擇權這麼多年是作買方有利還是作賣方有利?
仔細說一下回溯測試的規則,以下圖為例,例如2005/2/17日是結算日,下一個交易日2005/2/18的收盤時進場,履約價選擇價平6100,作買方就是6100的call和6100的put各買一口,分別是101點和86點,結果這個月到結算,買方輸了98點。
L作的測試期間是2005/1 ~ 2013/5,在這101個月的期間裡,不算交易費用,光是以策略的損益作累積,結果買方累積損益是 237點!! 也就是說,不是買方有利,也不是賣方有利,在期間夠長的情況下,買賣方是勢均力敵的。
以下是買方月損益和累積損益圖。
以下是買賣方月損益的基本統計資料,買方最大獲利881點、最大損失503點,在101個月中贏了44次,平均贏一次賺246點,平均輸一次189點。可以看出意料之中的買方獲利月份少,但賺賠比高。賣方獲利月份多,但賺賠比低。
以下是各月份買方損益。
2013年7月2日 星期二
選擇權策略
選擇權交易是 期權交易方法 裡非常非常重要的一塊,L想要開始紀錄選擇權的研究都想了很久如何起頭,因為它變化無窮,可以設計出太多種策略,只要深入瞭解選擇權各種特性,搭配買賣方價差或不同月份或期貨,就能找到特別的策略。
還有許多故事是源由選擇權策略,那些大起大落的玩家專家們,在這個市場經歷了多少勝利與苦頭,都在這裡,這麼多迷人的奧妙之處,你怎麼能不愛選擇權呢?
此篇先紀錄未來想要整理的主題,畢竟可以談的主題太多,需要先整理個架構,再來抽空各個逐一紀錄。
選擇權基礎部份
- 評價,Black–Scholes option pricing model (選擇權評價-BS MODEL (with Excel) )
- Delta ( 選擇權GREEKS實作(C#) )
- Gamma
- Vega
- Theta
- 隱含波動率,implied volatility ( 隱含波動率 (with EXCEL VBA、C#) )
價差策略部份
- 垂直價差、比例價差
- 跨式、勒式部位
- 蝴蝶價差、禿鷹價差
- 時間價差,近遠月
- 與期貨組合部位
策略設計與測試部份
- 台指選測試
- 周選擇權策略
- 選擇權應用期貨訊號
- 歷史買方賣方勝率與盈虧比紀錄 (台指選擇權結算買賣方損益 )
- 選擇權與期貨投資組合的應用
- 其它相關 ( 籌碼分析-法人期貨未平倉 )
大致上以這些主題為方向,也要提醒自己要思考要紀錄的是有價值的東西。關於選擇權的書很多,但更多的是只有介紹買賣方和基本價差策略,再描繪選擇權很容易操作,那些太害人了。進場操作選擇權是很簡單,但要變成拿手的、有把握的獲利武器是一點都不簡單。
訂閱:
文章 (Atom)