运行于老虎证券开放api的一个小小策略

本文介绍了一个基于老虎证券API的美股自动化交易策略实现。该策略利用20日均线进行买卖信号判断,通过阿里云定时运行,并使用Crontab在美股开盘前触发。策略涉及读取标普500成分股信息,获取历史价格数据并应用技术指标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过两周的时间,在老虎证券开放api基础上起一个策略,上穿20日均线买入,下穿20日均线卖出,标普500股票池,运行在阿里云上。用crontab定时,美股开盘前运行。策略文件夹下需要有sp500code.dat保存着标普500股票代码,也可以每次运行的时候去维基百科爬取。

# -*- coding: utf-8 -*-
"""
Created on 2018/9/20

@author: gaoan
"""
import logging
import traceback
import pandas as pd
import talib as ta
import re
import math
import threading
import time
import sys
import signal
from datetime import datetime
#账户设置包导入
from tigeropen.examples.client_config import get_client_config
#交易包导入
from tigeropen.trade.domain.order import ORDER_STATUS
from tigeropen.trade.request.model import AccountsParams
from tigeropen.common.response import TigerResponse
from tigeropen.tiger_open_client import TigerOpenClient
from tigeropen.trade.trade_client import TradeClient
from tigeropen.quote.request import OpenApiRequest
from tigeropen.common.util.contract_utils import option_contract, future_contract
#行情包导入
from tigeropen.examples.sp500 import save_sp500_tickers as getsp500code
from tigeropen.common.consts import Market, QuoteRight, BarPeriod,Language
from tigeropen.quote.quote_client import QuoteClient
#判断可以买入的股票代码
buy_set=set()
#判断可以卖出的股票代码
sell_set=set()
#当前持仓股票代码和数量的字典
cur_quant={}
goal=5
#日志设置
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filemode='a', )
logger = logging.getLogger('TigerOpenApi')
#客户端设置
client_config = get_client_config()
#定义交易客户端
openapi_client = TradeClient(client_config, logger=logger)
#定义行情客户端
quote_client = QuoteClient(client_config, logger=logger)
#获取标普500的20日bars
def get_price(bars_num):
    stocks = read_sp_500code()
    df=pd.DataFrame(columns=['symbol','time','open','high','low','close','volume'])
    #每次取数据要取的条目数量
    items=math.floor(1000/bars_num)
    stock_num=len(stocks)
    print(stock_num)
    roundtrip=math.floor(stock_num/items)
    print(roundtrip)

    for i in range(roundtrip):
        bars = quote_client.get_bars(stocks[i*items:i*items+items],period=BarPeriod.DAY,begin_time=-1, end_time=-1,right=QuoteRight.BR,limit=bars_num)
        df=df.append(bars,ignore_index=True)
        print(bars)
    bars = quote_client.get_bars(stocks[stock_num-roundtrip*items:stock_num],\
                     period=BarPeriod.DAY,begin_time=-1,end_time=-1,right=QuoteRight.BR,limit=bars_num)
    df=df.append(bars,ignore_index=True)   

    return(df)
def generate_trade_info():
    stocks = read_sp_500code()
    prices=get_price(20)
    print(prices)
    ave=[]
    buy_set.clear()
    sell_set.clear()
    for i in range(len(stocks)):
        price=prices[i*20:i*20+20]['close'].values
        mai=ta.MA(price,timeperiod=20,matype=0)
        ave.append(mai[-1])
    print(ave)
    for i in range(len(stocks)):
        price=prices[i*20:i*20+20]['close'].values
        if price[-2]<ave[i] and price[-1]>ave[i]:
            buy_set.add(stocks[i])
        elif price[-2]>ave[i] and price[-1]<ave[i]:
            sell_set.add(stocks[i])
    print(buy_set)
    print(sell_set)

def trade():
    #generate_trade_info()
    account = client_config.paper_account
    curset=get_curset(account)
    print(curset)
    tosell=curset & sell_set
    tosell_list=list(tosell)
    print(tosell_list)
    market_status_list = quote_client.get_market_status(Market.US)
    #print(market_status_list)
    #print(type(market_status_list))
    '''
    if market_status_list[0].status=='Not Yet Open':
        print('市场还没有开始交易')
        return
    '''
    #卖出股票
    for i in range(len(tosell_list)):
        contract = openapi_client.get_contracts(tosell_list[i])[0]
        order = openapi_client.create_order(account, contract, 'SELL', 'MKT' , cur_quant(tosell_list[i]))
        openapi_client.place_order(order)
    curset=get_curset(account)
    print(buy_set)
    tobuy=buy_set-curset
    tobuy_list=list(tobuy)
    #变成列表后会产生排序,这个顺序是默认的
    print(tobuy_list)
    tofill=goal-len(curset)
    print(tofill)
    tofill= min(tofill,len(tobuy_list))
    cur_asset=openapi_client.get_assets(account=account)
    potfolio=cur_asset[0]
    cash=potfolio.summary.available_funds*0.01
    print("Cash",cash)
    if tofill>0:
        for i in range(tofill):
            contract = openapi_client.get_contracts(tobuy_list[i])[0]
            #print(contract)
            #print(type(tobuy_list[i]))
            #print(tobuy_list[i])
            brief=quote_client.get_briefs(symbols=[tobuy_list[i]],right=QuoteRight.BR)
            latest_price=brief[0].latest_price
            order = openapi_client.create_order(account, contract, 'BUY', 'MKT' , math.floor(cash/tofill/latest_price))
            print('buy order sent')
            openapi_client.place_order(order)
       

#position对象:[contract: TVIX/STK/USD, quantity: 5, average_cost: 36.0764, market_price: 0.0]
def get_curset(account):
    pos=openapi_client.get_positions(account=account)
    print(len(pos))
    curset=set()
    cur_quant={}
    for i in range(len(pos)):
        print('当前持仓\n',pos[i])
        cont=pos[i].contract
        code = re.search(r'[A-Z]*(?=/STK)',str(cont)).group(0)
        curset.add(code)
        cur_quant[code]=pos[i].quantity
    return curset

#卖出当前所有持仓
def all_off(account):
    pos=openapi_client.get_positions(account=account)
    for i in range(len(pos)):
        contract=pos[i].contract
        quantity=pos[i].quantity
        if quantity>0:
            order = openapi_client.create_order(account, contract, 'SELL', 'MKT' , quantity)
            openapi_client.place_order(order)
        elif quantity<0:
            order = openapi_client.create_order(account, contract, 'BUY', 'MKT' , -quantity)
            openapi_client.place_order(order)

def read_sp_500code():
    infile = open('sp500code.dat','r')
    incontent = infile.read()
    incontent=incontent.lstrip('[')
    incontent=incontent.rstrip(']')
    stocks = incontent.split(', ')
    new= []
    for i in range(len(stocks)):
        new.append(eval(stocks[i]))
    return new

def before_market_open():
    generate_trade_info()

#Not Yet Open, Pre Market Trading, Market Trading
if __name__ == '__main__':
    p = threading.Thread(target=before_market_open)
    p.setDaemon(True)
    p.start()
    time.sleep(10)
    p.join()
    while True: 
        time.sleep(1)
        market_status_list = quote_client.get_market_status(Market.US)
        print(market_status_list)
        if market_status_list[0].status == 'Trading':
            trade()
            break
    #get_curset(client_config.paper_account)
    #all_off(client_config.paper_account)
<think>好的,用户想了解如何使用Python与老虎证券API进行交互或开发相关应用。首先,我需要回顾系统级指令,确保回答符合要求。所有数学表达式要用$...$,独立公式用$$...$$,同时要生成相关问题,正确引用资料。 首先,用户的问题涉及老虎证券的Python API,我需要参考提供的引用内容。引用1提到了克隆GitHub仓库的步骤,引用3有具体的代码示例,比如获取期货合约和下单操作。引用2和4可能关联性不大,但可以提及编程基础的重要性。 接下来,我需要整理步骤。首先安装SDK,然后配置认证信息,接着调用API接口。在引用3中,用户需要自己建立期货合约,但实测不能交易,只能创建订单。这部分要提醒用户注意可能的问题。 然后,按照用户的要求,结构要清晰,分步骤说明。同时需要确保LaTeX语法正确,不过这里可能用不到数学公式,但如果有性能分析部分,可能需要使用,比如时间复杂度$O(n \log n)$。 生成相关问题时要围绕API使用、功能限制、错误处理等。例如,如何获取实时行情,如何处理认证错误,期货交易的问题等。 最后,检查引用是否正确添加,比如在安装步骤和代码示例后添加[^1]和[^3]。确保回答自然,符合用户需求。</think>### 老虎证券 Python API 使用指南 #### 1. 环境准备 - **安装SDK**:克隆官方仓库并安装依赖 ```bash git clone https://github.com/tigerfintech/openapi-python-sdk.git cd openapi-python-sdk pip install -r requirements.txt ``` 引用自SDK安装文档[^1] #### 2. 认证配置 需准备以下参数: ```python client_config = { "account": "您的账户ID", "api_key": "API密钥", "secret_key": "私钥", "env": "模拟环境/生产环境" } ``` #### 3. 核心接口调用示例 **获取期货合约**(需注意期货交易限制): ```python from openapi_quote_client import QuoteClient from openapi_trade_client import FutureContract future = 'MGC' contract = quote_client.get_current_future_contract(future) # 需要手动构建合约对象 custom_contract = FutureContract( symbol=future, currency=contract.currency[0], expiry=contract.last_trading_date[0], multiplier=contract.multiplier[0] ) ``` 引用自期货交易示例[^3] **创建订单**(当前期货仅支持创建未提交): ```python order = openapi_client.create_order( client_config.account, custom_contract, 'BUY', 'LMT', 1, limit_price=0.1 ) ``` #### 4. 功能限制说明 - 股票/期权合约可直接获取 - 期货合约需手动构建且不能实际交易 - 订单类型支持:限价单(LMT)、市价单(MKT) #### 5. 开发建议 - 使用try-except处理API异常 - 建议先使用模拟环境测试 - 结合Pandas进行数据分析 ```python import pandas as pd # 示例:将行情数据转换为DataFrame data = quote_client.get_bars('AAPL', '1d') df = pd.DataFrame(data) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值