Upbit量化交易策略:API Key获取与环境搭建

2025-02-27 18:49:42 38

Upbit平台API交易策略编写:量化交易初探

1. 前期准备:API Key 获取与环境搭建

在开始构建任何基于 Upbit 平台的自动化交易策略之前,首要任务是获得合法的 API 访问权限。 API 密钥允许你的程序安全地与 Upbit 服务器通信,执行诸如获取市场数据、下单等操作。 您需要登录您的 Upbit 账户,通常在用户设置或“我的页面”中寻找“API 公开密钥”或类似的选项。 按照 Upbit 的指引生成一对密钥:Access Key 和 Secret Key。 Access Key 相当于你的用户名,用于标识你的身份;Secret Key 相当于你的密码,用于授权操作。 务必将您的 Access Key 和 Secret Key 安全地存储起来,切勿以明文形式保存在代码或公共存储库中。 特别强调,绝对不要将您的 Secret Key 泄露给任何第三方,因为拥有 Secret Key 的人可以完全控制您的 Upbit 账户,造成严重的资金损失。

成功获取 API 密钥后,下一步是搭建一个可靠且隔离的开发环境。 Python 语言因其易用性、强大的社区支持以及丰富的量化交易相关库而成为量化交易的首选。 推荐使用 Anaconda 或 virtualenv 等工具创建一个独立的 Python 虚拟环境。 这样做的好处是,可以避免不同项目之间的 Python 包依赖冲突,保持环境的整洁和可维护性。 例如,您可以使用 Anaconda 创建一个名为 "upbit_trading" 的环境,专门用于 Upbit 交易策略的开发。

安装量化交易所需的关键 Python 库:

bash pip install pyupbit pandas numpy

  • pyupbit: Upbit 官方提供的 Python 库,它封装了 Upbit API 的各种接口,使得开发者可以通过简单的 Python 代码与 Upbit 交易所进行交互,例如查询账户余额、获取历史 K 线数据、提交订单等。
  • pandas: 一个功能强大的数据分析库,提供了 DataFrame 数据结构,方便用户进行数据清洗、转换、分析和可视化。 在量化交易中,pandas 常用于处理 K 线数据、计算技术指标、回测交易策略等。
  • numpy: Python 中用于科学计算的基础库,提供了高性能的多维数组对象和各种数学函数。 numpy 是 pandas 的底层依赖,为数据分析提供了强大的数值计算支持。

2. 连接 Upbit API 并获取市场数据

使用 pyupbit 库连接到 Upbit API,开启数据获取和交易执行,流程简洁高效。

import pyupbit
import pandas as pd

access = "YOUR ACCESS KEY"
secret = "YOUR SECRET KEY"

upbit = pyupbit.Upbit(access, secret)

print(upbit.get_balance("KRW")) # 查询账户余额 (韩元)

务必将 YOUR_ACCESS_KEY YOUR_SECRET_KEY 替换为您的Upbit账户实际API密钥。这些密钥允许你安全地访问你的账户信息和执行交易。函数 upbit.get_balance("KRW") 用于查询账户中的韩元余额,这是评估资金状况的重要步骤。类似的,通过调整参数,例如使用 upbit.get_balance("BTC") 可以查询比特币余额,或者使用 upbit.get_balance("ETH") 查询以太坊余额。 你可以通过API来查询你账户中任意币种的余额。

获取市场数据是制定量化交易策略的基础。 pyupbit.get_ohlcv() 函数允许你获取指定加密货币交易对的历史K线数据,K线数据包含开盘价 (Open), 最高价 (High), 最低价 (Low), 收盘价 (Close) 和成交量 (Volume),为技术分析提供必要信息。

df = pyupbit.get_ohlcv("KRW-BTC", count=200) # 获取比特币最近 200 天的 K 线数据

以上代码将获取 "KRW-BTC" 交易对(即韩元计价的比特币)最近 200 天的日线K线数据,并将这些数据存储在一个 pandas DataFrame 对象 df 中,方便进行后续的数据分析和处理。 count 参数用于指定要获取的数据点数量,最大允许值为200。 "KRW-BTC" 定义了交易对,该函数支持所有Upbit交易所提供的交易对。时间周期可以通过调整参数来改变,例如可以使用 minute1 获取1分钟K线数据, minute5 获取5分钟K线数据, minute15 获取15分钟K线数据, minute30 获取30分钟K线数据, minute60 获取60分钟K线数据, day 获取日线数据, week 获取周线数据, 以及 month 获取月线数据。选择合适的时间周期取决于交易策略的时间框架。

3. 编写简单的移动平均线交易策略

移动平均线 (Moving Average, MA) 是一种广泛应用的技术指标,其核心功能在于通过平滑特定时期内的价格数据,从而有效识别市场趋势,降低短期价格波动带来的干扰。 移动平均线策略因其易于理解和实施,在加密货币交易中被广泛采用。一个基础的移动平均线策略是:当较短周期的移动平均线向上穿过较长周期的移动平均线时,被视为潜在的买入信号;相反,当较短周期移动平均线向下穿过较长周期移动平均线时,则被视为潜在的卖出信号。这种交叉信号被交易者用来判断趋势的变化,并据此进行交易决策。

以下是一个使用Python和Pandas库计算移动平均线的简单示例代码:


def calculate_ma(df, period):
    """计算移动平均线"""
    return df['close'].rolling(window=period).mean()

代码解释:

  • calculate_ma(df, period) :该函数接收一个Pandas DataFrame df 和一个周期 period 作为输入。
  • df['close'] :假设DataFrame中包含名为 'close' 的列,代表收盘价。
  • .rolling(window=period) :此方法创建一个滑动窗口,窗口大小由 period 参数指定。
  • .mean() :计算滑动窗口内收盘价的平均值,得到移动平均线的值。
  • return :函数返回计算得到的移动平均线序列。

要应用此策略,你需要:

  1. 获取加密货币的历史价格数据,例如收盘价。
  2. 使用 calculate_ma 函数计算短期和长期移动平均线。
  3. 监控两条移动平均线的交叉情况,当短期MA上穿长期MA时,考虑买入;当短期MA下穿长期MA时,考虑卖出。
  4. 需要注意的是,简单的移动平均线策略可能会产生虚假信号,因此建议结合其他技术指标和风险管理策略一起使用。

计算 5 日和 20 日移动平均线

在金融时间序列分析中,移动平均线(Moving Average, MA)是一种常用的平滑技术,用于减少价格波动带来的噪声,从而更清晰地识别趋势。计算移动平均线涉及对特定时间段内的数据点进行平均。在此示例中,我们将计算5日移动平均线和20日移动平均线,分别代表短期和中期趋势。

为了计算移动平均线,我们使用 calculate_ma 函数(假定已定义),该函数接受DataFrame ( df ) 和窗口期(即时间段)作为输入参数。对于5日移动平均线,我们将窗口期设置为5;对于20日移动平均线,我们将窗口期设置为20。计算结果将分别存储在DataFrame的新列 'ma5' 和 'ma20' 中。

具体实现如下:

df['ma5'] = calculate_ma(df, 5)

这行代码调用 calculate_ma 函数,传入DataFrame df 和窗口期 5。函数返回DataFrame中每行对应过去5天数据的平均值,并将结果赋值给名为 'ma5' 的新列。'ma5' 列现在包含了每日的5日移动平均线值。

df['ma20'] = calculate_ma(df, 20)

类似地,这行代码计算20日移动平均线。 calculate_ma 函数被调用,传入DataFrame df 和窗口期 20。函数计算DataFrame中每行对应过去20天数据的平均值,并将结果赋值给名为 'ma20' 的新列。'ma20' 列包含了每日的20日移动平均线值。与5日移动平均线相比,20日移动平均线对价格波动的反应更慢,更能反映长期的价格趋势。

通过比较'ma5'和'ma20',交易者和分析师可以获得对潜在买入或卖出信号的洞察。例如,当短期移动平均线('ma5')向上穿过长期移动平均线('ma20')时,可能表明看涨趋势;反之,当短期移动平均线向下穿过长期移动平均线时,可能表明看跌趋势。

定义交易信号

交易信号是量化交易策略中的核心组成部分,用于指示何时买入或卖出某种资产。 在本例中,我们利用 Pandas DataFrame (`df`) 来存储和计算交易信号。

df['signal'] = 0.0 初始化一个名为 'signal' 的新列,并将其所有值设置为 0.0。这意味着初始状态下,没有买入或卖出信号。

以下代码行基于5日移动平均线(MA5)和20日移动平均线(MA20)之间的关系生成买入和卖出信号:

df['signal'][df['ma5'] > df['ma20']] = 1.0 这行代码表示,当5日移动平均线大于20日移动平均线时,产生买入信号。 更具体地说,它会遍历DataFrame,如果'ma5'列的值大于同一行中'ma20'列的值,则将'signal'列的相应值设置为 1.0。 移动平均线交叉是常用的技术分析指标,当短期均线向上穿过长期均线时,通常被认为是看涨信号。

df['signal'][df['ma5'] < df['ma20']] = -1.0 另一方面,当5日移动平均线小于20日移动平均线时,产生卖出信号。 与买入信号类似,这行代码会检查'ma5'是否小于'ma20',如果是,则将'signal'列设置为 -1.0。 短期均线向下穿过长期均线通常被认为是看跌信号,提示卖出资产。

df['signal'] 列存储了基于移动平均线交叉的交易信号。值为 1.0 表示买入信号,-1.0 表示卖出信号,0.0 表示没有信号。这些信号可以用于构建更复杂的量化交易策略,例如根据信号执行交易,并进行风险管理和止损设置。

计算持仓

df['position'] = df['signal'].shift(1)

df['position'].fillna(0, inplace=True)

这段代码的核心在于构建一个量化交易策略,并通过 Pandas DataFrame 来进行数据处理和信号生成。 calculate_ma() 函数被设计用于计算特定时间周期的移动平均线。移动平均线是技术分析中常用的指标,用于平滑价格波动,识别趋势方向。通过定义 calculate_ma() 函数,可以方便地计算不同周期的移动平均线,例如示例中的 5 日和 20 日移动平均线。

在计算得到 5 日和 20 日移动平均线后,代码将它们添加到 DataFrame 中,为后续的信号生成提供数据基础。 df['signal'] 列代表交易信号,其生成逻辑基于短期移动平均线(5 日)和长期移动平均线(20 日)的比较。当短期移动平均线高于长期移动平均线时,产生买入信号(1),表明短期价格上涨趋势强于长期,可能是一个买入机会。相反,当短期移动平均线低于长期移动平均线时,产生卖出信号(-1),表明短期价格下跌趋势强于长期,可能是一个卖出机会。

df['position'] 代表持仓情况,它反映了交易策略在每个时间点的持仓状态。为了避免在同一根 K 线中同时发出买入和卖出信号,代码使用 df['signal'].shift(1) 将信号延迟一天。这意味着,今天的持仓由昨天的交易信号决定。这种延迟处理方式有助于减少因微小价格波动而产生的频繁交易,从而降低交易成本。 fillna(0, inplace=True) 用于填充 DataFrame 中因 shift(1) 操作而产生的缺失值(NaN),将其替换为 0,表示初始状态或没有信号时的空仓状态。通过这样的处理, df['position'] 列能够准确反映交易策略的持仓变化情况,为后续的绩效评估和风险管理提供基础数据。

4. 回测策略并评估效果

在部署真实资金进行交易之前,对交易策略进行回测是至关重要的。回测,也称为历史数据测试,通过将策略应用于过去的市场数据,模拟其在不同市场条件下的表现,从而对策略的有效性进行预先评估。

回测的主要目的是评估策略在历史数据上的表现,深入分析其盈利能力、风险水平以及稳定性。通过回测,可以量化策略的关键指标,例如总收益、最大回撤、胜率、盈亏比等,从而更全面地了解策略的潜在优势和劣势。

回测还可以帮助我们识别潜在的风险和问题,例如过度拟合、参数敏感性、交易频率过高等。过度拟合指的是策略在历史数据上表现出色,但在实际交易中表现不佳的现象。参数敏感性指的是策略的性能对参数的变化非常敏感,微小的参数调整可能导致策略性能大幅波动。交易频率过高可能会增加交易成本,降低策略的盈利能力。

选择合适的回测工具和数据是至关重要的。回测工具应该能够提供足够灵活的参数设置、详细的报告以及可视化的分析功能。回测数据应该具有代表性,覆盖足够长的时间范围,并且包含不同的市场条件,例如牛市、熊市、震荡市等。还应该注意数据的质量,避免使用错误或不完整的数据。

回测结果应该进行仔细分析和解读。应该关注策略的关键指标,例如总收益、最大回撤、胜率、盈亏比等,并与其他策略进行比较。还应该对回测结果进行敏感性分析,评估策略对不同参数和市场条件的适应性。如果回测结果不理想,应该对策略进行调整和优化,直到达到满意的效果为止。

需要注意的是,回测仅仅是评估策略的一种手段,并不能保证策略在未来一定能够成功。市场是不断变化的,历史数据并不能完全预测未来的走势。因此,在实际交易中,应该谨慎使用回测结果,并根据市场情况进行适当调整。

计算每日收益率

为了量化加密货币资产的每日盈利或亏损情况,我们需要计算每日收益率。这可以通过比较当日收盘价与前一日收盘价的变化百分比来实现。

在Python的pandas库中,我们可以创建一个名为 'returns' 的新列,用于存储每日收益率。计算方法如下:

df['returns'] = df['close'].pct_change()

解释:

  • df :代表包含加密货币价格数据的pandas DataFrame。
  • df['close'] :表示DataFrame中名为 'close' 的列,该列存储每日的收盘价格。
  • .pct_change() :这是一个pandas DataFrame的方法,用于计算序列中每个元素与前一个元素之间的百分比变化。更具体地说,它计算的是 ((当前值 - 前一个值) / 前一个值)。
  • df['returns'] = ... :这会将计算出的每日收益率存储在DataFrame的新列 'returns' 中。

例如,如果今天的收盘价为$100,昨天的收盘价为$95,那么今天的收益率为 ((100 - 95) / 95) = 0.0526,即5.26%。 该值将被存储在 'returns' 列中对应日期的位置。

需要注意的是,第一天的收益率通常会显示为 'NaN'(Not a Number),因为第一天没有前一天的数据可供比较。在后续分析中,可以根据具体需求选择忽略或填充这些 'NaN' 值。

计算策略收益

在量化交易中,评估策略的有效性至关重要。计算策略收益是评估策略表现的关键步骤。该步骤通常涉及将策略产生的仓位信号与标的资产的实际收益率相结合,从而模拟策略的投资回报。

df['strategy_returns'] = df['position'] * df['returns']

上述代码展示了如何使用Python和Pandas库来计算策略收益。其中, df 是一个Pandas DataFrame对象,它存储了历史交易数据和策略信号。 df['position'] 代表策略产生的仓位信号,通常为1(多头)、-1(空头)或0(空仓)。 df['returns'] 代表标的资产的收益率,例如每日收益率或每小时收益率。通过将这两个序列相乘,可以得到策略在每个时间点的收益率。

strategy_returns 列的计算过程本质上是将策略的持仓方向与市场实际变动相结合。例如,当策略持有正向仓位( position = 1 )且市场上涨( returns > 0 )时,策略将获得正收益。相反,如果市场下跌( returns < 0 ),策略将遭受损失。类似地,当策略持有负向仓位( position = -1 )且市场下跌时,策略将获得正收益。如果市场上涨,策略将遭受损失。当策略空仓时( position = 0 ),策略收益为零,不受市场波动的影响。

计算得到的 strategy_returns 序列可以用于进一步的分析,例如计算累计收益率、夏普比率、最大回撤等指标,从而全面评估策略的风险收益特征。 通过对比策略收益与基准收益,可以更深入地了解策略的alpha(超额收益)和beta(系统性风险)。

计算累计收益

df['cumulative_returns'] = (1 + df['strategy_returns']).cumprod()

print(df[['close', 'ma5', 'ma20', 'signal', 'position', 'returns', 'strategy_returns', 'cumulative_returns']].tail(10))

这段代码用于计算股票交易策略中的关键指标:每日收益、策略收益和累计收益。 df['close'].pct_change() 函数被用于计算每日收盘价的百分比变化,这代表了每日的原始收益率。 df['strategy_returns'] 代表策略的每日收益,它是通过将持仓头寸 ( df['position'] ) 与每日收益 ( df['returns'] ,即价格变动百分比) 相乘得到的。正的持仓代表做多,负的持仓代表做空,因此策略收益反映了策略在每日的价格变动中获得的收益或损失。

最重要的部分是 df['cumulative_returns'] 的计算。 .cumprod() 函数被应用在 (1 + df['strategy_returns']) 上,它表示累积乘积。该计算方法将每日的策略收益累积起来,从而得到一个累计收益曲线。这个曲线反映了策略从起始日期到当前日期的总收益情况。可以直观地了解策略在整个回测期间的表现,例如盈利能力和稳定性。 cumulative_returns 值大于 1 表示盈利,小于 1 表示亏损,值越大表示盈利越多。

通过观察 cumulative_returns 列,可以快速评估策略在历史数据上的表现。 除了累计收益,还可以使用其他更高级的风险调整收益指标,例如夏普比率 (Sharpe Ratio) 和最大回撤 (Maximum Drawdown),来更全面地评估策略的风险收益特征。 夏普比率衡量的是策略在承担每单位风险时所获得的超额收益,最大回撤则衡量的是策略在回测期间可能遭受的最大损失。 这些指标能够提供更深入的策略评估信息,帮助投资者做出更明智的决策。还可以考虑计算索提诺比率 (Sortino Ratio) 来衡量下行风险,以及Alpha和Beta值来评估策略相对于基准的表现。

5. 实现自动交易

在加密货币交易中,自动化是提升效率和抓住市场机遇的关键。一旦你的交易策略经过了充分的回测验证,证明其在历史数据中具有盈利能力,那么就可以考虑将其部署到Upbit交易所,从而实现自动交易。这意味着你可以将你的策略转化为程序代码,使其能够根据预设的规则自动执行买卖操作,无需人工干预。

自动交易的实现通常需要以下几个步骤:

  1. 策略编码: 将经过验证的交易策略转化为可执行的代码。这可能涉及使用编程语言(如Python)和Upbit提供的API接口。策略代码需要能够接收市场数据,分析数据,并根据预设的规则发出交易指令。
  2. API密钥配置: 通过Upbit平台获取API密钥,并将其配置到你的交易程序中。API密钥是程序访问你Upbit账户并执行交易的凭证,务必妥善保管。
  3. 交易机器人部署: 将编写好的交易程序部署到服务器或云平台,确保其24/7不间断运行。选择稳定可靠的服务器对于自动交易至关重要。
  4. 风险管理设置: 在自动交易程序中设置严格的风险管理参数,包括止损点、止盈点、最大持仓量等。这些参数可以帮助你控制交易风险,避免因市场波动而造成重大损失。
  5. 监控与优化: 即使部署了自动交易程序,也需要定期监控其运行情况,并根据市场变化和策略表现进行优化。例如,可以调整策略参数、增加新的交易信号或更换交易品种。

通过实现自动交易,你可以解放双手,将更多的时间用于策略研究和市场分析。同时,自动交易可以避免情绪化交易,严格执行预设的交易规则,提高交易效率和盈利能力。然而,需要注意的是,自动交易并非万能,仍然需要持续的监控和优化,才能在不断变化的市场中保持竞争力。

假设有 100 万韩元 (KRW) 可用

在进行加密货币交易前,我们需要确认账户中韩元 (KRW) 和比特币 (BTC) 的余额。假设我们使用 Upbit 交易所的 API,可以通过以下方式获取余额信息:

krw_balance = upbit.get_balance("KRW")
上述代码段用于从 Upbit 交易所获取当前账户中韩元 (KRW) 的余额。 upbit.get_balance("KRW") 函数调用会返回账户中可用于交易的 KRW 数量。这个余额信息对于确定可以购买多少比特币至关重要。

btc_balance = upbit.get_balance("BTC")

这段代码用于获取账户中已持有的比特币 (BTC) 数量。 upbit.get_balance("BTC") 函数调用返回账户中 BTC 的余额。虽然在这个例子中可能不是立即使用,但知道账户中的 BTC 数量对于整体资产管理和进一步的交易决策仍然很重要,例如确定是否需要出售部分 BTC 以增加 KRW 余额,或者在后续的交易策略中使用。

确定交易目标价格至关重要,可以使用以下代码获取当前比特币 (KRW-BTC) 的市场价格:

target_price = pyupbit.get_current_price("KRW-BTC")

这段代码使用 pyupbit.get_current_price("KRW-BTC") 函数来获取 Upbit 交易所中 KRW-BTC 交易对的当前市场价格。 "KRW-BTC" 参数指定了要查询的交易对,即用韩元 (KRW) 购买比特币 (BTC) 的市场。 这个 target_price 变量将存储当前的 BTC 价格,以便后续用于计算可以购买的比特币数量或者评估当前市场状况。这是进行任何交易决策的关键一步,确保交易者了解当前的市场价格。

获取最新的移动平均线数据

currentprice = pyupbit.getcurrent_price("KRW-BTC")

为了简化例子,假设我们已经有了实时的 ma5 和 ma20 数据

ma5 = df['ma5'].iloc[-1] # 从dataframe中获取,实际应用中需要使用实时计算的函数或API接口获取最新的5日移动平均线数据。在量化交易平台或数据源中,通常会提供计算好的MA5数据。例如,通过API订阅的方式实时获取。

ma20 = df['ma20'].iloc[-1] # 从dataframe中获取,实际应用中需要使用实时计算的函数或API接口获取最新的20日移动平均线数据。与MA5类似,需要确保MA20的数据源是实时更新的。

if ma5 > ma20 and krw_balance > 5000: # 至少持有 5000 韩元才能下单。这里判断MA5是否上穿MA20,形成金叉,并且账户中韩元余额大于5000,满足买入条件。 实际应用中,需要考虑交易平台的最小交易额限制。
# 买入比特币
amount_to_buy = krw_balance * 0.99 / current_price # 预留 1% 手续费。计算买入的比特币数量,预留1%的手续费。实际应用中,需要使用更精确的手续费计算方式,并考虑滑点等因素。
order_result = upbit.buy_market_order("KRW-BTC", amount_to_buy)
print("Buy Order:", order_result)

elif ma5 < ma20 and btc_balance > 0.00001: # 至少持有 0.00001 BTC 才能下单。判断MA5是否下穿MA20,形成死叉,并且账户中比特币余额大于0.00001,满足卖出条件。实际应用中,需要根据交易平台的最小交易单位调整阈值。
# 卖出比特币
order_result = upbit.sell_market_order("KRW-BTC", btc_balance * 0.99) # 预留 1% 手续费。计算卖出的比特币数量,预留1%的手续费。实际应用中,需要使用更精确的手续费计算方式。
print("Sell Order:", order_result)

else:
print("No action needed.")

这段代码首先获取账户的韩元和比特币余额,然后获取当前的比特币价格。根据移动平均线的交叉情况,决定买入或卖出比特币。 upbit.buy_market_order() upbit.sell_market_order() 函数用于执行市价单。 实际应用中,需要处理API调用可能出现的异常,并进行重试或报警处理,保证程序的稳定性。

请注意,这只是一个非常简单的示例。在实际应用中,需要考虑更多因素,例如订单类型(限价单、市价单等)、止损止盈策略(设定止损止盈价格,控制风险)、资金管理策略(例如,每次交易只使用总资金的一小部分)等等。还需要编写代码来实时获取市场数据,并定期执行交易策略,并对交易策略进行回测,评估其有效性。

6. 风险提示

量化交易,如同所有金融投资活动一样,蕴含着固有的风险,务必保持高度的审慎态度。由于市场波动的不可预测性,任何量化交易策略都无法保证持续盈利。务必在充分理解相关风险的基础上参与。

历史回测数据,虽然可以作为策略有效性的参考,但其结果并不代表未来实际交易中的收益情况。过往业绩并不预示未来表现,市场环境的变化、交易滑点、手续费等因素都可能导致实际收益与回测结果产生偏差。 回测仅为辅助决策工具,切勿过度依赖。

在应用任何量化交易策略之前,请务必深入了解其背后的原理、算法逻辑以及潜在风险。理解策略在不同市场条件下的表现,以及可能存在的局限性。务必评估自身对市场波动、策略失效等风险的承受能力,并据此制定合理的投资计划。

资金管理是量化交易中至关重要的一环。永远不要将全部资金投入到单一的量化交易策略中。合理的资金分配能够有效分散风险,降低因策略失效或市场突变造成的损失。建议采用多元化的投资组合,并在量化交易资金中设置止损点,以控制潜在亏损。

The End

发布于:2025-02-27,除非注明,否则均为币看点原创文章,转载请注明出处。