股票实现程序化自动化交易的三个基础:获取数据、执行交易、查询账户。
以后说到策略示例的时候就不介绍接口的基础使用方法了,随便一个策略把过程写出来都会很啰嗦,尽量压缩内容吧,这些内容是面向新手的,大佬们忽略细节就好。
单均线突破策略
今天要说的单均线突破策略简单总结流程如下:
1、获取历史数据;
2、计算N日简单移动平均线;
3、获取实时数据,判断上穿还是下穿;
4、执行买入或者卖出;
单均线突破策略是一种经典的技术分析策略,通过计算某个周期的简单移动平均线(SMA),当价格突破均线时执行买入或卖出操作。
如果还有别的,那就是获取持仓,判断当前持仓量,有持仓的话是根据盈利减仓一部分还是清仓,或者根据资金量是否继续加仓。这里就不说这些细节了,写策略的时候根据自己情况决定吧,逻辑并不复杂。
还有,交易的滑点和手续费的设置,滑点是指预期交易价格和实际交易价格之间的差异,执行交易是用挂单价、最新价还是对手价,部分成交,剩下撤消还是挂单,如果没有立即成交,是撤消还是挂单等等,这些也先不讲,以后讲回测的时候再说。
下面我们来分步骤写代码实现
0、连接客户端,启动交易对象
# 客户端的路径
client_path = r'D:\程序交易客户端\userdata_mini'
# 随便输入一个整数
session_id = random.randint(100, 10000)
# 创建交易对象实例
xt_trader = XtQuantTrader(client_path, session_id)
# 启动交易对象
xt_trader.start()
# 创建交易连接
con_result = xt_trader.connect()
# 返回值是0就是连接成功,失败返回非0的值,一般是-1
print('连接状态:', con_result)
if con_result == 0:
print('连接成功')
# 创建账户对象,默认STOCK,表示股票账户,也支持港股通、期权、期货等
account = StockAccount('你的资金账号', 'STOCK')
因为要执行交易的,所以要创建交易连接和账户对象,只是分析数据的话不用这一步,实现交易肯定要先有股票账户才行,这里不详细说了。
1、获取历史数据
这里假设我们要获取的是过去一年的历史数据,也足够测试用了:
from datetime import datetime, timedelta
now_time = datetime.now()
old_time = now_time - timedelta(days=365)
start_time = old_time.strftime('%Y%m%d')#历史数据的开始时间,取一年前
end_time = now_time.strftime('%Y%m%d')#历史数据的结束时间,取今天
stock_list = ['000001.SZ'] #平安银行,可以用列表取多支['000001.SZ','600519.SH']
# 下载历史数据较多的话加上回调,输出下载进度
def down_callback(data):
print(data)
# 历史行情需要先下载
xtdata.download_history_data2(stock_list, '1d', start_time, end_time, down_callback)
# 获取数据,只要close就行
result = xtdata.get_market_data_ex(['close'], stock_list, '1d', start_time, end_time)
# 返回的是字典格式,键名是股票代码,键值是dataframe数据
his_data = result[stock_list[0]]
print(his_data)
# 取回的数据如下
close
20230529 11.98
20230530 11.87
20230531 11.60
20230601 11.59
20230602 11.93
... ...
20240522 11.56
20240523 11.40
20240524 11.31
20240527 11.51
20240528 11.40
我写代码都是自己用的,懒省事,也没注释习惯,自己看懂就行,时间长了自己也看不懂了就只能重写。新手不要学我这样的坏习惯,最好加上参数名和对应的参数值,并在需要的地方写清楚注释。
2、计算N日简单移动平均线
# 计算20日简单移动平均线
his_data['SMA20'] = his_data['close'].rolling(window=20).mean()
print(his_data)
Python是真好用,pandas是真好用,还有更好用的股票相关类库,这里都用不到,这又让我想起上篇说的某位复读机,问了我10次:为啥没有MACD?
3、获取实时数据,判断上穿还是下穿
realtime_data = xtdata.get_full_tick(stock_list)
print(realtime_data)
lastclose = realtime_data[stock_list[0]]['lastClose']
if lastclose > his_data['SMA20'].iloc[-1]:
signal = 'buy'
elif lastclose < his_data['SMA20'].iloc[-1]:
signal = 'sell'
else:
signal = 'hold'
这里用的是获取全推数据get_full_tick,常用的数据接口也就是这两个,都演示一下,盘口的tick数据都是可以取到的,用上面的get_market_data_ex也是可以取到实时数据的,不如这个方便。
4、执行买入或者卖出
实际上在第三步判断后直接执行操作就行,这里是为了演示的更清晰一些,而且很多时候出现交易信号,还要和信号一起,再加一些别的判断。
if signal == 'buy':
xt_trader.order_stock(account, stock_list[0], xtconstant.STOCK_BUY, 100, xtconstant.MARKET_PEER_PRICE_FIRST, 0)
elif signal == 'sell':
xt_trader.order_stock(account, stock_list[0], xtconstant.STOCK_SELL, 100, xtconstant.MARKET_PEER_PRICE_FIRST, 0)
这里用的报价类型是对手价,所以报单价格直接用0就行,如果是用之前讲过的指定价,这个价格参数要填的,并且要在交易所规定的价格笼子以内,不然就是废单了。
单均线突破策略的优缺点
优点很好理解,简单易懂,非常直观,并且容易实现,适合新手学习。缺点也很明显,均线是对过去价格的平均,具有一定的滞后性,可能错过最佳买卖时机。还有产生假信号的问题,尤其震荡行情中,均线来回突破,如果不加判断,你的程序就傻了,来回买卖,频繁交易不说,还要高买低卖。
还有一些要注意的
简单的示例就是这些了,实际情况肯定是要加多种判断,筛选的标的也不应该只有一支,这么简单的策略,如标题所说,为什么却长期可用呢?因为这种策略只会在某些时间段,某些标的上一定可用,但不会每时每刻都有效。
如果调整了参数几乎可以适用于任何标的,任何时间。这类策略一般都只是作为参考,配合其它因子一起使用才行。新手练习最为合适,如果用这类策略跑回测,数据特别完美,那一定是过拟合了,千万别想当然的就以为可以赚钱,拿去跑实盘。
股票实现程序化自动化交易的三个基础:获取数据、执行交易、查询账户。在前面的文章中都已经演示过了,以后的分享都会在此基础上做演示,如果有没编程基础,会很难理解。
量化交易需要的API接口,获取数据有很多种,执行交易和查询账户只能通过券商申请,要找个人账户可申请,入金门槛低,接入文档完善,技术支持好的。
会编程,有基础,只是需要API接口有用,不会写程序的朋友可能需要学习或者找人代写交易策略,这不是什么现成的自动化程序。
注意啊,要么你自己会写程序,要么你找人帮你写,股票券商肯定不会帮你,再简单的需求都不会帮你写,严重违规的!
今天的分享就到这里,对股票量化程序自动交易感兴趣的朋友可以关注我,有任何相关问题也可以留言讨论或者私信与我交流!
-----
相关文章----Python炒股自动化(简版)
python炒股自动化(0),申请券商API接口
python炒股自动化(1),量化交易接口区别
Python炒股自动化(2):获取股票实时数据和历史数据
Python炒股自动化(3):分析取回的实时数据和历史数据
Python炒股自动化(4):通过接口向交易所发送订单
Python炒股自动化(5):通过接口查询订单,查询账户资产
----