基于Python制作股票交易計(jì)算器
python版
完整代碼
import tkinter as tk
from tkinter import ttk, messagebox
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from datetime import datetime
class StockDesigner:
def __init__(self, root):
self.root = root
self.root.title("股票交易計(jì)算器")
self.root.geometry("1000x700")
# 設(shè)置主題樣式
style = ttk.Style()
style.theme_use('clam') # 使用 clam 主題
# 自定義樣式
style.configure('TLabel', font=('微軟雅黑', 10))
style.configure('TButton', font=('微軟雅黑', 10))
style.configure('TLabelframe', font=('微軟雅黑', 10))
style.configure('TLabelframe.Label', font=('微軟雅黑', 10, 'bold'))
style.configure('Custom.TButton', padding=10, font=('微軟雅黑', 10, 'bold'))
# 設(shè)置默認(rèn)手續(xù)費(fèi)率
self.commission_rate = 0.00025
self.stamp_duty = 0.001
self.min_commission = 5
# 創(chuàng)建主框架
self.main_frame = ttk.Frame(root, padding="20")
self.main_frame.grid(row=0, column=0, sticky="nsew")
self.create_widgets()
# 配置根窗口的網(wǎng)格權(quán)重
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
def create_widgets(self):
# 創(chuàng)建標(biāo)題
title_label = ttk.Label(self.main_frame, text="股票交易計(jì)算器",
font=('微軟雅黑', 16, 'bold'))
title_label.grid(row=0, column=0, columnspan=2, pady=(0, 20))
# 創(chuàng)建左側(cè)輸入框架
input_frame = ttk.LabelFrame(self.main_frame, text="交易數(shù)據(jù)輸入", padding="20")
input_frame.grid(row=1, column=0, padx=(0, 10), sticky="nsew")
# 修改輸入框布局
labels = ["股票代碼:", "買(mǎi)入價(jià)格:", "買(mǎi)入數(shù)量:", "目標(biāo)賣(mài)出價(jià):", "目標(biāo)盈利金額:"]
entries = ["code_entry", "buy_price_entry", "volume_entry", "sell_price_entry", "target_profit_entry"]
for i, (label, entry) in enumerate(zip(labels, entries)):
ttk.Label(input_frame, text=label).grid(row=i, column=0, pady=10, padx=(0, 10), sticky="e")
entry_widget = ttk.Entry(input_frame, width=25, font=('微軟雅黑', 10))
entry_widget.grid(row=i, column=1, pady=10, sticky="w")
setattr(self, entry, entry_widget)
# 添加說(shuō)明文本
hint_text = "注:手續(xù)費(fèi)率為萬(wàn)分之2.5,印花稅為千分之1"
ttk.Label(input_frame, text=hint_text, font=('微軟雅黑', 9), foreground='gray')\
.grid(row=len(labels), column=0, columnspan=2, pady=(10, 0))
# 添加兩個(gè)計(jì)算按鈕
calc_button = ttk.Button(input_frame, text="計(jì)算交易成本和收益",
command=self.calculate_profit, style='Custom.TButton')
calc_button.grid(row=len(labels)+1, column=0, columnspan=2, pady=(20,5))
reverse_calc_button = ttk.Button(input_frame, text="計(jì)算目標(biāo)賣(mài)出價(jià)",
command=self.calculate_target_price, style='Custom.TButton')
reverse_calc_button.grid(row=len(labels)+2, column=0, columnspan=2, pady=(5,20))
# 創(chuàng)建右側(cè)顯示框架
display_frame = ttk.LabelFrame(self.main_frame, text="計(jì)算結(jié)果", padding="20")
display_frame.grid(row=1, column=1, sticky="nsew")
# 創(chuàng)建結(jié)果顯示區(qū)
self.result_text = tk.Text(display_frame, height=20, width=45,
font=('Consolas', 10), bg='#F8F8F8')
self.result_text.grid(row=0, column=0, sticky="nsew")
# 添???滾動(dòng)條
scrollbar = ttk.Scrollbar(display_frame, orient="vertical",
command=self.result_text.yview)
scrollbar.grid(row=0, column=1, sticky="ns")
self.result_text.configure(yscrollcommand=scrollbar.set)
# 設(shè)置網(wǎng)格權(quán)重
self.main_frame.grid_columnconfigure(1, weight=1)
self.main_frame.grid_rowconfigure(1, weight=1)
display_frame.grid_columnconfigure(0, weight=1)
display_frame.grid_rowconfigure(0, weight=1)
def calculate_profit(self):
try:
buy_price = float(self.buy_price_entry.get())
volume = int(self.volume_entry.get())
sell_price = float(self.sell_price_entry.get())
if not all([buy_price > 0, volume > 0, sell_price > 0]):
messagebox.showerror("錯(cuò)誤", "請(qǐng)輸入有效的數(shù)據(jù)!")
return
# 計(jì)算買(mǎi)入成本
buy_amount = buy_price * volume
buy_commission = max(buy_amount * self.commission_rate, self.min_commission)
# 計(jì)算賣(mài)出收入
sell_amount = sell_price * volume
sell_commission = max(sell_amount * self.commission_rate, self.min_commission)
stamp_duty = sell_amount * self.stamp_duty
# 計(jì)算總成本和收益
total_cost = buy_amount + buy_commission + sell_commission + stamp_duty
total_income = sell_amount
net_profit = total_income - total_cost
profit_rate = (net_profit / total_cost) * 100
# 顯示結(jié)果
result = f"""┌{'─'*40}┐
│ 交易明細(xì) │
└{'─'*40}┘
買(mǎi)入價(jià)格: {buy_price:.3f}元
買(mǎi)入數(shù)量: {volume:,}股
買(mǎi)入金額: {buy_amount:,.2f}元
買(mǎi)入手續(xù)費(fèi): {buy_commission:.2f}元
賣(mài)出價(jià)格: {sell_price:.3f}元
賣(mài)出金額: {sell_amount:,.2f}元
賣(mài)出手續(xù)費(fèi): {sell_commission:.2f}元
印花稅: {stamp_duty:.2f}元
┌{'─'*40}┐
│ 盈虧分析 │
└{'─'*40}┘
總成本: {total_cost:,.2f}元
總收入: {total_income:,.2f}元
凈利潤(rùn): {net_profit:,.2f}元
收益率: {profit_rate:.2f}%
┌{'─'*40}┐
│ 盈虧平衡點(diǎn) │
└{'─'*40}┘
最低賣(mài)出價(jià)格: {(total_cost/volume):.3f}元
"""
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, result)
except ValueError:
messagebox.showerror("錯(cuò)誤", "請(qǐng)輸入正確的數(shù)值!")
def calculate_target_price(self):
try:
buy_price = float(self.buy_price_entry.get())
volume = int(self.volume_entry.get())
target_profit = float(self.target_profit_entry.get())
if not all([buy_price > 0, volume > 0, target_profit > 0]):
messagebox.showerror("錯(cuò)誤", "請(qǐng)輸入有效的數(shù)據(jù)!")
return
# 計(jì)算買(mǎi)入成本
buy_amount = buy_price * volume
buy_commission = max(buy_amount * self.commission_rate, self.min_commission)
# 通過(guò)二分法查找目標(biāo)賣(mài)出價(jià)
left, right = buy_price, buy_price * 2
target_price = 0
while left <= right:
mid = (left + right) / 2
sell_amount = mid * volume
sell_commission = max(sell_amount * self.commission_rate, self.min_commission)
stamp_duty = sell_amount * self.stamp_duty
total_cost = buy_amount + buy_commission + sell_commission + stamp_duty
net_profit = sell_amount - total_cost
if abs(net_profit - target_profit) < 0.01:
target_price = mid
break
elif net_profit < target_profit:
left = mid + 0.0001
else:
right = mid - 0.0001
# 計(jì)算詳細(xì)成本
buy_amount = buy_price * volume
buy_commission = max(buy_amount * self.commission_rate, self.min_commission)
sell_amount = target_price * volume
sell_commission = max(sell_amount * self.commission_rate, self.min_commission)
stamp_duty = sell_amount * self.stamp_duty
total_cost = buy_amount + buy_commission + sell_commission + stamp_duty
# 修改顯示結(jié)果,添加成本明細(xì)
result = f"""┌{'─'*40}┐
│ 反向計(jì)算結(jié)果 │
└{'─'*40}┘
買(mǎi)入價(jià)格: {buy_price:.3f}元
買(mǎi)入數(shù)量: {volume:,}股
買(mǎi)入金額: {buy_amount:,.2f}元
買(mǎi)入手續(xù)費(fèi): {buy_commission:.2f}元
目標(biāo)盈利: {target_profit:.2f}元
需要賣(mài)出價(jià)格: {target_price:.3f}元
賣(mài)出金額: {sell_amount:,.2f}元
賣(mài)出手續(xù)費(fèi): {sell_commission:.2f}元
印花稅: {stamp_duty:.2f}元
┌{'─'*40}┐
│ 成本與收益 │
└{'─'*40}┘
總成本: {total_cost:,.2f}元
總收入: {sell_amount:,.2f}元
凈利潤(rùn): {target_profit:.2f}元
上漲幅度: {((target_price/buy_price - 1) * 100):.2f}%
"""
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, result)
# 自動(dòng)填充賣(mài)出價(jià)格輸入框
self.sell_price_entry.delete(0, tk.END)
self.sell_price_entry.insert(0, f"{target_price:.3f}")
except ValueError:
messagebox.showerror("錯(cuò)誤", "請(qǐng)輸入正確的數(shù)值!")
if __name__ == "__main__":
root = tk.Tk()
app = StockDesigner(root)
root.mainloop()效果圖

Html 版
完整代碼
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>股票交易計(jì)算器</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.calculator {
border: 1px solid #ccc;
padding: 20px;
border-radius: 5px;
}
.input-group {
margin-bottom: 15px;
}
label {
display: inline-block;
width: 120px;
}
input {
width: 150px;
padding: 5px;
}
button {
background-color: #4CAF50;
color: white;
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
.result {
margin-top: 20px;
padding: 10px;
background-color: #f9f9f9;
}
</style>
</head>
<body>
<div class="calculator">
<h2>股票交易計(jì)算器</h2>
<div class="input-group">
<label>買(mǎi)入價(jià)格:</label>
<input type="number" id="buyPrice" step="0.01">
</div>
<div class="input-group">
<label>賣(mài)出價(jià)格:</label>
<input type="number" id="sellPrice" step="0.01">
</div>
<div class="input-group">
<label>交易數(shù)量:</label>
<input type="number" id="quantity">
</div>
<div class="input-group">
<label>手續(xù)費(fèi)率:</label>
<input type="number" id="feeRate" value="0.00025" step="0.0001">
</div>
<button onclick="calculate()">計(jì)算</button>
<div class="result" id="result"></div>
</div>
<script>
function calculate() {
// 獲取輸入值
const buyPrice = parseFloat(document.getElementById('buyPrice').value);
const sellPrice = parseFloat(document.getElementById('sellPrice').value);
const quantity = parseInt(document.getElementById('quantity').value);
const feeRate = parseFloat(document.getElementById('feeRate').value);
// 驗(yàn)證輸入
if (!buyPrice || !sellPrice || !quantity || !feeRate) {
alert('請(qǐng)?zhí)顚?xiě)所有必要信息!');
return;
}
// 計(jì)算交易費(fèi)用
const buyTotal = buyPrice * quantity;
const sellTotal = sellPrice * quantity;
const buyFee = Math.max(buyTotal * feeRate, 5); // 最低手續(xù)費(fèi)5元
const sellFee = Math.max(sellTotal * feeRate, 5);
// 計(jì)算盈虧
const profit = sellTotal - buyTotal - buyFee - sellFee;
const profitRate = (profit / buyTotal * 100).toFixed(2);
// 顯示結(jié)果
const resultHTML = `
<h3>交易明細(xì):</h3>
<p>買(mǎi)入總額:¥${buyTotal.toFixed(2)}</p>
<p>買(mǎi)入手續(xù)費(fèi):¥${buyFee.toFixed(2)}</p>
<p>賣(mài)出總額:¥${sellTotal.toFixed(2)}</p>
<p>賣(mài)出手續(xù)費(fèi):¥${sellFee.toFixed(2)}</p>
<p>凈盈虧:¥${profit.toFixed(2)}</p>
<p>收益率:${profitRate}%</p>
`;
document.getElementById('result').innerHTML = resultHTML;
}
</script>
</body>
</html>效果圖

到此這篇關(guān)于基于Python制作股票交易計(jì)算器的文章就介紹到這了,更多相關(guān)Python股票交易計(jì)算器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python自動(dòng)化實(shí)現(xiàn)日?qǐng)?bào)數(shù)據(jù)可視化
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)自動(dòng)化生成日?qǐng)?bào)數(shù)據(jù)可視化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
django中使用POST方法獲取POST數(shù)據(jù)
這篇文章主要介紹了django中使用POST方法獲取POST數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
如何在Python中利用matplotlib.pyplot畫(huà)出函數(shù)圖詳解
通過(guò)圖像可以直觀地學(xué)習(xí)函數(shù)變化、分布等規(guī)律,在學(xué)習(xí)函數(shù)、概率分布等方面效果顯著,下面這篇文章主要給大家介紹了關(guān)于如何在Python中利用matplotlib.pyplot畫(huà)出函數(shù)圖的相關(guān)資料,需要的朋友可以參考下2022-08-08
使用scrapy實(shí)現(xiàn)爬網(wǎng)站例子和實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲(chóng)(蜘蛛)的步驟
本文分二個(gè)示例,第一個(gè)是個(gè)簡(jiǎn)單的爬網(wǎng)站的小例子,第二個(gè)例子實(shí)現(xiàn)目是從一個(gè)網(wǎng)站的列表頁(yè)抓取文章列表,然后存入數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)包括文章標(biāo)題、鏈接、時(shí)間,大家參考使用吧2014-01-01
Python推導(dǎo)式之字典推導(dǎo)式和集合推導(dǎo)式使用體驗(yàn)
這篇文章主要為大家介紹了Python推導(dǎo)式之字典推導(dǎo)式和集合推導(dǎo)式使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

