【理财类-01-07】20260717 股票根据“股价*佣金费率大于等于5元”,推算最适合购买或卖出股数。(Python)
背景需求
【理财类-01-06】20260716 股票“差价”收益计算和excel统计(Python)https://mp.csdn.net/mp_blog/creation/editor/162911231
我发现有些股数少,会导致佣金总额小于5元,但是实际支付是5元,就会损失佣金
所以我要预先根据“买入价、卖出价”和“佣金比例”“预设100股-100000股(整数股)”来推算正好在大于等于5元的那个股数
在107行,写入股票代码和买入价或卖出价
''' 输入“买入价*预设股数(100-10000)*佣金比例(沪0.0001843深0.0001654)”,当佣金正好大于等于5“,就确定用这个股数” 豆包、阿夏 20260716 ''' def calc_min_shares(code: str, buy_price: float) -> dict: """ 根据股票代码、买入价,计算刚好佣金≥5元的最小股数(100~10000,100手递增) :param code: 股票代码字符串,如"600001"、"300001" :param buy_price: 买入单价 :return: 结果字典 """ # 1. 校验股票代码长度,提取前两位 if len(code) != 6 or not code.isdigit(): raise ValueError("股票代码必须是6位纯数字") code_prefix = code[:2] # 2. 匹配市场与佣金费率 if code_prefix in ("60", "68"): market = "沪市" commission_rate = 0.0001843 # 0.1843‰ elif code_prefix in ("00", "30"): market = "深市" commission_rate = 0.0001654 # 0.1654‰ else: raise ValueError("仅支持60/68开头沪市、00/30开头深市A股代码") min_target_shares = None target_commission = 0.0 target_amount = 0.0 # 3. 遍历100~10000股,步长100(A股1手=100股) for shares in range(100, 100001, 100): trade_amount = buy_price * shares real_commission = trade_amount * commission_rate # 找到第一个佣金≥5元的股数,直接跳出循环 if real_commission >= 5: min_target_shares = shares target_amount = trade_amount target_commission = real_commission break # 4. 封装返回结果 result = { "股票代码": code, "市场": market, "佣金费率": f"{commission_rate * 1000}‰", "买入单价": buy_price, "搜索区间": "100 ~ 10000股(100股递增)" '\n---------------' } if min_target_shares is not None: result["满足佣金≥5元最小股数"] = min_target_shares result["计算佣金(未保底)"] = round(target_commission, 4) result["实际收取佣金(保底5元)"] = max(5, round(target_commission, 2)) result[""]='----------------------------------' result["对应成交总金额"] = round(target_amount, 2) else: result["提示"] = "区间100-10000股内,所有持仓计算佣金均不足5元,统一按5元收取" return result # ---------------------- 测试调用示例 ---------------------- if __name__ == "__main__": # 示例1:沪市60开头,股价10元 try: res1 = calc_min_shares("600000", 10.0) print("=== 测试1 沪市600000,股价10元 ===") for k, v in res1.items(): print(f"{k}: {v}") except Exception as e: print("错误:", e) print("\n" + "-"*60 + "\n") # 示例2:深市30开头,股价5元 try: res2 = calc_min_shares("300001", 5.0) print("=== 测试2 深市300001,股价5元 ===") for k, v in res2.items(): print(f"{k}: {v}") except Exception as e: print("错误:", e) print("\n" + "-"*60 + "\n") # 示例3:低价股,10000股佣金仍不足5 try: res3 = calc_min_shares("000001", 0.5) print("=== 测试3 深市000001,股价0.5元 ===") for k, v in res3.items(): print(f"{k}: {v}") except Exception as e: print("错误:", e) # 交互式输入版本(运行后手动输入) print("\n===== 交互式输入 =====") # stock_code = input("请输入6位股票代码:") # price = float(input("请输入买入单价:")) stock_code = '002229' # price = 9.5 # 3200 5.03 price = 9.7 # 3200 5.13 output = calc_min_shares(stock_code, price) for key, val in output.items(): print(f"{key}: {val}")我再预设一笔9.8和10,股价越高,可以买的股数逐渐减少从3200到3100(因为佣金总额高了)
但是如果差价过大:9.5元(3200股)和10元(3100股),股价不一样,
两种情况
以买入9.5元为主、3200股,则卖出10元 3200
以卖出10元为主、3100股,则买入9.5元 3100
低买,3200,高卖3200,佣金都大于5
高买,3100,低买3200,低买的佣金小于5(但是只是微微小于5)
以上需要分别输入买入价和卖出价,现在我要同时计算买入和卖出价对应的最大股数
''' 同时计算“买入价和卖出价*预设股数(100-10000)*佣金比例(沪0.0001843深0.0001654)”,当佣金正好大于等于5“,就确定用这个股数” 推算买入价最大股数,卖出价最大股数 豆包、阿夏 20260716 ''' def calc_min_shares(code: str, price: float) -> dict: """ 根据股票代码、价格,计算刚好佣金≥5元的最小股数(100~10000,100递增) :param code: 6位股票代码字符串 :param price: 买入/卖出单价 :return: 单组价格对应的计算结果字典 """ # 1. 校验股票代码 if len(code) != 6 or not code.isdigit(): raise ValueError("股票代码必须是6位纯数字") code_prefix = code[:2] # 2. 匹配市场佣金费率 if code_prefix in ("60", "68"): market = "沪市" commission_rate = 0.0001843 # 0.1843‰ elif code_prefix in ("00", "30"): market = "深市" commission_rate = 0.0001654 # 0.1654‰ else: raise ValueError("仅支持60/68开头沪市、00/30开头深市A股代码") min_target_shares = None target_commission = 0.0 target_amount = 0.0 # 3. 遍历100~10000股,步长100 for shares in range(100, 10001, 100): trade_amount = price * shares real_commission = trade_amount * commission_rate if real_commission >= 5: min_target_shares = shares target_amount = trade_amount target_commission = real_commission break # 4. 组装结果 result = { # "股票代码": code, # "市场": market, # "佣金费率": f"{commission_rate * 1000}‰", "成交单价": round(price, 2), # "搜索区间": "100 ~ 10000股(100股递增)" } if min_target_shares is not None: result["满足佣金≥5最小股数"] = min_target_shares # result["对应成交总金额"] = round(target_amount, 2) # result["理论计算佣金"] = round(target_commission, 4) # result["实际收取佣金(保底5元)"] = max(5, round(target_commission, 2)) else: result["提示"] = "100-10000股内全部佣金不足5元,统一收5元保底佣金" return result # ---------------------- 测试调用 ---------------------- if __name__ == "__main__": # 测试案例 try: stock_code = '002229' buy_price = 9.5 # 买入单价 sell_price = 10.0 # 卖出单价 # 分别计算买入、卖出两套数据 buy_result = calc_min_shares(stock_code, buy_price) sell_result = calc_min_shares(stock_code, sell_price) print("==================== 买入计算结果 ====================") for k, v in buy_result.items(): print(f"{k}: {v}") print("-" * 60) print("==================== 卖出计算结果 ====================") for k, v in sell_result.items(): print(f"{k}: {v}") except Exception as e: print("程序异常:", e) print("\n===== 交互式手动输入模式 =====") try: # input_code = input("请输入6位股票代码:") # input_buy = float(input("请输入买入单价:")) # input_sell = float(input("请输入卖出单价:")) input_code = '002229' input_buy = 9.3 input_sell = 10 res_buy = calc_min_shares(input_code, input_buy) res_sell = calc_min_shares(input_code, input_sell) print("\n===== 手动输入-买入结果 =====") for k, v in res_buy.items(): print(f"{k}: {v}") print("-" * 60) print("===== 手动输入-卖出结果 =====") for k, v in res_sell.items(): print(f"{k}: {v}") except Exception as err: print("输入错误:", err)