构建Crypto投资组合跟踪器
本文将指导你如何使用Python构建自己的加密货币投资组合跟踪器。

一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK
欢迎来到我的教程系列的第一部分,该系列将指导你如何使用Python构建自己的加密货币投资组合跟踪器。在这个系列中,我将带您你成创建自定义投资组合应用程序的过程,使你能够在Python中获取实时价格报价并跟踪你的投资组合表现。
在这篇文章中,我将通过解释如何使用CoinMarketCap API获取实时加密货币数据来启动这个系列。到本教程结束时,你将对如何以结构化和可重复的方式检索实时价格有一个基本的了解,这将是构建应用程序后端的基础。让我们开始吧!
第一部分:从CoinMarketCap API获取数据
1、CoinMarketCap API
CoinMarketCap API是一个强大的工具,允许开发人员获取数千种加密货币的实时和历史数据,包括价格、市值、交易量等。凭借其友好的文档 [1] 和丰富的功能,CoinMarketCap API被加密货币社区中的许多开发者广泛使用。
对于这个项目,我将使用API的免费版本,该版本每月允许进行10,000次调用。此版本没有完整的历史信息,但它确实保留了过去一个月、一周和24小时的数据。
第一步是在CoinMarketCap.com上注册一个帐户。创建完成后,导航到右上方搜索栏上方的API部分。

然后,您应该会看到类似下面的屏幕。在API密钥下,有一个生成密钥的选项。点击它并将您的密钥存储在安全的地方。(由于我已经创建了我的密钥,所以看起来与我的不同)

2、发起请求
现在我们已经设置了API并获得了密钥,我们可以开始拉取数据了。API有八个端点和四个端点路径可用。


对于这个项目,我们将使用以下端点。
https://pro-api.coinmarketcap.com/v2/cryptocurrency/quotes/latest
3、Python包
在深入研究并开始发起请求之前,花些时间设置一个适当的开发环境是很重要的。为此,我将使用conda,但任何Python虚拟环境管理器都可以。您需要安装pandas
和requests
包。以下是我在使用的版本。
python==3.9.7
pandas==1.4.2
requests==2.26.0
4、请求头
对于这个项目,我正在使用requests
中的Session
对象。这个对象允许您为重复的API请求存储持久的头配置。包含之前生成的API密钥的头字典被传递给Session
对象并存储起来,因此后续使用此会话变量发出的所有请求都将嵌入API密钥。
from requests import Session
import json
url = 'https://pro-api.coinmarketcap.com/v2/cryptocurrency/quotes/latest'
headers = {
'Accepts': 'application/json',
'X-CMC_PRO_API_KEY': '<ENTER API KEY HERE>',
}
session = Session()
session.headers.update(headers)
5、一个简单的请求
现在会话已配置好,我们准备提取一些实际数据。为此,我创建了一个名为参数的字典,然后将其传递给session.get()
,指定要获取哪个加密货币符号的数据。URL是之前定义的路径,指向/quotes/latest
路径。最后,这些数据从JSON加载到字典中。
def get_response(symbol):
parameters = {
'symbol': symbol
}
response = session.get(url, params=parameters)
return json.loads(response.text)
get_response('BTC')
你应该会得到像下面这样的大块文本。

6、数据处理
很高兴我们得到了一个响应,但是如果您查看这个大块文本,您会发现只有一些数据是有用的。让我们创建一个函数来提取我们需要的信息。
此函数将分解字典并剥离无用的信息,直到达到我们想要的内容。到达那里后,它将字典转换为DataFrame。
def clean_response(symbol):
data = get_response(symbol)
new_dict = data['data'][symbol][0]['quote']['USD']
new_dict['symbol'] = symbol
df = pd.DataFrame(new_dict, index=[0])
df.set_index('symbol', inplace=True)
return df
df = clean_response('BTC')

我们可以使用以下命令查看所有列:
df.columns

7、请求多个符号
现在我们知道如何为单个加密货币请求报价,是时候扩展这个过程以同时为多个符号请求报价了。我们需要更改的第一个东西是请求的结构。API要求一个逗号分隔的字符串(不是列表),我们可以从列表创建:
symbols = ['BTC','ETH','SOL']
print(','.join(symbols))
这可以很容易地集成到之前的请求函数中。
def get_response_multiple(symbols):
parameters = {
'symbol': ','.join(symbols)
}
response = session.get(url, params=parameters)
return json.loads(response.text)
get_response_multiple(['BTC','ETH','SOL'])
如果我们现在尝试为上面列出的三个符号请求数据,那么我们将得到像以前一样的长块,这次每个符号都会重复。让我们修改清理函数以处理从多个符号返回的数据。
下面,我使用列表推导式遍历每个请求的符号,并重新构造响应字典以包含符号条目。整个字典列表随后被转换为DataFrame。
def clean_response_multiple_2(symbols):
data = get_response_multiple(symbols)
df = pd.DataFrame(
[{'symbol': symbol, **data['data'][symbol][0]['quote']['USD']} for symbol in symbols]
).set_index('symbol')
return df
symbols = ['BTC','ETH','SOL']
df = clean_response_multiple(symbols)

在本文中,我们回顾了CoinMarketCap API的基础知识以及如何在一个请求中获取和处理多个加密货币的数据。这将成为我们投资组合跟踪器应用程序后端的基础。
第二部分:使用Streamlit和SQLite3的基本CRUD应用程序
这是系列文章的第二部分,我将在其中用Python构建一个自定义的加密货币投资组合跟踪器。在上一篇文章中,我们回顾了CoinMarketCap API,并展示了如何获取实时加密货币价格报价。
在这篇文章中,我们将使用Streamlit和SQLite3设置投资组合跟踪应用程序的基本框架,使用户能够输入自己的自定义投资组合信息。到本文结束时,我们将学习:
- SQLite3数据库操作的基础知识
- 使用Streamlit对SQLite3数据库执行CRUD操作
- 使用Streamlit构建多页面应用程序
8、SQLite3
SQLite3是一个轻量级、自包含的SQL数据库引擎,随Python一起预装。它非常适合小型个人应用程序,例如我们的加密货币投资组合跟踪器,因为它不需要单独的服务器和数据库管理系统。数据库以.db
文件的形式存储在磁盘上。
9、Streamlit
Streamlit是一个开源的应用程序框架,主要用于机器学习和数据科学项目。它允许您快速轻松地创建交互式Web应用程序,无需HTML或CSS。
10、环境设置
每个Python环境都已将SQLite3作为依赖项添加,因此无需通过pip安装任何额外的库。但是,Streamlit需要通过您使用的Python包管理器进行安装。下面是我们运行中的requirements.txt
内容。
python==3.9.7
pandas==1.4.2
requests==2.26.0
streamlit==1.32.0
11、SQLite3操作
下面,我将回顾如何初始化SQLite3数据库并执行四个基本的CRUD功能。您会注意到,我没有直接使用f字符串嵌入变量,而是使用了?
语法。这称为参数化查询,是一种最佳实践,可以提高代码可读性并防止SQL注入攻击。这是因为信息是作为参数传递的,而不是直接形成SQL查询。
11.1 初始化数据库
import sqlite3
connection = sqlite3.connect("crypto_portfolio.db")
cursor = connection.cursor()
*注意:首次运行时,本地会创建crypto_portfolio.db文件并持久保存。
11.2 创建表
cursor.execute("CREATE TABLE if not exists portfolio (symbol TEXT, amount FLOAT, cost FLOAT)")
11.3 插入数据
cursor.execute("INSERT OR REPLACE INTO portfolio (symbol, amount, cost) VALUES (?, ?, ?)", ('BTC', 1, 45000))
cursor.execute("INSERT OR REPLACE INTO portfolio (symbol, amount, cost) VALUES (?, ?, ?)", ('ETH', 5, 10000))
11.4 查询表
import pandas as pd
df = pd.read_sql("SELECT * from portfolio", connection)
print(df)
coin amount cost
0 BTC 1.0 45000.0
1 ETH 2.0 10000.0
我们也可以使用cursor.execute("SELECT * from portfolio")
来查询表,但这样我们需要手动处理响应。pd.read_sql
为我们处理了这些。
11.5 删除数据
cursor.execute("DELETE FROM portfolio WHERE symbol=?", ('BTC',))
12、Streamlit集成
现在我们知道如何在SQLite3数据库上执行CRUD操作,是时候将它们集成到一个功能性应用程序中了。
首先,我导入所需的库,然后定义一个连接数据库的函数。接下来,定义了四个CRUD函数。
import streamlit as st
import sqlite3
import pandas as pd
def get_connection():
conn = sqlite3.connect('crypto_portfolio.db')
return conn
# 函数用于向投资组合中添加新币种
def add_coin(symbol, amount, cost):
conn = get_connection()
c = conn.cursor()
c.execute("INSERT OR REPLACE INTO portfolio (symbol, amount, cost) VALUES (?, ?, ?)", (symbol, amount, cost))
conn.commit()
conn.close()
# 函数用于查看投资组合
def view_portfolio():
conn = get_connection()
dfjoin = pd.read_sql('select symbol, amount, cost from portfolio', conn)
conn.close()
return dfjoin
# 函数用于从投资组合中删除币种
def delete_coin(symbol):
conn = get_connection()
c = conn.cursor()
c.execute("DELETE FROM portfolio WHERE symbol=?", (symbol,))
conn.commit()
conn.close()
# 函数用于更新币种的数量和成本
def update_coin(symbol, amount, cost):
conn = get_connection()
c = conn.cursor()
c.execute("UPDATE portfolio SET amount=?, cost=? WHERE symbol=?", (amount, cost, symbol))
conn.commit()
conn.close()
现在数据库连接正常并且CRUD操作已经定义好了,是时候构建用户界面了。为此,我们将构建两个独立的页面,一个用于数据输入,另一个用于数据查看。
def data_entry_page():
st.subheader("添加或更新币种")
with st.form("add_coin_form"):
symbol = st.text_input("币种符号(例如,BTC,ETH)")
amount = st.number_input("数量", min_value=0.0, format="%.8f")
cost = st.number_input("成本", min_value=0.0, format="%.2f")
submitted = st.form_submit_button("添加或更新币种")
if submitted:
if symbol.strip() == "":
st.error("符号不能为空!")
else:
add_coin(symbol, amount, cost)
st.success("币种已添加或更新到投资组合")
st.subheader("删除币种")
delete_symbol = st.text_input("输入要删除的币种符号")
if st.button("删除币种"):
if delete_symbol.strip() == "":
st.error("符号不能为空!")
else:
delete_coin(delete_symbol)
st.success("币种已从投资组合中删除")
def portfolio_page():
st.subheader("您的投资组合")
df = view_portfolio()
st.table(df)
最后,我们将应用布局定义如下,这将在应用程序中创建两个独立的标签页。
# 主应用程序布局
st.title("加密货币投资组合跟踪器")
# 导航标签
tab1, tab2 = st.tabs(["投资组合", "数据输入"])
with tab1:
portfolio_page()
with tab2:
data_entry_page()
注意:这三个脚本应依次粘贴到单个app.py文件中。
13、运行程序
要运行应用程序,请导航到主项目目录,该目录现在应该有crypto_portfolio.db
和app.py
文件。使用streamlit run app.py
运行应用程序,您应该会看到如下页面。

切换到数据输入页面,您应该会看到:

恭喜!我们现在创建了一个完全交互式的应用程序来存储投资组合信息。在本系列的最后一部分中,我们将结合所学内容创建一个完整的投资组合跟踪器,包括实时加密货币价格报价和更高级的投资组合指标可视化。请继续关注,不要错过!
原文链接:Building a Cryptocurrency Portfolio Tracker with Python
汇智网翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。