专栏首页奔跑的键盘侠Python——量化分析常用命令介绍(五)

Python——量化分析常用命令介绍(五)

这是奔跑的键盘侠的第110篇文章

感觉写着写着就有点超纲了

本来是要做入门学习的分享,结果一发不可收拾,事情有点搞大了

但是既然硬着头皮开动了,总要善终吧?

其实,挺多事情,都被我半途而废、有始无终,以至于现在很多方面只是一知半解。

索性,感觉头大的小伙伴,可以留着以后慢慢消化。

好了,继续接下来的表演。

上期的目录,再补充一下:

├── README
├── MyQuant_v1 #量化分析程序目录
   ├── __init__.py
   ├── data #数据处理目录
   │   ├── __init__.py
   │   ├── basic_crawler.py# 爬取股票基础信息存入MongoDB数据库.
   │   └── data_crawler.py  #爬取指数、股票数据
 ├──util # 公用程序
   │   ├── __init__.py
   │   ├── stock_util.py#获取股票交易日前,所有股票代码
   │   └── database.py #链接数据库
   ├── backtest #回测
   │   ├── __init__.py
   │   └── _backtest_ #计划写一下回测走势图
   ├── factor #因子
   │   ├── __init__.py
   │   └──_ factor_.py #不准备开发
   ├── strategy #策略
   │   ├── __init__.py
   │   └── _strategy_ #计划简单写个,主要用于回测
   ├── trading #交易
   │   ├── __init__.py
   │   └── _trading_ #不准备开发
   └── log #日志目录
          ├── __init__.py
          ├── backtest.log #不准备开发
           └── transactions.log#不准备开发

打开pycharm,再随便运行一下上次的代码,继续爬取一些数据,结果一运行就报错

提示mongodb连接不上……

赶快登陆终端看了一眼:

Last login: Sun Jul 14 08:52:32 on ttys000

(base) wangchaodeMacBook-Air:~ Ed_Frey$ mongo

MongoDB shell version v4.0.10

connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb

2019-07-14T08:54:41.743+0800 E QUERY [js] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused :

connect@src/mongo/shell/mongo.js:344:17

@(connect):2:6

exception: connect failed

百度搜索了半天,找到对症的帖子,大概是说上次没有正确的退出mongodb,要重新使用Run MongoDB里面的命令(上一篇安装mongodb里面有贴过),才能正常登入。

至于如何正常退出,要使用exit命令退出,而不能直接点关闭窗口,这……

1

basic_crawler.py

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
# @Time    : 2019-07-13 18:12
# @Author  : Ed Frey
# @File    : basic_crawler.py.py
# @Software: PyCharm
#  -*- coding: utf-8 -*-
from pymongo import UpdateOne
from util.database import DB_CONN
from util.stock_util import get_trading_dates
import tushare as ts
from datetime import datetime, timedelta

"""
to get basic data from tushare and save it to MongoDB.
"""
class BasicCrawler:
    def __init__(self):
        self.db = DB_CONN['basic']

    def crawl_basic(self, begin_date=None, end_date=None):
        '''
        to get the basic infomation of stocks between begin_date and end_date.
        :param begin_date:
        :param end_date:
        :return:
        '''
        if begin_date is None:
            begin_date = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')

        if end_date is None:
            end_date = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')

        all_dates = get_trading_dates(begin_date, end_date)

        for date in all_dates:
            try:
                self.crawl_basic_at_date(date)
            except:
                print(r"ERROR to crawl stocks' information,date:%s" % date, flush=True)


    def crawl_basic_at_date(self, date):
        '''
        to get the basic infomation of stocks on "date"
        :param date:
        :return:
        '''
        # if the date is None, get the last trading date
        df_basics = ts.get_stock_basics(date)

        # if the infomation is None,return.
        if df_basics is None:
            return
        update_requests = []
        codes = set(df_basics.index)
        for code in codes:
            doc = dict(df_basics.loc[code])
            try:
                # format"20180101'turned to format"2018-01-01'
                time_to_market = datetime\
                    .strptime(str(doc['timeToMarket']), '%Y%m%d')\
                    .strftime('%Y-%m-%d')

                #解决流通股本和总股本单位不一致的情况,有些单位是股,目前a股股本规模的最大的工商银行,是3564亿股,最小的德方纳米4274万股
                totals = float(doc['totals'])
                if totals > 4000:
                    totals *= 1E4
                else:
                    totals *= 1E8
                outstanding = float(doc['outstanding'])
                if outstanding > 4000:
                    outstanding *= 1E4
                else:
                    outstanding *= 1E8
                # 保存时增加date字段,因为每天都会有一条数据
                doc.update({
                    'code': code,
                    'date': date,
                    'timeToMarket': time_to_market,
                    'outstanding': outstanding,
                    'totals': totals
                })

                update_requests.append(
                    UpdateOne(
                        {'code': code, 'date': date},
                        {'$set': doc}, upsert=True))
            except:
                print('发生异常,股票代码:%s,日期:%s' % (code, date), flush=True)
                print(doc, flush=True)

        if len(update_requests) > 0:
            update_result = self.db.bulk_write(update_requests, ordered=False)

            print('抓取股票基本信息,日期:%s, 插入:%4d条,更新:%4d条' %
                  (date, update_result.upserted_count, update_result.modified_count), flush=True)

2

stock_util.py

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
# @Time    : 2019-07-13 18:19
# @Author  : Ed Frey
# @File    : stock_util.py
# @Software: PyCharm
from pymongo import ASCENDING
from util.database import DB_CONN
from datetime import datetime, timedelta


def get_trading_dates(begin_date=None, end_date=None):
    """
    to get the list of trading dates.
    if the begin_date is none, then get the date one year ago'
    :param begin_date: beginning date
    :param end_date: ending date
    :return: a trading dates' list
    """
    now = datetime.now()
    if begin_date is None:
        one_year_ago = now - timedelta(days=365)
        begin_date = one_year_ago.strftime('%Y-%m-%d')

    if end_date is None:
        end_date = now.strftime('%Y-%m-%d')

    daily_cursor = DB_CONN.basic.find(
        {'code': '000001', 'date': {'$gte': begin_date, '$lte': end_date}, 'index': True},
        sort=[('date', ASCENDING)],
        projection={'date': True, '_id': False})

    dates = [x['date'] for x in daily_cursor]

    return dates


def get_all_codes(date=None):
    """
    to get the list of stocks.
    if there's no date, then get the last day's.
    if the last day is not a trading day(can't get any code), then get the next last day's, and then on.
    :param date: date
    :return: a list of stocks' codes
    """
    datetime_obj = datetime.now()
    if date is None:
        date = datetime_obj.strftime('%Y-%m-%d')

    codes = []
    code_cursor = DB_CONN.basic.find(
        {'date': date},
        projection={'code': True, '_id': False})

    codes = [x['code'] for x in code_cursor]

    while len(codes) == 0:
        code_cursor = DB_CONN.basic.find(
            {'date': date},
            projection={'code': True, '_id': False})

        codes = [x['code'] for x in code_cursor]

        datetime_obj = datetime_obj - timedelta(days=1)
        date = datetime_obj.strftime('%Y-%m-%d')

    return codes

反正吧,我看着也有点头大了

本文分享自微信公众号 - 奔跑的键盘侠(runningkeyboardhero)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python——量化分析介绍(八)

    今天内容不多,也不复杂。首先,之前写的stock_util补充一个获取指定日期前某个交易日期的函数,毕竟后期写到买卖点指标的时候,难免要用到前后两个交易日指标值...

    Ed_Frey
  • Python——量化分析介绍(七)

    data_crawler.py虽然早就写出来了,但总要完整的爬取一遍才敢投入应用中,果然,随便一爬就有问题,速度贼慢,龟速……

    Ed_Frey
  • Python——量化分析介绍(九)

    从第三方获取到的数据,其实有挺多内容要自己填充完善的,比如股票停牌日的信息,要知道停牌日的个股信息是空的,如刚好持仓股遇到停牌,是无法交易的,计算持仓市值时,停...

    Ed_Frey
  • 毫秒级时间戳转换封装

    const dateFormat = (time) => { var date = new Date() date.setTime(time) var t...

    余生
  • 快速生成日期维度数据

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1148526
  • php获取本年、本月、本周时间戳和日期格式的实例代码

    cal_days_in_month(par1,par2,par3);par1 :用来计算的某种历法,PHP Calendar 常量 par2 :参数par1选中...

    砸漏
  • Python——量化分析介绍(八)

    今天内容不多,也不复杂。首先,之前写的stock_util补充一个获取指定日期前某个交易日期的函数,毕竟后期写到买卖点指标的时候,难免要用到前后两个交易日指标值...

    Ed_Frey
  • 【爬虫军火库】生成指定日期间的日期列表

    今天没能空下来时间写太多,所以只简单记录一个很具体的需求: 指定了起止日期,如何生成一个日期列表。 这个需求是我之前在抓取一个环保的历史数据时遇到的: ? 如...

    不二小段
  • 关于评审开发人员的sql语句(r3笔记第11天)

    在平时的工作中,经常会有一些开发人员提出一些数据库相关的一些问题。可能问的最多的就是sql语句了。 按照一个标准的流程,开发提交的sql语句在完成一系列测试之后...

    jeanron100
  • 批处理之实战一--找到指定文件的指定关键词,并将结果保存到指定位置的TXT中!

    昨天看到有个小伙伴在微信后台留言,说想要做一个批处理文件,搜索软件运行产生的log日志,搜索其中的关键词,并将结果打印出来,这个真的是很有实用意义啊,一方面减小...

    浩Coding

扫码关注云+社区

领取腾讯云代金券