范雅惠程式交易Markowitz 1952 投資效率前緣
STYLE樣式BORDER邊界SOLID實心DASHED虛線DOTTED點線
import csv #輸入import輸出export,輸入csv套件
import math #輸入math套件
from tkinter import * #或者import tkinter as tk
Dim = 10
def draw_circle(x, y, label):
canvas.create_oval(100+x-5, 700-y-5, 100+x+5, 700-y+5, fill="black")
canvas.create_text(100+x+20, 700-y, text = label, anchor='w', font=('微軟正黑體',20))
file = open('台灣.csv','r',encoding='utf-8')
read = csv.reader(file)
header, rows = [], []
header = next(read)
for item in read:
rows.append(item)
file.close()
num = len(rows) #資料表長度
print(header)
mean = [0 for i in range(Dim)]; mean50 = 0; vari50=0
meanTemp = [0 for i in range(Dim)]
vari = [[0 for i in range(Dim)] for j in range(Dim)]
for k in range(num):
for i in range(Dim):
meanTemp[i]=float(rows[k][i+1])/100 #轉換為小數
mean[i] += meanTemp[i]
for j in range(i+1):
vari[i][j] += meanTemp[i]*meanTemp[j]
meanTemp50 = float(rows[k][33])/100; mean50+=meanTemp50; vari50 += meanTemp50*meanTemp50
for i in range(Dim):
mean[i] = mean[i]/num
for j in range(i+1):
vari[i][j]=(vari[i][j] - mean[i]*mean[j]*num)/(num-1)
for i in range(Dim):
for j in range(i+1,Dim):
vari[i][j]=vari[j][i]
tk = Tk() #建構視窗名為tk
tk.geometry('1200x900')#視窗 寬1200像素
tk.title("范雅惠python分析台灣50股票投資組合")
canvas = Canvas(tk, width=1200, height=900, bg='white')
canvas.grid(row=0,column=0,padx=5,pady=5,columnspan=3)
canvas.create_line(100, 700, 1100, 700, arrow=LAST,width=3)
for i in range(1,10): #X軸 0, 5...7
canvas.create_text(100+i*100, 700, text = i*5, anchor='n', font=('微軟正黑體',20))
canvas.create_line(100, 800, 100, 50, arrow=LAST,width=3)
for i in range(-1,7): #Y軸 1, 2, 3, 4, 5
canvas.create_text(94, 700-i*100, text = i*5, anchor='e', font=('微軟正黑體',20))
canvas.create_text(1100, 705, text = '標準差', anchor='n', font=('微軟正黑體',20))
canvas.create_text(95, 50, text = '報酬率', anchor='e', font=('微軟正黑體',20))
for i in range(Dim):
x, y = math.sqrt(vari[i][i]*12)*2000, 12*mean[i]*2000
draw_circle(x, y, header[i+1] )
mean50 = mean50/num; vari50=(vari50-mean50*mean50*num)/(num-1)
x, y = math.sqrt(vari50*12)*2000, 12*mean50*2000
draw_circle(x, y, header[33] )
#print(header[33], x, y)
step = 0.2 #原來是一表示僅考慮單一個股0.5也考慮50%
w=[0 for i in range(Dim)]
while w[0] <= 1:
while w[0]+w[1] <= 1:
while w[0]+w[1]+w[2] <= 1:
while w[0]+w[1]+w[2]+w[3] <= 1:
while w[0]+w[1]+w[2]+w[3]+w[4] <= 1:
while w[0]+w[1]+w[2]+w[3]+w[4]+w[5] <= 1:
while w[0]+w[1]+w[2]+w[3]+w[4]+w[5]+w[6] <= 1:
while w[0]+w[1]+w[2]+w[3]+w[4]+w[5]+w[6]+w[7] <= 1:
while w[0]+w[1]+w[2]+w[3]+w[4]+w[5]+w[6]+w[7]+w[8] <= 1:
temp9=w[0]+w[1]+w[2]+w[3]+w[4]+w[5]+w[6]+w[7]+w[8]
if temp9 < 1: w[9] = 1 - temp9
else: w[9] = 0
meanP, variP = 0, 0
for i in range(Dim):
meanP += w[i]*mean[i]
for j in range(Dim):
variP += w[i]*vari[i][j]*w[j]
y = 12*meanP*2000
x = math.sqrt(variP*12)*2000
canvas.create_oval(98+x,698-y,102+x, 702-y, fill="blue")
w[8] += step
w[7] += step
w[8] = 0
w[6] += step
w[7], w[8] = 0, 0
w[5] += step
for i in range(6, 9): w[i]=0
w[4] += step
for i in range(5, 9): w[i]=0
w[3] += step
for i in range(4, 9): w[i]=0
w[2] += step
for i in range(3, 9): w[i]=0
w[1] += step
for i in range(2, 9): w[i]=0
w[0] += step
for i in range(1, 9): w[i]=0
tk.mainloop()
评论
发表评论