Pine Script转Python后遇float与NoneType类型不兼容错误求助
问题:Pine Script转Python的Z-score计算报错
我将Pine Script中的Z-score计算代码转换为Python代码,使用pandas与pandas_ta库实现,但运行时出现错误。
Python代码(原错误版本)
import pandas as pd import pandas_ta as ta close = pd.read_csv('close-MATIC.csv') def Z_4(src, length, smooth): mean = ta.sma(src, length) vlo = src - mean std = ta.stdev(vlo, length) value = (src - mean) / std Wema = ta.ema(ta.ema(value, smooth), smooth) return [Wema, value] R4 = Z_4(close, 8, 5) print(R4)
样本close-MATIC.csv数据
1.1154 1.1133 1.114 1.1131666666666669 1.1158444444444446 1.1207629629629632 1.1231753086419756 1.1252835390946503 1.1277223593964336 1.1305149062642892 1.1350099375095262 1.1363399583396843 1.1352933055597896 1.1354622037065263 1.132108135804351 1.1314387572029008 1.1310258381352671 1.1331172254235113 1.1350114836156744 1.135007655743783
原Pine Script代码
f_zscore(_src, _length, _smooth)=> _mean = sma(_src, _length) _std = stdev(_src-_mean, _length) _value = (_src - _mean) / _std _dema = ema(ema(_value, _smooth), _smooth) [_value, _dema] smooth = input(3) [z0, d0] = f_zscore(close, input(6), smooth)
报错信息
Traceback (most recent call last): File "c:/Users/MO/OneDrive/Desktop/New folder (21)/TOP4.py", line 14, in <module> R4= Z_4(close,8,5) File "C:\Users\MO\OneDrive\Desktop/New folder (21)/TOP4.py", line 8, in Z_4 vlo=(src-mean) File "C:\Users\MO\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\ops\common.py", line 65, in new_method return method(self, other) File "C:\Users\MO\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\arraylike.py", line 97, in __sub__ return self._arith_method(other, operator.sub) File "C:\Users\MO\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\frame.py", line 5982, in _arith_method new_data = self._dispatch_frame_op(other, op, axis=axis) File "C:\Users\MO\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\frame.py", line 6008, in _dispatch_frame_op bm = self._mgr.apply(array_op, right=right) File "C:\Users\MO\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\internals\managers.py", line 425, in apply applied = b.apply(f, **kwargs) File "C:\Users\MO\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\internals\blocks.py", line 378, in apply result = func(self.values, **kwargs) File "C:\Users\MO\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\ops\array_ops.py", line 189, in arithmetic_op res_values = _na_arithmetic_op(lvalues, rvalues, op) File "C:\Users\MO\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\ops\array_ops.py", line 149, in _na_arithmetic_op result = _masked_arith_op(left, right, op) File "C:\Users\MO\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\ops\array_ops.py", line 111, in _masked_arith_op result[mask] = op(xrav[mask], y) TypeError: unsupported operand type(s) for -: 'float' and 'NoneType'
解决方案
错误根源有两个:
- CSV读取方式错误:你的CSV没有表头,
pd.read_csv会默认把第一行数据作为列名,导致close是DataFrame而非Series,pandas_ta的函数需要传入Series才能正确计算。 - 返回顺序不符原逻辑:原Pine Script返回顺序是
[_value, _dema],原Python代码返回顺序相反,虽不影响报错,但会导致结果对应关系错误。
修正后的代码:
import pandas as pd import pandas_ta as ta # 读取CSV时指定无表头,并转为Series close = pd.read_csv('close-MATIC.csv', header=None, squeeze=True) def Z_4(src, length, smooth): mean = ta.sma(src, length) vlo = src - mean std = ta.stdev(vlo, length) value = (src - mean) / std # 对应原Pine Script的两次EMA计算 dema = ta.ema(ta.ema(value, smooth), smooth) # 按原Pine的返回顺序:先value,再dema return [value, dema] R4 = Z_4(close, 8, 5) # 打印结果,可选择去除NaN的行 print("Z-score值:\n", R4[0].dropna()) print("\n双EMA平滑后的Z-score:\n", R4[1].dropna())
说明:
header=None告诉pandas文件没有表头,squeeze=True将单列DataFrame转为Series,符合pandas_ta的参数要求。- 调整返回顺序与原Pine Script一致,保证结果逻辑匹配。
- 打印时用
dropna()可以过滤掉前几个因滑动窗口产生的NaN值,更易查看有效结果。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

