[Add]新增波动率图表

This commit is contained in:
vn.py 2017-12-01 10:27:15 +08:00
parent 796adc7673
commit af31162849
3 changed files with 152 additions and 2 deletions

View File

@ -14,6 +14,16 @@
"underlyingSymbol": "510050",
"chainSymbol": "510050-1801",
"r": 0.03
},
{
"underlyingSymbol": "510050",
"chainSymbol": "510050-1803",
"r": 0.03
},
{
"underlyingSymbol": "510050",
"chainSymbol": "510050-1806",
"r": 0.03
}
]
}

View File

@ -0,0 +1,126 @@
# encoding: UTF-8
import pyqtgraph as pg
from vnpy.event import Event
from vnpy.trader.vtEvent import EVENT_TIMER
from .uiOmBase import *
########################################################################
class VolatilityChart(pg.GraphicsWindow):
"""持仓组合波动率图表"""
signal = QtCore.pyqtSignal(type(Event()))
#----------------------------------------------------------------------
def __init__(self, omEngine, parent=None):
"""Constructor"""
super(VolatilityChart, self).__init__(parent)
self.omEngine = omEngine
self.portfolio = omEngine.portfolio
self.eventEngine = omEngine.eventEngine
self.updateCount = 0
self.updateTrigger = 2
self.bidCurveDict = {}
self.askCurveDict = {}
self.pricingCurveDict = {}
self.initUi()
self.registerEvent()
#----------------------------------------------------------------------
def initUi(self):
"""初始化界面"""
portfolio = self.portfolio
self.setWindowTitle(u'波动率图表')
pg.setConfigOptions(antialias=True) #启用抗锯齿
# 创建绘图区以及线
for chain in portfolio.chainDict.values():
symbol = chain.symbol + CALL_SUFFIX
chart = self.addPlot(title=symbol)
chart.showGrid(x=True, y=True)
chart.setLabel('left', u'波动率') #设置左边标签
chart.setLabel('bottom', u'行权价') #设置底部标签
self.bidCurveDict[symbol] = chart.plot(pen='r', symbol='t', symbolSize=8, symbolBrush='r')
self.askCurveDict[symbol] = chart.plot(pen='g', symbolSize=8, symbolBrush='g')
self.pricingCurveDict[symbol] = chart.plot(pen='w', symbol = 's', symbolSize=8, symbolBrush='w')
self.nextRow()
for chain in portfolio.chainDict.values():
symbol = chain.symbol + PUT_SUFFIX
chart = self.addPlot(title=symbol)
chart.showGrid(x=True, y=True)
chart.setLabel('left', u'波动率')
chart.setLabel('bottom', u'行权价')
self.bidCurveDict[symbol] = chart.plot(pen='r', symbol='t', symbolSize=8, symbolBrush='r')
self.askCurveDict[symbol] = chart.plot(pen='g', symbolSize=8, symbolBrush='g')
self.pricingCurveDict[symbol] = chart.plot(pen='w', symbol = 's', symbolSize=8, symbolBrush='w')
#----------------------------------------------------------------------
def registerEvent(self):
"""注册事件监听"""
self.signal.connect(self.processTimerEvent)
self.eventEngine.register(EVENT_TIMER, self.signal.emit)
#----------------------------------------------------------------------
def processTimerEvent(self, event):
"""处理定时事件"""
self.updateCount += 1
if self.updateCount >= self.updateTrigger:
self.updateCount = 0
self.updateChart()
#----------------------------------------------------------------------
def updateChart(self):
"""更新图表"""
for chain in self.portfolio.chainDict.values():
strikeData = [option.k for option in chain.callDict.values()]
# 看涨
symbol = chain.symbol + CALL_SUFFIX
bidImpvData = []
askImpvData = []
pricingImpvData = []
for option in chain.callDict.values():
bidImpvData.append(option.bidImpv*100)
askImpvData.append(option.askImpv*100)
pricingImpvData.append(option.pricingImpv*100)
self.bidCurveDict[symbol].setData(y=bidImpvData, x=strikeData)
self.askCurveDict[symbol].setData(y=askImpvData, x=strikeData)
self.pricingCurveDict[symbol].setData(y=pricingImpvData, x=strikeData)
# 看跌
symbol = chain.symbol + PUT_SUFFIX
bidImpvData = []
askImpvData = []
pricingImpvData = []
for option in chain.putDict.values():
bidImpvData.append(option.bidImpv*100)
askImpvData.append(option.askImpv*100)
pricingImpvData.append(option.pricingImpv*100)
self.bidCurveDict[symbol].setData(y=bidImpvData, x=strikeData)
self.askCurveDict[symbol].setData(y=askImpvData, x=strikeData)
self.pricingCurveDict[symbol].setData(y=pricingImpvData, x=strikeData)
#----------------------------------------------------------------------
def closeEvent(self, event):
"""关闭"""
self.eventEngine.unregister(EVENT_TIMER, self.signal.emit)

View File

@ -11,6 +11,7 @@ from .omBase import EVENT_OM_LOG
from .uiOmBase import QtWidgets, QtCore
from .uiOmManualTrader import ManualTrader
from .uiOmGreeksMonitor import GreeksMonitor
from .uiOmVolatilityManager import VolatilityChart
########################################################################
@ -59,6 +60,9 @@ class OmManager(QtWidgets.QWidget):
self.buttonGreeksMonitor = QtWidgets.QPushButton(u'希腊值监控')
self.buttonGreeksMonitor.clicked.connect(self.openGreeksMonitor)
self.buttonVolatilityChart = QtWidgets.QPushButton(u'波动率图表')
self.buttonVolatilityChart.clicked.connect(self.openVolatilityChart)
self.logMonitor = QtWidgets.QTextEdit()
self.logMonitor.setReadOnly(True)
@ -67,6 +71,7 @@ class OmManager(QtWidgets.QWidget):
hbox.addWidget(self.buttonInit)
hbox.addWidget(self.buttonManualTrader)
hbox.addWidget(self.buttonGreeksMonitor)
hbox.addWidget(self.buttonVolatilityChart)
hbox.addStretch()
hbox2 = QtWidgets.QHBoxLayout()
@ -123,7 +128,16 @@ class OmManager(QtWidgets.QWidget):
self.widgetDict['greeksMonitor'].showMaximized()
except KeyError:
self.widgetDict['greeksMonitor'] = GreeksMonitor(self.omEngine)
self.widgetDict['greeksMonitor'].showMaximized()
self.widgetDict['greeksMonitor'].showMaximized()
#----------------------------------------------------------------------
def openVolatilityChart(self):
"""打开波动率图表组件"""
try:
self.widgetDict['volatilityChart'].showMaximized()
except KeyError:
self.widgetDict['volatilityChart'] = VolatilityChart(self.omEngine)
self.widgetDict['volatilityChart'].showMaximized()
#----------------------------------------------------------------------
def close(self):
@ -131,7 +145,7 @@ class OmManager(QtWidgets.QWidget):
for widget in self.widgetDict.values():
widget.close()
super(OmManagerWidget, self).close()
super(OmManager, self).close()
#----------------------------------------------------------------------
def registerEvent(self):