mpf11_5_plotly_Keltner Channels_ATR_Stochastic RSI_%B MFI

本文介绍了技术分析中的几个关键指标:平均真实范围(ATR)用于衡量波动性,Keltner通道提供趋势判断,Stochastic RSI帮助识别超买/超卖,以及百分比B(%B)指示价格在布林带中的位置。ATR不受价格方向影响,而Keltner通道与布林带对比,更适用于盘整市场。Stochastic RSI结合MFI可用于趋势识别和交易信号。%B与资金流量结合,可辅助判断趋势起点和交易点。

mpf11_Learning rate_Activation_Loss_Optimizer_Quadratic Program_NewtonTaylor_L-BFGS_Nesterov_Hessian:mpf11_Learning rate_Activation_Loss_Optimizer_Quadratic Program_NewtonTaylor_L-BFGS_Nesterov_Hessian_unknown activation function: square_LIQING LIN的博客-优快云博客

mpf11_2_chain rule_forward_backpropag_Jacobian_error_loss_RSI_patternTriangl_CMFi_Williams%R_AO_VWAP : https://blog.youkuaiyun.com/Linli522362242/article/details/127293875

mpf11_3_status_plotly Align dual Yaxis_animation_button_MFI_Williams %Rsi_AO Co_VWAP_MAcd_BollingerBands : https://blog.youkuaiyun.com/Linli522362242/article/details/129129889

mpf11_4_plotly Align dual Yaxis_Chaikin/Stochastic Oscillator_ma Envelopes_support阻力_pivot point_KDJ : 

你遇到的错误: ``` TypeError: unsupported format string passed to mpf.__format__ ``` 这是一个 **`mpmath` 中常见的类型与格式化冲突问题**。 --- ## 🔍 错误原因 当你尝试用 Python 的字符串格式化(如 `f"{x:.10f}"` 或 `"%.10f" % x`)去打印一个 `mpmath.mpf` 类型的高精度浮点数时,就会触发这个错误。 ### 示例错误代码: ```python from mpmath import mp mp.dps = 50 x = mp.mpf('2.5') print(f"The value is {x:.10f}") # ❌ 报错! ``` 输出: ``` TypeError: unsupported format string passed to mpf.__format__ ``` 👉 原因:`mpf` 对象不支持标准的 `float` 格式化语法(如 `.10f`),因为它不是内置 `float` 类型。 --- ## ✅ 正确解决方案 ### ✔️ 方法一:先转为 `str` 或 `float` 再格式化(推荐用于输出) #### 如果你想保留高精度显示 → 转成字符串即可: ```python x = mp.mpf('2.5') + mp.pi print(f"The value is {x}") # ✅ 自动调用 str(x) # 输出: 5.6415926535897932384626433832795028841971693993751 ``` #### 如果你想控制小数位数(比如只显示 10 位小数): ```python # 先转换为 float 再格式化(牺牲精度) print(f"The value is {float(x):.10f}") # ✅ ``` > ⚠️ 注意:这会丢失高精度,仅用于最终结果展示。 --- ### ✔️ 方法二:使用 `mp.nstr()` —— mpmath 官方推荐的格式化工具! 这是最专业、最安全的方法。 ```python from mpmath import mp, nstr x = mp.mpf('2.5') + mp.pi formatted = nstr(x, n=10) # 显示 10 个有效数字 print(f"The value is {formatted}") # ✅ 输出: 5.641592654 ``` - `nstr(x, n)`:将 `mpf` 格式化为 `n` 个有效数字的字符串。 - 支持科学计数法、自动缩放等。 #### 更多用法: ```python nstr(x, n=15, strip_zeros=False) # 不省略末尾零 nstr(x, n=10, pretty=True) # 启用漂亮打印 ``` 📌 文档参考:https://mpmath.org/doc/current/general.html#nstr --- ### ✔️ 方法三:自定义 `__format__` 包装器(高级技巧) 如果你非要使用 f-string 的 `.10f` 语法,可以封装一个兼容类: ```python class SafeMPF: def __init__(self, value): self.value = mp.mpf(value) def __format__(self, fmt): # 将 fmt 解析为 .10f → 提取精度 try: if 'f' in fmt or 'g' in fmt or 'e' in fmt: return format(float(self.value), fmt) else: return format(self.value, 's') except: return str(self.value) def __str__(self): return str(self.value) # 使用示例: x = SafeMPF(mp.pi) print(f"Pi = {x:.15f}") # ✅ 成功输出: Pi = 3.141592653589793 ``` 这样就能在 f-string 中安全使用 `mpf`。 --- ## 🛠 实际应用建议(结合之前的高精度验证) 回到我们之前做的精度测试: ```python exact = y_exact_mp(x) # ← 这是一个 mpf approx = ... # scipy 结果(普通 float) err = abs(approx - float(exact)) # ✅ 必须转成 float 才能和 float 比较 ``` ✅ 正确写法: ```python for x_val in [0.0, 0.1, 1.0, 10.0]: exact = y_exact_mp(x_val) approx = (digamma(x_val + 1) + np.euler_gamma) / x_val if x_val != 0.0 \ else np.pi**2 / 6.0 err = abs(approx - float(exact)) # ← 关键:float(exact) print(f"x={x_val:4.1f}, error={err:.3e} ({'PASS' if err < 1e-10 else 'FAIL'})") ``` --- ## ✅ 总结 | 场景 | 正确做法 | |------|----------| | 打印 `mpf` 值 | `print(x)` 或 `print(nstr(x, n=10))` | | 格式化到 N 位小数 | `nstr(x, n)` 或 `float(x)` 后再格式化 | | 在 f-string 中使用 | `f"{float(x):.10f}"` 或使用 `SafeMPF` 包装 | | 计算误差 | `abs(float(approx) - float(exact))` | --- ## ❌ 禁止写法(会报错) ```python f"{my_mpf_value:.10f}" # ❌ "% .10f" % my_mpf_value # ❌ format(my_mpf_value, '.10f') # ❌ ``` --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LIQING LIN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值