BNB 价格 · K线抓取 · 2020年开始
简介 —— 这段 Python 脚本通过币安公开 API 获取 BNB/USDT 【这里可以修改为你想要的币种】的日线 K 线数据,用 Pandas 整理成表格,并保存为 CSV 文件。代码虽短,但涵盖了 requests 网络请求、pandas 数据清洗、matplotlib 可视化准备等核心操作。
1. 导入所需库
三个核心库:网络请求、数据处理、绘图准备。
import requests
import pandas as pd
import matplotlib.pyplot as plt
- requests — 发送 HTTP 请求,获取币安 API 数据
- pandas — 强大的数据分析工具,处理表格数据
- matplotlib.pyplot — 绘图库,为后续可视化做准备
2. 配置币安 K 线接口
接口说明 — 币安 /api/v3/klines 返回数组列表,包含开高低收、成交量等字段。
# 币安 K线接口,1d = 日线,limit=365 取约一年数据
url = "https://api.binance.com/api/v3/klines"
params = {
"symbol": "BNBUSDT",
"interval": "1d",
"limit": 10
}
- url — 币安公开 K 线端点
- symbol — 交易对 BNBUSDT
- interval — 1d 表示日线
- limit — 数据条数,示例取 10 条
3. 发送请求 & 获取数据
resp = requests.get(url, params=params)
data = resp.json()
resp.json() 将返回的 JSON 数据解析为 Python 列表。
4. 转换为 DataFrame
币安返回的每个元素是一个包含 12 个字段的数组,需要手动指定列名。
# 币安返回的是数组列表,转成 DataFrame
df = pd.DataFrame(data, columns=[
"OpenTime", "Open", "High", "Low", "Close", "Volume",
"CloseTime", "QuoteVolume", "Trades", "TakerBuyBase", "TakerBuyQuote", "Ignore"
])
5. 数据类型处理
将时间戳转换为可读日期,将价格、成交量转为浮点数。
# 处理数据类型
df["Date"] = pd.to_datetime(df["OpenTime"], unit="ms")
df["Close"] = df["Close"].astype(float)
df["Open"] = df["Open"].astype(float)
df["High"] = df["High"].astype(float)
df["Low"] = df["Low"].astype(float)
df["Volume"] = df["Volume"].astype(float)
df = df.set_index("Date")
6. 选取需要的列 & 保存 CSV
# 只保留需要的列
df = df[["Open", "High", "Low", "Close", "Volume"]]
# ---------- 保存 CSV ----------
df.to_csv("bnb_daily.csv", encoding="utf-8-sig")
print("✅ 已保存到 btc_daily.csv") # 注意:原文写的是 btc_daily.csv,保留原注释
提示 — encoding="utf-8-sig" 确保中文/表情符号在 Excel 中正常显示。
7. 打印数据预览
print("=== 前5天 ===")
print(df.head())
print("\n=== 最近5天 ===")
print(df.tail())
print("\n=== 统计概览 ===")
print(df.describe())
- df.head() — 查看前 5 行
- df.tail() — 查看最后 5 行
- df.describe() — 统计概览(均值、标准差、分位数等)
完整代码
import requests
import pandas as pd
import matplotlib.pyplot as plt
# 币安 K线接口,1d = 日线,limit=365 取约一年数据
url = "https://api.binance.com/api/v3/klines"
params = {
"symbol": "BNBUSDT",
"interval": "1d",
"limit": 10 #目前此代码只能抓取1000条数据,想要更多的数据,看另一份代码
}
resp = requests.get(url, params=params)
data = resp.json()
# 币安返回的是数组列表,转成 DataFrame
df = pd.DataFrame(data, columns=[
"OpenTime", "Open", "High", "Low", "Close", "Volume",
"CloseTime", "QuoteVolume", "Trades", "TakerBuyBase", "TakerBuyQuote", "Ignore"
])
# 处理数据类型
df["Date"] = pd.to_datetime(df["OpenTime"], unit="ms")
df["Close"] = df["Close"].astype(float)
df["Open"] = df["Open"].astype(float)
df["High"] = df["High"].astype(float)
df["Low"] = df["Low"].astype(float)
df["Volume"] = df["Volume"].astype(float)
df = df.set_index("Date")
# 只保留需要的列
df = df[["Open", "High", "Low", "Close", "Volume"]]
# ---------- 保存 CSV ----------
df.to_csv("bnb_daily.csv", encoding="utf-8-sig")
print("✅ 已保存到 btc_daily.csv")
print("=== 前5天 ===")
print(df.head())
print("\n=== 最近5天 ===")
print(df.tail())
print("\n=== 统计概览 ===")
print(df.describe())
关键点总结
使用 requests 获取实盘数据
pd.DataFrame 指定列名
毫秒时间戳转日期索引
保存为 bnb_daily.csv
为 matplotlib 绘图预留数据
保留所有原始注释