使用 Python 怎么实现自动交易加密货币,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
将在本教程使用如下工具:
币安专业交易视图(已经有其他人做了数据可视化,所以不需要重复造轮子)
Jupyter 笔记本:用于数据科学任务
Pythonic:作为整体框架
PythonicDaemon :作为终端运行(仅适用于控制台和 Linux)
为了使加密货币交易机器人尽可能做出正确的决定,以可靠的方式获取资产的美国线(OHLC)数据是至关重要。你可以使用 Pythonic 的内置元素,还可以根据自己逻辑来对其进行扩展。
一般的工作流程:
鸿蒙官方战略合作共建——HarmonyOS技术社区
与币安时间同步
下载 OHLC 数据
从文件中把 OHLC 数据加载到内存
比较数据集并扩展更新数据集
这个工作流程可能有点夸张,但是它能使得程序更加健壮,甚至在停机和断开连接时,也能平稳运行。
一开始,你需要 币安 OHLC 查询 元素和一个 基础操作 元素来执行你的代码。
数据挖掘工作流程
OHLC 查询设置为每隔一小时查询一次 TRXBTC 资产对(波场/比特币)。
配置 OHLC 查询元素
其中输出的元素是 Pandas DataFrame。你可以在 基础操作 元素中使用 输入 变量来访问 DataFrame。其中,将 Vim 设置为 基础操作 元素的默认代码编辑器。
使用 Vim 编辑基础操作元素
具体代码如下:
import pickle, pathlib, osimport pandas as pd outout = None if isinstance(input, pd.DataFrame): file_name = 'TRXBTC_1h.bin' home_path = str(pathlib.Path.home()) data_path = os.path.join(home_path, file_name) try: df = pickle.load(open(data_path, 'rb')) n_row_cnt = df.shape[0] df = pd.concat([df,input], ignore_index=True).drop_duplicates(['close_time']) df.reset_index(drop=True, inplace=True) n_new_rows = df.shape[0] - n_row_cnt log_txt = '{}: {} new rows written'.format(file_name, n_new_rows) except: log_txt = 'File error - writing new one: {}'.format(e) df = input pickle.dump(df, open(data_path, "wb" )) output = df
首先,检查输入是否为 DataFrame 元素。然后在用户的家目录(~/
)中查找名为 TRXBTC_1h.bin
的文件。如果存在,则将其打开,执行新代码段(try
部分中的代码),并删除重复项。如果文件不存在,则触发异常并执行 except
部分中的代码,创建一个新文件。
只要启用了复选框 日志输出,你就可以使用命令行工具 tail
查看日志记录:
$ tail -f ~/Pythonic_2020/Feb/log_2020_02_19.txt
出于开发目的,现在跳过与币安时间的同步和计划执行,这将在下面实现。
下一步是在单独的 网格 中处理评估逻辑。因此,你必须借助返回元素 将 DataFrame 从网格 1 传递到网格 2 的第一个元素。
在网格 2 中,通过使 DataFrame 通过 基础技术分析 元素,将 DataFrame 扩展包含 EMA 值的一列。
在网格 2 中技术分析工作流程
配置技术分析元素以计算 25 个值的 EMA。
配置技术分析元素
当你运行整个程序并开启 技术分析 元素的调试输出时,你将发现 EMA-25 列的值似乎都相同。
输出中精度不够
这是因为调试输出中的 EMA-25 值仅包含六位小数,即使输出保留了 8 个字节完整精度的浮点值。
为了能进行进一步处理,请添加 基础操作 元素:
网格 2 中的工作流程
使用 基础操作 元素,将 DataFrame 与添加的 EMA-25 列一起转储,以便可以将其加载到 Jupyter 笔记本中;
将扩展后的 DataFrame 存储到文件中
在 Juypter 笔记本中开发评估策略,让你可以更直接地访问代码。要加载 DataFrame,你需要使用如下代码:
用全部小数位表示
你可以使用 iloc 和列名来访问最新的 EMA-25 值,并且会保留所有小数位。
你已经知道如何来获得最新的数据。上面示例的最后一行仅显示该值。为了能将该值拷贝到不同的变量中,你必须使用如下图所示的 .at
方法方能成功。
你也可以直接计算出你下一步所需的交易参数。
买卖决策
如上面代码所示,我选择 0.009 作为交易参数。但是我怎么知道 0.009 是决定交易的一个好参数呢? 实际上,这个参数确实很糟糕,因此,你可以直接计算出表现最佳的交易参数。
假设你将根据收盘价进行买卖。
回测功能
在此示例中,buy_factor
和 sell_factor
是预先定义好的。因此,发散思维用直接计算出表现最佳的参数。
嵌套的 for 循环,用于确定购买和出售的参数
这要跑 81 个循环(9x9),在我的机器(Core i7 267QM)上花费了几分钟。
5Af65b11f637ce55589036c357df10.png" target="_blank"><img src="https://s5.51cto.com/oss/202103/29/895Af65b11f637ce55589036c357df10.png" width="auto" border="0" height="auto" alt="" title="">
将利润与相关的交易参数按降序排序
当你打印出列表时,你会看到 0.002 是最好的参数。
交易要素和收益的有序列表
当我在 2020 年 3 月写下这篇文章时,价格的波动还不足以呈现出更理想的结果。我在 2 月份得到了更好的结果,但即使在那个时候,表现最好的交易参数也在 0.002 左右。
现在开始新建一个网格以保持逻辑清晰。使用 返回 元素将带有 EMA-25 列的 DataFrame 从网格 2 传递到网格 3 的 0A 元素。
在网格 3 中,添加 基础操作 元素以执行评估逻辑。这是该元素中的代码:
实现评估策略
如果输出 1
表示你应该购买,如果输出 2
则表示你应该卖出。 输出 0
表示现在无需操作。使用 分支 元素来控制执行路径。
5A397c4d0c592d6c5e8d54b81c.png" target="_blank">
分支元素:网格 3,2A 位置
因为 0
和 -1
的处理流程一样,所以你需要在最右边添加一个分支元素来判断你是否应该卖出。
分支元素:网格 3,3B 位置
网格 3 应该现在如下图所示:
网格 3 的工作流程
由于无需在一个周期中购买两次,因此必须在周期之间保留一个持久变量,以指示你是否已经购买。
你可以利用 栈 元素来实现。顾名思义,栈元素表示可以用任何 Python 数据类型来放入的基于文件的栈。
你需要定义栈仅包含一个布尔类型,该布尔类型决定是否购买了(True
)或(False
)。因此,你必须使用 False
来初始化栈。例如,你可以在网格 4 中简单地通过将 False
传递给栈来进行设置。
将 False 变量传输到后续的栈元素中
在分支树后的栈实例可以进行如下配置:
设置栈元素
在栈元素设置中,将 对输入的操作 设置成 无。否则,布尔值将被 1
或 0
覆盖。
该设置确保仅将一个值保存于栈中(True
或 False
),并且只能读取一个值(为了清楚起见)。
在栈元素之后,你需要另外一个 分支 元素来判断栈的值,然后再放置 币安订单 元素。
判断栈中的变量
将币安订单元素添加到分支元素的 True
路径。网格 3 上的工作流现在应如下所示:
网格 3 的工作流程
币安订单元素应如下配置:
编辑币安订单元素
你可以在币安网站上的帐户设置中生成 API 和密钥。
在币安账户设置中创建一个 API 密钥
在本文中,每笔交易都是作为市价交易执行的,交易量为 10,000 TRX(2020 年 3 月约为 150 美元)(出于教学的目的,我通过使用市价下单来演示整个过程。因此,我建议至少使用限价下单。)
如果未正确执行下单(例如,网络问题、资金不足或货币对不正确),则不会触发后续元素。因此,你可以假定如果触发了后续元素,则表示该订单已下达。
这是一个成功的 XMRBTC 卖单的输出示例:
成功卖单的输出
该行为使后续步骤更加简单:你可以始终假设只要成功输出,就表示订单成功。因此,你可以添加一个 基础操作 元素,该元素将简单地输出 True 并将此值放入栈中以表示是否下单。
如果出现错误的话,你可以在日志信息中查看具体细节(如果启用日志功能)。
5A5046bc2.png" target="_blank"><img src="https://s6.51cto.com/oss/202103/29/adafdf0329f7dd08340b4c15A5046bc2.png" width="600" border="0" height="auto" alt="" title="">
在网格 1,1A 位置的币安调度器
由于币安调度器元素只执行一次,因此请在网格 1 的末尾拆分执行路径,并通过将输出传递回币安调度器来强制让其重新同步。
网格 1:拆分执行路径
5A 元素指向 网格 2 的 1A 元素,并且 5B 元素指向网格 1 的 1A 元素(币安调度器)。
你可以在本地计算机上全天候 7×24 小时运行整个程序,也可以将其完全托管在廉价的云系统上。例如,你可以使用 Linux/FreeBSD 云系统,每月约 5 美元,但通常不提供图形化界面。如果你想利用这些低成本的云,可以使用 PythonicDaemon,它能在终端中完全运行。
PythonicDaemon 控制台
PythonicDaemon 是基础程序的一部分。要使用它,请保存完整的工作流程,将其传输到远程运行的系统中(例如,通过安全拷贝协议 SCP),然后把工作流程文件作为参数来启动 PythonicDaemon:
$ PythonicDaemon trading_bot_one
为了能在系统启动时自启 PythonicDaemon,可以将一个条目添加到 crontab 中:
# crontab -e
5Affe9f04ec1f392dab2124b8.png" target="_blank"><img src="https://s6.51cto.com/oss/202103/29/a0b9ace5Affe9f04ec1f392dab2124b8.png" width="auto" border="0" height="auto" alt="" title="">
在 Ubuntu 服务器上的 Crontab
看完上述内容,你们掌握使用 Python 怎么实现自动交易加密货币的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。