今天,我决定用老虎证券的API开放平台来实现模拟账户下单买股票,看看AI能不能顺利完成任务。你知道,编程的乐趣就是在于一开始的探索,尤其是当你碰到新的技术挑战时。

老虎证券的开放平台提供了一些非常实用的API接口,方便开发者与证券账户进行交互。如果你感兴趣,可以查看它们的官方文档:

简介 | 老虎开放平台

我先试了第一个功能,查询账户功能,老虎文档写的是,

第一个挑战:查询账户余额

我首先决定从最简单的操作开始——查询账户余额。按照老虎的文档,API接口应该会返回账户的各种余额信息。我直接将文档丢给Claude 3.7,看看它能否给我生成一段完美的Python代码。

不出所料,它快速给出了以下代码:

代码如下:

from tigeropen.trade.trade_client import TradeClient
from tigeropen.tiger_open_config import get_client_config
import pandas as pd
from pprint import pprint

def get_account_balance(private_key_path, tiger_id, account=None):
    """
    获取老虎证券账户余额信息
    
    参数:
    private_key_path (str): 私钥文件路径
    tiger_id (str): 老虎证券ID
    account (str, optional): 账户ID,不指定则使用默认账户
    
    返回:
    dict: 包含账户余额信息的字典
    """
    # 设置客户端配置
    client_config = get_client_config(
        private_key_path=private_key_path, 
        tiger_id=tiger_id, 
        account=account
    )
    
    # 创建交易客户端
    trade_client = TradeClient(client_config)
    
    # 获取账户资产信息
    portfolio_account = trade_client.get_prime_assets(base_currency='USD')
    
    # 提取关键账户信息
    account_info = {
        'account_id': portfolio_account.account,
        'update_time': portfolio_account.update_timestamp,
        'summary': {}
    }
    
    # 处理证券账户信息 (如果存在)
    if 'S' in portfolio_account.segments:
        sec = portfolio_account.segments['S']
        account_info['summary']['securities'] = {
            'cash_balance': sec.cash_balance,
            'available_cash': sec.cash_available_for_trade,
            'withdrawable_cash': sec.cash_available_for_withdrawal,
            'equity_with_loan': sec.equity_with_loan,
            'total_assets': sec.net_liquidation,
            'unrealized_pl': sec.unrealized_pl,
            'realized_pl': sec.realized_pl,
            'buying_power': sec.buying_power,
            'leverage': sec.leverage,
            'currencies': {}
        }
        
        # 添加各币种资产
        for currency, asset in sec.currency_assets.items():
            account_info['summary']['securities']['currencies'][currency] = {
                'cash_balance': asset.cash_balance,
                'available_cash': asset.cash_available_for_trade
            }
    
    # 处理期货账户信息 (如果存在)
    if 'C' in portfolio_account.segments:
        futures = portfolio_account.segments['C']
        account_info['summary']['futures'] = {
            'cash_balance': futures.cash_balance,
            'available_cash': futures.cash_available_for_trade,
            'withdrawable_cash': futures.cash_available_for_withdrawal,
            'total_assets': futures.net_liquidation,
            'unrealized_pl': futures.unrealized_pl,
            'realized_pl': futures.realized_pl,
            'init_margin': futures.init_margin,
            'maintain_margin': futures.maintain_margin,
            'currencies': {}
        }
        
        # 添加各币种资产
        for currency, asset in futures.currency_assets.items():
            account_info['summary']['futures']['currencies'][currency] = {
                'cash_balance': asset.cash_balance,
                'available_cash': asset.cash_available_for_trade
            }
    
    return account_info

if __name__ == "__main__":
    # 设置您的参数
    private_key_path = '您的私钥路径'
    tiger_id = '您的tiger_id'
    account = '您的账户ID'  # 可选,不设置则使用默认账户
    
    # 获取账户余额
    balance_info = get_account_balance(private_key_path, tiger_id, account)
    
    # 打印账户信息
    print(f"账户ID: {balance_info['account_id']}")
    print(f"更新时间: {pd.to_datetime(balance_info['update_time'], unit='ms')}")
    print("\n=== 账户余额详情 ===")
    pprint(balance_info['summary'])

运行结果如下:

这个代码直接生成了所有我需要的查询功能,并且一次性准确输出了账户余额。大赞Claude 3.7的效率!

同时也测试了一下Grok3.0,可惜这次Grok3.0没能正确给出代码。

第二个挑战:模拟账户下单

接下来,我决定再挑战一下,看看Claude 3.7能否教我如何通过模拟账户下单买入股票。我的目标是用130美元的价格购买一手英伟达(NVDA)股票。

再次,我将任务交给Claude 3.7,它迅速给出了一段代码:

代码如下:

from tigeropen.common.util.contract_utils import stock_contract
from tigeropen.common.util.order_utils import limit_order
from tigeropen.trade.trade_client import TradeClient
from tigeropen.tiger_open_config import get_client_config

def place_limit_order_for_nvda():
    """
    在模拟账户中下限价单购买一手NVDA股票
    """
    # 设置客户端配置,这里需要使用您的模拟账户
    # 注意:确保account参数是您的模拟账户ID
    client_config = get_client_config(
        private_key_path='您的私钥路径',  # 替换为您的私钥文件路径
        tiger_id='您的tiger_id',        # 替换为您的老虎证券ID
        account='您的模拟账户ID'         # 替换为您的模拟账户ID
    )
    
    # 创建交易客户端
    trade_client = TradeClient(client_config)
    
    # 生成NVDA股票合约
    contract = stock_contract(symbol='NVDA', currency='USD')
    
    # 生成限价单订单对象
    # 参数说明:
    # - account: 账户ID
    # - contract: 股票合约
    # - action: 买入(BUY)或卖出(SELL)
    # - limit_price: 限价单价格,这里设为130美元
    # - quantity: 数量,这里为1手(100股)
    order = limit_order(
        account=client_config.account, 
        contract=contract, 
        action='BUY', 
        limit_price=130.0, 
        quantity=100  # 美股一手通常是100股
    )
    
    # 下单
    try:
        order_id = trade_client.place_order(order)
        print(f"订单已提交,订单ID: {order_id}")
        print(f"订单状态: {order.status}")
        
        # 获取订单详情
        placed_order = trade_client.get_order(id=order_id)
        print("订单详情:")
        print(f"- 交易品种: {placed_order.contract}")
        print(f"- 订单类型: {placed_order.order_type}")
        print(f"- 交易方向: {placed_order.action}")
        print(f"- 限价: ${placed_order.limit_price}")
        print(f"- 数量: {placed_order.quantity}股")
        print(f"- 已成交: {placed_order.filled}股")
        print(f"- 剩余: {placed_order.remaining}股")
        
    except Exception as e:
        print(f"下单失败: {e}")
        if hasattr(order, 'reason') and order.reason:
            print(f"失败原因: {order.reason}")

if __name__ == "__main__":
    place_limit_order_for_nvda()

运行结果是:代码准确执行,成功下单!模拟账户中可以看到买入成功。

在手机端也能看到买入成功的交易记录。整个人都感觉AI就是这么可靠!

手机端也可以看到确实买入成功。

下一步:量化交易

这次的测试顺利完成之后,我计划深入研究如何用AI来生成交易策略,实现量化交易。毕竟,AI不仅能帮助你解决技术问题,还能在金融市场中发掘新的机会。这个故事,还在继续……

Logo

更多推荐