国信证券学习系列(8)

        我为什么要用国信,就是这个原因,可以做期权,期货,股票,etf,可转债的回测。满足了我所有的需要,我要做指数增强。通常的做法是股票和期货。但实际上,股票和期权做组合,成本更低。

(1)认沽期权和认购期权的隐含波动率大于50etf波动率时,
以标的资产当前的价格作为行权价买入相同数量、相同标的资产和相同行权日的认购和认沽期权开仓
(2)认沽期权和认购期权的隐含波动率小于50etf波动率且有市场时,平仓
获取数据:

import datetime
from math import (log, pow, sqrt, exp)from scipy import stats
import numpy as np
import talibcdf = stats.norm.cdf
STEP_CHANGE = 0.001
STEP_UP = 1 + STEP_CHANGE
STEP_DOWN = 1 - STEP_CHANGE
STEP_DIFF = STEP_CHANGE * 2
DX_TARGET = 0.00001
'''
变量说明
s:标的物股票价格
k:行权价
r:无风险利率
t:剩余到期时间(年)
v:隐含波动率
cp:期权类型,+1/-1对应call/put
price:期权价格
'''

初始参数:

def init(ContextInfo):ContextInfo.contract_unit = 10000#随着时间推移该对合约可能不存了,根据需求手动修改更新ContextInfo.optOne="10001713" ContextInfo.optTwo="10001714"#上面合约的到期年月,根据需求手动修改更新ContextInfo.aa= get_week_of_month(2019, 3)ContextInfo.holdings = {ContextInfo.optOne: 0, ContextInfo.optTwo: 0}ContextInfo.accountID = '8861103625'ContextInfo.s_volatility = []

计算隐含波动率:

def calculateImpv(price, s, k, r, t, cp):"""计算隐含波动率"""# 检查期权价格必须为正数if price <= 0:return 0# 检查期权价格是否满足最小价值(即到期行权价值)meet = Falseif cp == 1 and (price > (s - k) * exp(-r * t)):meet = Trueelif cp == -1 and (price > k * exp(-r * t) - s):meet = True# 若不满足最小价值,则直接返回0if not meet:return 0# 采用Newton Raphson方法计算隐含波动率v = 0.29 # 初始波动率猜测for i in range(50):# 计算当前猜测波动率对应的期权价格和vega值p = calculatePrice(s, k, r, t, v, cp)vega = calculateOriginalVega(s, k, r, t, v, cp)# 如果vega过小接近0,则直接返回if not vega:break# 计算误差dx = (price - p) / vega# 检查误差是否满足要求,若满足则跳出循环if abs(dx) < DX_TARGET:break# 计算新一轮猜测的波动率v += dx# 检查波动率计算结果非负if v <= 0:return 0# 保留4位小数v = round(v, 4)return v

计算vega:

def calculateOriginalVega(s, k, r, t, v, cp):"""计算原始vega值"""    price1 = calculatePrice(s, k, r, t, v*STEP_UP, cp)price2 = calculatePrice(s, k, r, t, v*STEP_DOWN, cp)vega = (price1 - price2) / (v * STEP_DIFF)return vega

计算期权价格:

def calculatePrice(s, k, r, t, v, cp):"""计算期权价格"""# 如果波动率为0,则直接返回期权空间价值if v <= 0:return max(0, cp * (s - k))d1 = (log(s / k) + (r + 0.5 * pow(v, 2)) * t) / (v * sqrt(t))d2 = d1 - v * sqrt(t)price = cp * (s * cdf(cp * d1) - k * cdf(cp * d2) * exp(-r * t))return price

获取日期:

def get_week_of_month(year, month):"""获取指定的某天是某个月中的第几周周一作为一周的开始"""begin = datetime.datetime(year, month, 1).weekday()delta = datetime.timedelta(days=21+begin)exercise_date = datetime.datetime(year, month, 1) + deltareturn  exercise_date.strftime('%Y-%m-%d')

策略代码:

#coding:gbk
"""
跨式期权策略
回测模型示例(非实盘交易策略)(1)认沽期权和认购期权的隐含波动率大于50etf波动率时,
以标的资产当前的价格作为行权价买入相同数量、相同标的资产和相同行权日的认购和认沽期权开仓
(2)认沽期权和认购期权的隐含波动率小于50etf波动率且有市场时,平仓
"""
import datetime
from math import (log, pow, sqrt, exp)from scipy import stats
import numpy as np
import talibcdf = stats.norm.cdf
STEP_CHANGE = 0.001
STEP_UP = 1 + STEP_CHANGE
STEP_DOWN = 1 - STEP_CHANGE
STEP_DIFF = STEP_CHANGE * 2
DX_TARGET = 0.00001
'''
变量说明
s:标的物股票价格
k:行权价
r:无风险利率
t:剩余到期时间(年)
v:隐含波动率
cp:期权类型,+1/-1对应call/put
price:期权价格
'''def init(ContextInfo):ContextInfo.contract_unit = 10000#随着时间推移该对合约可能不存了,根据需求手动修改更新ContextInfo.optOne="10001713" ContextInfo.optTwo="10001714"#上面合约的到期年月,根据需求手动修改更新ContextInfo.aa= get_week_of_month(2019, 3)ContextInfo.holdings = {ContextInfo.optOne: 0, ContextInfo.optTwo: 0}ContextInfo.accountID = '8861103625'ContextInfo.s_volatility = []
def handlebar(ContextInfo):#当前K线的对应的下标从0开始index = ContextInfo.barpos#当前K线对应的时间:毫秒realtime = ContextInfo.get_bar_timetag(index)current_time = timetag_to_datetime(realtime,'%Y-%m-%d')#当前周期period = ContextInfo.period#取当前K线图对应的合约当前K线的当前主图复权方式下的收盘价price_call = ContextInfo.get_market_data(['close'],period=period, stock_code = [ContextInfo.optOne+".SHO"]) price_put = ContextInfo.get_market_data(['close'],period=period, stock_code = [ContextInfo.optTwo+".SHO"])s = ContextInfo.get_market_data(["close"],stock_code = ["510050.SH"],period=period)#print price_call,price_putContextInfo.s_volatility.append(s)s_volatility = np.std(np.array(ContextInfo.s_volatility))ContextInfo.paint("s_volatility", s_volatility*10, -1, 0)k = 2.55r = ContextInfo.get_risk_free_rate(index)/100t = ((datetime.datetime.strptime(ContextInfo.aa, "%Y-%m-%d") - datetime.datetime.strptime(current_time, "%Y-%m-%d")).days) / 365.0cp_call = 1cp_put = -1implied_volatility_call = calculateImpv(price_call, s, k, r, t, cp_call)implied_volatility_put = calculateImpv(price_put, s, k, r, t, cp_put)#print "implied_volatility_call", implied_volatility_call#print "implied_volatility_put", implied_volatility_putContextInfo.paint("implied_volatility", (implied_volatility_put + implied_volatility_call), -1, 0)if (implied_volatility_put + implied_volatility_call) > s_volatility*10 :passorder(50,1101,ContextInfo.accountID ,ContextInfo.optOne,5,-1,1,ContextInfo)passorder(50,1101,ContextInfo.accountID ,ContextInfo.optTwo,5,-1,1,ContextInfo)ContextInfo.holdings[ContextInfo.optOne] = 1ContextInfo.holdings[ContextInfo.optTwo] = 1elif ContextInfo.holdings[ContextInfo.optOne] == 1 and ContextInfo.holdings[ContextInfo.optTwo] == 1 and (implied_volatility_put + implied_volatility_call) < s_volatility*10 :passorder(53,1101,ContextInfo.accountID ,ContextInfo.optOne,5,-1,1,ContextInfo)passorder(53,1101,ContextInfo.accountID ,ContextInfo.optTwo,5,-1,1,ContextInfo)ContextInfo.holdings[ContextInfo.optOne] = 0ContextInfo.holdings[ContextInfo.optTwo] = 0def calculateImpv(price, s, k, r, t, cp):"""计算隐含波动率"""# 检查期权价格必须为正数if price <= 0:return 0# 检查期权价格是否满足最小价值(即到期行权价值)meet = Falseif cp == 1 and (price > (s - k) * exp(-r * t)):meet = Trueelif cp == -1 and (price > k * exp(-r * t) - s):meet = True# 若不满足最小价值,则直接返回0if not meet:return 0# 采用Newton Raphson方法计算隐含波动率v = 0.29 # 初始波动率猜测for i in range(50):# 计算当前猜测波动率对应的期权价格和vega值p = calculatePrice(s, k, r, t, v, cp)vega = calculateOriginalVega(s, k, r, t, v, cp)# 如果vega过小接近0,则直接返回if not vega:break# 计算误差dx = (price - p) / vega# 检查误差是否满足要求,若满足则跳出循环if abs(dx) < DX_TARGET:break# 计算新一轮猜测的波动率v += dx# 检查波动率计算结果非负if v <= 0:return 0# 保留4位小数v = round(v, 4)return vdef calculateOriginalVega(s, k, r, t, v, cp):"""计算原始vega值"""    price1 = calculatePrice(s, k, r, t, v*STEP_UP, cp)price2 = calculatePrice(s, k, r, t, v*STEP_DOWN, cp)vega = (price1 - price2) / (v * STEP_DIFF)return vegadef calculatePrice(s, k, r, t, v, cp):"""计算期权价格"""# 如果波动率为0,则直接返回期权空间价值if v <= 0:return max(0, cp * (s - k))d1 = (log(s / k) + (r + 0.5 * pow(v, 2)) * t) / (v * sqrt(t))d2 = d1 - v * sqrt(t)price = cp * (s * cdf(cp * d1) - k * cdf(cp * d2) * exp(-r * t))return pricedef get_week_of_month(year, month):"""获取指定的某天是某个月中的第几周周一作为一周的开始"""begin = datetime.datetime(year, month, 1).weekday()delta = datetime.timedelta(days=21+begin)exercise_date = datetime.datetime(year, month, 1) + deltareturn  exercise_date.strftime('%Y-%m-%d')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Socket程序从Windows移植到Linux下的一些注意事项

关于这个话题网上流传的是一个相同的版本&#xff0c;就是那个第一项是头文件的区别&#xff0c;但后面列出的头文件只有#include没有&#xff08;估计是原版的在不断转载的过程中有人不小心忘了把尖括号转义&#xff0c;让浏览器当html标记解析没了&#xff09;的那个。现在整…

边缘控制平面Ambassador全解读

Ambassador是由Datawire开源的一个API网关项目&#xff0c;主要在Kubernetes的容器编排框架中使用。Ambassador本质上是一个通过配置边缘/API来管理Envoy数据面板的控制面板。而Envoy则是一个基于第7层协议的网络代理和通信总线&#xff0c;它是一个由Lyft开源的云原生服务&…

Linux 文件编辑命令 详细整理

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、vi编辑器有3种基本工作模式 首先需要知道vi编辑器有3种基本工作模式&#xff0c;分别是&#xff1a;命令模式、文本输入模式、和末…

专访迅雷首席工程师:迅雷的下一代互联网底层技术构想

摘要&#xff1a;互联网合纵连横频频上演&#xff0c;迅雷与小米的联姻也成为了热点&#xff0c;有许多人为迅雷的上市和迅雷的未来担忧&#xff0c;这家像工程师一样的公司&#xff0c;命运会怎样&#xff0c;他们未来会如何走下去&#xff1f;对此CSDN专访了迅雷首席工程师刘…

YASnippet - emacs 的代码片段管理工具

添加 snippet M-x 然后输入 yas-new-snippet 回车 RET&#xff0c;会出现一个新的 buffer # -*- mode: snippet -*-# name: # key: # --在出现的 buffer 中填写相应的数据 # -*- mode: snippet -*-# name: vard# key: vard# --echo <pre>;var_dump($0);die;c-x c…

深入vuex原理(上)

前言 vuex作为vue生态的重要组成部分&#xff0c;是对store进行管理的一柄利剑。简而言之&#xff0c;vuex是vue的状态管理器。使用vuex可用使数据流变得清晰、可追踪、可预测&#xff0c;更可以简单的实现 类似时光穿梭 等高级功能&#xff0c;对于复杂的大型应用来讲&#xf…

Maven入门(含实例教程)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Maven这个个项目管理和构建自动化工具&#xff0c;越来越多的开发人员使用它来管理项目中的jar包。接下来小宝鸽&#xff0c;将从下面几个…

进阶正则表达式

本文同步自我的博客园&#xff1a;http://www.cnblogs.com/hustskyking/ 关于正则表达式&#xff0c;网上可以搜到一大片文章&#xff0c;我之前也搜集了一些资料&#xff0c;并做了排版整理&#xff0c;可以看这篇文章http://www.cnblogs.com/hustskyking/archive/2013/06/04/…

tkinter拦截关闭事件

import tkinter as tk from tkinter import messageboxroot tk.Tk()def on_closing():if messagebox.askokcancel("Quit", "Do you want to quit?"):root.destroy()root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop() 转载于:htt…

阿里云服务器一分价钱一分货,切记!

阿里云为了满足低端市场的需求&#xff0c;会推出一些价格非常便宜的机器&#xff0c;但是这些机器是为新手练手用或者做测试用的&#xff0c;性能不行。你不要指望花每月9.5元&#xff0c;买一台学生机&#xff0c;就可以放置流量大的网站还不卡&#xff0c;那个不现实。阿里云…

请记住:你的付出都会以该有的方式归来(图)

人&#xff0c;这一生就像一个耕种的农民。你不是在付出&#xff0c;就是在收获。当然&#xff0c;有人说&#xff0c;付出并不一定有回报。这是大多数人都认同的&#xff0c;也就是付出与得到不一定成正比&#xff0c;不是付出的越多就得到的越多。但我想告诉你的是&#xff0…

c++primer plus笔记

> 第六版 操作符重载 #include<iostream> using namespace std;class Time { public:Time(){hm0;}Time(int _h,int _m){h _h;m _m;}void show(){printf("%02d:%02d \n",h,m);}Time operator(const Time &t){Time result;result.m t.m m;result.h t…

Luogu P3975 [TJOI2015]弦论

题目链接 \(Click\) \(Here\) 题目大意&#xff1a; 重复子串不算的第\(k\)大子串重复子串计入的第\(k\)大子串写法&#xff1a;后缀自动机。 和\(OI\) \(Wiki\)上介绍的写法不太一样&#xff0c;因为要同时解决两个问题。 把字符串每个前缀所在等价类的\(siz\)记为\(1\)&#…

《 图解 HTTP 》读书笔记

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. TCP/IP 协议族按层次分为&#xff1a;应用层、传输层、网络层、数据链路层。 2. IP 协议的作用是把各种数据包传送给对方。 3. IP …

身体出现危险时会发出信号 这太重要了 一定收藏 !(组图)

太重要了&#xff01;真的太重要了&#xff01; 心脏有问题时———左边手臂会酸、麻、痛。 肝脏有问题时———小腿晚上睡觉时容易抽筋。 肾脏出现问题时———声音就会出不来&#xff0c;就会沙哑。 脾胃出现问题时———偏头痛。 任何试图更改生物钟的行为&#xff0c;都将给…

数据结构与算法-概念

计算机从解决数值计算问题到解决生活中的问题 现实生活中的问题涉及不同个体间的复杂联系 需要在计算机程序中描述生活中个体间的联系数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系而不是研究复杂的算法 数据结构 基本概念 数据&#xff1a;程序的操作对象…

腾讯联手联通推出车联网“网卡”,打“内容”+“流量”的组合拳

车载生态已经成为了一个兵家必争之地了&#xff0c;于商业前景而言&#xff0c;这是一个BAT都无法忽视的掘金胜地。 从市场数据来看&#xff0c;全球车联网市场年复合增长率达到25%&#xff0c;根据汽车之家大数据显示&#xff1a;自2014年以来&#xff0c;车联网上市新车型渗…

编程面试中的十个常见错误

本文由 伯乐在线 - darkinlight 翻译自 thegeekstuff。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。 身为程序员&#xff0c;你肯定知道和其他技术工作面试比起来&#xff0c;编程工作的面试流程略有不同。 这篇文章会就你在编程面试中应当避免的10个问题展开讨…

费曼技巧与博客

费曼技巧与博客 什么是费曼技巧&#xff1f; 费曼技巧是一种学习方法&#xff0c;核心是以教促学。 具体实践 以学习费曼技巧为例&#xff1a; 确定学习目标为学习费曼技巧。寻找资料&#xff08;网络、书籍、报刊等&#xff09;学习费曼技巧&#xff0c;直到自己认为已经理解了…

阿里云服务器 CentOS 7上-- Docker 安装 网关(API-Getway)--KONG

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 全程操作按官方文档来就可以了。 1.将 Kong 连接到 Cassandra 或 PostgreSQL 容器 Kong支持 2 种数据库&#xff1a;Cassandra 或 Post…