如何将TradingView kNN指标PineScript转Python并实现Binance自动交易
问题解决方案
1. 准确转换Capissimo kNN PineScript到Python代码
要解决准确率不佳的问题,核心是1:1复现PineScript的逻辑细节,步骤如下:
拆解PineScript核心逻辑
先拿到该指标的开源PineScript代码,重点提取:- 特征集:比如收盘价、成交量、RSI(14)、MACD(12,26,9)等,确认每个指标的参数和计算方式(比如RSI是否用Wilder平滑)
- kNN参数:k值、样本窗口大小、距离计算方式(通常是欧氏距离)、涨跌标签定义(比如下一根K线收盘价>当前收盘价标记为看涨)
- 信号生成规则:比如当看涨样本占比>50%时输出买入信号
复现数据与特征计算
用python-binance或ccxt获取和TradingView完全一致的K线数据(周期、时间范围),然后用TA-Lib或自定义函数实现特征计算,确保和TradingView的指标输出完全匹配(可以逐K线对比数值)。示例代码片段:import talib import numpy as np import ccxt # 获取Binance历史K线 binance = ccxt.binance({'apiKey': 'YOUR_KEY', 'secret': 'YOUR_SECRET'}) bars = binance.fetch_ohlcv('BTC/USDT', '1h', limit=200) closes = np.array([bar[4] for bar in bars]) volumes = np.array([bar[5] for bar in bars]) # 计算RSI(和PineScript参数一致) rsi = talib.RSI(closes, timeperiod=14) # 计算MACD macd, signal, hist = talib.MACD(closes, fastperiod=12, slowperiod=26, signalperiod=9)实现kNN算法
严格按照PineScript的逻辑编写kNN:- 标准化特征(如果PineScript做了归一化,比如将特征缩放到0-1区间)
- 计算当前样本与历史样本的距离
- 筛选最近的k个样本,统计涨跌标签
- 生成交易信号
示例代码片段:
def knn_predict(current_features, historical_features, labels, k=5): # 计算欧氏距离 distances = np.sqrt(np.sum((historical_features - current_features)**2, axis=1)) # 获取最近k个样本的索引 nearest_indices = distances.argsort()[:k] # 统计标签 nearest_labels = labels[nearest_indices] # 投票生成信号:1=看涨,0=看跌 return 1 if np.sum(nearest_labels) > k//2 else 0 # 准备特征矩阵和标签 features = np.column_stack((rsi[1:], macd[1:], volumes[1:])) # 标签:下一根K线是否上涨 labels = np.where(closes[1:] > closes[:-1], 1, 0) # 预测当前信号 current_features = features[-1] signal = knn_predict(current_features, features[:-1], labels[:-1], k=5)验证一致性
把Python生成的信号和TradingView上的指标信号逐K线对比,调整细节直到完全匹配,这是提升准确率的关键。
2. 实现Binance平台持续执行交易
配置API与交易基础逻辑
使用python-binance库对接Binance API,注意将密钥存到环境变量避免硬编码:from binance.client import Client import os client = Client(os.getenv('BINANCE_API_KEY'), os.getenv('BINANCE_API_SECRET'))编写持续运行的循环
用无限循环定期获取数据、生成信号、执行交易,添加异常处理避免崩溃:import time while True: try: # 获取最新K线数据 bars = client.get_klines(symbol='BTCUSDT', interval=Client.KLINE_INTERVAL_1HOUR, limit=200) closes = np.array([float(bar[4]) for bar in bars]) # ... 省略特征计算和kNN信号生成步骤 ... # 检查持仓状态 balance = client.get_asset_balance(asset='BTC') has_position = float(balance['free']) > 0.0001 # 执行交易 if signal == 1 and not has_position: # 市价买入,用USDT余额的10% usdt_balance = float(client.get_asset_balance(asset='USDT')['free']) order = client.create_order( symbol='BTCUSDT', side=Client.SIDE_BUY, type=Client.ORDER_TYPE_MARKET, quoteOrderQty=usdt_balance * 0.1 ) print(f"买入订单执行:{order}") elif signal == 0 and has_position: # 市价卖出全部持仓 btc_balance = float(balance['free']) order = client.create_order( symbol='BTCUSDT', side=Client.SIDE_SELL, type=Client.ORDER_TYPE_MARKET, quantity=btc_balance ) print(f"卖出订单执行:{order}") # 等待下一个周期(比如55分钟,避免重复获取同一K线) time.sleep(55 * 60) except Exception as e: print(f"错误发生:{e}") time.sleep(60) # 出错后等待1分钟重试保持程序持续运行
- 在VS Code中直接运行脚本,或者用
nohup python your_script.py &(Linux/macOS)让程序后台运行 - 用Binance测试网先做模拟交易,验证逻辑没问题再切换到实盘
- 添加日志记录,将交易和信号信息写入文件,方便后续排查
- 在VS Code中直接运行脚本,或者用
内容的提问来源于stack exchange,提问作者user20900234
相关产品推荐
相关产品推荐

