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

图1
上一次,我们在一文中用pandas 库中的 rolling 方法来计算了20日均线,见上图1,rolling 方法用于指定窗口内的数据进行滚动统计计算,而 mean 方法用于计算这些数据的平均值。将这两个方法结合起来,就可以得到移动平均线。。
但python还有一个talib库,它为金融市场数据提供了广泛的技术分析指标和函数。talib 能够计算如移动平均线、布林带、相对强弱指数(RSI)、随机振荡器等超过150种不同的金融技术指标,广泛地应用于各种金融市场的量化分析和交易策略开发。
今天,我们就用talib库来改写一下单均线策略。
有一点非常好,当我们安装好QMT后,就同时也安装好了talib库,我们只需要在程序的开头导入即可,免去了自行安装的麻烦。

图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.

图3

图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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!