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 #原來是一表示僅考慮單一個股
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()
程式碼 import csv #輸入import輸出export,輸入csv套件 import math #輸入math套件 from tkinter import * #或者import tkinter as tk scale = 2000 # 放大倍率 base = 600 # 圖形中心高度 def transposeMatrix(m): #自訂轉置transpose函數 N = [] for j in range(len(m[0])): row = [] for i in range(len(m)): row.append(m[i][j]) N.append(row) return N def getMatrixMinor(m,i,j): return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])] def getMatrixDeternminant(m): #base case for 2x2 matrix if len(m) == 2: return m[0][0]*m[1][1]-m[0][1]*m[1][0] determinant = 0 for c in range(len(m)): determinant += ((-1)**c)*m[0][c]*getMatrixDeternminant(getMatrixMinor(m,0,c)) return determinant def getMatrixInverse(m): determinant = getMatrixDeternminant(m) if len(m) == 2: #處理2x2方陣 return [[m[1][1]/determinant, -1*m[0][1]/determinant], [-1*m[1][0]/determinant, m[0][0]/determinan...
f = open('00960.csv','r',encoding='utf-8') import csv #德明科大黃培暟修改11與16列 csv_reader = csv.reader(f) header, rows = [], [] #宣告空白串列(陣列,清單) header = next(csv_reader) #串列header存放第一列標題 for row in csv_reader: #逐列讀檔案、附加append於rows串列 rows.append(row) f.close() idSet = set() component = dict() #zeros = [0 for i in range(21)] for row in rows: for j in range(0, 21): idSet.add(row[j*4]) for id in idSet: component[id] = [0 for i in range(21)] #取代原來的zeros for row in rows: for j in range(0, 21): if row[j*4+3] != '': component[row[j*4]][j] = row[j*4 + 3] print(row[j*4+1],component[row[j*4]]) for id in idSet: print(id, component[id]) 原來 修改後
515.優秀如你,如果沒有多去照顧幾個妹子,就是全人類的損失。https://algorithmic-trading-takming.blogspot.com/2026/04/blog-post_23.html
回覆刪除305.https://huang-pei-kai.blogspot.com/2026/03/blog-post.html