2012年7月30日 星期一

台指壓力支撐計算教學

期貨操作時,大家都希望能在拉回支撐時買進、反彈高點壓力點賣出,而壓力與支撐的點位通常會如何判斷呢?最簡單的方法就是均價及三關價,本篇就先就三關價來做個介紹,最原始的三關價的計算方式是用開、高、收、低來計算隔日的上關、中關、下關三個價位,公式如下:
上關價:本日最低點 +(本日最高點 - 本日最低點)X 1.382
中關價:(本日最高點 + 本日最低點)X 0.5
下關價:本日最高點 -(本日最高點 本日最低點)X  1.382

    有些人會在上關價跟中關價加一個本日最高點當作另外一個關卡價,同理也會在下關價跟中關價之間加一個本日最低點,舉例2012627的開高收低是6918700568986986
上關價 = 6898 + (7005-6898) X 1.382 = 7045.87
上關價2(即昨日最高價) = 7005
中關價 = (7005+6898) X 0.5 = 6951.5
下關價2(即昨日最低價) = 6898
下關價 = 7005 – (7005-6898) X 1.382 = 6857.12

    而漸漸也有很多人改良關卡價的計算方式,有些人認為開盤價與收盤價的代表意義較高,計算時應該給予較高的權重,所以在中關價的地方公式改成:開盤價*2+最高價+最低價+收盤價*2,上關價2則改為:中關價+(中關價-最低價),上關價為則改為:中關價+(最高價-最低價),下關價2改為:中關價-(最高價-中關價),下關價改為:中關價-(最高價-最低價),以上例計算如下
上關價 = 6951.8 + ( 7005-6898) = 7058.8
上關價2= 6951.8 + (6951.8-6898) = 7004.8
中關價 = (6918*2+7005+6898+6986*2)÷6 = 6951.8
下關價2= 6951.8 – (6951-6898) = 6898.8
下關價 = 6951.8 – (7005-6898) = 6844.8

獲得最後一個非空儲存格

    獲得指定列(或欄)中最後一個非空儲存格,以下程式碼會尋找A欄的最後一個有內容的儲存格列號
Sub 找最後一個非空儲存格()
    Dim last As Range
    Set last = ActiveSheet.Range("A65536").End(xlUp)
    MsgBox last.Row
    Set last = Nothing
End Sub

複製儲存格範圍的值

    只複製儲存格範圍的值,以下的程式碼即可達成
Sub 複製儲存格範圍的值()
   Sheet2.Range("B2:C5").Value = Sheet1.Range("B2:C5").Value
End Sub

複製儲存格範圍

    在使用EXCEL時,我們經常需要複製指定的儲存格範圍到另一個儲存格範圍,要複製指定的儲存格範圍到其他的位置,可以使用Range物件的copy方法。
下列程式碼複製Sheet1Sheet2A1開始的位置
Sub 複製儲存格範圍()
   Sheet1.Range("A1").CurrentRegion.Copy Sheet2.Range("A1")
End Sub

    如果Sheet2目標儲存格原本是有內容的話,會跳出一個確認視窗,確認是否要取代目標儲存格的內容,若想略過這個內容可以使用以下語法
Sub 複製儲存格範圍2()
   Application.DisplayAlerts = False
   Sheet1.Range("A1").CurrentRegion.Copy Sheet2.Range("A1")
   Application.DisplayAlerts = True
End Sub
Application.DisplayAlerts = False是設定不出現對話方塊

    如果想要連同欄寬同時複製,則參考以下程式碼
Sub 複製儲存格範圍3()
   Application.DisplayAlerts = False
   Sheet1.Range("A1").CurrentRegion.Copy
   With Sheet2.Range("A1")
      .PasteSpecial xlPasteColumnWidths
      .PasteSpecial xlPasteAll
   End With
   Application.CutCopyMode = False
   Application.DisplayAlerts = True
End Sub

透過錄製巨集了解VBA程式碼

    很多人一聽到程式就會想到要學一堆程式碼,對於沒有程式設計基礎的人來說,學習一堆程式語法是非常痛苦的一件事,但其實說穿了,語法只是一種語言讓我們藉此命令電腦幫我們執行我們要做的動作。
    大家多多少少在平常的工作中都會使用到EXCEL吧!而經常使用EXCEL的人都會發現,我們經常在做很多重複的動作,VBA就可以讓我們把平常重複做的動作簡化,在我們開始學VBA前,我們先來講【巨集】,巨集是可以把我們平常做的重複性動作錄製起來,這樣以後只要呼叫錄製好的巨集,電腦就會幫我們執行一連串的動作,有點類似像按鍵精靈的感覺!
    舉個實際的例子,假設我們有一個表單如下

    我們希望排列的順序是依造總分由高至低,一般就是把要排序的資料選起來,然後按上方資料->排序,然後選總分(遞減)。這次在做這個動作前,我們先執行錄製巨集的動作,打開工具->巨集->錄製新巨集,然後執行資料排序的動作,錄製完後就會在VB編輯器內看到一個程序如下
Sub 總分排序()
'
' 總分排序 Macro
' tommy7568 2012/7/26 錄製的巨集
'
' 快速鍵: Ctrl+a
'
    Range("A2:E5").Select
    Selection.Sort Key1:=Range("E2"), Order1:=xlDescending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlStroke, DataOption1:=xlSortNormal
End Sub
這就是我們做資料排序實際的程式碼!

限制工作表捲動範圍

    限制工作表捲動範圍,參造以下程式碼
Sub 限制工作表捲動範圍()
   Worksheets(1).ScrollArea = "B4:H12"
End Sub
以上程式可使第一張工作表的可捲動範圍設定B4H12ScrollArea=””則可取消限制捲動範圍

    如果要限制可捲動範圍為使用中視窗的可視範圍,則用以下程式碼達成
Sub 捲動範圍為可視範圍()
   With Sheet1
        .Activate
        .ScrollArea = ActiveWindow.VisibleRange.Address
   End With
End Sub
ScrollArea屬性設定為使用中視窗的可視範圍位址

活頁簿中新增新的工作表

    要在活頁簿中新增新的工作表,可以用以下語法做到
Sub 新增工作表()
   Sheets.Add after:=Sheets(Sheets.Count)
   ActiveSheet.Name = "新的工作表"
End Sub
第一行程式碼使用Add方法新增一個工作表,並將其新增至所有工作表的後面。Sheets.Count傳回活頁簿中工作表總數

取得某值最初或最後出現的位置

    在一個資料範圍中,欲取得某一個值最後出現的位置,可以使用以下的程式碼
Sub 取得範圍中最早或最後出現的數值位置()
    With Range("A1:A6")
         Set c = .Find(what:="劉德華", LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlPrevious)
         If Not c Is Nothing Then MsgBox c.Row
    End With
End Sub
執行該程式可以尋找A1:A6中最後出現劉德華的列號

    如果要尋找最初出現的位置,則改為
Sub 取得範圍中最早或最後出現的數值位置()
    With Range("A1:A6")
         Set c = .Find(what:="劉德華", after:=.Cells(.Cells.Count), LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlNext)
         If Not c Is Nothing Then MsgBox c.Row
    End With
End Sub

改變EXCEL的標題列

    打開EXCEL時,最左上角預設會出現Microsoft Excel – Book1,如果想要更改標題列時,我們可以用下列的程式碼達成
Sub 設定EXCEL標題列()
    Application.Caption = "設定標題列範例"
    ActiveWindow.Caption = "表單"
End Sub
    執行後EXCEL的標題就會變成

合併連續性相同儲存格

    要合併連續性相同儲存格內容時,可以用以下程式碼
Sub 合併相同內容的連續儲存格()
   Dim row1 As Integer
   Application.DisplayAlerts = False
   With ActiveSheet
       row1 = .Range("A65536").End(xlUp).Row
       For i = row1 To 2 Step -1
         If .Cells(i, 1).Value = Cells(i - 1, 1).Value Then
            .Range(.Cells(i - 1, 1), .Cells(i, 1)).Merge
         End If
       Next i
    End With
    Application.DisplayAlerts = True
End Sub
執行此程式,A欄的連續性相同儲存格將會被合併

任意選擇工作表中的範圍

    以下的程式碼可以指定book1.xls的第一個工作表,並選擇該工作表中的儲存格範圍D2:F5
Sub 選擇任一工作表範圍()
   Workbooks("book1.xls").Worksheets(1).Activate
   ActiveSheet.Range("D2:F5").Select
End Sub

    如果該檔案並沒有開啟中,可以用另外一個方式做到
Sub 選擇任一工作表範圍2()
   Application.Goto Workbooks("book1.xls").Worksheets(1).range_("D2:F5"), True
End Sub

VBA選定某特定儲存格並按鍵盤

    要透過VBA選定某特定儲存格,並輸入字串時可以用下列語法
Sub 模擬選定儲存格並按鍵盤()
  Range("A1").Select
  Application.SendKeys "aaaa"
End Sub
第一行是選定A1這個儲存格,第二行則是送出aaaa

EXCEL視窗最大化或最小化

    想要將目前的EXCEL視窗最大化或最小化,可以使用以下的語法
Sub 視窗最大化()
    Application.WindowState = xlMaximized
    ActiveWindow.WindowState = xlMaximized
End Sub

xlMaximized代表最大化,如果是想要最小化則用xlMinimized

學習VBA前言

    VBA全名為Visual Basic for Application,是一種程式設計語言,整合在宿主應用程式(EXCELWORD)的具體應用軟體中,接下來的介紹主要是以VBA for EXCEL為主,究竟VBA可以在EXCEL中達到怎樣的幫助呢?
(1)   自動完成重複性的工作任務
(2)   組合功能表命令的功能,或者組合內建對話方塊的功能
(3)   建立自訂工具列
(4)   建立自訂函數
(5)   建立自訂表單
(6)   完成資料計算和分析
(7)   建立自訂增益集,以供他人使用及重複利用
(8)   改善EXCEL界面,滿足特定要求及目的

接下來的介紹主要以學會VBA的目的,並且達到能使用VBA建立程式交易
的績效回測或自動下單

利用買權賣權平價理論尋找套利空間

觀察選擇權報價時可以發現,相同履約價的買權跟賣權都會有差不多的時間價值,這種固定關係,稱為買權賣權平價理論。代表者買權、賣權與期貨之間的關係,若三者關係發生偏差,則會產生套利的空間。
利用選擇權平價理論的公式可得:標的物的價格=履約價+買權價格-賣權價格,假設目前7000Call權利金為1467000Put權利金為66,則我們可以得出台指期的理論價格應該是7000+146-66 = 7080,如果台指期的價格大幅偏離7080則會產生套利的空間。簡而言之,買進相同履約價的Call並賣出相同履約價的Put就等於是作多一口小台指,以上述例子來看,假設我們從選擇權平價理論算出台指理論價在7080,但此時台指及小台指卻在7090,則我們可以買進7000Call 146,賣出7000P 66,並且同時賣出小台指7090,則會立刻獲得十點的套利空間。
了解選擇權平價理論後,很多人可能會在盤中觀察是否有套利空間出現,但實務上其實出現套利空間的機會不多,通常出現在行情急漲或急跌的情況下,而且一有可套利空間出現時,就會有人進場套利將套利空間吃掉,所以若對此方式的套利有興趣,最好可以寫個程式來監控選擇權的價位,最好能做到出現套利空間時就自動下單,如果對程式設計不熟也可以用EXCEL來做到,相關的文章有空在發表。

何謂波動率?

交易金融商品一般認為要掌握趨勢方向,但其實波動率的掌控也是非常重要的依環,波動率是什麼?簡單來說,就是漲跌的幅度。選擇權的交易中,波動率尤其重要,除了預期行情的方向外,研判波動幅度大小,才能決定該筆交易是要做買方〈買進買權、買進賣權、買權多頭價差或賣權空頭價差等〉還是賣方〈賣出買權、賣出賣權、賣權多頭價差或買權空頭價差等〉。
而行情的漲幅或跌幅則是要由市場的買賣供需來決定,買的人多賣的人少,自然行情的漲幅就大,而波動率的計算又可分為歷史波動率、隱含波動率及未來波動率三種,接下來就分別介紹這三種波動率的計算方式:
1.      歷史波動率
歷史波動率是過去某一段時間內,以收盤價計算的年化報酬率標準差,計算歷史波動率可使用下列方法:
近期加權指數收盤價
7/20 7165
7/23 7029
7/24 7008
7/25 6979
7/26 6971
7/27 7124
先計算7/23的對數報酬率:㏑(7029÷6909) = -0.019 = -1.9%
再計算7/27對數報酬率:㏑(7124÷6971) = 0.022 = 2.2%
再取其標準差,使用EXCEL輸入=STDEVA(-1.9%,2,2%)*252^0.5,可得出18.32%,就是最近五日的台股波動率
2.      隱含波動率
隱含波動率是以選擇權目前的權利金價格代入B-S評價模型,反推市場對未來行情的看法,隱含波動率越高代表大家對行情噴出的看法越樂觀;反之,隱含波動率下降,則行情進入整理的機會較高。台灣期交所有一個網頁http://www.taifex.com.tw/chinese/9/9_4.asp可以計算隱含波動率及理論價格,大家可以多加利用。
3.      未來波動率
即是指預期的波動率,一般而言,我們會以歷史波動率的簡單平均來預測未來的波動率。