您现在的位置是: 首页 >  文档 文档

Upbit API自动化交易:智能掘金新纪元的关键

时间:2025-03-04 73人已围观

Upbit API 自动化交易:掘金新纪元的钥匙

随着加密货币市场的日渐成熟,手动交易的效率瓶颈日益凸显。波动性大、交易机会转瞬即逝的特性,使得投资者迫切需要更高效、更智能的交易工具。Upbit,作为韩国领先的数字资产交易所,其强大的API接口为自动化交易策略的实现提供了坚实的基础。本文将探讨如何利用Upbit API进行自动化交易,挖掘市场潜力,把握投资先机。

理解Upbit API:通往自动化交易的桥梁

Upbit API,全称为应用程序编程接口(Application Programming Interface),是一系列预定义的函数、协议和工具,允许开发者通过编写代码,以编程方式与Upbit交易所进行无缝交互。它提供了一种结构化的方式,使得计算机程序可以访问Upbit的各种功能,无需人工干预。通过Upbit API,开发者可以构建复杂的交易策略,实现自动化下单(包括市价单、限价单等)、实时查询账户余额、持仓信息和交易历史记录,并能精准获取包括交易对的买一价、卖一价、最新成交价、成交量等实时行情数据,以及历史K线数据。Upbit API就像一座功能强大的桥梁,精密地连接了投资者的量化交易策略和Upbit交易所的底层交易系统,使得计算机能够高效、准确地代替人工执行预先设定的交易指令,极大提升交易效率并降低人为错误。

构建自动化交易系统的基本要素

一个完整的Upbit API自动化交易系统,旨在实现无需人工干预的加密货币交易策略执行,通常包含以下几个核心组件:

  • API 密钥管理: 存储和安全管理您的 Upbit API 密钥(包括访问密钥和安全密钥),这是系统访问您的 Upbit 账户进行交易的凭证。密钥的安全存储至关重要,建议使用加密存储或硬件安全模块 (HSM)。
API密钥管理: 安全存储和管理Upbit API密钥至关重要。泄露的密钥可能导致账户资金被盗。建议使用环境变量或专门的密钥管理工具,并定期更换密钥。
  • 行情数据获取模块: 从Upbit API实时获取市场数据,例如最新的交易价格、交易量、订单簿信息等。这些数据是分析市场趋势、制定交易策略的基础。
  • 交易策略模块: 这是自动化交易系统的核心。该模块基于预先设定的规则和算法,对行情数据进行分析,判断买卖时机,并生成交易指令。
  • 订单执行模块: 负责将交易策略模块生成的交易指令发送到Upbit交易所,并监控订单的执行状态。
  • 风险管理模块: 监控账户风险,例如仓位大小、止损止盈点等。当风险超过预设阈值时,自动采取措施,例如平仓或减仓,以保护资金安全。
  • 日志记录模块: 记录所有交易操作、系统状态和错误信息。方便后续分析和优化交易策略。
  • 开发语言和框架选择

    Upbit API 支持多种编程语言,为开发者提供了广泛的选择。Python、Java、Node.js 等都是常用的选项。Python 尤其受到青睐,这得益于其清晰简洁的语法、庞大的生态系统,以及在数据科学和分析领域的强大功能,使其成为构建自动化交易系统和量化策略的理想选择。

    Python 提供了丰富的库,能够显著简化与 Upbit API 的交互和数据处理流程:

    • requests: 用于发送和接收 HTTP 请求,是与 Upbit API 进行通信的核心工具。 通过 requests 库,开发者可以轻松地获取市场数据、提交订单以及管理账户信息。
    • pandas: 强大的数据分析库,专门用于处理和分析从 Upbit API 获取的行情数据。 pandas 提供了高效的数据结构(如 DataFrame)和数据操作工具,方便进行数据清洗、转换和分析。
    • numpy: Python 的科学计算核心库,为数值计算、线性代数、随机数生成等提供基础支持。 在量化交易中, numpy 可以用于构建复杂的数学模型和技术指标。
    • ccxt: 一个功能强大的通用加密货币交易 API 库。它统一了对多个交易所 API 的访问方式,显著简化了与 Upbit 及其他交易所的集成过程。 使用 ccxt ,开发者可以避免直接处理各个交易所 API 的差异,从而专注于交易逻辑的实现。 asyncio版本的ccxt也为高并发访问提供了可能。

    实战:一个简单的移动平均线策略

    以下是一个使用Python实现的简单移动平均线(Moving Average, MA)策略示例,演示如何利用Upbit API进行自动化交易。移动平均线策略是一种广泛使用的技术分析方法,它通过计算一定时期内的平均价格,来平滑价格波动,识别趋势方向。该策略的核心在于比较短期移动平均线和长期移动平均线的交叉情况,以此判断买入或卖出时机。本例将使用ccxt库,这是一个支持多种加密货币交易所的Python库,方便我们与Upbit交易所进行交互。

    import ccxt import time

    上述代码段首先导入了必要的Python库: ccxt time ccxt 库(CryptoCurrency eXchange Trading Library)允许开发者连接到Upbit以及其他众多加密货币交易所,进行数据获取和交易操作。 time 库则用于控制程序的执行频率,例如,每隔一段时间获取一次价格数据,并执行相应的交易逻辑。后续代码将演示如何利用这两个库构建一个简单的移动平均线交易机器人。

    配置 Upbit API 密钥

    为了通过 Python 的 ccxt 库访问您的 Upbit 账户,您需要配置 API 密钥。请确保您已在 Upbit 交易所创建了 API 密钥,并妥善保管好您的密钥和密钥。泄露密钥可能导致您的资金风险。

    以下代码展示了如何使用您的 Upbit API 密钥和密钥初始化 ccxt Upbit 交易所对象:

    exchange = ccxt.upbit({
        'apiKey': 'YOURUPBITAPIKEY',
        'secret': 'YOURUPBITSECRETKEY',
    })

    apiKey : 将 'YOUR UPBIT API_KEY' 替换为您的 Upbit API 密钥字符串。API 密钥用于识别您的账户。

    secret : 将 'YOUR UPBIT SECRET_KEY' 替换为您的 Upbit 密钥字符串。密钥用于对您的 API 请求进行签名,确保请求的安全性。

    请注意,强烈建议将您的 API 密钥和密钥存储在安全的地方,例如环境变量或加密配置文件中,而不是直接硬编码在您的代码中。这有助于防止您的密钥泄露。

    完成上述配置后,您就可以使用 exchange 对象来调用 ccxt 库提供的各种 Upbit API 方法,例如获取市场数据、下单、查询账户余额等。

    设置交易标的和交易数量

    在加密货币交易中,明确指定交易标的和交易数量至关重要。交易标的定义了您希望交易的加密货币对,而交易数量则决定了您希望买入或卖出的该加密货币的数量。以下代码示例展示了如何在程序中设置这些关键参数。

    symbol = 'KRW/BTC'

    symbol 变量定义了交易标的,在本例中为韩元(KRW)和比特币(BTC)的交易对。这意味着您将使用韩元购买比特币,或者出售比特币以换取韩元。不同的交易所可能使用不同的符号表示相同的交易对,因此请务必查阅您所使用的交易所的API文档,以确保使用正确的符号。

    amount = 0.001

    amount 变量定义了交易数量,在本例中为0.001 BTC。这意味着您希望交易0.001个比特币。请注意,交易数量通常以您正在交易的加密货币(本例中为BTC)为单位。一些交易所可能对最小交易数量有限制,因此请确保您的交易数量符合交易所的要求。

    设置正确的交易标的和交易数量是成功进行加密货币交易的基础。在执行任何交易之前,请仔细检查这些参数,以避免意外错误。不同交易所的交易对表示方法和交易量单位可能存在差异,务必参考对应交易所的API文档或规则。

    定义移动平均线周期

    在技术分析中,移动平均线(Moving Averages, MA)是一种常用的平滑价格数据,以识别趋势方向的指标。移动平均线的计算涉及对特定周期内的价格进行平均。周期长度的选择对移动平均线的灵敏度至关重要,较短的周期能更快地反映价格变化,但可能产生更多的虚假信号;较长的周期则更为平滑,更能反映长期趋势,但对价格变化的反应较慢。 short_window = 12 此变量定义了短期移动平均线的周期长度。在此示例中,短期移动平均线将使用过去12个时间单位(例如,12天、12小时或12分钟,取决于图表的时间框架)的价格数据进行计算。短期移动平均线对价格变化更为敏感,因此交易者通常使用它来识别短期趋势和潜在的入场/离场点。 long_window = 26 此变量定义了长期移动平均线的周期长度。这里,长期移动平均线将基于过去26个时间单位的价格数据进行计算。与短期移动平均线相比,长期移动平均线更加平滑,对价格波动的反应较慢,因此适用于识别长期趋势。交易者通常结合短期和长期移动平均线来制定交易策略,例如,当短期移动平均线上穿长期移动平均线时,可能被视为买入信号(黄金交叉),反之则可能被视为卖出信号(死亡交叉)。周期选择应根据个人交易风格、资产波动性以及回测结果进行优化。

    获取历史数据

    获取加密货币的历史数据对于技术分析、回溯测试交易策略和构建预测模型至关重要。`get_historical_data` 函数旨在从交易所获取指定加密货币交易对的历史K线(OHLCV)数据。

    函数定义:

    def get_historical_data(symbol, timeframe='1m', limit=30):
        ohlcv = exchange.fetch_ohlcv(symbol,  timeframe=timeframe, limit=limit)
        return ohlcv

    参数说明:

    • symbol (string): 指定要获取历史数据的加密货币交易对,例如 'BTC/USDT'(比特币/泰达币)。交易对的具体格式取决于交易所的规范。确保提供的交易对在交易所中有效且存在交易数据。
    • timeframe (string, optional): K线的时间周期,默认为 '1m' (1分钟)。常用的时间周期包括 '1m' (1分钟), '5m' (5分钟), '15m' (15分钟), '30m' (30分钟), '1h' (1小时), '4h' (4小时), '1d' (1天), '1w' (1周), '1M' (1月)。交易所支持的时间周期可能有所不同,需要根据具体交易所的API文档进行调整。
    • limit (int, optional): 指定要获取的历史数据的最大K线数量,默认为 30。不同的交易所对于单次请求的历史数据量存在限制。较高的 limit 值可能导致请求失败或响应时间过长。建议根据交易所的API文档选择合适的 limit 值。

    函数功能:

    1. exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit) : 调用交易所的 API 获取历史 OHLCV 数据。此方法会向交易所发送请求,并接收包含开盘价 (Open), 最高价 (High), 最低价 (Low), 收盘价 (Close) 和成交量 (Volume) 的数据。 数据通常以列表的形式返回,其中每个元素代表一个 K 线。
    2. return ohlcv : 返回获取到的 OHLCV 数据。返回的数据是一个列表,列表中的每个元素都是一个列表,包含时间戳(Unix时间戳,毫秒级别)、开盘价、最高价、最低价、收盘价和成交量。

    返回值:

    返回一个列表,其中每个元素代表一个K线。每个K线是一个列表,包含以下元素:

    • 时间戳 (Unix 时间戳,毫秒级别)
    • 开盘价 (Open)
    • 最高价 (High)
    • 最低价 (Low)
    • 收盘价 (Close)
    • 成交量 (Volume)

    示例用法:

    
    ohlcv_data = get_historical_data('BTC/USDT', timeframe='1h', limit=100)
    print(ohlcv_data)
    

    注意事项:

    • 确保已经正确配置了交易所的 API 密钥和相关设置。
    • 交易所对于 API 的使用频率和数据量有限制,需要注意避免超出限制。
    • 返回的数据格式可能因交易所而异,需要根据具体交易所的 API 文档进行解析。
    • 时间戳通常是 Unix 时间戳,需要进行转换才能得到可读的时间格式。

    计算移动平均线

    在金融市场分析中,移动平均线(Moving Average, MA)是一种常用的技术指标,用于平滑价格数据,从而减少短期波动的影响,更好地识别趋势方向。以下是一个Python函数,用于计算指定数据集的移动平均线。

    
    def calculate_moving_average(data, window):
        """
        计算移动平均线。
    
        参数:
        data: 包含历史价格数据的列表,每个元素应为一个包含开盘价、最高价、最低价、收盘价等信息的列表或元组。
        window: 移动平均线窗口大小,即用于计算平均值的价格数据点数量。
    
        返回值:
        float: 计算得到的移动平均线值。
    
        示例:
        假设 data = [[...], [...], ..., [10, 12, 8, 11, 100], [...,...,...,...,101]],其中每个子列表代表一天的数据,第5个元素(索引为4)是收盘价。
        calculate_moving_average(data, 5) 将返回最后5个收盘价的平均值。
        """
        closes = [d[4] for d in data]  # 提取所有收盘价。假设data的每个子列表的第五个元素是收盘价
        return sum(closes[-window:]) / window  # 计算最后'window'个收盘价的平均值
    

    函数详解:

    1. data 参数: 该参数是一个列表,其中每个元素代表一个时间周期(例如,一天)的价格数据。每个元素可以是一个列表或元组,包含诸如开盘价、最高价、最低价和收盘价等信息。函数假设收盘价位于每个元素的索引 4 的位置。
    2. window 参数: 该参数指定了移动平均线的窗口大小。窗口大小决定了用于计算平均值的历史数据点的数量。例如,如果 window 设置为 5 ,则函数将计算最近 5 个时间周期的收盘价的平均值。
    3. closes = [d[4] for d in data] 这行代码使用列表推导式从 data 列表中提取所有收盘价,并将它们存储在 closes 列表中。请确保数据结构中,收盘价始终位于索引 4 的位置。
    4. return sum(closes[-window:]) / window 这行代码计算移动平均线。 closes[-window:] 获取 closes 列表中最后 window 个元素(即最近 window 个收盘价)。 sum() 函数计算这些收盘价的总和,然后除以 window 大小,得到移动平均线的值。

    使用注意事项:

    • 请确保 data 列表中的每个元素都包含收盘价,并且收盘价位于索引 4 的位置。
    • window 大小应根据具体情况选择。较小的 window 值会使移动平均线对价格变化更敏感,而较大的 window 值会使其更平滑。
    • 如果 data 列表中的元素少于 window 个,则函数将尝试计算一个基于现有数据的移动平均线,可能会导致结果不准确。在实际应用中,您可能需要添加错误处理机制来处理这种情况。

    示例用法:

    
    # 假设我们有以下价格数据:
    data = [
        [1, 2, 3, 4, 10],  # 开盘价, 最高价, 最低价, 收盘价, 成交量
        [5, 6, 7, 8, 11],
        [9, 10, 11, 12, 12],
        [13, 14, 15, 16, 13],
        [17, 18, 19, 20, 14]
    ]
    
    # 计算5日移动平均线
    moving_average = calculate_moving_average(data, 5)
    print(f"5日移动平均线: {moving_average}")  # 输出:5日移动平均线: 12.0
    

    这个函数提供了一个计算移动平均线的基础框架。在实际应用中,您可以根据需要对其进行修改和扩展,例如添加对不同类型价格(例如,开盘价、最高价、最低价)的支持,或者实现不同类型的移动平均线(例如,指数移动平均线)。

    交易逻辑

    以下代码展示了一个基于移动平均线交叉策略的简单加密货币交易逻辑。该策略利用短期和长期移动平均线的关系来生成买入和卖出信号。代码片段旨在演示交易策略的核心概念,实际应用中需要进行更完善的错误处理、风险管理以及参数优化。

    def trade(): 函数定义了交易策略的主体。

    try:
         # 获取历史数据
         data = get_historical_data(symbol)

    使用 get_historical_data(symbol) 函数获取指定交易对 ( symbol ) 的历史价格数据。历史数据是计算移动平均线的基础,其质量和时间跨度对策略的有效性至关重要。实际应用中,需要考虑数据源的可靠性和API的限制,并根据交易频率选择合适的时间粒度(如分钟、小时、天)。

         # 计算移动平均线
         short_ma = calculate_moving_average(data, short_window)
         long_ma = calculate_moving_average(data, long_window)

    接下来,使用 calculate_moving_average() 函数分别计算短期移动平均线 ( short_ma ) 和长期移动平均线 ( long_ma )。 short_window long_window 参数分别定义了计算移动平均线的时间窗口长度。选择合适的窗口长度是策略优化的关键,需要根据市场波动性和交易标的进行调整。短期均线对价格变化更敏感,长期均线则更能反映趋势。

         # 获取当前持仓信息
         balance = exchange.fetch_balance()
         btc_balance = balance['total']['BTC']

    然后,通过 exchange.fetch_balance() 方法获取当前交易所账户的余额信息,并从中提取出BTC (比特币) 的持仓数量 btc_balance 。持仓信息是判断是否可以进行买入或卖出操作的依据,避免超额交易。这里假设交易对涉及 BTC,实际应用中需要根据具体交易对进行调整。

         # 交易信号
         if short_ma > long_ma and btc_balance == 0:
              # 短期均线高于长期均线,买入
              order = exchange.create_market_buy_order(symbol, amount)
              print(f"Buy {amount} {symbol} at {order['price']}")
         elif short_ma < long_ma and btc_balance > 0:
              # 短期均线低于长期均线,卖出
              order = exchange.create_market_sell_order(symbol, btc_balance)
              print(f"Sell {btc_balance} {symbol} at {order['price']}")
         else:
              print("No trade signal.")

    基于移动平均线的交叉情况生成交易信号。如果短期均线高于长期均线 ( short_ma > long_ma ),并且当前没有持有任何BTC ( btc_balance == 0 ),则发出买入信号。使用 exchange.create_market_buy_order() 方法以市价买入指定数量 ( amount ) 的交易对。反之,如果短期均线低于长期均线 ( short_ma < long_ma ),并且持有BTC ( btc_balance > 0 ),则发出卖出信号,使用 exchange.create_market_sell_order() 方法以市价卖出全部持有的BTC。如果没有满足任何条件,则不进行任何交易。

    except Exception as e:
         print(f"Error: {e}")
    

    使用 try...except 块来捕获可能发生的异常,例如API连接错误、数据获取失败或交易执行错误。捕获异常可以防止程序崩溃,并输出错误信息以便调试和改进。在实际应用中,需要更详细地处理不同类型的异常,并采取相应的应对措施,例如重试、报警或停止交易。

    循环执行交易逻辑

    交易机器人通常需要持续不断地监控市场并执行交易。 为了实现这一点, 可以使用无限循环结构, 例如 while True: 。 这段代码会创建一个永无止境的循环, 使交易逻辑能够重复执行。

    在循环内部, trade() 函数负责执行实际的交易操作。 该函数可能包含以下步骤: 分析市场数据、 评估交易信号以及根据预设策略提交买卖订单。 trade() 函数的具体实现取决于交易策略的复杂性和所使用的交易平台。

    为了避免过于频繁的交易和减轻服务器压力, 建议在每次交易循环之间添加时间间隔。 time.sleep(60) 函数使程序暂停执行 60 秒, 然后再继续下一次循环。 这意味着交易逻辑将大约每分钟执行一次。 可以根据实际需求调整睡眠时间。 例如, 如果交易策略基于高频交易, 则可以缩短睡眠时间; 如果交易策略基于长期趋势, 则可以延长睡眠时间。

    需要注意的是, 在实际应用中, 建议添加异常处理机制来应对潜在错误。 例如, 可以使用 try...except 块来捕获网络连接错误或 API 调用失败等异常, 从而确保交易机器人的稳定运行。 还应考虑添加退出循环的机制, 例如通过监控特定信号或接收用户指令来停止交易机器人。

    风险控制与策略优化

    自动化交易系统并非设置完毕后即可高枕无忧。加密货币市场瞬息万变,市场情绪、监管政策、技术革新等多种因素都会影响价格波动,导致最初有效的交易策略逐渐失效。因此,持续的监控、评估和策略优化是至关重要的,它直接关系到自动化交易系统的长期盈利能力。

    • 回测: 回测是评估交易策略可行性的关键步骤。它利用历史市场数据,模拟策略在过去一段时间内的表现。通过分析回测结果,可以评估策略的潜在盈利能力、最大回撤、胜率、盈亏比等关键指标。更深入的回测还应考虑交易成本(手续费、滑点)对策略表现的影响。选择具有代表性的历史数据至关重要,以避免过度拟合,确保策略在不同市场条件下的稳健性。
    • 模拟交易: 模拟交易,也称为纸上交易或沙盒交易,是在一个与真实市场环境尽可能相似的虚拟环境中进行的交易。它允许交易者在不冒真实资金风险的情况下,测试和验证交易策略。模拟交易可以帮助识别策略的潜在缺陷,并优化参数设置。然而,需要注意的是,模拟交易环境无法完全模拟真实市场的流动性和交易深度,因此模拟结果可能与真实交易结果存在差异。
    • 参数优化: 交易策略的参数选择对策略的绩效至关重要。参数优化是指通过调整交易策略中的参数,例如移动平均线的周期、RSI指标的阈值、止损止盈比例等,以寻找最优的参数组合。常用的参数优化方法包括网格搜索、遗传算法、贝叶斯优化等。参数优化需要谨慎进行,过度优化可能会导致策略过度拟合历史数据,从而在真实交易中表现不佳。建议采用滚动窗口优化或样本外测试来评估优化后的参数的泛化能力。
    • 风险控制: 风险控制是自动化交易系统成功的基石。有效的风险控制策略能够保护交易资金,降低潜在损失。关键的风险控制参数包括仓位大小、止损止盈点、最大单笔交易风险、最大总风险敞口等。仓位大小应根据账户资金量和风险承受能力合理设置,避免过度杠杆。止损点应根据市场波动性和策略特性进行动态调整,以限制单笔交易的潜在损失。止盈点的设置则需要在锁定利润和追求更高收益之间取得平衡。同时,还需要监控整体风险敞口,避免过度暴露于单一资产或策略。

    高级策略与算法

    除了基础的移动平均线等策略外,加密货币交易者还可以利用更为复杂和精密的交易策略与算法,以期获得更高的收益或更有效的风险控制。

    • 趋势跟踪策略: 这类策略依赖于技术指标的分析,如移动平均收敛散度 (MACD)、相对强弱指数 (RSI) 等。通过这些指标,交易者可以识别市场的主要趋势,并采取顺应趋势的交易操作。例如,当MACD发出买入信号且RSI显示超卖时,可以考虑建立多头仓位;反之,则考虑建立空头仓位。更高级的趋势跟踪策略可能还会结合成交量分析、波动率指标等,以提高信号的准确性。
    • 套利策略: 加密货币市场存在多个交易所,且同一资产在不同交易所的价格可能存在细微差异。套利策略正是利用这些价格差异,在价格较低的交易所买入,并在价格较高的交易所卖出,从而赚取无风险利润。还可以进行跨交易所的三角套利,或者利用不同交易对之间的关系进行套利。需要注意的是,套利机会往往短暂易逝,需要快速的交易执行和低延迟的网络连接。还需要考虑交易手续费、提币费用等成本因素。
    • 机器学习算法: 机器学习算法在预测市场走势方面具有潜力。例如,神经网络可以学习历史价格数据中的复杂模式,并预测未来的价格变化。支持向量机 (SVM) 可以用于分类问题,例如预测价格是上涨还是下跌。其他常用的机器学习算法还包括决策树、随机森林、梯度提升等。在使用机器学习算法进行交易时,需要进行充分的数据预处理、特征工程和模型训练,并进行回测和实盘验证,以评估模型的性能和风险。还需要注意模型的过拟合问题,并定期更新模型,以适应市场的变化。更高级的应用包括使用强化学习来自动优化交易策略。

    合规与法律风险

    在进行加密货币交易时,务必高度重视合规性,严格遵守适用的法律法规。这不仅是保障自身权益的必要措施,也是维护市场秩序的基石。针对Upbit交易所,用户需要全面了解并严格遵守其交易规则,包括但不限于账户实名认证、交易限额、以及针对特定币种的特殊规定。同时,必须深入研究并遵守您所在国家或地区的法律法规,这些法规可能涉及加密货币的定义、交易许可、税务义务、以及投资者保护等多个方面。

    尤其需要关注的是反洗钱法(AML)和了解您的客户(KYC)相关规定。交易所通常会要求用户提供身份证明、地址证明等信息,以核实用户身份,防止非法资金流入。务必如实提供相关信息,配合交易所的合规要求。某些国家或地区可能将加密货币视为证券,因此证券法也可能适用。在进行涉及首次代币发行(ICO)或证券型代币发行(STO)的交易时,更应谨慎评估法律风险。

    违反相关法律法规可能导致严重的法律后果,包括但不限于账户冻结、罚款、甚至刑事责任。因此,在进行加密货币交易前,建议咨询专业的法律顾问,以确保您的交易行为符合法律法规的要求。持续关注监管政策的变化,及时调整您的交易策略,以规避潜在的法律风险。同时,请注意防范以“合规”为名义的诈骗行为,切勿轻易向陌生人透露个人信息或资产。