Python富途股票自动交易:均线策略实战指南(二)

391 阅读6分钟

在当今数字化投资浪潮中,自动化交易已成为投资者不可或缺的利器。Python凭借其强大的数据处理和脚本编写能力,与富途股票交易平台深度结合,为投资者打开了智能投资的新大门。今天,就让我们深入探索如何利用Python实现富途股票的自动交易。

一、高级应用:拓展交易策略与分析

随着对Python和富途API的深入理解,你可以开发更复杂的交易策略,如基于技术指标的交易信号生成、多因子模型等。同时,利用Python强大的数据可视化库,如Matplotlib和Seaborn,可以将交易数据和市场趋势直观地展示出来,进一步优化投资决策。

二、实战案例:均线策略实现自动交易

以下是一个基于均线策略的实战案例,通过计算快线和慢线的均线,判断多空趋势并执行相应的交易操作。

# 计算均线,判断多空
def calculate_bull_bear(code, fast_param, slow_param):
    if fast_param <= 0 or slow_param <= 0:
        return 0
    if fast_param > slow_param:
        return calculate_bull_bear(code, slow_param, fast_param)
    ret, data = quote_ctx.get_cur_kline(code=code, num=slow_param + 1, ktype=KLType.K_1M)
    if ret != RET_OK:
        print('获取K线失败:', data)
        return 0
    candlestick_list = data['close'].values.tolist()[::-1]
    fast_value = None
    slow_value = None
    if len(candlestick_list) > fast_param:
        fast_value = sum(candlestick_list[1: fast_param + 1]) / fast_param
    if len(candlestick_list) > slow_param:
        slow_value = sum(candlestick_list[1: slow_param + 1]) / slow_param
    if fast_value is None or slow_value is None:
        return 0
    return 1 if fast_value >= slow_value else -1

# 开仓函数
def open_position(code):
    # 获取摆盘数据
    ask, bid = get_ask_and_bid(code)

    # 计算下单量
    open_quantity = calculate_quantity()

    # 判断购买力是否足够
    if is_valid_quantity(TRADING_SECURITY, open_quantity, ask):
        # 下单
        ret, data = trade_ctx.place_order(price=ask, qty=open_quantity, code=code, trd_side=TrdSide.BUY,
                                          order_type=OrderType.NORMAL, trd_env=TRADING_ENVIRONMENT,
                                          remark='moving_average_strategy')
        if ret != RET_OK:
            print('开仓失败:', data)
    else:
        print('下单数量超出最大可买数量。')

# 平仓函数
def close_position(code, quantity):
    # 获取摆盘数据
    ask, bid = get_ask_and_bid(code)

    # 检查平仓数量是否有效
    if quantity == 0:
        print('无效的下单数量。')
        return False

    # 平仓
    ret, data = trade_ctx.place_order(price=bid, qty=quantity, code=code, trd_side=TrdSide.SELL,
                   order_type=OrderType.NORMAL, trd_env=TRADING_ENVIRONMENT, remark='moving_average_strategy')
    if ret != RET_OK:
        print('平仓失败:', data)
        return False
    return True

# 策略启动时运行一次,用于初始化策略
def on_init():
    # 解锁交易(如果是模拟交易则不需要解锁)
    if not unlock_trade():
        return False
    print('************  策略开始运行 ***********')
    return True

# 每次产生一根新的 K 线运行一次,可将策略的主要逻辑写在此处
def on_bar_open():
    # 打印分隔线
    print('*************************************')

    # 只在常规交易时段交易
    if not is_normal_trading_time(TRADING_SECURITY):
        return

    # 获取 K 线,计算均线,判断多空
    bull_or_bear = calculate_bull_bear(TRADING_SECURITY, FAST_MOVING_AVERAGE, SLOW_MOVING_AVERAGE)

    # 获取持仓数量
    holding_position = get_holding_position(TRADING_SECURITY)

    # 下单判断
    if holding_position == 0:
        if bull_or_bear == 1:
            print('【操作信号】 做多信号,建立多单。')
            open_position(TRADING_SECURITY)
        else:
            print('【操作信号】 做空信号,不开空单。')
    elif holding_position > 0:
        if bull_or_bear == -1:
            print('【操作信号】 做空信号,平掉持仓。')
            close_position(TRADING_SECURITY, holding_position)
        else:
            print('【操作信号】 做多信号,无需加仓。')

代码详细解释

1. 计算均线,判断多空

calculate_bull_bear 函数用于计算快线和慢线的均线值,并根据两者的相对位置判断当前市场处于多头还是空头趋势。具体步骤如下:

  • 检查参数有效性:确保快线和慢线的周期参数大于0。若快线周期大于慢线周期,则交换两者,以确保快线周期小于慢线周期。
  • 获取K线数据:调用 quote_ctx.get_cur_kline 获取指定股票的K线数据。这里获取的是1分钟K线数据,数量为慢线周期加1,以确保有足够的数据计算均线。
  • 计算均线值:从获取的K线数据中提取收盘价,计算快线和慢线的均线值。快线的均线值是最近fast_param个收盘价的平均值,慢线的均线值是最近slow_param个收盘价的平均值。
  • 比较均线值:比较快线和慢线的均线值。若快线大于等于慢线,则返回1(多头信号);否则返回-1(空头信号)。

2. 开仓函数

open_position 函数用于执行开仓操作。具体步骤如下:

  • 获取摆盘数据:调用 get_ask_and_bid 函数获取股票的买一价(ask)和卖一价(bid)。
  • 计算下单量:调用 calculate_quantity 函数计算下单量,这里使用最小交易量。
  • 检查购买力:调用 is_valid_quantity 函数检查账户的购买力是否足够。若足够,则下单买入;否则提示下单失败。

3. 平仓函数

close_position 函数用于执行平仓操作。具体步骤如下:

  • 获取摆盘数据:调用 get_ask_and_bid 函数获取股票的买一价和卖一价。
  • 检查平仓数量:确保平仓数量有效,即不为0。
  • 执行平仓:下单卖出指定数量的股票,完成平仓操作。若平仓成功,返回True;否则返回False。

4. 策略启动时运行一次

on_init 函数在策略启动时运行一次,用于初始化策略。主要功能是解锁交易(如果是模拟交易则不需要解锁),并打印策略开始运行的提示信息。

5. 每次产生一根新的 K 线运行一次

on_bar_open 函数在每次产生一根新的K线时运行,用于执行策略的主要逻辑。具体步骤如下:

  • 打印分隔线:打印分隔线,用于区分不同的K线周期。
  • 检查交易时段:调用 is_normal_trading_time 函数检查当前是否处于常规交易时段。若不是,则返回。
  • 计算均线,判断多空:调用 calculate_bull_bear 函数获取当前的多空信号。
  • 获取持仓数量:调用 get_holding_position 函数获取当前的持仓数量。
  • 下单判断:根据持仓情况和多空信号,决定是否开仓或平仓。若无持仓且出现多头信号,则开仓;若有持仓且出现空头信号,则平仓;若无持仓且出现空头信号,则不开空单;若有持仓且出现多头信号,则不加仓。

三、结语:开启你的智能投资之旅

Python与富途股票自动交易的结合,为投资者提供了一个强大且灵活的交易工具。通过自动化交易,不仅可以提高交易效率,还能在复杂的市场环境中保持冷静和理性。如果你对股票投资和自动化交易感兴趣,不妨从今天开始,用Python构建你的智能交易系统,开启财富增长的新篇章!