“我先学明白再进场,跑赢 90% 冲动党。”——这大概是每位刚接触加密货币的投资者的共同心声。本文将以 加密货币模拟器 为核心,分享一个完全 零成本、用 Python 就能跑 的可视化沙盘。你无需注册交易所、不需要真实资金,只要一台电脑就能把交易策略从理论拉到实战倒计时。
项目总览:从 0 到可运行的极简模拟器
我们的目标分三阶段:
- 数据源:抓取 2018 年 3 月 7 日-16 日 BTC、ETH 等历史行情,搭建本地 SQLite 数据库。
- 核心引擎:写 100 行不到的脚本,让程序自动计算最佳出仓价、盈亏百分比。
- 体验升级:加上打字特效、提示用户择时入场,模拟器立刻有了“交易大片”感。
😎 快去体验完整代码的魅力👉 立即点击查看加密模拟器高阶玩法。
前期准备:环境、文件与数据
- 运行环境:Python 2.7(演示源码默认),也可平滑迁移到 3.x
- 必备库:sqlite3(内置)、datetime
- 数据文件:currency_monitor.db(已剔除外链,可自建或通过脚本爬取历史 K 线)
把数据文件丢进项目根目录,结构与 GitHub 开源仓一致即可跑通。
编写流程拆解
第一步:向用户问好——欢迎页函数 welcome()
def welcome():
dramaticTyping("Simple Crypto Trading Simulator\n")
dramaticTyping("Hey Yo, you are back in time. It's March 7, 2018 7:39 AM\n")
dramaticTyping("Fetching prices...\n")
- 关键词自然植入:加密货币模拟器,历史行情回测
- 戏剧性打字效果用 drama.py 实现(文末给出源码)
第二步:历史价格抓取 fetchCoins()
import sqlite3
def fetchCoins():
conn = sqlite3.connect('./currency_monitor.db')
cursor = conn.cursor()
sql = "SELECT first_leg, ask FROM prices WHERE timestamp='1520408341.52' AND second_leg='USD';"
cursor.execute(sql)
rows = cursor.fetchall()
coins = {}
for base, ask_px in rows:
if base not in coins:
coins[base] = round(ask_px, 4)
dramaticTyping("{} — ${}\n".format(base, coins[base]))
return coins
小贴士:
- 查询条件固定为“2018-03-07 07:39 UTC”,可改成变量让模拟器支持更多日期。
- 核心关键词:回测数据、模拟价格抓取。
第三步:让用户下单 inputBuy()
def inputBuy(coins):
dramaticTyping("选择要买入的加密货币(例:BTC、ETH):\n")
symbol = raw_input("").upper()
if symbol not in coins:
dramaticTyping("暂不支持该币种,请重新输入。\n")
return None, None
dramaticTyping("计划买入数量:\n")
qty = float(raw_input(""))
return symbol, qty
第四步:运行模拟 runSimulation()
主要任务:
- 读取 3 月 7 日至 16 日间该币的最高 卖出 价作为“最佳出仓价”。
- 计算盈亏百分比。
def runSimulation(bought_px, qty, symbol):
value_then = bought_px * qty
best_px, ts = fetchBestBidPriceFromDB(symbol)
value_best = best_px * qty
delta = (value_best - value_then) / value_then * 100
dramaticTyping("最佳出仓价出现时间: {}\n".format(datetime.datetime.fromtimestamp(float(ts))))
dramaticTyping("资产变化: ${} -> ${} ({:.2f}%)".format(
round(value_then, 4), round(value_best, 4), delta))
抓取最佳价的 SQL:
SELECT max(bid), timestamp FROM prices WHERE first_leg=? AND second_leg='USD' AND timestamp>1520408341.52;
FAQ · 常见问题第一期
Q1:数据库可以替换为实时行情吗?
A:可以。 fetchCoins() 用交易所 API 替换 SQLite 查询即可。若在行业高峰期调用,务必做频率限制。
Q2:Python 2.7 会不会太旧?
A:演示代码兼容 2.7,只改动 print
与 raw_input
名称即可无缝迁移 3.x。
Q3:如何测试自己的交易策略?
A:把 strategy.py 作为外部模块引入,将买卖信号写入 runSimulation()
的判定逻辑,蒙特卡罗跑万次即可得出策略胜率、最大回撤。
Q4:初学者能否快速上手?
A:完全零基础也能操作。文章提供完整注释,读者只需复制三个 py 文件到同级目录,执行 python run.py
。
Q5:能否保存每次回测报告?
A:用 CSV 或 SQLite 记录每笔下单、止盈、止损即可。后续可接可视化库 matplotlib / plotly 做资产曲线。
Q6:模拟器和真实交易差距在哪?
A:模拟器默认零滑点、无限流动性。想提高拟真度,可在撮合逻辑中引入随机滑点及手续费模型。
打字特效 drama.py
把 drama.py
引入任何想增加电影质感的模块:
import time, sys
def dramaticTyping(msg):
for ch in msg:
sys.stdout.write(ch)
sys.stdout.flush()
time.sleep(0.03)
别看只有三五行,却把“回测试单”秒变“剧本杀”。
代码整合:一键跑通的 run.py
from simulator import runSimulation
from drama import dramaticTyping
from fetcher import fetchCoins, inputBuy
if __name__ == '__main__':
welcome()
coins = fetchCoins()
symbol, qty = inputBuy(coins)
if symbol:
runSimulation(coins[symbol], qty, symbol)
运行效果示例(节选):
Simple Crypto Trading Simulator
...
BTC — $9865.11
ETH — $742.38
计划买入 BTC 0.1 枚
最佳出仓价出现时间: 2018-03-12 02:00:00
资产变化: $986.51 -> $1153.20 (+16.9%)
进阶空间:把玩具变成工具
- 消息队列 + WebSocket:接入实时 K 线,演示现货与合约差异。
- 策略工厂:封装 MACD、RSI、布林轨,让模拟器同时跑 10 条策略横向对比。
- Dash / Streamlit 前端:拖拉式调参,一分钟即可体验 加密货币回测 在线裸眼 3D 曲线。
👉 拓展阅读:想用更专业的回测框架?点开获取成熟开发者都在用的完整工具链👉 深度体验零成本交易策略验证。
彩蛋:把模拟器开源出去
如果本文点燃了你的热情,不妨把项目更名为 MyFirstCryptoLab
,开放 Issue 收集新策略。三年后,当你真的重仓布局 BTC 之际,回来看这段亲手写的代码,会比任何 K 线更动人。