返回目录:理财保险
不是每个人都有时间时刻盯盘的,而且股票那么多,往往挂一漏万,错过很多好的股票和买入机会。笔者尝试用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 talib
如果失败,可以下载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_result)
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)
print(type(rs))
#### 打印结果集 ####
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:
# print(key,ResultData.data[key])
#当盘中价格高于警示价格,输出提示信息。
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 = {}
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)