# KD import numpy as np import pandas as pd import mplfinance as mpf import talib from datetime import datetime data = pd.read_csv('2330.csv') data.iloc[:, 0] = pd.to_datetime(data.iloc[:, 0], format = "%Y/%m/%d") dataclose= [float(line) for line in data['Close']] K,D = talib.STOCH(data['High'].values,data['Low'].values,data['Close'].values) detail = [['日期', '買/賣(+/-)', '價格', '價格(稅)', '實際花費', '目前獲利']] temp_detail = [] unit = 1 stock = 0 get = 0 for i in range(1, len(K)): if((( (K[i - 1] < D[i - 1] and K[i] > D[i] + 3 )or D[i] < 15 or (D[i] < 30 and K[i] < 20)) ) and stock == 0): stock += unit get -= round(unit * dataclose[i] * 1000 * 1.001425) temp_detail.append( str(datetime.date(data['Date'][i]).year) + '/' +str(datetime.date(data['Date'][i]).month) + '/' + str(datetime.date(data['Date'][i]).day) ) temp_detail.append('+' + str(unit)) temp_detail.append(dataclose[i]) temp_detail.append(round(dataclose[i] * 1.001425, 1)) temp_detail.append('-' + str(round(unit * dataclose[i] * 1000 * 1.001425))) temp_detail.append(gain) detail.append(temp_detail) temp_detail = [] elif((((K[i - 1] > D[i - 1] and K[i] + 3 < D[i] ) or D[i] > 15 or (D[i] > 70 and K[i] > 80))) and stock != 0): get += round(stock * dataclose[i] * 1000 * 0.995575) temp_detail.append(str(datetime.date(data['Date'][i]).year) + '/' + str(datetime.date(data['Date'][i]).month) + '/' + str(datetime.date(data['Date'][i]).day) ) temp_detail.append('-' + str(stock)) temp_detail.append(dataclose[i]) temp_detail.append(round(dataclose[i] * 0.995575, 1)) temp_detail.append('+' + str(round(stock * dataclose[i] * 1000 * 0.995575))) temp_detail.append(gain) detail.append(temp_detail) stock = 0 temp_detail = [] cost = 0 income = 0 for i in range(1, len(detail)): if(float(detail[i][4]) < 0): cost += abs(int(detail[i][4])) elif(float(detail[i][4]) > 0): get += int(detail[i][4]) print("支出:", cost, "元") print("收入:", get, "元") print("淨收益:", get - cost, "元") print("投資報酬率:", round(100 * (get - cost) / cost, 2), "%") detail = pd.DataFrame(detail) detail