【理财类-01-07】20260717 股票根据“股价*佣金费率大于等于5元”,推算最适合购买或卖出股数。(Python)
背景需求【理财类-01-06】20260716 股票“差价”收益计算和excel统计Pythonhttps://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~10000100手递增 :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股步长100A股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~10000100递增 :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)做多低买股数 与高卖股数不一样做空高卖股数 与低买股数不一样低买的相同股数的佣金会小于5。所以高卖可以多加100股