基于Python制作股票交易計算器
更新時間:2024年12月19日 10:43:32 作者:PieroPc
這篇文章主要為大家詳細(xì)介紹了如何利用Python和Html分別制作一個股票交易計算器,文中的示例代碼簡潔易懂,有需要的小伙伴可以參考一下
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("股票交易計算器") 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ù)費率 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="股票交易計算器", 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 = ["股票代碼:", "買入價格:", "買入數(shù)量:", "目標(biāo)賣出價:", "目標(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) # 添加說明文本 hint_text = "注:手續(xù)費率為萬分之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)) # 添加兩個計算按鈕 calc_button = ttk.Button(input_frame, text="計算交易成本和收益", 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="計算目標(biāo)賣出價", 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="計算結(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") # 添???滾動條 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("錯誤", "請輸入有效的數(shù)據(jù)!") return # 計算買入成本 buy_amount = buy_price * volume buy_commission = max(buy_amount * self.commission_rate, self.min_commission) # 計算賣出收入 sell_amount = sell_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 total_income = sell_amount net_profit = total_income - total_cost profit_rate = (net_profit / total_cost) * 100 # 顯示結(jié)果 result = f"""┌{'─'*40}┐ │ 交易明細(xì) │ └{'─'*40}┘ 買入價格: {buy_price:.3f}元 買入數(shù)量: {volume:,}股 買入金額: {buy_amount:,.2f}元 買入手續(xù)費: {buy_commission:.2f}元 賣出價格: {sell_price:.3f}元 賣出金額: {sell_amount:,.2f}元 賣出手續(xù)費: {sell_commission:.2f}元 印花稅: {stamp_duty:.2f}元 ┌{'─'*40}┐ │ 盈虧分析 │ └{'─'*40}┘ 總成本: {total_cost:,.2f}元 總收入: {total_income:,.2f}元 凈利潤: {net_profit:,.2f}元 收益率: {profit_rate:.2f}% ┌{'─'*40}┐ │ 盈虧平衡點 │ └{'─'*40}┘ 最低賣出價格: {(total_cost/volume):.3f}元 """ self.result_text.delete(1.0, tk.END) self.result_text.insert(tk.END, result) except ValueError: messagebox.showerror("錯誤", "請輸入正確的數(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("錯誤", "請輸入有效的數(shù)據(jù)!") return # 計算買入成本 buy_amount = buy_price * volume buy_commission = max(buy_amount * self.commission_rate, self.min_commission) # 通過二分法查找目標(biāo)賣出價 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 # 計算詳細(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}┐ │ 反向計算結(jié)果 │ └{'─'*40}┘ 買入價格: {buy_price:.3f}元 買入數(shù)量: {volume:,}股 買入金額: {buy_amount:,.2f}元 買入手續(xù)費: {buy_commission:.2f}元 目標(biāo)盈利: {target_profit:.2f}元 需要賣出價格: {target_price:.3f}元 賣出金額: {sell_amount:,.2f}元 賣出手續(xù)費: {sell_commission:.2f}元 印花稅: {stamp_duty:.2f}元 ┌{'─'*40}┐ │ 成本與收益 │ └{'─'*40}┘ 總成本: {total_cost:,.2f}元 總收入: {sell_amount:,.2f}元 凈利潤: {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) # 自動填充賣出價格輸入框 self.sell_price_entry.delete(0, tk.END) self.sell_price_entry.insert(0, f"{target_price:.3f}") except ValueError: messagebox.showerror("錯誤", "請輸入正確的數(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>股票交易計算器</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>股票交易計算器</h2> <div class="input-group"> <label>買入價格:</label> <input type="number" id="buyPrice" step="0.01"> </div> <div class="input-group"> <label>賣出價格:</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ù)費率:</label> <input type="number" id="feeRate" value="0.00025" step="0.0001"> </div> <button onclick="calculate()">計算</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); // 驗證輸入 if (!buyPrice || !sellPrice || !quantity || !feeRate) { alert('請?zhí)顚懰斜匾畔ⅲ?); return; } // 計算交易費用 const buyTotal = buyPrice * quantity; const sellTotal = sellPrice * quantity; const buyFee = Math.max(buyTotal * feeRate, 5); // 最低手續(xù)費5元 const sellFee = Math.max(sellTotal * feeRate, 5); // 計算盈虧 const profit = sellTotal - buyTotal - buyFee - sellFee; const profitRate = (profit / buyTotal * 100).toFixed(2); // 顯示結(jié)果 const resultHTML = ` <h3>交易明細(xì):</h3> <p>買入總額:¥${buyTotal.toFixed(2)}</p> <p>買入手續(xù)費:¥${buyFee.toFixed(2)}</p> <p>賣出總額:¥${sellTotal.toFixed(2)}</p> <p>賣出手續(xù)費:¥${sellFee.toFixed(2)}</p> <p>凈盈虧:¥${profit.toFixed(2)}</p> <p>收益率:${profitRate}%</p> `; document.getElementById('result').innerHTML = resultHTML; } </script> </body> </html>
效果圖
到此這篇關(guān)于基于Python制作股票交易計算器的文章就介紹到這了,更多相關(guān)Python股票交易計算器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python自動化實現(xiàn)日報數(shù)據(jù)可視化
這篇文章主要為大家詳細(xì)介紹了如何使用Python實現(xiàn)自動化生成日報數(shù)據(jù)可視化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02django中使用POST方法獲取POST數(shù)據(jù)
這篇文章主要介紹了django中使用POST方法獲取POST數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08如何在Python中利用matplotlib.pyplot畫出函數(shù)圖詳解
通過圖像可以直觀地學(xué)習(xí)函數(shù)變化、分布等規(guī)律,在學(xué)習(xí)函數(shù)、概率分布等方面效果顯著,下面這篇文章主要給大家介紹了關(guān)于如何在Python中利用matplotlib.pyplot畫出函數(shù)圖的相關(guān)資料,需要的朋友可以參考下2022-08-08使用scrapy實現(xiàn)爬網(wǎng)站例子和實現(xiàn)網(wǎng)絡(luò)爬蟲(蜘蛛)的步驟
本文分二個示例,第一個是個簡單的爬網(wǎng)站的小例子,第二個例子實現(xiàn)目是從一個網(wǎng)站的列表頁抓取文章列表,然后存入數(shù)據(jù)庫中,數(shù)據(jù)庫包括文章標(biāo)題、鏈接、時間,大家參考使用吧2014-01-01Python推導(dǎo)式之字典推導(dǎo)式和集合推導(dǎo)式使用體驗
這篇文章主要為大家介紹了Python推導(dǎo)式之字典推導(dǎo)式和集合推導(dǎo)式使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06