cxm'blog

  • 首页
  • 关于
  • 日常
  • 读书
  • 观影
  • 投资
  • 学习笔记
  • 发现
oiam.top
  1. 首页
  2. 学习笔记
  3. 正文

python选取A股小市值策略

2022年1月11日 741点热度 12人点赞 0条评论

2022.1.11——15:30更新:

增加了数据存放方式的选择,二选一,根据自己的选择注释相应代码即可

1、每次执行会在同一目录下生成以日期命名的csv文件(同一天多次运行会以最新数据覆盖)

2、数据都存放到market_cap_last10.csv,每次执行会在下方追加最新数据,不再覆盖


最近在学习python,献丑一把,从a股里选取总市值最小的前十名,结果里已经剔除了北交所和ST股。

如果需要保留北交所的股票,把这行注释掉:df = df.drop(bj.index)

策略非常简单,以后也许可能会更新一些吧,换手率,交易量等会有加权

每月第一个交易日会把前3名放到富途组合里,欢迎关注一下:17762422

from urllib.request import urlopen  # python自带爬虫库
import pandas as pd
import time
import re  # 正则表达式库
import os  # 系统库
import json  # python自带的json数据库


# 从网页上抓取数据
def get_content_from_internet(url, max_try_num=10, sleep_time=5):
    get_success = False  # 是否成功抓取到内容

    for i in range(max_try_num):
        try:
            content = urlopen(url=url, timeout=10).read()  # 使用python自带的库,从网络上获取信息
            get_success = True  # 成功抓取到内容
            break
        except Exception as e:
            print('抓取数据报错,次数:', i + 1, '报错内容:', e)
            time.sleep(sleep_time)

    # 判断是否成功抓取内容
    if get_success:
        return content
    else:
        raise ValueError('使用urlopen抓取网页数据不断报错,达到尝试上限,停止程序,请尽快检查问题所在')


def get_market_cap():
    raw_url = 'http://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeData?page=%s' \
              '&num=80&sort=symbol&asc=1&node=hs_a&symbol=&_s_r_a=sort'
    page_num = 1

    all_df = pd.DataFrame()
    # ===开始逐页遍历,获取股票数据
    while True:
        # 构建url
        url = raw_url % (page_num)
        print('开始抓取页数:', page_num)

        # 抓取数据
        content = get_content_from_internet(url)
        content = content.decode('gbk')

        # 判断页数是否为空
        if '[]' in content or 'null' in content:
            print('抓取到页数的尽头,退出循环')
            break

        # 通过正则表达式,给key加上引号
        content = re.sub(r'(?<={|,)([a-zA-Z][a-zA-Z0-9]*)(?=:)', r'"\1"', content)

        # 将数据转换成dict格式
        content = json.loads(content)

        # 将数据转换成DataFrame格式
        df = pd.DataFrame(content, dtype='float')
        df.rename(columns={'symbol': '股票代码', 'name': '股票名称', 'mktcap': '总市值'}, inplace=True)
        df = df[['股票代码', '股票名称', '总市值']]
        df['总市值'] = round(df['总市值'] * 10000, 2)
        # 合并数据
        all_df = all_df.append(df, ignore_index=True)
        # 将页数+1
        page_num += 1
        time.sleep(1)

    # ===返回结果
    return all_df


df = get_market_cap()
bj = df[df['股票代码'].str.contains('bj')]
st = df[df['股票名称'].str.contains('ST')]
df = df.drop(st.index)
df = df.drop(bj.index)

df = df.sort_values(by=['总市值'], ascending=1)

now = time.localtime()
nowt = time.strftime("%Y-%m-%d %H:%M:%S", now)
filename_day = time.strftime("%Y-%m-%d", now)
print("更新时间:", nowt)

df = df.head(10)

# === 以下数据存放方式二选一
# === 1、每次执行会生成以日期命名的csv文件
# path = r'C:\Users\wanbabi\Desktop\xbx_stock_2019\data\market_cap_last10\\' + filename_day + '.csv'
# pd.DataFrame(columns=['更新时间:' + nowt]).to_csv(path, index=False, encoding='gbk')
# df.to_csv(path, index=False, mode='a', encoding='gbk')

# === 2、每次执行会追加最新数据,不再覆盖
# path = r'C:\Users\wanbabi\Desktop\xbx_stock_2019\data\market_cap_last10\market_cap_last10.csv'
# ut = pd.DataFrame(columns=['更新时间:' + nowt])
# df = df.append(ut)
# df.to_csv(path, index=False, mode='a', encoding='gbk')
标签: 暂无
最后更新:2022年1月11日

wanbabi

这个人很懒,什么都没留下

点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档
  • 2023年2月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年1月
  • 2021年12月
分类
  • 学习笔记
  • 投资
  • 日常
  • 未分类
  • 观影

COPYRIGHT © 2022 cxm'blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备2022016824号