暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何用Python监控股票异动

程序猿韩三皮 2022-08-03
1882
大家平常工作会比较忙,如果是买基金的话可以不用一直盯着,但是每天大概到14:30左右就需要考虑今天怎么操作了,这个时候make-money系统可以帮我们解决问题,但是如果买股票的话就需要花一些时间来盯盘了,这时候作为技术的我们如果还靠人肉来盯盘就感觉有点low了,于是想着能不能整个脚本帮我盯盘,说干就干,可以先给大家看看我的成品:

  1. 获取股票相关数据

    基础数据包括:股票名称,当前涨跌幅,最高价,最低价,成交量

    这边在网上搜索了一个免费的接口:

     http://api.money.126.net/data/feed/{},money.api

    用postman测试了一下,数据结构大约是这样的,截个图出来给大家瞅瞅

   


2.开干

    main入口函数代码

    import json


    import requests
    import re
    from models.nettick import NetTick




    class NetEaseData:
    @staticmethod
    def get_realtime_data(symbol):
    """
    网易的实时数据接口
    :param symbol: 股票代码
    :return: Tick
    """
    code = NetEaseData.convert_market(symbol)
    try:
    response = requests.get("http://api.money.126.net/data/feed/{},money.api".format(code)).text
    re_find = NetEaseData.__re_find(response)
    if re_find is not None:
    find_stock = re_find.get(code)
    if find_stock is not None:
    return NetTick(find_stock)


    except Exception as e:
    print('请求网易接口出错,错误信息:{}'.format(e))


    return None


    @staticmethod
    def convert_market(other_market_code=str):
    """
    转换通用股票代码 sz sh bj开头+股票代码
    """
    if other_market_code[0:2].lower() == 'sh':
    return '0' + other_market_code[2:]
    elif other_market_code[0:2].lower() == 'sz':
    return '1' + other_market_code[2:]
    else:
    return '2' + other_market_code[2:]


    @staticmethod
    def get_realtime_datas(symbols=[]):
    """
    网易的实时数据接口
    :param symbols: 股票代码列表
    :return: Ticks列表
    """
    codes = [NetEaseData.convert_market(code) for code in symbols]
    result = []
    try:
    response = requests.get("http://api.money.126.net/data/feed/{},money.api".format(','.join(codes))).text
    re_find = NetEaseData.__re_find(response)
    if re_find is not None:
    for code in re_find:
    item = re_find[code]
    result.append(NetTick(item))
    except Exception as e:
    print('请求网易接口出错,错误信息:{}'.format(e))


    return result


    @staticmethod
    def __re_find(response):
    find = re.findall(r"_ntes_quote_callback\((.*)\);", response)
    if len(find) >= 1:
    return json.loads(find[-1])
    return None




    if __name__ == '__main__':
    ticks = NetEaseData.get_realtime_datas(
    ['sz002665', 'sz002761', 'sh512710', 'sz000625', 'sh513130', 'sh512170', 'sz159995',
    'sz002425', 'sz002051', 'sz000665', 'sz000560', 'sh600166', 'sh600715', 'sh603363'])
    # up_shares = []
    # down_shares = []
    for tick in ticks:
    if tick.percent > 0:
    print(f"{tick.name}{tick.symbol}】", tick.price,
    "<font color='red'>%.2f" % (tick.percent * 100) + "%</font>",
    f"最低价:{tick.low},最高价:{tick.high}", f"成交量:{tick.volume 1000000}万")
    else:
    print(f"{tick.name}{tick.symbol}】", tick.price,
    "<font color='info'>%.2f" % (tick.percent * 100) + "%</font>",
    f"最低价:{tick.low},最高价:{tick.high}", f"成交量:{tick.volume 1000000}万")


    在与上面文件同级目录下,建目录model,然后建文件nettick,贴入以下代码
      class NetTick:
      def __init__(self, dict={}):
      self.name = dict.get('name') # 股票名称
      self.yestclose = dict.get('yestclose') # 昨日收盘价
      self.bidvol5 = dict.get('bidvol5') # 买5数量
      self.bidvol4 = dict.get('bidvol4') # 买4数量
      self.bidvol3 = dict.get('bidvol3') # 买3数量
      self.bidvol2 = dict.get('bidvol2') # 买2数量
      self.bidvol1 = dict.get('bidvol1') # 买1数量
      self.bid5 = dict.get('bid5') # 买5价格
      self.bid4 = dict.get('bid4') # 买4价格
      self.bid3 = dict.get('bid3') # 买3价格
      self.bid2 = dict.get('bid2') # 买2价格
      self.bid1 = dict.get('bid1') # 买1价格
      self.askvol5 = dict.get('askvol5') # 卖5数量
      self.askvol4 = dict.get('askvol4') # 卖4数量
      self.askvol3 = dict.get('askvol3') # 卖3数量
      self.askvol2 = dict.get('askvol2') # 卖2数量
      self.askvol1 = dict.get('askvol1') # 卖1数量
      self.ask5 = dict.get('ask5') # 卖5价格
      self.ask4 = dict.get('ask4') # 卖4价格
      self.ask3 = dict.get('ask3') # 卖3价格
      self.ask2 = dict.get('ask2') # 卖2价格
      self.ask1 = dict.get('ask1') # 卖1价格
      self.symbol = dict.get('symbol') # 股票代码 第一位1:深交所 0:上交所 2北交所
      self.volume = dict.get('volume') # 成交量
      self.price = dict.get('price') # 当前价格
      self.open = dict.get('open') # 开盘价
      self.low = dict.get('low') # 最低价
      self.high = dict.get('high') # 最高价
      self.code = dict.get('code') # 去除标记为的股票代码
      self.turnover = dict.get('turnover') # 成交额
      self.percent = dict.get('percent') # 涨跌幅
      self.updown = dict.get('updown') # 涨跌金额


      接下来直接用python run主文件就可以

      3 .定时任务配置

      参考https://github.com/ouqiang/gocron搭了一个自己的定时任务系统

      任务配置如下:

      wehook配置:

      这里的url是通过企业微信拉三个人进群,添加群机器人,然后踢掉另外两人即可,支持markdown模式,这里贴出详细的配置

        {
        "msgtype": "markdown",
        "markdown": {
        "content": "任务【{{.TaskName}}】执行{{.Status}},\n结果:{{.Result}}"
        }
        }


        todo

        1. 现在的股票代码是手动写的,后期可计入数据库;

        2. 未同步持仓信息,后期可以考虑加入持仓信息,计算实时收益;

        3. 后期可加入加仓逻辑和减仓逻辑,方便提醒操作;


        大家有什么好的想法或者建议,欢迎私信,也是想研究一下量化投资的开始,大家一起make-money

        如果大家想要源码也可以私我


        欢迎关注程序猿韩三皮公众号,我们一起用技术挣钱





        文章转载自程序猿韩三皮,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论