不是每个人都有时间时刻盯盘的,而且股票那么多,往往挂一漏万,错过很多好的股票和买入机会。笔者尝试用python实现了一个可以自动盯盘的程序,调用了一个免费的股票数据接口baostock提供的历史行情数据和实时数据,实现了对盘中突破10日高点,且在20日均线上股票的提示。目前股票池最大容量为500只股票,同时实现对500只股票的监控,3秒以内就能快速识别和反应,听上去是不是很酷?如果大家有兴趣,可以自己往里面添加别的功能,实现自己的策略。
首先默认已经安装python,且版本是3.5或者以上。
安装pandas: pip insall pandas
安装numpy: pip install numpy
安装baostock数据接口包:pip install baostock。
如果有问题,请去官网下载再安装:http://www.baostock.com
安装TA-Lib库 pip install ta-lib(如果安装不成功,可进入“https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib”下载如“TA_Lib‑0.4.17‑cp35‑cp35m‑win32.whl”相对应的版本,使用pip install xx.whl进行本地安装)
程序首先下载股票上一个交易日之前的日K线行情数据,然后计算上一交易日的20日均线,然后比较上一交易日20日均线的值和过去10天最高收盘价两个值,取其中的最大值作为阻力线,然后再获取当日实时数据,如果某个时刻突破了这个阻力线,则发出提示信息。这只是个简单的策略,大家可以自己在我的程序基础上,设定自己的策略。
import baostock as bs import pandas as pd import numpy as np import talib as ta import datetime # 获取历史行情数据,并根据日K线数据设置警示价格 def return_constraintdict(stockcodelist): login_result = bs.login(user_id='anonymous', password='123456') print('login respond error_msg:'+login_result.error_msg) startdate = '2018-01-01' today = datetime.datetime.now() delta = datetime.timedelta(days=1) # 获取截至上一个交易日的历史行情 predate = today - delta strpredate = datetime.datetime.strftime(predate, '%Y-%m-%d') for stockcode in stockcodelist: ### 获取沪深A股行情和估值指标(日频)数据并返回收盘价20日均线 #### # date 日期 # code 股票代码 # close 收盘价 # preclose 前收盘价 # volume 交易量 # amount 交易额 # adjustflag 复权类型 # turn 换手率 # tradestatus 交易状态 # pctChg 涨跌幅 # peTTM 动态市盈率 # psTTM 市销率 # pcfNcfTTM 市现率 # pbMRQ 市净率 rs = bs.query_history_k_data("%s" % stockcode, "date,code,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM", start_date=startdate, end_date=strpredate, frequency="d", adjustflag="2") print('query_history_k_data respond error_code:' + rs.error_code) print('query_history_k_data respond error_msg:' + rs.error_msg) #### 打印结果集 #### result_list = [] while (rs.error_code == '0') & rs.next(): # 获取一条记录,将记录合并在一起 result_list.append(rs.get_row_data()) result = pd.DataFrame(result_list, columns=rs.fields) closelist = list(result['close']) closelist = [float(price) for price in closelist] malist = ta.MA(np.array(closelist), timeperiod=20) if len(malist) > 20 and closelist[-20] > 0: ma20value = malist[-1] summit20day = max(closelist[-10:]) # 以突破10日高点且在20日均线以上作为买入条件 resistancelinedict[stockcode] = max(ma20value, summit20day) else: resistancelinedict[stockcode] = float(closelist[-1]) bs.logout() return resistancelinedict # 每次收到实时行情后,回调此方法 def callbackFunc(ResultData): print(ResultData.data) for key in ResultData.data: # 当盘中价格高于警示价格,输出提示信息。 if key in resistancelinedict and float(ResultData.data[key][6]) > resistancelinedict[key]: print("%s,突破阻力线,可以买入" % key) def test_real_time_stock_price(stockcode): login_result = bs.login_real_time(user_id='anonymous', password='123456') # 订阅 rs = bs.subscribe_by_code(stockcode, 0, callbackFunc, "", "user_params") # rs = bs.subscribe_by_code("sz.300009", 0, callbackFunc, "", "user_params") if rs.error_code != '0': print("request real time error", rs.error_msg) else: # 使主程序不再向下执行。使用time.sleep()等方法也可以 text = input("press any key to cancel real time \r\n") # 取消订阅 cancel_rs = bs.cancel_subscribe(rs.serial_id) # 登出 login_result = bs.logout_real_time("anonymous") if __name__ == '__main__': resistancelinedict = {} # stockcodes = "sh.600000,sz.300009,sz.300128,sh.603568,sz.000049" stockcodelist = ['sh.600000', 'sz.300009', 'sz.300128', 'sh.603568', 'sz.000049', 'sh.600518', 'sz.300532', 'sz.000001'] stockcodes = "" for stockcode in stockcodelist: stockcodes = "%s%s," % (stockcodes, stockcode) stockcodes = stockcodes[:-1] print(stockcodes) resistancelinedict = return_constraintdict(stockcodelist) #### 登出系统 #### test_real_time_stock_price(stockcodes)