python股票策略_基于python的股票自动盯盘程序

不是每个人都有时间时刻盯盘的,而且股票那么多,往往挂一漏万,错过很多好的股票和买入机会。笔者尝试用python实现了一个可以自动盯盘的程序,调用了一个免费的股票数据接口baostock提供的历史行情数据和实时数据,实现了对盘中突破10日高点,且在20日均线上股票的提示。目前股票池最大容量为500只股票,同时实现对500只股票的监控,3秒以内就能快速识别和反应,听上去是不是很心动?如果大家有兴趣,可以自己往里面添加不同的判别条件,实现自己的策略。

首先默认已经安装python,且版本是3.5或者以上。

安装pandas: pip insall pandas

安装numpy: pip install numpy

安装baostock数据接口包:pip install baostock。

baostock提供免费历史k线的下载,包括前后复权的数据,而且还提供股票实时数据

如果有问题,请去官网下载再安装:http://www.baostock.com,不需要注册。

安装TA-Lib库 pip install ta-lib(如果安装不成功,可进入“https://www.lfd.uci.edu/~gohl ke/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]

# 调用TA-Lib中的MA函数,计算20日均线值

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 inResultData.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 = {}

# 自定义股票池

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)

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值