In [25]:
# !/usr/bin/python
# -*- encoding: utf-8 -*-
"""
Codes for Kinyu HW
URL: https://github.com/myuuuuun/various/kinyu
"""

%matplotlib inline
from __future__ import division, print_function
import math
from random import uniform, normalvariate, shuffle
import numpy as np
import matplotlib.pyplot as plt
np.set_printoptions(threshold=np.nan)

問題2 (1)


In [5]:
def average(probability, asset):
    return np.sum(probability * asset)


def variance(probability, asset):
    ave = average(probability, asset)
    return np.sum(probability * pow(asset - ave, 2))


def std(probability, asset):
    return np.sqrt(variance(probability, asset))


# 資産A, B, Cがあり、状態1〜5がある
# [state1, state2, ..., state5]
probability = np.array([0.2, 0.5, 0.1, 0.15, 0.05])
assetA = np.array([2.56, 1.79, 1.02, 0.26, 0.00])
assetB = np.array([4.73, 1.18, 0.47, 0.47, 0.00])
assetC = np.array([0.00, 0.22, 1.10, 4.39, 0.00])


# 問題2(1) 資産A〜Cの平均と標準偏差
def pro2_1():
    print("Average of assetA: " + str( average(probability, assetA) ))
    print("Average of assetB: " + str( average(probability, assetB) ))
    print("Average of assetC: " + str( average(probability, assetC) ))

    print("SD of assetA: " + str( std(probability, assetA) ))
    print("SD of assetB: " + str( std(probability, assetB) ))
    print("SD of assetC: " + str( std(probability, assetC) ))


pro2_1()


Average of assetA: 1.548
Average of assetB: 1.6535
Average of assetC: 0.8785
SD of assetA: 0.794132230803
SD of assetB: 1.57858884767
SD of assetC: 1.50474341667

問題2(2)


In [22]:
# 問題2(2) 資産A, Bの組み合わせで達成可能なポートフォリオを図示(横軸標準偏差、縦軸平均)
# p*assetA + (1-p)*assetB とする(0<=p<=1)
def pro2_2():
    aves = []
    stds = []
    for p in np.linspace(0, 1, 21):
        portfolio = p * assetA + (1-p) * assetB
        aves.append(average(probability, portfolio))
        stds.append(std(probability, portfolio))

    print(aves)
    print(stds)

    fig, ax = plt.subplots(figsize=(10, 8))
    plt.title("oppotunity curve of portfolio of asset A & B")

    plt.xlabel("sigma: standard deviation")
    plt.ylabel("mu: average")
    plt.plot(stds, aves, color='b', linewidth=2, label='p*assetA + (1-p)*assetB (0<=p<=1)')
    plt.legend()
    ax.set_ylim(0.8, 2.0)
    ax.set_xlim(0.3, 2.0)
    plt.text(1.57, 1.64, '(1.58, 1.65)\n(p=0. only assetB)', ha = 'left', va = 'top')
    plt.text(0.79, 1.55, '(0.79, 1.55)\n(p=1. only assetA)', ha = 'right', va = 'bottom')
    plt.show()


pro2_2()


[1.6535, 1.6482249999999998, 1.6429500000000004, 1.6376750000000002, 1.6324000000000003, 1.6271250000000002, 1.62185, 1.6165749999999999, 1.6113, 1.606025, 1.6007500000000001, 1.5954750000000002, 1.5902000000000003, 1.5849250000000001, 1.57965, 1.5743749999999999, 1.5690999999999999, 1.5638250000000002, 1.5585499999999999, 1.5532750000000002, 1.548]
[1.5785888476737699, 1.5310400343802248, 1.4839111319415326, 1.4372434490631714, 1.391083405119909, 1.3454832484557362, 1.3005018752389401, 1.2562057581761834, 1.2126699922072781, 1.1699794600226967, 1.1282301128315981, 1.0875303498638555, 1.0480024618291695, 1.009784076857523, 0.97302951008692451, 0.93791086829986148, 0.90461869867917266, 0.87336189914319029, 0.84436653622701074, 0.81787316368432084, 0.79413223080290607]

問題2(3)


In [24]:
# 問題2(3) 資産A, Bの組み合わせで達成可能なポートフォリオを図示(横軸標準偏差、縦軸平均)
# p*assetA + q*assetB + (1-p-q)*assetC とする(0<=p, q<=p+q<=1)
def pro2_3():
    fig, ax = plt.subplots(figsize=(10, 8))
    plt.title("oppotunity curve of portfolio of asset A & B & C")
    plt.xlabel("sigma: standard deviation")
    plt.ylabel("mu: average")

    # p=(一定)の時のAとBとCの組み合わせで書ける曲線
    plt.plot(0, 0, color='c', label='p*A + q*B + (1-p-q)*C (p=const)')
    for p in np.arange(0, 1.01, 0.02):
        aves = []
        stds = []
        for q in np.arange(0, 1.01-p, 0.02):
            portfolio = p * assetA + q * assetB + (1-p-q) * assetC
            aves.append(average(probability, portfolio))
            stds.append(std(probability, portfolio))
        
        if p == 0:
            plt.plot(stds, aves, color='r', linewidth=2, label='q*B + (1-q)*C (p=0)')

        else:
            plt.plot(stds, aves, color='#88ffff')

        #print(aves)
        #print(stds)
    
    # q=0の時のAとCの組み合わせで書ける曲線
    aves = []
    stds = []
    q = 0
    for p in np.arange(0, 1.02, 0.02):
        portfolio = p * assetA + q * assetB + (1-p-q) * assetC
        aves.append(average(probability, portfolio))
        stds.append(std(probability, portfolio))
    plt.plot(stds, aves, color='g', linewidth=2, label='p*A + (1-q)*C (q=0)')

    # p+q=1の時のAとBの組み合わせで書ける曲線
    aves = []
    stds = []
    for p in np.arange(0, 1.02, 0.02):
        q = 1 - p
        portfolio = p * assetA + q * assetB + (1-p-q) * assetC
        aves.append(average(probability, portfolio))
        stds.append(std(probability, portfolio))
    plt.plot(stds, aves, color='b', linewidth=2, label='p*A + q*B (p+q=1)')

    plt.legend()
    ax.set_ylim(0.8, 2.0)
    ax.set_xlim(0.3, 2.0)
    plt.text(0.79, 1.56, '(0.79, 1.55)\n(p=1, q=0. only assetA)', ha = 'right', va = 'bottom')
    plt.text(1.57, 1.64, '(1.58, 1.65)\n(p=0, q=1. only assetB)', ha = 'left', va = 'top')
    plt.text(1.50, 0.88, '(1.50, 0.88)\n(p, q=0. only assetC)', ha = 'left', va = 'bottom')
    plt.show()


pro2_3()



In [ ]: