基于LLM决策的Crypto交易应用
在本文中,我们将探索一个 Python 脚本,该脚本旨在通过将区块链交互与语言学习模型 (LLM) 相结合,实现币安智能链 (BSC) 上的交易自动化,以供决策制定。
一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK
在本文中,我们将探索一个 Python 脚本,该脚本旨在通过将区块链交互与语言学习模型 (LLM) 相结合,实现币安智能链 (BSC) 上的交易自动化,以供决策制定。此外,我们将讨论迁移到 Web3.py 版本 7,重点介绍增强代码可读性并符合 Python 标准的关键更改和改进。
1、交易机器人概述
交易机器人执行以下关键功能:
- 环境设置:它使用 dotenv 库加载基本环境变量,如钱包地址、API 密钥和配置设置。此设置可确保敏感信息的安全,并且脚本保持可配置。
- 日志记录机制:自定义日志记录功能记录所有操作和错误,将它们写入日志文件并将它们与时间戳一起打印到控制台。这有助于监控机器人的活动和调试问题。
- 余额检索:机器人从指定的钱包地址获取 BNB 和 BUSD 代币的余额。它处理以太币和代币余额,将值转换为人类可读的格式并优雅地管理异常。
- LLM 决策:通过 Ollama API 使用 LLM,机器人会制定包含当前钱包余额的提示。然后,LLM 决定是否执行“买入”、“卖出”或“持有”操作,并为其决策提供简要理由。
- 交易执行:根据 LLM 的决定,机器人通过交换代币来执行交易。它利用预定义函数(busd2bnb 和 bnb2busd)在区块链上执行实际的代币交换。
- 持续运行:机器人循环运行,定期做出决策并执行交易。它包括针对用户中断和意外错误的异常处理,确保长期稳健运行。
主要功能:
- 与 LLM 集成:通过整合 LLM 进行决策,机器人可以利用 AI 来潜在地增强交易策略,从而智能地适应市场条件。
- 模块化设计:脚本被组织成处理特定任务(例如日志记录、余额检查、决策和交易执行)的函数。这种模块化使代码更易于维护和扩展。
- 错误处理:全面的错误处理可确保正确记录异常,并且机器人可以在出现问题时正常恢复或退出。
2、迁移到 Web3.py v7
随着 Web3.py 版本 7 的发布,有几个显着的变化,这些变化提高了库与 Python 标准的一致性和整体代码可读性。迁移到此版本涉及更新方法名称、中间件使用和错误处理实践。
2.1 关键变化
a) 方法重命名:方法已重命名以遵循 snake_case 约定。例如:
- toWei 现在是 to_wei。
- fromWei 现在是 from_wei。
b) 中间件更新:处理权威证明网络的中间件已重命名:
- geth_poa_middleware 现在是 ExtraDataToPOAMiddleware。
c) 增强的错误处理:库现在提供更细粒度的 Web3 操作特定异常,例如 ContractLogicError 和 Web3ValueError,从而实现更好的错误管理。
d) 交易处理:对于不支持 EIP-1559(以太坊交易费机制)的网络(如 BSC),代码继续使用 gas_price 而不是较新的费用参数。
2.2 迁移的好处
- 提高可读性:使用 snake_case 使代码更符合 Python 的样式指南,从而增强了可读性。
- 更好的错误管理:特定异常有助于快速查明问题并适当处理它们,而无需通用异常块。
- 面向未来:保持最新库版本的更新可确保更好的支持、安全更新以及与其他工具和库的兼容性。
2.3 迁移后的功能
迁移后,脚本继续执行其核心功能并进行了改进:
- 区块链连接:使用更新的中间件建立与 BSC 网络的连接。
- 资金验证:检查钱包余额以确保有足够的资金来支付交易金额和相关的 gas 费用。
- 合约交互:与 PancakeSwap 路由器合约交互以获取预期的输出金额并执行 BNB 和 BUSD 之间的交换。
- 交易执行:使用更新的方法名称构建、签署和发送交易并适当处理交易收据。
- 异常处理:利用新的 Web3 特定异常更有效地管理错误,提供更清晰的错误消息和恢复路径。
将 LLM 集成到交易机器人中为交易策略引入了一个智能层,有可能增强基于复杂数据分析的决策。迁移到 Web3.py 版本 7 使代码库与现代 Python 实践保持同步,从而提高了可读性和可维护性。
3、实现经过
理解并应用这些更新,开发人员可以创建更强大、更高效的区块链应用程序。及时了解库更新不仅有利于当前项目,还可以确保长期兼容性和支持。
3.1 LLM + Ollama
此 Python 脚本使用 Web3、币安智能链 (BSC) 和语言模型 (LLM) 进行智能决策,自动执行 BNB 和 BUSD 之间的交易决策。该脚本集成了 Ollama API 查询,以根据钱包余额确定是“买入”、“卖出”还是“持有”,并使用智能合约执行代币交换。API 响应的超时时间已延长以提高可靠性。
注意:此脚本仅用于教育目的,不适用于现实世界的交易或加密货币策略应用程序。
3.2 代币兑换
代码连接到币安智能链 (BSC),检查钱包余额,使用 PancakeSwap 将 BNB 兑换为 BUSD,并确保交易成本得到覆盖。它从合约中检索预期输出,构建、签署并发送交易,然后等待收据:
from dotenv import load_dotenv
import sys
import os
from web3 import Web3
from web3.middleware import ExtraDataToPOAMiddleware
from web3.exceptions import ContractLogicError, Web3ValueError
load_dotenv()
private_key = os.getenv('PRIVATE_KEY')
wallet_address = os.getenv('WALLET_ADDRESS')
if not private_key or not wallet_address:
print("Set PRIVATE_KEY and WALLET_ADDRESS in environment.")
sys.exit()
web3 = Web3(Web3.HTTPProvider("https://bsc-dataseed.binance.org/"))
web3.middleware_onion.inject(ExtraDataToPOAMiddleware(), layer=0)
if not web3.is_connected():
print("Connection failed to BSC")
sys.exit()
balance = web3.eth.get_balance(wallet_address)
amount_in = web3.to_wei(0.05, 'ether')
gas_price = web3.eth.gas_price
tx_cost = 250000 * gas_price + amount_in
if balance < tx_cost:
print(f"Insufficient funds: Balance {web3.from_wei(balance, 'ether')} BNB, Required {web3.from_wei(tx_cost, 'ether')} BNB")
sys.exit()
contract = web3.eth.contract(
address="zzz", # Replace with the actual contract address
abi=[
{
"inputs": [
{"internalType": "uint256", "name": "amountIn", "type": "uint256"},
{"internalType": "address[]", "name": "path", "type": "address[]"}
],
"name": "getAmountsOut",
"outputs": [{"internalType": "uint256[]", "name": "amounts", "type": "uint256[]"}],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{"internalType": "uint256", "name": "amountOutMin", "type": "uint256"},
{"internalType": "address[]", "name": "path", "type": "address[]"},
{"internalType": "address", "name": "to", "type": "address"},
{"internalType": "uint256", "name": "deadline", "type": "uint256"}
],
"name": "swapExactETHForTokens",
"outputs": [{"internalType": "uint256[]", "name": "amounts", "type": "uint256[]"}],
"stateMutability": "payable",
"type": "function"
}
]
)
try:
amounts_out = contract.functions.getAmountsOut(amount_in, ["zzz", "zzz"]).call() # Replace "zzz" with actual token addresses
amountOutMin = int(amounts_out[1] * 0.99)
deadline = web3.eth.get_block('latest')['timestamp'] + 600
transaction = contract.functions.swapExactETHForTokens(
amountOutMin, ["zzz", "zzz"], wallet_address, deadline # Replace "zzz" with actual token addresses
).build_transaction({
'from': wallet_address,
'value': amount_in,
'gas': 250000,
'gas_price': gas_price,
'nonce': web3.eth.get_transaction_count(wallet_address),
})
signed_txn = web3.eth.account.sign_transaction(transaction, private_key=private_key)
tx_hash = web3.eth.send_raw_transaction(signed_txn.rawTransaction)
tx_receipt = web3.eth.wait_for_transaction_receipt(tx_hash)
print(f"Success: {tx_receipt.transactionHash.hex()}, Swapped {web3.from_wei(amount_in, 'ether')} BNB for {web3.from_wei(amounts_out[1], 'ether')} BUSD")
except ContractLogicError as e:
print(f"Contract error: {e}")
except Web3ValueError as e:
print(f"Web3 error: {e}")
except Exception as e:
print(f"Error: {e}")
print("Script completed.")
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。