学习QMT股票量化系统再谈单均线策略

单均线策略作为量化交易的入门策略,有助于初学者逐步建立量化交易的知识体系,为进一步学习更高级的量化交易策略和技术打下坚实的基础。

学习QMT股票量化系统再谈单均线策略

图1

上一次,我们在一文中pandas 库中的 rolling 方法来计算了20日均线,见上图1,rolling 方法用于指定窗口内的数据进行滚动统计计算,而 mean 方法用于计算这些数据的平均值。将这两个方法结合起来,就可以得到移动平均线。。

但python还有一个talib库,它为金融市场数据提供了广泛的技术分析指标和函数。talib 能够计算如移动平均线、布林带、相对强弱指数(RSI)、随机振荡器等超过150种不同的金融技术指标,广泛地应用于各种金融市场的量化分析和交易策略开发。

今天,我们就用talib库来改写一下单均线策略。

有一点非常好,当我们安装好QMT后,就同时也安装好了talib库,我们只需要在程序的开头导入即可,免去了自行安装的麻烦。

学习QMT股票量化系统再谈单均线策略

图2

改写单均线策略也很简单,我们把原来的MA20 = pd.Series(close).rolling(window=ContextInfo.MA_period).mean()这一行删除,换成以下代码即可,其他的地方都不用改:

MA20 = talib.MA(close, timeperiod=ContextInfo.MA_period, matype=0)

close是收盘价;timeperiod是均线周期,即20日;matype=0,表示简单移动平均线。

在这里我们附上修改后的完整代码:

#encoding:gbk
'''
单均线策略,股价大于20日均线,全仓买入,小于20均线,全仓卖出
注意:本策略仅用于python量化学习,不用于真实交易
'''

import pandas as pd
import numpy as np
import talib

def init(ContextInfo):
    # 设置股票代码和账户ID
    ContextInfo.stock = "600863.SH"
    ContextInfo.accID = 'your accID'
    # 设置移动平均周期
    ContextInfo.MA_period = 20

def handlebar(ContextInfo):
    # 计算20日均线
    close = ContextInfo.get_market_data_ex(
        ['close'],
        [ContextInfo.stock],
        start_time="20230101",
        end_time="20231231",
        period='1d',
        dividend_type='none'
    )[ContextInfo.stock]['close']
    
    MA20 = talib.MA(close, timeperiod=ContextInfo.MA_period, matype=0)  # matype=0 表示简单移动平均线

    # 获取账户信息
    account_info = get_trade_detail_data(ContextInfo.accID, 'stock', 'account')
    if not account_info:
        print("无法获取账户信息")
        return
    
    account_info = account_info[0]
    available_cash = int(account_info.m_dAvailable)  # 可用资金

    # 全仓买入逻辑
    if close[-2] <= MA20[-2] and close[-1] > MA20[-1]:
        # 计算买入数量,向下取整
        buy_volume = available_cash // close[-1]
        # 下单买入
        order_target_value(ContextInfo.stock, buy_volume, ContextInfo, ContextInfo.accID)

    # 全仓卖出逻辑
    elif close[-2] > MA20[-2] and close[-1] <= MA20[-1]:
        # 获取持仓信息
        position_info = get_trade_detail_data(ContextInfo.accID, 'stock', 'position')
        if not position_info:
            print("无法获取持仓信息")
            return
        
        position_info = position_info.get(ContextInfo.stock, 0)  # 获取当前股票的持仓量
        
        # 下单卖出
        order_target_value(ContextInfo.stock, -position_info, ContextInfo, ContextInfo.accID)

回测运行正常,见图3和图4.

学习QMT股票量化系统再谈单均线策略

图3

学习QMT股票量化系统再谈单均线策略

图4

代码中get_trade_detail_data()函数用于获取交易账户的详细信息,例如像资金帐号,可用资金,持股代码,持股数量,成本价,市值,成交信息等等。当我们在买进股票前,我们要先看看,自己有多少可用资金,再根据价格来计算可买进的数量,我们就用下面的代码来获取可用资金:

account_info = get_trade_detail_data(ContextInfo.accID, ‘stock’, ‘account’)

ContextInfo.accID是交易账号ID;’stock’指账号类型为股票;’account’是查询数据为可用资金。

同样,当们卖出股票时,也需要知道自己的持股数量,同样使得get_trade_detail_data()函数来获取,查询数据的参数改一下就行了。

position_info = get_trade_detail_data(ContextInfo.accID, ‘stock’, ‘position’)

ContextInfo.accID是交易账号ID;’stock’指账号类型为股票;’position’是查询数据为持股数量。

可见,get_trade_detail_data()的参数是这样的:

get_trade_detail_data(account_id, account_type, data_type)

account_id 是交易账号ID,account_type 是账号类型(如股票、期货等),而 data_type 指定了您想要查询的数据类型,如可用资金,持股数量等等。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/73462
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 10 日
下一篇 2024 年 7 月 10 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注