finance

  1. 金融 指尖笔记
    1. 期权
    2. 上证180指数投资组合的风险测度
      1. 指定年份,计算这时期的上证180的风险
      2. 使用教程
        1. Linux 或 Mac 系统:
        2. Windows:
  2. 附件
    1. Windows版
    2. Linux或Mac版

金融 指尖笔记

期权

看涨期权:拥有在交割日以行权价格买入标的物的权利

看跌期权:拥有在交割日以行权价格卖出标的物的权利

在行权日,期权持有者可以选择或放弃交付。因为买入期权的人拥有选择的权利(option)。

期权可以买入,那么期权的卖方是谁呢?

两种期权分别分析。

看涨期权:

看涨期权赋予期权买方买入标的物的权利,标的物的来源则来自于卖方。看涨期权的卖方必须拥有标的物。标的物和行权价格形成看涨期权合约这一商品。它就由卖方卖给买方。期权合约这类商品有价值,它的价值就是权利金。下面从两方面分析。

买方角度:买方以权利金的价格买入期权。到了交割日,若标的物价格大于行权价格,买方必定行使权力,买入标的物,然后再卖出标的物,赚取价格差。若标的物价格小于行权价格,买方肯定放弃行使权力,因为不可能买入标的物然后再卖出,这样亏死。那么买方的收益 = max(0, 即期价格-行权价格) - 权利金

卖方角度:卖方卖出期权获得权利金。在交割日,买方若行权,卖方必须卖出标的物。买方放弃行权,卖方保留标的物。当即期价格 > 行权价格:卖方卖出标的物,相比于不选择卖出期权合约的情况,显然卖方在出售标的物的收益上处于亏损状态。当即期价格 < 行权价格:买方放弃行权。卖方保留标的物,相比于不选择卖出期权合约的情况,卖方在出售标的物的收益上不亏不赚。卖方的收益 = min(权利金,权利金+即期价格-行权价格)

看跌期权:

看跌期权赋予买方在交割日以行权价格卖出标的物的权利。买方卖出的标的物必须得有人接手,那个接手的人就是看跌期权的卖方。所以看跌期权合约由行权价格,卖方买入标的物的义务组成。这个义务取决于买方是否行权。

分析

买方角度:买方以权利金从卖方出购买期权,付权利金。期权赋予买方在交割日是否选择卖出标的物的权利 。在交割日,若即期价格 > 行权价格,买方肯定放弃卖出,然后以即期价格卖掉标的物赚钱。否则行权肯定亏死。若即期价格 < 行权价格,卖方肯定行权赚钱。买方收益 = max(0 , 行权价格 - 即期价格 ) - 权利金。

卖方角度:卖方卖出期权获得权利金。若即期价格 < 行权价格, 买方行权,卖方必须以行权价格买入标的物,相比于直接以即期价格买标的物来看,卖方处于亏损状态。若即期价格 > 行权价格,买方放弃行权,卖方无需买入标的物。 卖方收益 = min(权利金,权利金 + 即期价格 - 行权价格)

以上是阿枫对期权的浅显思考,仅参考课件和书本基础知识,没有细查专业知识。如有错误,请留言斧正。

上证180指数投资组合的风险测度

指定年份,计算这时期的上证180的风险

使用教程

数据表准备

  1. 在CSMAR数据库下载某一时期的上证180指数的数据表
  2. 另存为数据表,保存到你的工作目录,格式csv,名称“stock”+”number”,比如”stock4”

代码准备

  1. 安装 numpy 和 matplotlib 模块

  2. 复制代码(有两个版本),保存到当前目录 ,命名。比如”magic.py”

  3. Linux 或 Mac 系统:

    打开Terminal,cd 当前目录,chmod +x magic.py。

    magic.py -i stock_id。例如 导入stock4.csv 文件,开始变魔法。

    ./magic.py -i 4

    Windows:

    在IDE里直接 Run。(不熟悉Win,所以直接修改了代码,不用命令行操作)

    数据表和代码放在同一个目录下。

  4. 结果示例

finance

附件

Windows版

#!/usr/bin/env python
#coding=utf8
import csv
import numpy as np
import argparse
import random 
import matplotlib.pyplot as plt

stock_max = None
stock = []
stock_exp = []
stock_var = []
stock_val = []

def main():
    print 'This is Windows Version'
    file_id = raw_input("File Name:")
    clean_data(file_id)
    x = np.array([i for i in range(1,stock_max)])
    y_list = [];note_list = []
    note_list.append('Same weight');y_list.append(Var(x,1))
    note_list.append('Capitalization-weight'); y_list.append(Var(x,0))
    draw_plot(x,y_list,note_list)

def Var(x,opt):
        y = []
        #shuffle
        global stock;global stock_val
        com = zip(stock,stock_val)
        random.shuffle(com)
        stock = []
        stock_val = []
        for i in range(stock_max):
            stock.append(com[i][0])
            stock_val.append(com[i][1])
        #shuffle
        for n in x:
            cov_mat = []
            weight = []

            for i in range(n):
                cov_mat.append(stock[i])
            weight_sum = sum(stock_val[0:n])
            cov_mat = np.mat(np.cov(cov_mat))
            for i in range(n):
                weight.append(stock_val[i]/weight_sum)
            if opt==1 :weight = [1.0/n for i in range(n)]
            weight = np.mat(weight)
            var = float(weight*cov_mat*weight.T)
            var_sqrt = pow(var,0.5)
            y.append(var_sqrt)
        return y


def draw_plot(x,y,note):
    for i in range(len(y)):
        plt.plot(x, y[i], label=note[i])
    plt.xlabel('Number of stocks')
    plt.ylabel('Portfolio Standard Deviation')
    plt.title("Finance")
    plt.legend()
    plt.show()

def clean_data(id):
    with open(id,'r') as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=',')
        line_cnt = 0
        stock_map = dict()
        for row in csv_reader:
            line_cnt+=1
            if line_cnt<4: continue
            if row[0] not in stock_map.keys():
                stock_map[row[0]] = [[],[]]
            if row[4]=='' or row[3] == '': continue
            stock_map[row[0]][0].append(float(row[4]))
            stock_map[row[0]][1].append(float(row[3]))
        global stock;global stock_val;global stock_max

        good_len = 120

        #;get good_len:
        len_map = dict()
        for i in stock_map:
            if len(stock_map[i][0]) not in len_map.keys():
                len_map[len(stock_map[i][0])] = 1
            else:
                len_map[len(stock_map[i][0])] += 1
        cur_max = 0
        for i in len_map:
            if len_map[i]>cur_max:
                good_len = i
                cur_max = len_map[i]
        #get good_len: done
        print 'Appearance of one stock:',good_len

        stock_max = len(stock_map)
        for i in stock_map:
            if len(stock_map[i][0])<good_len: continue
            stock.append(stock_map[i][0][:good_len])
            stock_val.append(stock_map[i][1][:good_len])
        for i in range(len(stock_val)):
            stock_val[i] = np.mean(np.array(stock_val[i]))

        stock_max = len(stock)
        print 'Number of stock:',stock_max

def parse_args():
    parser = argparse.ArgumentParser(description="Give me a stock data , I will give you a chart!")
    parser.add_argument("-i", "--id", dest="id", help="stock data ID.")
    return parser.parse_args()

if __name__ =='__main__':
    main()

Linux或Mac版

#!/usr/bin/env python
#coding=utf8
import csv
import numpy as np
import argparse
import random 
import matplotlib.pyplot as plt

stock_max = None
stock = []
stock_exp = []
stock_var = []
stock_val = []

def main():
    args = parse_args()
    file_id = args.id
    clean_data(file_id)

    x = np.array([i for i in range(1,stock_max)])
    y_list = [];note_list = []
    note_list.append('Same weight');y_list.append(Var(x,1))
    note_list.append('Capitalization-weight'); y_list.append(Var(x,0))
    draw_plot(x,y_list,note_list)

def Var(x,opt):
        y = []
        #shuffle
        global stock;global stock_val
        com = zip(stock,stock_val)
        random.shuffle(com)
        stock = []
        stock_val = []
        for i in range(stock_max):
            stock.append(com[i][0])
            stock_val.append(com[i][1])
        #shuffle
        for n in x:
            cov_mat = []
            weight = []

            for i in range(n):
                cov_mat.append(stock[i])
            weight_sum = sum(stock_val[0:n])
            cov_mat = np.mat(np.cov(cov_mat))
            for i in range(n):
                weight.append(stock_val[i]/weight_sum)
            if opt==1 :weight = [1.0/n for i in range(n)]
            weight = np.mat(weight)
            var = float(weight*cov_mat*weight.T)
            var_sqrt = pow(var,0.5)
            y.append(var_sqrt)
        return y


def draw_plot(x,y,note):
    for i in range(len(y)):
        plt.plot(x, y[i], label=note[i])
    plt.xlabel('Number of stocks')
    plt.ylabel('Portfolio Standard Deviation')
    plt.title("Finance")
    plt.legend()
    plt.show()

def clean_data(id):
    with open('stock'+str(id)+'.csv','r') as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=',')
        line_cnt = 0
        stock_map = dict()
        for row in csv_reader:
            line_cnt+=1
            if line_cnt<4: continue
            if row[0] not in stock_map.keys():
                stock_map[row[0]] = [[],[]]
            if row[4]=='' or row[3] == '': continue
            stock_map[row[0]][0].append(float(row[4]))
            stock_map[row[0]][1].append(float(row[3]))
        global stock;global stock_val;global stock_max

        good_len = 120

        #;get good_len:
        len_map = dict()
        for i in stock_map:
            if len(stock_map[i][0]) not in len_map.keys():
                len_map[len(stock_map[i][0])] = 1
            else:
                len_map[len(stock_map[i][0])] += 1
        cur_max = 0
        for i in len_map:
            if len_map[i]>cur_max:
                good_len = i
                cur_max = len_map[i]
        #get good_len: done
        print 'Appearance of one stock:',good_len

        stock_max = len(stock_map)
        for i in stock_map:
            if len(stock_map[i][0])<good_len: continue
            stock.append(stock_map[i][0][:good_len])
            stock_val.append(stock_map[i][1][:good_len])
        for i in range(len(stock_val)):
            stock_val[i] = np.mean(np.array(stock_val[i]))

        stock_max = len(stock)
        print 'Number of stock:',stock_max

def parse_args():
    parser = argparse.ArgumentParser(description="Give me a stock data , I will give you a chart!")
    parser.add_argument("-i", "--id", dest="id", help="stock data ID.")
    return parser.parse_args()

if __name__ =='__main__':
    main()


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。

文章标题:finance

本文作者:枫云李

发布时间:2019-05-01, 00:00:00

最后更新:2020-01-16, 02:06:12

原始链接:https://primelyw.github.io/2019/05/01/finance/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
github