期权卖方最佳结算价VBA代码

论坛 期权论坛 期权     
吴宇   2016-1-4 02:56   24511   1

这篇要纪录选择权卖方最佳结算价的小工具设计,这个价格的意义是在参考整个选择权市场上未平仓合约对于最可能结算位置的预测,简单的说,就是结在哪裡会赚最多。

以L自己的习惯来说,参考最大未平仓合约的位置及最佳结算价位置是每日必看的一项指标,有参考性,但同时也要提醒,期交所资料都是收盘后才公布,当日有大行情变化时是跟不上的,另外,这也仅仅是从选择权市场来看。所以,心态上将它当作较长期的变化,这样的角度或许比较适当。

稍微介绍后就来实作吧,写EXCEL VBA,期交所每日公布选择权每日交易行情查询,由Excel汇入外部资料的连结是http://www.taifex.com.tw/chinese/3/3_2_tbl.asp,然后我们需要的资料有合约别、履约价、买卖权、结算价、未平仓合约量,将这些贴到sheet2再来算,前置作业是把周和近远月的合约分开,这点也顺带提醒,由不同月份合约的最佳结算价可以看出市场对于近远月指数的预期,这点也蛮值得参考的。

主要公式就是模拟各结算价下,现在未平仓合约的总损益如何,所以各个履约价都算一次完后加总起来,计算原则很简单,

若是call & 模拟结算价<履约价,获利为市价*未平仓口数

若是call & 模拟结算价>履约价,损益为( (模拟结算价-履约价) 市价)*未平仓口数

若是put & 模拟结算价>履约价,获利为市价*未平仓口数

若是put & 模拟结算价<履约价,损益为( (履约价-模拟结算价) 市价)*未平仓口数

最后把各履约价的损益加总起来计在模拟价旁边,看在哪个模拟价位是获利最大就得到了。这个东西也能再进阶去探索,就是把未平仓的GREEKS全算出来,搭配期货去看,那有机会再写。

其他的部份都是处理资料和迴圈而已,有需要参考的读友可以看看下面程式码区,如果想进一步瞭解的话,或许也可以再详细作一篇纪录。

当然有错的话,L不负责任,有心得或指教的话,欢迎留言讨论。

Sub cal()

Sheet2.Range("A2:Z700").Clear

i = 6

While Sheet1.Cells(i, 1) <> ""

If Sheet2.Cells(2, 2) = "" Then

Sheet2.Cells(2, 2) = Sheet1.Cells(i, 2)

ElseIf Sheet2.Cells(3, 2) = "" And Sheet1.Cells(i, 2) <> Sheet2.Cells(2, 2) Then

Sheet2.Cells(3, 2) = Sheet1.Cells(i, 2)

ElseIf Sheet2.Cells(4, 2) = "" And Sheet2.Cells(3, 2) <> "" And Sheet1.Cells(i, 2) <> Sheet2.Cells(3, 2) Then

Sheet2.Cells(4, 2) = Sheet1.Cells(i, 2)

ElseIf Sheet2.Cells(5, 2) = "" And Sheet2.Cells(4, 2) <> "" And Sheet2.Cells(3, 2) <> "" And Sheet1.Cells(i, 2) <> Sheet2.Cells(4, 2) Then

Sheet2.Cells(5, 2) = Sheet1.Cells(i, 2)

End If

Sheet2.Cells(i 2, 2) = Sheet1.Cells(i, 2)

Sheet2.Cells(i 2, 3) = Sheet1.Cells(i, 3)

Sheet2.Cells(i 2, 4) = Sheet1.Cells(i, 4)

Sheet2.Cells(i 2, 5) = Sheet1.Cells(i, 13)

Sheet2.Cells(i 2, 6) = Sheet1.Cells(i, 9)

i = i 1

Wend

i = 8

While Sheet2.Cells(i, 2) <> ""

If Sheet2.Cells(i, 2) = Sheet2.Cells(2, 2) Then

If Sheet2.Cells(i, 4) = "Call" And Sheet2.Cells(i, 5) > Sheet2.Cells(2, 4) Then

Sheet2.Cells(2, 4) = Sheet2.Cells(i, 5)

Sheet2.Cells(2, 3) = Sheet2.Cells(i, 3)

End If

If Sheet2.Cells(i, 4) = "Put" And Sheet2.Cells(i, 5) > Sheet2.Cells(2, 6) Then

Sheet2.Cells(2, 6) = Sheet2.Cells(i, 5)

Sheet2.Cells(2, 5) = Sheet2.Cells(i, 3)

End If

End If

If Sheet2.Cells(i, 2) = Sheet2.Cells(3, 2) Then

If Sheet2.Cells(i, 4) = "Call" And Sheet2.Cells(i, 5) > Sheet2.Cells(3, 4) Then

Sheet2.Cells(3, 4) = Sheet2.Cells(i, 5)

Sheet2.Cells(3, 3) = Sheet2.Cells(i, 3)

End If

If Sheet2.Cells(i, 4) = "Put" And Sheet2.Cells(i, 5) > Sheet2.Cells(3, 6) Then

Sheet2.Cells(3, 6) = Sheet2.Cells(i, 5)

Sheet2.Cells(3, 5) = Sheet2.Cells(i, 3)

End If

End If

If Sheet2.Cells(i, 2) = Sheet2.Cells(4, 2) Then

If Sheet2.Cells(i, 4) = "Call" And Sheet2.Cells(i, 5) > Sheet2.Cells(4, 4) Then

Sheet2.Cells(4, 4) = Sheet2.Cells(i, 5)

Sheet2.Cells(4, 3) = Sheet2.Cells(i, 3)

End If

If Sheet2.Cells(i, 4) = "Put" And Sheet2.Cells(i, 5) > Sheet2.Cells(4, 6) Then

Sheet2.Cells(4, 6) = Sheet2.Cells(i, 5)

Sheet2.Cells(4, 5) = Sheet2.Cells(i, 3)

End If

End If

If Sheet2.Cells(i, 2) = Sheet2.Cells(5, 2) Then

If Sheet2.Cells(i, 4) = "Call" And Sheet2.Cells(i, 5) > Sheet2.Cells(5, 4) Then

Sheet2.Cells(5, 4) = Sheet2.Cells(i, 5)

Sheet2.Cells(5, 3) = Sheet2.Cells(i, 3)

End If

If Sheet2.Cells(i, 4) = "Put" And Sheet2.Cells(i, 5) > Sheet2.Cells(5, 6) Then

Sheet2.Cells(5, 6) = Sheet2.Cells(i, 5)

Sheet2.Cells(5, 5) = Sheet2.Cells(i, 3)

End If

End If

i = i 1

Wend

Sheet2.Cells(7, 9) = Sheet2.Cells(2, 2)

Sheet2.Cells(7, 10) = Sheet2.Cells(3, 2)

Sheet2.Cells(7, 11) = Sheet2.Cells(4, 2)

Sheet2.Cells(7, 12) = Sheet2.Cells(5, 2)

i = Sheet2.Cells(1, 10)

j = 8

While i < Sheet2.Cells(1, 11)

Sheet2.Cells(j, 8) = i

j = j 1

i = i 5

Wend

j = 8

While Sheet2.Cells(j, 8) <> ""

settle = Sheet2.Cells(j, 8)

i = 8

While Sheet2.Cells(i, 2) <> ""

If Sheet2.Cells(i, 4) = "Call" And Sheet2.Cells(i, 6) <> "-" Then

If settle > Sheet2.Cells(i, 3) Then Sheet2.Cells(i, 7) = (Sheet2.Cells(i, 6) - (settle - Sheet2.Cells(i, 3))) * Sheet2.Cells(i, 5)

If settle <= Sheet2.Cells(i, 3) Then Sheet2.Cells(i, 7) = Sheet2.Cells(i, 6) * Sheet2.Cells(i, 5)

End If

If Sheet2.Cells(i, 4) = "Put" And Sheet2.Cells(i, 6) <> "-" Then

If settle >= Sheet2.Cells(i, 3) Then Sheet2.Cells(i, 7) = Sheet2.Cells(i, 6) * Sheet2.Cells(i, 5)

If settle < Sheet2.Cells(i, 3) Then Sheet2.Cells(i, 7) = (Sheet2.Cells(i, 6) - (Sheet2.Cells(i, 3) - settle)) * Sheet2.Cells(i, 5)

End If

If Sheet2.Cells(i, 2) = Sheet2.Cells(7, 9) Then

Sheet2.Cells(j, 9) = Sheet2.Cells(j, 9) Sheet2.Cells(i, 7)

ElseIf Sheet2.Cells(i, 2) = Sheet2.Cells(7, 10) Then

Sheet2.Cells(j, 10) = Sheet2.Cells(j, 10) Sheet2.Cells(i, 7)

ElseIf Sheet2.Cells(i, 2) = Sheet2.Cells(7, 11) Then

Sheet2.Cells(j, 11) = Sheet2.Cells(j, 11) Sheet2.Cells(i, 7)

ElseIf Sheet2.Cells(i, 2) = Sheet2.Cells(7, 12) Then

Sheet2.Cells(j, 12) = Sheet2.Cells(j, 12) Sheet2.Cells(i, 7)

End If

i = i 1

Wend

j = j 1

Wend

Sheet2.Cells(6, 9) = Application.WorksheetFunction.Max(Sheet2.Range("I8:I360"))

Sheet2.Cells(6, 10) = Application.WorksheetFunction.Max(Sheet2.Range("J8:J360"))

Sheet2.Cells(6, 11) = Application.WorksheetFunction.Max(Sheet2.Range("K8:K360"))

Sheet2.Cells(6, 12) = Application.WorksheetFunction.Max(Sheet2.Range("L8:L360"))

i = 8

While Sheet2.Cells(i, 8) <> ""

If Sheet2.Cells(i, 9) = Sheet2.Cells(6, 9) Then Sheet2.Cells(2, 7) = Sheet2.Cells(i, 8)

If Sheet2.Cells(i, 10) = Sheet2.Cells(6, 10) Then Sheet2.Cells(3, 7) = Sheet2.Cells(i, 8)

If Sheet2.Cells(i, 11) = Sheet2.Cells(6, 11) Then Sheet2.Cells(4, 7) = Sheet2.Cells(i, 8)

If Sheet2.Cells(i, 12) = Sheet2.Cells(6, 12) Then Sheet2.Cells(5, 7) = Sheet2.Cells(i, 8)

i = i 1

Wend

i = 1

While Sheet3.Cells(i, 1) <> ""

i = i 1

Wend

Sheet3.Cells(i, 1) = Sheet1.Cells(2, 1)

Sheet3.Cells(i, 3) = Sheet2.Cells(2, 7)

End Sub

Written by L

分享到 :
0 人收藏
萍水相逢,尽是他乡之客

1 个回复

倒序浏览
2#
睡梦中的雄师  4级常客 | 2016-1-9 23:01:45 发帖IP地址来自 江苏苏州
好吧,我来支持一下~~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:38337
帖子:3370
精华:36
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP