Repository: Rockyzsu/stock Branch: master Commit: 87b853a20f9f Files: 207 Total size: 4.5 MB Directory structure: gitextract_dvg32hnt/ ├── .gitattributes ├── .gitignore ├── LICENSE ├── README.MD ├── StockAnalyze.py ├── __init__.py ├── analysis/ │ ├── FOF_Duanjuan_fund.ipynb │ ├── Untitled.ipynb │ ├── Untitled1.ipynb │ ├── apply_people_count.ipynb │ ├── bond_daily_report.py │ ├── closed_fund_analysis.ipynb │ ├── closed_fund_backtest.ipynb │ ├── column_between_hours.ipynb │ ├── daily_zt_report.py │ ├── data_sync_uqer.ipynb │ ├── deal_company_analysis.ipynb │ ├── df_sql_analysis.ipynb │ ├── diagnose_stock.py │ ├── fd_money.py │ ├── filterstock.py │ ├── fupan.py │ ├── get_break_high_low.py │ ├── hk_new_stock_ratio.ipynb │ ├── hugutong.ipynb │ ├── index_stock.ipynb │ ├── ipospeed.py │ ├── jucao_annnounce_parse.py │ ├── last_year_price.ipynb │ ├── levt_notebook.ipynb │ ├── location.ipynb │ ├── longhuban.ipynb │ ├── plot_test.ipynb │ ├── query.ipynb │ ├── realtime_monitor.ipynb │ ├── recall_bond.py │ ├── reits区间涨幅.ipynb │ ├── stock_analysis.ipynb │ ├── topTenHolder.ipynb │ ├── trade_frequency.ipynb │ ├── xueqiu_private.ipynb │ ├── 东北债.ipynb │ ├── 乖离率计算.ipynb │ ├── 公众号绘制收益率曲线.ipynb │ ├── 基金分析.ipynb │ ├── 基金年度收益.ipynb │ ├── 收益率曲线绘制.ipynb │ ├── 新闻分析.ipynb │ ├── 每日分析模板.ipynb │ ├── 私募基金收益率.ipynb │ ├── 统计分时最大站跌幅.ipynb │ ├── 退市转债分析.ipynb │ ├── 选股.ipynb │ ├── 雪球私募收益率分析.ipynb │ └── 雪球赏金.ipynb ├── backtest/ │ ├── backtrader-course-lession1.py │ ├── dataframe-feed.py │ ├── datapath.py │ ├── examle1/ │ │ └── sma-demo.py │ └── ma_line_backtest.py ├── common/ │ ├── Base.py │ ├── BaseService.py │ ├── SecurityBase.py │ ├── TushareUtil.py │ ├── __init__.py │ ├── aes.py │ └── pdf_convertor.py ├── daily/ │ └── fupan.ipynb ├── datahub/ │ ├── A_stock_daily_info.py │ ├── SPSIOP_PRICE.py │ ├── __init__.py │ ├── basic_market_info.py │ ├── black_list_sql.py │ ├── bond_industry_info.py │ ├── daily_stock_market_info.py │ ├── dfcf_hot_block.py │ ├── foreignexchange.py │ ├── industry_info/ │ │ ├── ak_bk.py │ │ ├── cookies.txt │ │ ├── ths_industry_cralwer_top.py │ │ ├── ths_industry_detail.py │ │ └── ths_industry_list.py │ ├── jisilu.py │ ├── jisilu_bond_announcement.py │ ├── js_file/ │ │ └── encode_jsl.js │ ├── jsl_login.py │ ├── jucao_announcement.py │ ├── jucao_reits_notice.py │ ├── ninwen.py │ ├── public_private_fund_members.py │ ├── repurchase.py │ ├── store_news.py │ ├── ttjj_new_stock.py │ ├── xueqiu_group.py │ ├── xueqiu_sync_portfolio.py │ ├── yanbao_crawl.py │ └── zdt.py ├── fund/ │ ├── ETFShareDetection.py │ ├── ETF_Finder.py │ ├── JJTool.py │ ├── LOFShareDetection.py │ ├── LOF_Model.py │ ├── LOF_Purchase_limit.py │ ├── LOF_arbitrage.py │ ├── ShareDetection.py │ ├── __init__.py │ ├── ark_funds.py │ ├── check_holiday.py │ ├── closed_end_fund.py │ ├── closed_end_fund_backtrade/ │ │ ├── backtrade_fund_weekly_share_increment.py │ │ ├── fund_code.json │ │ ├── fund_data_source.py │ │ └── main.py │ ├── danjuan_fund.py │ ├── danjuan_fund_data_analysis.py │ ├── etf_info.py │ ├── etf_models.py │ ├── etf_range_increment.py │ ├── fund_annouce.py │ ├── fund_holding_list_gen_dynamic_flourish.py │ ├── fund_holding_person.py │ ├── fund_info_spider.py │ ├── fund_jsl.py │ ├── fund_profit_info.py │ ├── fund_raise_speed.py │ ├── fund_share_crawl.py │ ├── fund_share_monitor.py │ ├── fund_share_update.py │ ├── fund_tencent.py │ ├── jsl_fund.py │ ├── ndx_index.py │ ├── qdii_fund_analysis_5fund.ipynb │ ├── reits.ipynb │ ├── reits_data_crawler.py │ ├── reits_history.py │ ├── reits_netvalue.py │ ├── run_sh_fundshare.py │ ├── run_sz_fundshare.py │ ├── sqlhelper.py │ ├── stop_purchase_lof_fund.py │ ├── sz_etf.py │ ├── ttfund_etf_holding.py │ ├── ttjj.py │ ├── ttjj_others.py │ ├── xueqiu_content.txt │ ├── xueqiu_private_fund.py │ └── 基金持仓股.ipynb ├── futu/ │ ├── basic_usage.py │ ├── realtime_price.py │ ├── subscribe.py │ ├── unsubscrible.py │ └── util.py ├── hk_stock/ │ ├── aastock_new_stock.py │ └── new_stock_release.py ├── jisilu_bond_release.py ├── jisilu_daily.py ├── jubi.py ├── juejin/ │ └── fetch_data.ipynb ├── k-line/ │ ├── basic_usage.py │ ├── main.py │ ├── recognize_form.py │ └── search_target.py ├── k_line.py ├── longhuban.py ├── machine_learning/ │ └── 贝叶斯预测涨跌.py ├── monitor/ │ ├── __init__.py │ ├── alert_me.py │ ├── big_deal.py │ ├── ceiling_break.py │ ├── crawler_monitor.py │ ├── jsl_monitor.py │ ├── realtime_kzz_price.py │ ├── realtime_monitor_ts.py │ └── server_api.py ├── new_stock_break.py ├── new_stock_fund.py ├── pledged_validation.py ├── plot_line.py ├── ptrade/ │ ├── __init__.py │ └── 逆回购.py ├── real_time_big_deal.py ├── recordMyChoice.py ├── relationship_case.py ├── requirements.txt ├── select_stock.py ├── shareholder_info.py ├── snowball.py ├── source_code_reading/ │ ├── README.MD │ └── source_code.py ├── statistices.py ├── stockInfo.py ├── stock_check.py ├── store_data.py ├── strategy_verify.py ├── temp/ │ └── edit.txt ├── toolkit.py ├── trader/ │ ├── __init__.py │ └── auto_trader.py ├── transfer_data_es.py ├── utils/ │ ├── delivery_order.py │ ├── profit_compare.py │ └── push_msn.py ├── yesterday_zt_monitor.py ├── 收益率曲线绘制.ipynb ├── 新闻分析.ipynb ├── 选股.ipynb └── 雪球赏金.ipynb ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ *.js linguist-language=python *.css linguist-language=python *.ipynb linguist-language=python *.html linguist-language=python ================================================ FILE: .gitignore ================================================ *.pyc .DS_Store data.cfg /.idea *.xml *.html /private .ipynb_checkpoints/ *.log *.pkl stock_list.txt bases.csv yanbao/ *.csv *.xls *.xlsx config.py conf.py send_mail.py user.json codes.txt .vscode/ settings.py keys/ data/ email_list.py config.json .ipynb_checkpoints log/jsl_monitor configure/ release/ /datahub/image_server_dump_model.py datahub/model.h ninwen_model.h validate_key.py ================================================ FILE: LICENSE ================================================ Copyright (c) Stock developers. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of Stock nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: README.MD ================================================ ### 更好的帮助自己炒股(亏钱-。-) #### 2022-12-08 更新 目前正在重构项目代码,目录结构可能与下面描述有些出入,后期会慢慢更新修改,感谢大家的关注与支持。 --- *analysis/ 数据分析部分* *datahub/ 数据采集部分* *fund/ 基金相关的分析部分* *futu/ 富途牛牛接口的基本用法 * *hk_stock/ 港股部分* *k-line/ K线技术形态部分* *machine_learning/ 机器学习预测* *trader/ 交易部分* *ptrade/ ptrade自动交易实盘代码* *log/* 存放日志 *common/* 常用函数与库 *configure* 数据库连接与配置 ---- #### 使用教程: * 修改 configure/sample_config.json 配置文件名 为 configure/config.json,根据不同项目,并对着里面的字段进行修改,修改你的mysql,mongodb的用户名和密码,如果项目里面没有用到mysql,mongodb等,则不需要修改。 对应的映射关系可以看这个文件里面的源码。这个设置主要为了同一套代码便于切换线上和本地的数据库,并没有采用环境变量的方式存储用户密码。需要的朋友也可以自己改动。 configure/setting.py ``` def config(self, db_type='mysql', local='ubuntu'): db_dict = self.json_data[db_type][local] user = db_dict['user'] password = db_dict['password'] host = db_dict['host'] port = db_dict['port'] return (user, password, host, port) def get_engine(self, db, type_='ubuntu'): from sqlalchemy import create_engine user, password, host, port = self.config(db_type='mysql', local=type_) try: engine = create_engine( 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(user, password, host, port, db)) except Exception as e: print(e) return None return engine def get_mysql_conn(self, db, type_='ubuntu'): import pymysql user, password, host, port = self.config(db_type='mysql', local=type_) try: conn = pymysql.connect(host=host, port=port, user=user, password=password, db=db, charset='utf8') except Exception as e: print(e) return None else: return conn def mongo(self, location_type='ubuntu', async_type=False): user, password, host, port = self.config('mongo', location_type) connect_uri = f'mongodb://{user}:{password}@{host}:{port}' if async_type: from motor.motor_asyncio import AsyncIOMotorClient client = AsyncIOMotorClient(connect_uri) else: import pymongo client = pymongo.MongoClient(connect_uri) return client ``` #### 文末有券商福利:提供券商自动化下单接口 --- 码农的量化交易,把经历写成代码推送到github。代码和策略会一直保持更新,如果你有好的策略或者想法和疑问想要交流,可以加文末微信。 ### 新增: ### analysis 目录 数据分析部分 * analysis/get_zt_info 分析次新板块中的涨停强度 * analysis/diagnose_stock 股票诊断,是否有黑历史和东北股 * analysis/ipospeed IPO发行速度 与指数的相关性 * analysis/fd_money A股某段日期内涨停板的封单金额 * ### fund(基金) * fund/LOFShareDection.py 监控LOF、ETF场内份额变动 * fund/ark_funds.py 获取ARK ETF每日持仓数据,并写入mongodb * fund/fund_share_update.py 上交所,深交所 基金场内基金份额监控 * fund/fund_share_monitor.py 上交所,深交所 基金基金份额查询,规模变动 * fund/fund_info_spider.py 集思录基金,腾讯证券基金折价率,溢价率 爬虫 * fund/etf_info.py 市场指数基金的持仓股监控 * fund/ttjj.py 天天基金数据获取 * fund/xueqiu_private_fund.py 雪球私募私募获取 * fund/danjuan_fund.py 雪球蛋卷基金数据获取 * fund/danjuan_fund_data_analysis.py 雪球蛋卷基金分析 ## datahub(数据源) * datahub/foreignexchange.py 美元兑人民币汇率监控 * datahub/niwen.py 宁稳可转债下载 * datahub/public_private_fund_members.py 公墓私募基金成员数据 * datahub/jucao_ammouncement.py 巨潮公告批量获取+PDF下载 * datahub/bond_industry_info.py 可转债行业分布 * datahub/ceiling_break.py 涨停板封榜监控 ## k-line (K线技术形态识别) * k-line/recognize_form.py 通过talib识别常见形态,如三只乌鸦等 * ### 已有: * datahub/black_list_sql.py 记录A股市场上所有有黑历史的股票名单,并存入数据库 * big_deal.py 监控每天A股市场上的大单交易 * bond_monitor 可转债监控 * ceiling_break.py 新股一直板开板后多少天能够重新回到开板价格 * delivery_order.py 把交割单导出到Mysql,便于查找某只清仓股的操作历史痕迹,对自己的操作记录一目了然 * fetch_each_day.py --获取每天换手率前50的热门股 * filter_stock.py 通过不同的因子策略选股,常见的如市盈率,流通量,股东数,基金持股数等 * foreign_exchange.py 获取美元汇率的每天走势并存入Mysql * get_break_high.py --获取当天破50天新高的股票。为什么不获取60天呢? 因为大家都在用,用的人多了就不准了。 * ipospeed.py 统计每天IPO新股发行速度与大盘的相关性 * ipo_stock.py 新股统计 * jisilu.py 获取集思录的可转债行情 * jubi.py -获取国内山寨币平台的实时数据 * new_stock_break 分析新股的开板时机 * new_stock_fund 打新基金获取,并选出中签科创板的基金 * pledgeed_validation.py 股权质押数据整理 * push_msn.py -短信提醒自己 设定的某个股票价格或者涨幅达到自己 要求 * relationship_case.py 每个月的解禁股与大盘指数的关系 * select_stock.py - 选股策略, 根据自己的经验选出来的个股。 * SPSIOP_PRICE.py - 华宝油气估值 通过爬虫获取数据然后计算 * stockInfo.py 爬取市场股票新闻消息,并存储到ElasticSearch数据库中 * strategy_verify.py 获取雪球的策略并验证 * simulation.py 记录自己的模拟仓 * strategy_verify.py -获取雪球的即时交易策略 * win_or_lost_each_day.py --评估自己每天每只股票的盈亏情况 完成度100% * zdt.py --每天股票市场的涨停热度 ---- # 福利 ### 券商量化下单接口 支持python语言,可云端部署与本地运行两种模式,支持A股市场股票,转债,基金等品种。 ![实盘python下单接口](http://xximg.30daydo.com/picgo/ptrade1.png) ### 接口文档 ![](http://xximg.30daydo.com/picgo/api%E6%96%87%E6%A1%A3.png) ### 费率 交易费率低:
股票万一; 可转债万0.4;基金ETF,LOF万0.5 ---- 开通量化接口后是不收取额外费用,可永久使用。 开通条件: 不同券商门槛不同 * 券商一:开户后入金1W可开通 * 券商二:开户后入金2W即可开通 * ---- 当然也有其他主流券商可选,华泰,广发,华宝,招商,国金,银河证券等等,基本可以涵盖主流券商。 ---- ## 开通方式: 扫码
注明:开户。 ---- 关注开发者公众号: 可转债量化分析 ---- [![公众号](http://www.30daydo.com/uploads/article/20210329/e42c51f95e6e6b41366ee320c1f01316.jpg)](http://www.30daydo.com/uploads/article/20210329/e42c51f95e6e6b41366ee320c1f01316.jpg) ================================================ FILE: StockAnalyze.py ================================================ ''' @author:rocky @email:weigesysu@qq.com @feature: 收盘事后分析 ''' from configure.settings import DBSelector import pandas as pd from scipy import stats import tushare as ts import datetime import os # import matplotlib.pyplot as plt import numpy as np pd.set_option('display.max_rows', None) def volume_calculation(code, start, end): ''' 计算某个股票的某个时间段的累计成交量 :param start: 开始日期 :param end: 结束日期 :return: 成交量,占每天比例 ''' df = ts.get_today_ticks(code) # 转换str为时间格式,便于下面用来比较时间的大小 df['time'] = df['time'].map(lambda x: datetime.datetime.strptime(str(x), '%H:%M:%S')) total = df['volume'].sum() start = datetime.datetime.strptime(start, '%H:%M:%S') end = datetime.datetime.strptime(end, '%H:%M:%S') new_df = df[(df['time'] >= start) & (df['time'] < end)] volume = new_df['volume'].sum() rate = round(volume * 1.00 / total * 100, 2) return volume, rate def today_statistics(today): ''' :help: 今天涨跌幅的统计分析: 中位数,均值等数据 :param today: 日期 2019-01-01 :return:None ''' engine = DBSelector().get_engine('db_daily') df = pd.read_sql(today, engine, index_col='index') # 去除停牌的 成交量=0 df = df[df['volume'] != 0] median = round(df['changepercent'].median(), 2) mean = round(df['changepercent'].mean(), 2) std = round(df['changepercent'].std(), 2) p_25 = round(stats.scoreatpercentile(df['changepercent'], 25), 2) p_50 = round(stats.scoreatpercentile(df['changepercent'], 50), 2) p_75 = round(stats.scoreatpercentile(df['changepercent'], 75), 2) print('中位数: {}'.format(median)) print('平均数: {}'.format(mean)) print('方差: {}'.format(std)) print('25%: {}'.format(p_25)) print('50%: {}'.format(p_50)) print('75%: {}'.format(p_75)) def zt_location(date): ''' :help: 分析涨停的区域分布 :param date:日期格式 20180404 :return: ''' engine_zdt = DBSelector().get_engine('db_zdt') engine_basic = DBSelector().get_engine('db_stock') df = pd.read_sql(date + 'zdt', engine_zdt, index_col='index') df_basic = pd.read_sql('tb_basic_info', engine_basic, index_col='index') result = {} for code in df['代码'].values: try: area = df_basic[df_basic['code'] == code]['area'].values[0] result.setdefault(area, 0) result[area] += 1 except Exception as e: print(e) new_result = sorted(result.items(), key=lambda x: x[1], reverse=True) for k, v in new_result: print(k, v) def show_percentage(price): ''' :help: 根据收盘价计算每个百分比的价格 :param open_price: 开盘价 :return: ''' for i in range(1, 11): print('{}\t+{}% -> {}'.format(price, i, round(price * (1 + 0.01 * i), 2))) for i in range(1, 11): print('{}\t-{}% -> {}'.format(price, i, round(price * (1 - 0.01 * i), 2))) def stock_profit(code, start, end): ''' :help: 计算某个时间段的收益率 :param code: 股票代码 :param start: 开始时间 :param end: 结束时间 :return: 收益率 ''' k_data = ts.get_k_data(start=start, end=end, code=code) if len(k_data)==0: return np.nan start_price = k_data['close'].values[0] print("Start price: ", start_price) end_price = k_data['close'].values[-1] print("End price: ", end_price) earn_profit = (end_price - start_price) / start_price * 100 print("Profit: ", round(earn_profit, 2)) return round(earn_profit, 2) def exclude_kcb(df): ''' :help: 去除科创板 :param df: :return: ''' non_kcb = df[~df['code'].map(lambda x: True if x.startswith('688') else False)] return non_kcb def plot_percent_distribution(date): ''' :help:图形显示某一天的涨跌幅分布 :param date: :return: ''' import matplotlib.pyplot as plt total = [] engine = DBSelector().get_engine('db_daily') df = pd.read_sql(date, con=engine) df = exclude_kcb(df) count = len(df[(df['changepercent'] >= -11) & (df['changepercent'] <= -9.5)]) total.append(count) for i in range(-9, 9, 1): count = len(df[(df['changepercent'] >= i * 1.00) & (df['changepercent'] < ((i + 1)) * 1.00)]) total.append(count) count = len(df[(df['changepercent'] >= 9)]) total.append(count) # print(total) df_figure = pd.Series(total) plt.figure(figsize=(16, 10)) X = range(-10, 10) plt.bar(X, height=total, color='y') for x, y in zip(X, total): plt.text(x, y + 0.05, y, ha='center', va='bottom') plt.grid() plt.xticks(range(-10, 11)) plt.show() def year_price_change(year,ignore_new_stock=False): ''' :year: 年份 :ignore_new_stock: 排除当年上市的新股 计算某年个股的涨幅排名 :return: None 生成excel ''' year = int(year) basic = ts.get_stock_basics() pro = [] name='' # basic['timeToMarket']=pd.to_datetime(basic['timeToMarket'],format='%Y%m%d') # 去除当年的新股 if ignore_new_stock: basic=basic[basic['timeToMarket']< int('{}0101'.format(year))] name = '_ignore_new_stock' filename='{}_all_price_change{}.xls'.format(year,name) for code in basic.index.values: p = stock_profit(code, '{}-01-01'.format(year), '{}-01-01'.format(year+1)) pro.append(p) basic['p_change_year'] = pro basic=basic.sort_values(by='p_change_year', ascending=False) basic.to_excel(filename, encoding='gbk') def stock_analysis(filename): ''' # 分析年度的数据 :return: ''' df=pd.read_excel(filename,encoding='gbk') print('mean:\n',df['p_change_year'].mean()) print('max:\n',df['p_change_year'].max()) print('min:\n',df['p_change_year'].min()) print('middle\n',df['p_change_year'].median()) # plt.figure() # df['p_change_year'].plot.hist() # plt.show() def cb_stock_year(): ''' 上一年可转债正股的涨跌幅排名 :return: ''' engine = get_engine('db_stock') df_cb = pd.read_sql('tb_bond_jisilu', engine) filename='2019_all_price_change_ignore_new_stock.xls' df_all=pd.read_excel(filename,encoding='gbk') zg_codes = list(df_cb['正股代码'].values) df = df_all[df_all['code'].isin(zg_codes)] df.to_excel('2019_cb_zg.xls',encoding='gbk') def main(): ## 某个股票某个时间段的成交量 #### # code = '000069' # v, ratio = volume_calculation(code,'09:30:00', '10:00:00') # print('\n') # print(v, ratio) ## 涨跌幅分布 ##### # TODAY=datetime.datetime.now().strftime("%Y-%m-%d") # today_tendency(TODAY) ## 分析涨停的区域分布 #### # TODAY = datetime.datetime.now().strftime("%Y%m%d") # zt_location(TODAY) ## 显示百分比价格 # show_percentage(121) ## 计算某个个股某段时间的收益率 # stock_profit('300333','2019-01-01','2020-02-03') ## 显示价格分布 # date = '2020-02-07' # plot_percent_distribution(date) # 某年个股涨幅 # year_price_change(2019,True) # stock_analysis('2019_all_price_change_ignore_new_stock.xls') cb_stock_year() if __name__ == '__main__': main() ================================================ FILE: __init__.py ================================================ # -*- coding: utf-8 -*- # @Time : 2020/11/21 0:12 # @File : __init__.py # @Author : Rocky C@www.30daydo.com ================================================ FILE: analysis/FOF_Duanjuan_fund.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')\n", "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 38, "outputs": [], "source": [ "db=DBSelector().mongo('qq')\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "doc=db['db_stock']['danjuan_fund']" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "plan_list =[]\n", "for item in doc.find():\n", " plan_name=item['plan_name']\n", " holding=item['holding']\n", " d={}\n", " d[plan_name]=holding\n", " plan_list.append(d)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "len(plan_list)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "plan_list[0]" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "fund_dict={}\n", "for item in plan_list:\n", " name=list(item.keys())[0]\n", " funds=item[name]\n", " for fund in funds:\n", " # if fund['percent']!=0:\n", " fund_dict.setdefault(fund['fd_name'],set())\n", " fund_dict[fund['fd_name']].add(name)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "result={}\n", "for item in fund_dict:\n", " print(item,len(fund_dict[item]))\n", " result[item]=len(fund_dict[item])" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "list(sorted(result.items(),key=lambda x:x[1],reverse=True))" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "help(sorted)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "result_=list(sorted(result.items(),key=lambda x:x[1],reverse=True))" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "result_dict_=[]\n", "for name,count in result_:\n", " d={}\n", " d['name']=name\n", " d['count']=count\n", " result_dict_.append(d)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "import pandas as pd" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "result_dict_" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "df = pd.DataFrame(result_dict_)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "df.head()" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "df.to_excel('fund_count_.xls',encoding='utf8')" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "import numpy as np" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "found_day_list=[]\n", "for item in doc.find({},{'found_days':1}):\n", " found_day_list.append(item['found_days'])" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "print(np.array(found_day_list).mean())" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "result_np.mean()" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "plan_list =[]\n", "for item in doc.find():\n", " plan_name=item['plan_name']\n", " holding=item['holding']\n", " d={}\n", " d[plan_name]=holding\n", " plan_list.append(d)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "134" ] }, "metadata": {}, "execution_count": 5 } ], "source": [ "len(plan_list)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'螺丝钉指数基金组合': [{'fd_code': '003318',\n", " 'fd_name': '景顺长城中证500低波动',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 12.21,\n", " 'total_gain_rate': 34.2128},\n", " {'fd_code': '164906',\n", " 'fd_name': '交银中证海外中国互联网指数',\n", " 'type_desc': 'QDII型',\n", " 'type': 'qdii',\n", " 'percent': 11.39,\n", " 'total_gain_rate': 92.76259999999999},\n", " {'fd_code': '001406',\n", " 'fd_name': '东方红策略精选C',\n", " 'type_desc': '混合型',\n", " 'type': 'hybrid',\n", " 'percent': 8.27,\n", " 'total_gain_rate': 1.294},\n", " {'fd_code': '006586',\n", " 'fd_name': '南方安裕混合C',\n", " 'type_desc': '混合型',\n", " 'type': 'hybrid',\n", " 'percent': 7.61,\n", " 'total_gain_rate': -0.3519},\n", " {'fd_code': '006327',\n", " 'fd_name': '易方达中概互联50ETF联接人民币A',\n", " 'type_desc': 'QDII型',\n", " 'type': 'qdii',\n", " 'percent': 7.57,\n", " 'total_gain_rate': 50.16890000000001},\n", " {'fd_code': '161128',\n", " 'fd_name': '易方达标普信息科技',\n", " 'type_desc': 'QDII型',\n", " 'type': 'qdii',\n", " 'percent': 7.18,\n", " 'total_gain_rate': 30.4336},\n", " {'fd_code': '006585',\n", " 'fd_name': '南方宝元债券C',\n", " 'type_desc': '债券型',\n", " 'type': 'bond',\n", " 'percent': 6.93,\n", " 'total_gain_rate': 4.9699},\n", " {'fd_code': '090010',\n", " 'fd_name': '大成中证红利指数A',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 6.07,\n", " 'total_gain_rate': 21.2486},\n", " {'fd_code': '100032',\n", " 'fd_name': '富国中证红利指数增强',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 5.01,\n", " 'total_gain_rate': 34.3354},\n", " {'fd_code': '501050',\n", " 'fd_name': '华夏上证50AH优选指数(LOF)A',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 4.9,\n", " 'total_gain_rate': 20.8073},\n", " {'fd_code': '519671',\n", " 'fd_name': '银河沪深300价值指数',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 4.77,\n", " 'total_gain_rate': 23.9742},\n", " {'fd_code': '006060',\n", " 'fd_name': '鹏扬泓利债券C',\n", " 'type_desc': '债券型',\n", " 'type': 'bond',\n", " 'percent': 4.27,\n", " 'total_gain_rate': 3.6461},\n", " {'fd_code': '485011',\n", " 'fd_name': '工银双利债券B',\n", " 'type_desc': '债券型',\n", " 'type': 'bond',\n", " 'percent': 2.89,\n", " 'total_gain_rate': 0.8126},\n", " {'fd_code': '001594',\n", " 'fd_name': '天弘中证银行指数A',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 1.89,\n", " 'total_gain_rate': 21.3651},\n", " {'fd_code': '110031',\n", " 'fd_name': '易方达H股ETF联接',\n", " 'type_desc': 'QDII型',\n", " 'type': 'qdii',\n", " 'percent': 1.69,\n", " 'total_gain_rate': 27.4416},\n", " {'fd_code': '160716',\n", " 'fd_name': '嘉实基本面50指数(LOF)A',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 1.6,\n", " 'total_gain_rate': 58.5325},\n", " {'fd_code': '008127',\n", " 'fd_name': '广发趋势优选混合C',\n", " 'type_desc': '混合型',\n", " 'type': 'hybrid',\n", " 'percent': 1.52,\n", " 'total_gain_rate': 1.9698},\n", " {'fd_code': '501021',\n", " 'fd_name': '华宝香港中小',\n", " 'type_desc': 'QDII型',\n", " 'type': 'qdii',\n", " 'percent': 1.46,\n", " 'total_gain_rate': 34.732},\n", " {'fd_code': '070023',\n", " 'fd_name': '嘉实深证基本面120联接',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 1.44,\n", " 'total_gain_rate': 65.225},\n", " {'fd_code': '110003',\n", " 'fd_name': '易方达上证50指数A',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 0.92,\n", " 'total_gain_rate': 49.3477},\n", " {'fd_code': '310398',\n", " 'fd_name': '申万菱信沪深300价值指数',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 0.37,\n", " 'total_gain_rate': 35.1811},\n", " {'fd_code': '008975',\n", " 'fd_name': '富国中证消费50ETF联接A',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 0.04,\n", " 'total_gain_rate': 65.2204},\n", " {'fd_code': '161725',\n", " 'fd_name': '招商中证白酒指数',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 0,\n", " 'total_gain_rate': 58.114},\n", " {'fd_code': '040046',\n", " 'fd_name': '华安纳斯达克100指数',\n", " 'type_desc': 'QDII型',\n", " 'type': 'qdii',\n", " 'percent': 0,\n", " 'total_gain_rate': 50.47430000000001},\n", " {'fd_code': '000968',\n", " 'fd_name': '广发中证养老',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 0,\n", " 'total_gain_rate': 40.7162},\n", " {'fd_code': '001550',\n", " 'fd_name': '天弘中证医药100A',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 0,\n", " 'total_gain_rate': 31.3658},\n", " {'fd_code': '530015',\n", " 'fd_name': '建信深证基本面60ETF联接A',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 0,\n", " 'total_gain_rate': 20.3643},\n", " {'fd_code': '002086',\n", " 'fd_name': '大成景安短融债券E',\n", " 'type_desc': '债券型',\n", " 'type': 'bond',\n", " 'percent': 0,\n", " 'total_gain_rate': 0.28800000000000003},\n", " {'fd_code': '501029',\n", " 'fd_name': '华宝红利基金',\n", " 'type_desc': '指数型',\n", " 'type': 'index',\n", " 'percent': 0,\n", " 'total_gain_rate': -3.1023}]}" ] }, "metadata": {}, "execution_count": 6 } ], "source": [ "plan_list[0]" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "fund_dict={}\n", "for item in plan_list:\n", " name=list(item.keys())[0]\n", " funds=item[name]\n", " for fund in funds:\n", " # if fund['percent']!=0:\n", " fund_dict.setdefault(fund['fd_name'],set())\n", " fund_dict[fund['fd_name']].add(name)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "景顺长城中证500低波动 11\n交银中证海外中国互联网指数 16\n东方红策略精选C 1\n南方安裕混合C 1\n易方达中概互联50ETF联接人民币A 19\n易方达标普信息科技 4\n南方宝元债券C 4\n大成中证红利指数A 13\n富国中证红利指数增强 13\n华夏上证50AH优选指数(LOF)A 15\n银河沪深300价值指数 9\n鹏扬泓利债券C 4\n工银双利债券B 2\n天弘中证银行指数A 10\n易方达H股ETF联接 9\n嘉实基本面50指数(LOF)A 5\n广发趋势优选混合C 1\n华宝香港中小 13\n嘉实深证基本面120联接 6\n易方达上证50指数A 11\n申万菱信沪深300价值指数 2\n富国中证消费50ETF联接A 4\n招商中证白酒指数 9\n华安纳斯达克100指数 7\n广发中证养老 5\n天弘中证医药100A 5\n建信深证基本面60ETF联接A 5\n大成景安短融债券E 1\n华宝红利基金 8\n中欧时代先锋股票C 1\n中欧行业成长混合(LOF)C 1\n中欧新动力混合(LOF)C 1\n中欧价值发现混合C 3\n中欧明睿新起点混合 1\n中欧数据挖掘混合C 1\n中欧养老混合 2\n中欧医疗健康混合C 1\n中欧消费主题股票C 2\n中欧新蓝筹混合C 1\n中欧丰泓沪港深C 1\n中欧明睿新常态混合 3\n中欧盛世成长混合(LOF)C 1\n中欧新蓝筹混合A 9\n诺安研究精选股票 2\n鹏华新兴产业混合 5\n前海开源再融资股票 1\n国泰聚信价值优势C 6\n工银金融地产混合 18\n南方香港成长 2\n前海开源沪港深优势精选 5\n富国互联科技股票 1\n银华体育文化混合 1\n中欧品质消费股票A 2\n易方达亚洲精选 5\n博时军工主题股票 4\n中欧价值发现混合A 7\n交银新生活力混合 10\n嘉实新能源新材料A 2\n华安中证全指证券公司指数 3\n创金合信医疗保健股票A 3\n富国蓝筹精选股票 1\n上投摩根中国生物医药(QDII) 2\n华宝创新混合 2\n嘉实港股通新经济指数A 9\n南方中证有色金属联接C 2\n西部利得中证500指数增强C 1\n华安黄金易ETF联接A 7\n方正富邦红利精选 1\n长城环保主题混合 1\n景顺长城能源基建 4\n上投摩根科技前沿混合 1\n富国中证新能源汽车指数 7\n华安沪深300增强 1\n万家经济新动能混合C 1\n南方500信息联接 4\n国泰中证申万证券行业指数 5\n国联安半导体ETF联接C 3\n天弘中证计算机指数C 2\n天弘中证500指数增强A 5\n国泰中证全指通信设备ETF联接基金C 3\n长信军工量化混合 3\n申万菱信中证500指数优选增强 3\n富国沪深300增强 7\n天弘医疗健康混合C 1\n天弘医疗健康混合A 1\n创金合信中证500指数增强C 1\n方正富邦消费红利指数增强(LOF) 1\n申万菱信沪深300指数增强 1\n天弘中证500指数A 2\n广发沪深300指数增强C 2\n广发中证基建工程指数C 4\n申万菱信中证500指数增强 5\n申万菱信中证500指数优选增强C 1\n鹏华中证传媒指数(LOF) 6\n汇添富中证环境治理指数A 1\n广发沪深300指数增强A 1\n前海联合沪深300指数A 1\n兴全商业模式优选 11\n富国天惠成长LOF 18\n国富大中华精选混合(QDII)人民币 5\n国富沪港深成长精选股票 10\n交银新成长混合 14\n易方达安盈回报混合 3\n汇添富价值精选混合 14\n中欧新动力混合A 5\n泓德远见回报混合 4\n招商沪深300地产等权重指数 9\n工银文体产业股票 11\n兴全合宜混合(LOF)A 8\n鹏华中证全指证券公司指数(LOF) 4\n南方原油 5\n安信价值精选股票 2\n泓德泓益混合 2\n东方红沪港深混合 1\n汇添富全球移动互联网 5\n鹏扬景升混合A 1\n华宝中证银行ETF联接A 6\n华夏恒生ETF联接 15\n万家新利混合 2\n南方中证全指证券联接A 4\n财通价值动量混合 1\n中欧新动力混合 1\n中银转债增强债券A 1\n诺安成长混合 1\n博时裕隆混合 1\n天弘越南市场股票A 2\n广发全球精选股票 4\n国泰深证TMT50指数 3\n嘉实新兴产业 5\n中欧时代先锋 9\n华安德国30(DAX)ETF联接 7\n广发中证全指建筑材料指数A 4\n兴全沪深300指数增强A 9\n华安媒体互联网混合 6\n工银全球精选股票 2\n兴全可转债 6\n博时信用债券A 5\n交银医药创新股票 1\n信达澳银精华配置 2\n华泰柏瑞量化阿尔法 2\n兴全趋势 16\n前海开源金银珠宝 1\n华夏海外收益债券C 1\n兴全合润混合 16\n博时亚洲票息收益债 3\n易方达安心回报债A 6\n中海可转换债券A 1\n嘉实原油 2\n鹏华全球高收益债 2\n富国中证500指数增强 15\n易方达蓝筹精选混合 25\n东方红睿丰混合 1\n广发稳健增长混合A类 19\n中欧潜力价值混合 5\n景顺长城新兴成长 6\n兴全轻资产 2\n兴全合泰混合A 2\n兴全绿色投资 1\n兴全精选混合 3\n兴全社会责任 2\n兴全全球视野股票 2\n兴全有机增长 1\n兴全合泰混合C 1\n华安沪港深外延增长 1\n申万菱信中证申万电子行业投资指数(LOF)A 2\n鹏华文化传媒娱乐 1\n易方达沪深300量化增强 2\n工银深证红利ETF联接C 4\n易方达安心回报债B 2\n富国收益宝货币B 1\n易方达稳健收益债B 3\n广发中证传媒ETF联接A 4\n中欧新趋势混合A 3\n工银高质量成长混合A 1\n华宝价值发现混合 2\n汇添富蓝筹稳健混合 5\n交银优势行业混合 12\n易方达沪深300医药ETF联接 3\n华宝中证医疗指数 2\n国泰国证房地产行业指数 9\n华宝科技龙头ETF联接A 9\n华安黄金易ETF联接C 8\n国泰国证航天军工指数 2\n大成有色金属期货ETF联接C 2\n国联安半导体ETF联接A 2\n汇添富中证主要消费ETF联接 5\n国泰CES半导体芯片行业ETF联接A 3\n国泰中证生物医药ETF联接A 3\n富国中证科技50ETF联接A 1\n富国中证医药主题指数增强 2\n万家中证500指数增强A 1\n富国中证智能汽车指数 1\n国泰中证煤炭ETF发起式联接C 1\n天弘中证计算机指数A 5\n富国消费升级混合 1\n景顺长城大中华 1\n中欧医疗创新股票C 1\n嘉实智能汽车 1\n华宝资源优选 4\n富国品质生活混合 1\n华宝中证消费龙头指数(LOF)A 2\n易方达消费行业 7\n信达澳银新能源产业 5\n华宝科技ETF联接C 2\n交银阿尔法核心混合 5\n汇添富医药保健混合 2\n易方达安心回馈混合 5\n华夏创新成长ETF联接C 3\n中欧医疗健康混合A 12\n景顺长城鼎益混合(LOF) 3\n广发中证医药卫生 2\n南方中证500ETF联接 5\n鹏华国证钢铁行业指数(LOF) 1\n招商中证煤炭等权指数 3\n富国中证1000指数增强 2\n海富通阿尔法对冲混合C 1\n广发中证基建工程指数A 6\n广发纳斯达克100指数 5\n中信保诚中证800医药指数(LOF) 1\n鹏华中证500 1\n易方达中证军工指数(LOF) 1\n长盛中证全指证券公司指数(LOF) 1\n华夏沪港通恒生ETF联接 4\n国泰大宗商品配置 1\n诺安中证100指数A 1\n广发中证环保ETF联接C 3\n天弘中证医药100C 2\n广发中证军工ETF联接C 1\n南方中证500C 1\n广发中证传媒ETF联接C 5\n前海开源沪深300指数 1\n南方中证全指证券联接C 2\n前海开源中证军工指数A 1\n华安中证500低波ETF联接C 2\n广发可选消费联接C 2\n景顺中证500指数增强 1\n博时中证500指数增强 1\n华安安康灵活配置混合A 1\n中银新回报混合 1\n南方中证房地产联接A 2\n景顺顺益回报C 1\n银河君信混合C 1\n广发医药卫生联接C 4\n广发中证全指家用电器指数A 4\n南方创业板ETF联接 1\n天弘中证食品饮料指数C 3\n嘉实中证500ETF联接 4\n天弘沪深300指数增强A 1\n南方中证有色金属联接A 1\n南方中证银行联接A 1\n中欧责任投资混合A 2\n国泰国证新能源汽车指数 6\n汇添富中证新能源汽车产业指数A 4\n易方达创业板ETF联接A 8\n广发中证军工ETF联接 4\n天弘创业板ETF联接A 3\n鹏华中证信息技术指数(LOF) 2\n华宝券商ETF联接A 5\n华夏中证500ETF联接 1\n工银全球股票(QDII) 2\n中银增利债券 1\n南方天天利货币B 5\n汇添富移动互联股票 2\n工银传媒指数A 1\n中融新经济混合C 2\n泰康中证港股通非银指数C 3\n天弘上证50指数C 2\n广发中证全指家用电器指数C 2\n广发中证500ETF联接(LOF)A类 4\n天弘中证电子ETF联接C 4\n南方中证银行联接C 1\n广发信息技术联接C 4\n银华新能源材料量化优选C 2\n国泰国证食品饮料行业指数 3\n中邮新思路混合 1\n鹏华中证新能源指数 2\n方正富邦中证保险主题指数 7\n银华文体娱乐量化优选C 2\n交银经济新动力混合 3\n交银先进制造混合 1\n交银先锋混合 1\n交银策略回报混合 1\n交银精选混合 2\n交银蓝筹股票 1\n交银稳健配置混合 2\n交银定期支付双息平衡 6\n交银主题优选混合 1\n交银数据产业灵活配置混合 1\n交银中证环境治理指数 1\n交银国证新能源指数(LOF) 1\n交银双轮动债券C 1\n交银国企改革混合 1\n交银全球自然资源 1\n交银趋势优先股票 1\n交银上证180公司治理 1\n交银科技创新混合 1\n景顺长城内需增长 3\n广发优企精选混合 5\n汇添富优势精选混合 2\n易方达沪深300ETF联接 5\n南方MSCI中国A股国际通联接A 1\n华夏中证5G通信主题ETF联接A 1\n景顺长城沪深300指数增强 8\n南方H股联接A 2\n华安行业轮动混合 1\n招商行业精选股票 3\n富国高新技术产业 2\n诺德价值优势混合 1\n广发制造业精选混合 1\n上投摩根新兴动力混合 1\n汇添富消费行业混合 8\n银华心怡混合 2\n南方稳健成长混合 1\n华夏创新前沿股票 2\n银河服务混合 1\n富国天博创新混合 1\n融通行业景气混合 3\n添富红利增长混合C 1\n汇添富全球消费行业混合A 3\n易方达中小盘混合 9\n易方达科翔混合 1\n广发消费品精选混合 2\n银华内需精选混合 2\n工银新生代混合 2\n华夏经济转型股票 1\n鹏华消费优选混合 1\n华泰柏瑞创新升级 3\n嘉实泰和混合 3\n易方达行业领先企业 1\n海富通股票混合 2\n中欧创新成长混合A 2\n银华中小盘精选混合 2\n前海开源量化优选C 1\n创金合信工业周期精选股票C 1\n富国创新科技混合 2\n中银智能制造股票 1\n富国内需增长混合 1\n前海开源医疗健康C 1\n工银前沿医疗股票 6\n前海开源人工智能主题 1\n中银金融地产混合 5\n兴全多维价值混合A 1\n工银消费服务混合 1\n工银信息产业混合 3\n工银战略新兴产业混合A 1\n工银消费股票A 1\n工银战略转型股票 3\n工银美丽城镇股票 1\n工银深证红利联接 6\n中欧时代智慧混合A 1\n万家臻选混合 1\n汇添富文体娱乐主题混合 1\n广发利鑫灵活配置混合A 2\n博时新兴消费主题 1\n广发科技动力股票 1\n嘉实美国成长股票 1\n东方红中证竞争力指数A 1\n工银精选金融地产混合A 3\n汇添富消费升级混合 2\n华宝新兴成长混合 1\n中金MSCI中国A股国际质量指数A 1\n中欧医疗创新股票A 4\n东方红中证竞争力指数C 1\n富国美丽中国混合 1\n朱雀企业优胜A 1\n嘉实价值优势混合 2\n景顺沪港深领先科技 2\n泓德战略转型股票 2\n交银持续成长主题 1\n华安沪港深通精选混合 1\n景顺长城量化新动力 1\n嘉实沪港深精选 1\n华泰柏瑞量化优选 1\n广发钱袋子货币 7\n嘉实优化红利混合 1\n前海开源沪港深龙头精选 1\n富国沪港深行业精选混合 4\n易方达国防军工混合 5\n汇添富医疗服务混合 3\n广发中证能源 1\n广发可选消费联接 2\n华宝美国消费 2\n广发中证信息联接 1\n富国富钱包货币 4\n鹏华香港中小企业指数 2\n博时转债增强债券C 1\n华宝标普油气上游股票人民币A 3\n永赢惠添利混合 3\n富国天合稳健混合 1\n华安成长创新混合 1\n国泰聚信价值优势A 5\n华泰柏瑞价值增长 1\n泰达宏利沪深300增强A 1\n易方达沪深300非银ETF联接 3\n易方达上证中盘ETF联接A 1\n华宝红利基金C 1\n华宝沪港深中国增强(LOF)A 2\n中金沪深300指数增强A 1\n华夏鼎沛债券A 1\n天弘中证中美互联网A 3\n鹏华香港银行指数 1\n泰康中证港股通非银指数A 2\n华宝香港大盘C 1\n嘉实全球互联网股票 1\n汇添富全球医疗保健 1\n交银品质升级混合 1\n天弘创业板ETF联接C 1\n易方达中概互联50ETF联接人民币C 4\n安信量化精选沪深300增强C 3\n华夏上证50AH优选指数(LOF)C 2\n易方达中证红利ETF联接发起式C 1\n华夏沪港通恒生ETF联接C 1\n易方达恒生国企ETF联接C 3\n中金中证500指数增强C 2\n广发纳斯达克100指数C 3\n易方达沪深300ETF联接C 3\n中金中证500指数增强A 1\n易方达中证500ETF联接C 2\n富国中证消费50ETF联接C 3\n国泰家电ETF发起式联接C 1\n易方达上证50ETF联接发起式C 3\n中融央视财经50ETF联接C 3\n嘉实中证主要消费ETF联接C 2\n西部利得中证500指数增强A 1\n浦银安盛沪深300指数增强 1\n工银新蓝筹股票 1\n博时中证全指证券公司指数 1\n富国中国中小盘混合 2\n易方达纳斯达克100指数 5\n海富通阿尔法对冲混合A 7\n创金合信中证红利低波动指数A 1\n兴全合宜混合(LOF)C 1\n富国天惠精选成长混合C 1\n华富成长趋势混合 1\n招商中证全指证券公司指数 3\n汇添富创新医药主题混合 5\n华夏医疗健康混合C 1\n嘉实价值精选股票 5\n新华策略精选股票 2\n工银精选金融地产混合C 1\n南方香港优选股票 1\n华泰柏瑞质量成长 1\n信达澳银先进智造 2\n平安睿享文娱灵活配置混合C 1\n鹏华股息龙头ETF联接C类 1\n鹏华中证医药卫生指数 1\n鹏华中证国防指数(LOF) 2\n鹏华中证酒指数(LOF) 1\n鹏华中证500ETF联接C 1\n汇添富大盘核心资产增长混合 1\n汇添富环保行业股票 1\n汇添富民营活力 1\n国富弹性市值混合 1\n天弘中证电子ETF联接A 1\n富国中证全指证券公司指数 1\n信诚基建工程(LOF) 1\n嘉实恒生国企指数 3\n中欧价值智选回报A 1\n华夏价值精选混合 1\n华夏聚丰混合(FOF)A 1\n大成中小盘混合 1\n海富通内需热点混合 1\n华夏新起点混合 1\n华安生态优先混合 2\n景顺长城品质投资 2\n华泰柏瑞行业领先 1\n华宝香港大盘A 5\n鹏华中证800地产指数(LOF) 1\n天弘中证证券保险指数A 2\n申万菱信中小板指数 1\n易方达增强回报债A 3\n嘉实新兴市场债券 1\n广发医疗指数LOF 1\n汇添富中证生物科技指数C 1\n博时标普500ETF联接 3\n华泰柏瑞稳健收益债C 1\n博时信用债纯债C 2\n华夏海外收益债券A 1\n长信内需成长混合A 1\n银河创新混合 2\n易方达裕丰回报 3\n国泰中证全指通信设备ETF联接基金A 2\n天弘中证银行指数C 3\n泰康港股通TMT指数C 1\n中邮双动力混合 1\n天弘中证证券保险指数C 2\n国投瑞银白银期货(LOF) 2\n博时创业成长混合A 1\n国泰现金管理货币A 1\n中银中高等级债券C 1\n华夏鼎茂债券A 1\n国泰江源优势混合A 2\n富国转型机遇混合 1\n国泰区位优势混合 1\n国泰蓝筹精选混合C 1\n国泰黄金ETF联接A 1\n易方达中债7-10年国开债指数 2\n国泰互联网+股票 1\n国泰融安多策略灵活配置混合 1\n国泰景气行业混合 1\n国泰成长优选混合 1\n国泰事件驱动混合 1\n国泰优势行业混合 1\n国泰金马稳健回报 1\n国泰创业板指数 1\n华夏亚债中国指数C 1\n融通行业景气C 1\n华夏亚债中国指数A 1\n国泰民安增利债券C 1\n国泰利是宝货币 1\n国泰货币基金 1\n国泰民安增益纯债A 1\n国富估值优势混合 1\n安信量化精选沪深300增强A 1\n大成纳斯达克100指数 3\n嘉实中证主要消费ETF联接A 1\n国泰新能源汽车ETF发起式联接A 1\n易方达金融行业股票 1\n富国新动力混合A 4\n银华中证全指医药卫生指数增强 1\n易方达标普生物科技 1\n汇添富中证港股通(LOF)A 2\n申万菱信新能源汽车主题 2\n广发双擎升级混合 3\n中欧电子信息产业沪港深 1\n万家行业优选混合 7\n富国中证银行指数 2\n广发多元新兴股票 3\n泓德臻远回报混合 3\n国泰金牛创新成长 1\n鹏华创业板指数(LOF) 1\n易方达中证银行指数A 1\n易方达供给改革混合 2\n国泰国证有色金属行业指数 5\n创金合信恒兴中短债债券A 1\n创金合信工业周期精选股票A 2\n广发中证金融地产 2\n创金合信科技成长A 2\n鹏华中证A股资源产业指数(LOF) 1\n广发全指工业ETF联接 1\n创金合信金融地产股票A 2\n长信可转债A 1\n广发趋势优选灵活配置混合 3\n华夏沪深300ETF联接 1\n国富中国收益混合 1\n易方达平稳增长混合 1\n泓德致远混合A 5\n易方达瑞和混合 1\n安信新价值混合A 1\n诺德成长优势混合 1\n华安安顺混合 1\n国寿安保稳惠混合 1\n国泰沪深300增强A 1\n泰康新机遇混合 1\n汇添富中证互联网医疗指数C 1\n天弘互联网混合 1\n嘉实沪深300ETF联接(LOF)A 1\n博时黄金ETF联接A 1\n万家沪深300指数增强A 1\n南方上证50增强A 1\n华泰柏瑞中证500ETF联接A 1\n华宝券商ETF联接C 3\n华夏国证半导体芯片ETF联接C 1\n银华中证5G通信主题ETF联接 1\n国泰智能汽车股票A 1\n富国军工主题混合 3\n国泰上证金融ETF联接 1\n博时黄金ETF联接C 2\n易方达稳健收益债A 1\n招商境远保本混合 1\n招商安泰平衡 1\n招商制造业混合 1\n招商丰韵混合C 1\n招商沪深300指数增强C 1\n招商医药股票 2\n招商核心价值混合 1\n招商先锋基金 1\n创金合信消费主题股票A 1\n创金合信新能源汽车股票C 1\n创金合信资源主题精选A 1\n创金合信新能源汽车股票A 1\n创金合信转债精选债券A 1\n华安中证银行指数 2\n国泰国证医药卫生行业指数 2\n建信中证500指数增强A 3\n招商央视50指数 2\n工银产业债券A 1\n汇添富双利债券A 1\n泓德裕康债券A 1\n广发聚鑫债券A 1\n鹏华优势企业股票 1\n景顺长城中证500联接 1\n景顺长城景颐双利C 1\n景顺长城内需增长贰号 1\n景顺长城环保优势 2\n景顺长城中证沪港深红利低波A 1\n景顺稳定收益债A 1\n南方转型混合 1\n南方智慧精选混合 1\n广发沪港深新起点股票A 3\n南方创新经济 1\n南方安福混合C 1\n广发沪港深股票 1\n中欧行业成长混合A 1\n南方金融主题混合 1\n南方国策动力 1\n南方天元 1\n工银医疗保健股票 1\n易方达标普500指数 2\n银华汇利灵活配置混合C 1\n银华信用四季红债券 1\n银华心诚混合 1\n银华和谐主题混合 1\n银华长丰混合发起式 1\n银华兴盛股票 1\n银华富裕主题混合 1\n银华中债AAA信用债指数C 1\n银华深证100指数(LOF) 1\n中欧可转债债券A 2\n汇添富可转换债券A 1\n广发聚宝混合A 1\n富国产业债债券 1\n富国创业板指数 2\n博时裕富沪深300指数A 1\n易方达信用债A 3\n博时信用债纯债A 1\n汇添富精选美元债A 1\n中欧互联网先锋混合A 1\n新华资源混合 1\n易方达信息产业混合 1\n宝盈先进制造混合A 1\n汇添富中证新能源汽车产业指数C 1\n国泰新能源汽车ETF发起式联接C 1\n广发创业板ETF联接C 2\n广发金融地产联接C 1\n国泰CES半导体芯片行业ETF联接C 1\n广发中债7-10年国开债指数C 1\n华夏上证50ETF联接 1\n广发沪深300ETF联接C 1\n广发中证全指建筑材料指数C 1\n前海开源金银珠宝C 1\n南方中证房地产联接C 1\n广发中证全指汽车指数C 1\n华安添鑫中短债A 1\n华安新丝路主题 1\n华安低碳生活混合 2\n华安双债A 1\n华安升级主题混合 1\n华安策略优选混合 1\n华安鼎丰债券 1\n博时宏观回报债券C 1\n博时富瑞纯债C 1\n博时汇智回报混合 1\n博时逆向投资混合C 1\n华安智能生活混合 1\n广发聚鑫债券C 1\n博时回报混合 1\n博时厚泽回报混合C 1\n博时价值增长混合 1\n嘉实主题新动力混合 1\n博时中证500指数增强C 1\n华安中证细分医药ETF联接C 2\n易方达创业板指数ETF联接C 1\n博时鑫泰混合C 1\n易方达裕祥回报债券 2\n安信稳健增值混合C 1\n博时沪深300指数C 1\n博时上证50ETF联接 2\n博时安盈债券C 1\n汇添富中证全指证券公司指数C 1\n招商双债增强债券 1\n大成景安短融债券A 1\n大摩优质信价纯债A 1\n博时鑫源混合C 1\n交银优选回报A 2\n中银多策略混合 1\n光大安和债券A 1\n华宝量化对冲策略A 2\n广发纯债债券C 1\n易方达投资级信用债C 1\n安信新回报混合A 1\n国投瑞银先进制造混合 1\n国投瑞银双债债券A 1\n国投瑞银恒泽中短债A 1\n国投瑞银新兴产业混合(LOF) 1\n国投瑞银锐意改革混合 1\n国投瑞银新机遇混合A 1\n国投瑞银港股通价值发现混合 1\n国投瑞银医疗保健混合 1\n国投瑞银美丽中国混合 1\n华宝沪深300增强 1\n华宝标普中国A股质量价值 1\n华夏沪深300指数增强A 1\n招商产业债券 2\n金鹰信息产业股票A 1\n汇安沪深300指数增强A 1\n华夏创蓝筹ETF联接A 1\n中海医药健康产业C 1\n招商中证银行指数 1\n建信中证红利潜力指数A 1\n广发全球医疗保健 1\n招商国证生物医药指数 2\n天弘中证光伏A 1\n汇丰晋信恒生龙头指数A 1\n浦银安盛沪港深基本面100指数 1\n南方恒生中国企业精明指数A 1\n鹏华中证银行指数(LOF) 1\n国联安中证医药100指数 1\n广发恒生中型股指数(LOF)A类 1\n银河定投宝腾安指数 1\n广发中证环保ETF联接A 1\n益民中证智能消费指数 1\n嘉实策略增长混合 1\n万家和谐增长混合 1\n国富研究精选混合 1\n华宝动力组合基金 1\n申万菱信新经济混合 1\n景顺长城优选混合 1\n创金合信沪深300指数增强C 1\n天弘中证500指数增强C 1\n鹏华外延成长混合 1\n鹏华产业精选混合 1\n鹏华研究精选混合 1\n鹏华精选成长混合 1\n鹏华先进制造股票 1\n鹏华环保产业股票 1\n鹏华沪深港互联网 1\n天弘港股通精选A 2\n中欧先进制造股票A 1\n国联安主题驱动 1\n国联安鑫安混合 1\n国联安添鑫混合A 1\n国联安锐意成长 1\n国联安鑫享混合 1\n天弘中证食品饮料指数A 1\n富国沪港深价值精选 1\n国富中小盘股票 1\n景顺长城绩优成长混合 3\n南方优选成长混合 2\n汇添富成长焦点 2\n易方达消费精选股票 2\n大成标普500 1\n易方达中证500ETF联接A 1\n汇添富中证全指证券公司指数A 1\n中证银行ETF联接基金C 1\n广发消费升级股票 1\n广发量化多因子混合 1\n广发策略优选 1\n广发轮动配置混合 1\n广发医疗保健股票A 2\n广发新兴产业混合 1\n广发品牌消费股票 1\n广发聚瑞混合 1\n广发电子信息传媒产业精选 1\n广发新经济混合 1\n工银双利债券A 1\n交银优择回报A 1\n南方10年国债C 1\n华夏粤港澳大湾区创新100ETF联接A 1\n创金合信中证500指数增强A 1\n易方达中债新综合债券指数A 1\n华宝宝康债券 1\n华宝新活力混合 1\n华宝先进成长 1\n华宝大盘精选 1\n华宝量化对冲策略C 1\n华宝中证100指数 1\n泓德量化精选混合 1\n泓德睿泽混合 1\n泓德泓汇混合 1\n泓德优势领航混合 1\n泓德泓华混合 1\n泓德优选成长混合 2\n泓德泓利货币A 1\n泓德裕丰中短债债券A 1\n易方达港股通红利 1\n鹏华改革红利 1\n博时精选混合 1\n华夏军工安全混合 1\n华夏回报混合 1\n泰达宏利风险预算 1\n南方宝元债券 2\n宝盈互联网沪港深混合 1\n中泰开阳价值优选混合A 1\n宝盈鸿利收益灵活配置混合A 1\n宝盈研究精选混合A 1\n工银圆兴混合 2\n华泰保兴吉年丰A 1\n鹏华养老产业股票 1\n融通健康产业混合 2\n华安创业板50ETF联接A 1\n华安沪深300ETF联接C 1\n华安CES港股通精选100ETF联接C 1\n易方达深证100ETF联接C 1\n华泰柏瑞沪深300ETF联接A 1\n华安上证180联接 1\n华安创业板50指数 2\n大摩强收益债券 2\n鹏华研究智选混合 1\n广发小盘成长混合(LOF) 1\n鹏扬中证500质量成长A 1\n富国中证价值ETF联接 1\n工银新金融股票 2\n中海量化策略混合 1\n万家恒利债券A 1\n大成有色金属期货ETF联接A 1\n交银丰润收益债C 1\n华安安信消费混合 1\n万家恒利债券C 1\n工银绝对收益混合B 1\n易MSCIA股ETF联接A 1\n富国信用债债券A 3\n广发高端制造股票 1\n中欧消费主题股票A 1\n融通产业趋势股票 1\n建信中债国开行债C 1\n建信鑫泽回报混合C 1\n建信沪深300指数增强C 1\n华夏创蓝筹ETF联接C 1\n建信中证500指数增强C 1\n富国天益价值混合 1\n宝盈品牌消费股票A 1\n广发内需增长混合A 1\n鹏华双债增利债券 1\n南方安泰混合 1\n易方达纯债A 1\n兴业添利债券 1\n博时丝路主题股票A 1\n景顺长城成长之星 1\n工银养老产业股票 1\n中海医疗保健主题股票 1\n民生加银策略精选 1\n广发稳健增长混合C类 1\n" ] } ], "source": [ "result={}\n", "for item in fund_dict:\n", " print(item,len(fund_dict[item]))\n", " result[item]=len(fund_dict[item])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[('易方达蓝筹精选混合', 21),\n", " ('易方达中概互联50ETF联接人民币A', 19),\n", " ('富国天惠成长LOF', 15),\n", " ('工银金融地产混合', 14),\n", " ('交银新成长混合', 13),\n", " ('兴全趋势', 12),\n", " ('广发稳健增长混合A类', 12),\n", " ('兴全合润混合', 12),\n", " ('富国中证红利指数增强', 11),\n", " ('华夏上证50AH优选指数(LOF)A', 11),\n", " ('汇添富价值精选混合', 11),\n", " ('景顺长城中证500低波动', 10),\n", " ('易方达上证50指数A', 10),\n", " ('国富沪港深成长精选股票', 10),\n", " ('工银文体产业股票', 10),\n", " ('华夏恒生ETF联接', 10),\n", " ('华宝香港中小', 9),\n", " ('中欧新蓝筹混合A', 9),\n", " ('交银新生活力混合', 9),\n", " ('嘉实港股通新经济指数A', 9),\n", " ('国泰国证房地产行业指数', 9),\n", " ('富国中证500指数增强', 9),\n", " ('兴全商业模式优选', 8),\n", " ('兴全合宜混合(LOF)A', 8),\n", " ('中欧医疗健康混合A', 8),\n", " ('景顺长城沪深300指数增强', 8),\n", " ('交银中证海外中国互联网指数', 7),\n", " ('银河沪深300价值指数', 7),\n", " ('天弘中证银行指数A', 7),\n", " ('易方达H股ETF联接', 7),\n", " ('交银优势行业混合', 7),\n", " ('招商中证白酒指数', 7),\n", " ('大成中证红利指数A', 6),\n", " ('招商沪深300地产等权重指数', 6),\n", " ('华宝科技龙头ETF联接A', 6),\n", " ('方正富邦中证保险主题指数', 6),\n", " ('万家行业优选混合', 6),\n", " ('前海开源沪港深优势精选', 5),\n", " ('易方达亚洲精选', 5),\n", " ('华安黄金易ETF联接A', 5),\n", " ('国富大中华精选混合(QDII)人民币', 5),\n", " ('汇添富全球移动互联网', 5),\n", " ('兴全沪深300指数增强A', 5),\n", " ('富国中证新能源汽车指数', 5),\n", " ('易方达安心回馈混合', 5),\n", " ('富国沪深300增强', 5),\n", " ('易方达创业板ETF联接A', 5),\n", " ('景顺长城新兴成长', 5),\n", " ('易方达国防军工混合', 5),\n", " ('华安纳斯达克100指数', 5),\n", " ('工银深证红利联接', 5),\n", " ('海富通阿尔法对冲混合A', 5),\n", " ('汇添富创新医药主题混合', 5),\n", " ('嘉实价值精选股票', 5),\n", " ('国泰国证有色金属行业指数', 5),\n", " ('易方达中小盘混合', 5),\n", " ('嘉实深证基本面120联接', 4),\n", " ('富国中证消费50ETF联接A', 4),\n", " ('博时军工主题股票', 4),\n", " ('鹏华中证传媒指数(LOF)', 4),\n", " ('中欧新动力混合A', 4),\n", " ('华宝中证银行ETF联接A', 4),\n", " ('南方中证全指证券联接A', 4),\n", " ('华安黄金易ETF联接C', 4),\n", " ('华宝资源优选', 4),\n", " ('天弘中证500指数增强A', 4),\n", " ('天弘中证计算机指数A', 4),\n", " ('汇添富消费行业混合', 4),\n", " ('工银前沿医疗股票', 4),\n", " ('中欧医疗创新股票A', 4),\n", " ('国泰聚信价值优势A', 4),\n", " ('华宝红利基金', 4),\n", " ('易方达纳斯达克100指数', 4),\n", " ('汇添富中证主要消费ETF联接', 4),\n", " ('易方达消费行业', 4),\n", " ('华宝香港大盘A', 4),\n", " ('华宝券商ETF联接A', 4),\n", " ('泓德致远混合A', 4),\n", " ('交银定期支付双息平衡', 4),\n", " ('南方宝元债券C', 3),\n", " ('鹏扬泓利债券C', 3),\n", " ('嘉实基本面50指数(LOF)A', 3),\n", " ('中欧价值发现混合C', 3),\n", " ('鹏华新兴产业混合', 3),\n", " ('创金合信医疗保健股票A', 3),\n", " ('景顺长城能源基建', 3),\n", " ('易方达安盈回报混合', 3),\n", " ('南方原油', 3),\n", " ('中欧潜力价值混合', 3),\n", " ('中欧新趋势混合A', 3),\n", " ('易方达沪深300医药ETF联接', 3),\n", " ('国泰中证申万证券行业指数', 3),\n", " ('景顺长城鼎益混合(LOF)', 3),\n", " ('广发纳斯达克100指数', 3),\n", " ('申万菱信中证500指数增强', 3),\n", " ('天弘中证医药100A', 3),\n", " ('嘉实中证500ETF联接', 3),\n", " ('南方中证500ETF联接', 3),\n", " ('广发全球精选股票', 3),\n", " ('天弘中证电子ETF联接C', 3),\n", " ('景顺长城内需增长', 3),\n", " ('广发优企精选混合', 3),\n", " ('汇添富蓝筹稳健混合', 3),\n", " ('易方达沪深300ETF联接', 3),\n", " ('招商行业精选股票', 3),\n", " ('交银阿尔法核心混合', 3),\n", " ('工银信息产业混合', 3),\n", " ('工银精选金融地产混合A', 3),\n", " ('广发中证基建工程指数A', 3),\n", " ('安信量化精选沪深300增强C', 3),\n", " ('易方达沪深300ETF联接C', 3),\n", " ('南方500信息联接', 3),\n", " ('嘉实恒生国企指数', 3),\n", " ('易方达增强回报债A', 3),\n", " ('富国沪港深行业精选混合', 3),\n", " ('广发双擎升级混合', 3),\n", " ('广发多元新兴股票', 3),\n", " ('华宝券商ETF联接C', 3),\n", " ('易方达安心回报债A', 3),\n", " ('易方达信用债A', 3),\n", " ('中欧时代先锋', 3),\n", " ('景顺长城绩优成长混合', 3),\n", " ('易方达标普信息科技', 2),\n", " ('工银双利债券B', 2),\n", " ('申万菱信沪深300价值指数', 2),\n", " ('国泰聚信价值优势C', 2),\n", " ('南方香港成长', 2),\n", " ('中欧价值发现混合A', 2),\n", " ('嘉实新能源新材料A', 2),\n", " ('上投摩根中国生物医药(QDII)', 2),\n", " ('华宝创新混合', 2),\n", " ('南方中证有色金属联接C', 2),\n", " ('鹏华中证全指证券公司指数(LOF)', 2),\n", " ('万家新利混合', 2),\n", " ('天弘越南市场股票A', 2),\n", " ('兴全轻资产', 2),\n", " ('兴全合泰混合A', 2),\n", " ('兴全精选混合', 2),\n", " ('华宝价值发现混合', 2),\n", " ('华宝中证医疗指数', 2),\n", " ('大成有色金属期货ETF联接C', 2),\n", " ('华夏创新成长ETF联接C', 2),\n", " ('华夏沪港通恒生ETF联接', 2),\n", " ('广发中证传媒ETF联接C', 2),\n", " ('南方中证房地产联接A', 2),\n", " ('广发中证全指家用电器指数A', 2),\n", " ('天弘中证食品饮料指数C', 2),\n", " ('中欧责任投资混合A', 2),\n", " ('国联安半导体ETF联接C', 2),\n", " ('中融新经济混合C', 2),\n", " ('泰康中证港股通非银指数C', 2),\n", " ('广发中证500ETF联接(LOF)A类', 2),\n", " ('广发信息技术联接C', 2),\n", " ('交银经济新动力混合', 2),\n", " ('汇添富中证新能源汽车产业指数A', 2),\n", " ('南方H股联接A', 2),\n", " ('富国高新技术产业', 2),\n", " ('富国创新科技混合', 2),\n", " ('广发利鑫灵活配置混合A', 2),\n", " ('嘉实价值优势混合', 2),\n", " ('景顺沪港深领先科技', 2),\n", " ('永赢惠添利混合', 2),\n", " ('易方达沪深300非银ETF联接', 2),\n", " ('天弘中证中美互联网A', 2),\n", " ('泰康中证港股通非银指数A', 2),\n", " ('易方达中概互联50ETF联接人民币C', 2),\n", " ('华夏上证50AH优选指数(LOF)C', 2),\n", " ('工银深证红利ETF联接C', 2),\n", " ('易方达恒生国企ETF联接C', 2),\n", " ('中金中证500指数增强C', 2),\n", " ('广发纳斯达克100指数C', 2),\n", " ('富国中国中小盘混合', 2),\n", " ('国泰中证生物医药ETF联接A', 2),\n", " ('新华策略精选股票', 2),\n", " ('汇添富全球消费行业混合A', 2),\n", " ('广发中证军工ETF联接', 2),\n", " ('国泰国证新能源汽车指数', 2),\n", " ('华安生态优先混合', 2),\n", " ('华泰柏瑞创新升级', 2),\n", " ('天弘中证证券保险指数A', 2),\n", " ('广发中证养老', 2),\n", " ('银河创新混合', 2),\n", " ('建信深证基本面60ETF联接A', 2),\n", " ('易方达裕丰回报', 2),\n", " ('国泰江源优势混合A', 2),\n", " ('易方达中债7-10年国开债指数', 2),\n", " ('大成纳斯达克100指数', 2),\n", " ('中银金融地产混合', 2),\n", " ('富国新动力混合A', 2),\n", " ('申万菱信新能源汽车主题', 2),\n", " ('长信军工量化混合', 2),\n", " ('嘉实新兴产业', 2),\n", " ('富国中证银行指数', 2),\n", " ('泓德臻远回报混合', 2),\n", " ('易方达供给改革混合', 2),\n", " ('创金合信工业周期精选股票A', 2),\n", " ('创金合信科技成长A', 2),\n", " ('创金合信金融地产股票A', 2),\n", " ('华安德国30(DAX)ETF联接', 2),\n", " ('工银战略转型股票', 2),\n", " ('天弘创业板ETF联接A', 2),\n", " ('兴全可转债', 2),\n", " ('博时黄金ETF联接C', 2),\n", " ('招商医药股票', 2),\n", " ('建信中证500指数增强A', 2),\n", " ('华宝标普油气上游股票人民币A', 2),\n", " ('招商央视50指数', 2),\n", " ('广发沪港深新起点股票A', 2),\n", " ('中欧可转债债券A', 2),\n", " ('博时信用债券A', 2),\n", " ('富国创业板指数', 2),\n", " ('华安低碳生活混合', 2),\n", " ('交银优选回报A', 2),\n", " ('申万菱信中证500指数优选增强', 2),\n", " ('招商产业债券', 2),\n", " ('招商国证生物医药指数', 2),\n", " ('天弘港股通精选A', 2),\n", " ('南方优选成长混合', 2),\n", " ('汇添富成长焦点', 2),\n", " ('易方达消费精选股票', 2),\n", " ('广发医疗保健股票A', 2),\n", " ('富国军工主题混合', 2),\n", " ('南方宝元债券', 2),\n", " ('工银圆兴混合', 2),\n", " ('大摩强收益债券', 2),\n", " ('工银新金融股票', 2),\n", " ('融通行业景气混合', 2),\n", " ('富国信用债债券A', 2),\n", " ('东方红策略精选C', 1),\n", " ('南方安裕混合C', 1),\n", " ('广发趋势优选混合C', 1),\n", " ('中欧时代先锋股票C', 1),\n", " ('中欧行业成长混合(LOF)C', 1),\n", " ('中欧新动力混合(LOF)C', 1),\n", " ('中欧明睿新起点混合', 1),\n", " ('中欧数据挖掘混合C', 1),\n", " ('中欧养老混合', 1),\n", " ('中欧医疗健康混合C', 1),\n", " ('中欧消费主题股票C', 1),\n", " ('诺安研究精选股票', 1),\n", " ('前海开源再融资股票', 1),\n", " ('富国互联科技股票', 1),\n", " ('银华体育文化混合', 1),\n", " ('中欧品质消费股票A', 1),\n", " ('华安中证全指证券公司指数', 1),\n", " ('富国蓝筹精选股票', 1),\n", " ('西部利得中证500指数增强C', 1),\n", " ('方正富邦红利精选', 1),\n", " ('长城环保主题混合', 1),\n", " ('上投摩根科技前沿混合', 1),\n", " ('泓德远见回报混合', 1),\n", " ('安信价值精选股票', 1),\n", " ('泓德泓益混合', 1),\n", " ('东方红沪港深混合', 1),\n", " ('鹏扬景升混合A', 1),\n", " ('财通价值动量混合', 1),\n", " ('中欧新动力混合', 1),\n", " ('中银转债增强债券A', 1),\n", " ('诺安成长混合', 1),\n", " ('博时裕隆混合', 1),\n", " ('东方红睿丰混合', 1),\n", " ('兴全绿色投资', 1),\n", " ('华安沪港深外延增长', 1),\n", " ('工银高质量成长混合A', 1),\n", " ('国泰国证航天军工指数', 1),\n", " ('富国消费升级混合', 1),\n", " ('景顺长城大中华', 1),\n", " ('中欧医疗创新股票C', 1),\n", " ('嘉实智能汽车', 1),\n", " ('富国品质生活混合', 1),\n", " ('中信保诚中证800医药指数(LOF)', 1),\n", " ('鹏华中证500', 1),\n", " ('易方达中证军工指数(LOF)', 1),\n", " ('长盛中证全指证券公司指数(LOF)', 1),\n", " ('华宝中证消费龙头指数(LOF)A', 1),\n", " ('国泰大宗商品配置', 1),\n", " ('诺安中证100指数A', 1),\n", " ('广发可选消费联接C', 1),\n", " ('景顺中证500指数增强', 1),\n", " ('广发中证基建工程指数C', 1),\n", " ('博时中证500指数增强', 1),\n", " ('华安安康灵活配置混合A', 1),\n", " ('中银新回报混合', 1),\n", " ('景顺顺益回报C', 1),\n", " ('银河君信混合C', 1),\n", " ('南方创业板ETF联接', 1),\n", " ('天弘沪深300指数增强A', 1),\n", " ('南方中证有色金属联接A', 1),\n", " ('南方中证银行联接A', 1),\n", " ('天弘上证50指数C', 1),\n", " ('广发中证全指家用电器指数C', 1),\n", " ('南方中证银行联接C', 1),\n", " ('银华新能源材料量化优选C', 1),\n", " ('交银先进制造混合', 1),\n", " ('交银先锋混合', 1),\n", " ('交银精选混合', 1),\n", " ('汇添富优势精选混合', 1),\n", " ('南方MSCI中国A股国际通联接A', 1),\n", " ('华夏中证5G通信主题ETF联接A', 1),\n", " ('华安行业轮动混合', 1),\n", " ('前海开源量化优选C', 1),\n", " ('创金合信工业周期精选股票C', 1),\n", " ('中银智能制造股票', 1),\n", " ('富国内需增长混合', 1),\n", " ('前海开源医疗健康C', 1),\n", " ('兴全多维价值混合A', 1),\n", " ('工银消费服务混合', 1),\n", " ('工银战略新兴产业混合A', 1),\n", " ('工银消费股票A', 1),\n", " ('中欧时代智慧混合A', 1),\n", " ('万家臻选混合', 1),\n", " ('汇添富文体娱乐主题混合', 1),\n", " ('东方红中证竞争力指数A', 1),\n", " ('汇添富消费升级混合', 1),\n", " ('华宝新兴成长混合', 1),\n", " ('中金MSCI中国A股国际质量指数A', 1),\n", " ('富国美丽中国混合', 1),\n", " ('朱雀企业优胜A', 1),\n", " ('泓德战略转型股票', 1),\n", " ('中欧创新成长混合A', 1),\n", " ('富国天合稳健混合', 1),\n", " ('华安成长创新混合', 1),\n", " ('泰达宏利沪深300增强A', 1),\n", " ('易方达上证中盘ETF联接A', 1),\n", " ('华宝红利基金C', 1),\n", " ('华宝沪港深中国增强(LOF)A', 1),\n", " ('中金沪深300指数增强A', 1),\n", " ('华夏鼎沛债券A', 1),\n", " ('鹏华香港银行指数', 1),\n", " ('嘉实全球互联网股票', 1),\n", " ('汇添富全球医疗保健', 1),\n", " ('交银品质升级混合', 1),\n", " ('天弘创业板ETF联接C', 1),\n", " ('易方达中证红利ETF联接发起式C', 1),\n", " ('华夏沪港通恒生ETF联接C', 1),\n", " ('中金中证500指数增强A', 1),\n", " ('易方达中证500ETF联接C', 1),\n", " ('西部利得中证500指数增强A', 1),\n", " ('浦银安盛沪深300指数增强', 1),\n", " ('工银新蓝筹股票', 1),\n", " ('博时中证全指证券公司指数', 1),\n", " ('创金合信中证红利低波动指数A', 1),\n", " ('易方达安心回报债B', 1),\n", " ('兴全合宜混合(LOF)C', 1),\n", " ('富国天惠精选成长混合C', 1),\n", " ('汇添富医药保健混合', 1),\n", " ('华富成长趋势混合', 1),\n", " ('国泰国证食品饮料行业指数', 1),\n", " ('工银精选金融地产混合C', 1),\n", " ('南方香港优选股票', 1),\n", " ('鹏华股息龙头ETF联接C类', 1),\n", " ('鹏华中证医药卫生指数', 1),\n", " ('鹏华中证信息技术指数(LOF)', 1),\n", " ('鹏华中证国防指数(LOF)', 1),\n", " ('鹏华中证酒指数(LOF)', 1),\n", " ('汇添富大盘核心资产增长混合', 1),\n", " ('汇添富环保行业股票', 1),\n", " ('国富弹性市值混合', 1),\n", " ('天弘中证电子ETF联接A', 1),\n", " ('富国中证全指证券公司指数', 1),\n", " ('广发中证传媒ETF联接A', 1),\n", " ('国联安半导体ETF联接A', 1),\n", " ('信诚基建工程(LOF)', 1),\n", " ('中欧价值智选回报A', 1),\n", " ('华夏价值精选混合', 1),\n", " ('华夏聚丰混合(FOF)A', 1),\n", " ('大成中小盘混合', 1),\n", " ('海富通内需热点混合', 1),\n", " ('华夏新起点混合', 1),\n", " ('鹏华中证800地产指数(LOF)', 1),\n", " ('申万菱信中小板指数', 1),\n", " ('嘉实新兴市场债券', 1),\n", " ('广发医疗指数LOF', 1),\n", " ('长信内需成长混合A', 1),\n", " ('广发消费品精选混合', 1),\n", " ('国泰CES半导体芯片行业ETF联接A', 1),\n", " ('国泰中证全指通信设备ETF联接基金A', 1),\n", " ('国泰现金管理货币A', 1),\n", " ('中银中高等级债券C', 1),\n", " ('华夏鼎茂债券A', 1),\n", " ('富国转型机遇混合', 1),\n", " ('国泰区位优势混合', 1),\n", " ('国泰蓝筹精选混合C', 1),\n", " ('国泰黄金ETF联接A', 1),\n", " ('国富估值优势混合', 1),\n", " ('安信量化精选沪深300增强A', 1),\n", " ('嘉实中证主要消费ETF联接A', 1),\n", " ('易方达金融行业股票', 1),\n", " ('中欧电子信息产业沪港深', 1),\n", " ('易方达沪深300量化增强', 1),\n", " ('鹏华创业板指数(LOF)', 1),\n", " ('易方达中证银行指数A', 1),\n", " ('创金合信恒兴中短债债券A', 1),\n", " ('广发中证金融地产 ', 1),\n", " ('鹏华中证A股资源产业指数(LOF)', 1),\n", " ('广发全指工业ETF联接', 1),\n", " ('长信可转债A', 1),\n", " ('富国富钱包货币', 1),\n", " ('广发趋势优选灵活配置混合', 1),\n", " ('南方中证全指证券联接C', 1),\n", " ('华夏沪深300ETF联接', 1),\n", " ('国富中国收益混合', 1),\n", " ('易方达平稳增长混合', 1),\n", " ('招商中证煤炭等权指数', 1),\n", " ('汇添富中证互联网医疗指数C', 1),\n", " ('天弘互联网混合', 1),\n", " ('嘉实沪深300ETF联接(LOF)A', 1),\n", " ('博时黄金ETF联接A', 1),\n", " ('万家沪深300指数增强A', 1),\n", " ('南方上证50增强A', 1),\n", " ('国泰中证全指通信设备ETF联接基金C', 1),\n", " ('天弘中证银行指数C', 1),\n", " ('华泰柏瑞中证500ETF联接A', 1),\n", " ('华夏国证半导体芯片ETF联接C', 1),\n", " ('银华中证5G通信主题ETF联接', 1),\n", " ('易方达稳健收益债A', 1),\n", " ('招商境远保本混合', 1),\n", " ('招商安泰平衡', 1),\n", " ('招商制造业混合', 1),\n", " ('招商丰韵混合C', 1),\n", " ('招商沪深300指数增强C', 1),\n", " ('创金合信消费主题股票A', 1),\n", " ('创金合信新能源汽车股票C', 1),\n", " ('创金合信资源主题精选A', 1),\n", " ('华安中证银行指数', 1),\n", " ('国泰国证医药卫生行业指数', 1),\n", " ('工银产业债券A', 1),\n", " ('汇添富双利债券A', 1),\n", " ('泓德裕康债券A', 1),\n", " ('广发聚鑫债券A', 1),\n", " ('鹏华优势企业股票', 1),\n", " ('景顺长城中证500联接', 1),\n", " ('景顺长城景颐双利C', 1),\n", " ('景顺长城内需增长贰号', 1),\n", " ('南方转型混合', 1),\n", " ('南方智慧精选混合', 1),\n", " ('南方创新经济', 1),\n", " ('南方安福混合C', 1),\n", " ('广发沪港深股票', 1),\n", " ('中欧行业成长混合A', 1),\n", " ('南方金融主题混合', 1),\n", " ('南方国策动力', 1),\n", " ('银华汇利灵活配置混合C', 1),\n", " ('银华信用四季红债券', 1),\n", " ('银华心诚混合', 1),\n", " ('银华和谐主题混合', 1),\n", " ('银华心怡混合', 1),\n", " ('银华内需精选混合', 1),\n", " ('银华长丰混合发起式', 1),\n", " ('银华兴盛股票', 1),\n", " ('汇添富可转换债券A', 1),\n", " ('广发聚宝混合A', 1),\n", " ('富国产业债债券', 1),\n", " ('富国中证1000指数增强', 1),\n", " ('博时裕富沪深300指数A', 1),\n", " ('博时信用债纯债A', 1),\n", " ('中欧互联网先锋混合A', 1),\n", " ('汇添富医疗服务混合', 1),\n", " ('新华资源混合', 1),\n", " ('易方达信息产业混合', 1),\n", " ('宝盈先进制造混合A', 1),\n", " ('汇添富中证新能源汽车产业指数C', 1),\n", " ('华安添鑫中短债A', 1),\n", " ('华安新丝路主题', 1),\n", " ('华安双债A', 1),\n", " ('华安升级主题混合', 1),\n", " ('华安策略优选混合', 1),\n", " ('华安鼎丰债券', 1),\n", " ('博时宏观回报债券C', 1),\n", " ('博时富瑞纯债C', 1),\n", " ('博时汇智回报混合', 1),\n", " ('博时逆向投资混合C', 1),\n", " ('华安智能生活混合', 1),\n", " ('广发聚鑫债券C', 1),\n", " ('易方达裕祥回报债券', 1),\n", " ('中银多策略混合', 1),\n", " ('安信新回报混合A', 1),\n", " ('嘉实泰和混合', 1),\n", " ('国投瑞银先进制造混合', 1),\n", " ('国投瑞银双债债券A', 1),\n", " ('国投瑞银恒泽中短债A', 1),\n", " ('国投瑞银新兴产业混合(LOF)', 1),\n", " ('国投瑞银锐意改革混合', 1),\n", " ('国投瑞银新机遇混合A', 1),\n", " ('国投瑞银港股通价值发现混合', 1),\n", " ('国投瑞银医疗保健混合', 1),\n", " ('华宝沪深300增强', 1),\n", " ('华宝标普中国A股质量价值', 1),\n", " ('汇添富中证港股通(LOF)A', 1),\n", " ('华夏沪深300指数增强A', 1),\n", " ('金鹰信息产业股票A', 1),\n", " ('汇安沪深300指数增强A', 1),\n", " ('华夏创蓝筹ETF联接A', 1),\n", " ('中海医药健康产业C', 1),\n", " ('招商中证银行指数', 1),\n", " ('建信中证红利潜力指数A', 1),\n", " ('广发全球医疗保健', 1),\n", " ('天弘中证光伏A', 1),\n", " ('嘉实策略增长混合', 1),\n", " ('万家和谐增长混合', 1),\n", " ('国富研究精选混合', 1),\n", " ('华宝动力组合基金', 1),\n", " ('申万菱信新经济混合', 1),\n", " ('嘉实中证主要消费ETF联接C', 1),\n", " ('鹏华外延成长混合', 1),\n", " ('鹏华产业精选混合', 1),\n", " ('鹏华研究精选混合', 1),\n", " ('鹏华精选成长混合', 1),\n", " ('鹏华先进制造股票', 1),\n", " ('鹏华环保产业股票', 1),\n", " ('鹏华沪深港互联网', 1),\n", " ('华安媒体互联网混合', 1),\n", " ('中欧先进制造股票A', 1),\n", " ('国联安主题驱动', 1),\n", " ('国联安鑫安混合', 1),\n", " ('国联安添鑫混合A', 1),\n", " ('国联安锐意成长', 1),\n", " ('国联安鑫享混合', 1),\n", " ('天弘中证食品饮料指数A', 1),\n", " ('富国沪港深价值精选', 1),\n", " ('国富中小盘股票', 1),\n", " ('广发消费升级股票', 1),\n", " ('广发量化多因子混合', 1),\n", " ('广发策略优选', 1),\n", " ('广发轮动配置混合', 1),\n", " ('广发新兴产业混合', 1),\n", " ('工银双利债券A', 1),\n", " ('交银优择回报A', 1),\n", " ('博时标普500ETF联接', 1),\n", " ('广发钱袋子货币', 1),\n", " ('南方10年国债C', 1),\n", " ('易方达标普500指数', 1),\n", " ('华夏粤港澳大湾区创新100ETF联接A', 1),\n", " ('创金合信中证500指数增强A', 1),\n", " ('华宝宝康债券', 1),\n", " ('华宝新活力混合', 1),\n", " ('华宝先进成长', 1),\n", " ('华宝大盘精选', 1),\n", " ('华宝量化对冲策略C', 1),\n", " ('泓德量化精选混合', 1),\n", " ('泓德睿泽混合', 1),\n", " ('泓德泓汇混合', 1),\n", " ('泓德优势领航混合', 1),\n", " ('兴全社会责任', 1),\n", " ('易方达港股通红利', 1),\n", " ('华夏回报混合', 1),\n", " ('泰达宏利风险预算', 1),\n", " ('工银全球精选股票', 1),\n", " ('宝盈互联网沪港深混合', 1),\n", " ('中泰开阳价值优选混合A', 1),\n", " ('宝盈鸿利收益灵活配置混合A', 1),\n", " ('宝盈研究精选混合A', 1),\n", " ('中欧明睿新常态混合', 1),\n", " ('华泰保兴吉年丰A', 1),\n", " ('鹏华养老产业股票', 1),\n", " ('华安创业板50ETF联接A', 1),\n", " ('华安沪深300ETF联接C', 1),\n", " ('华安CES港股通精选100ETF联接C', 1),\n", " ('鹏华研究智选混合', 1),\n", " ('广发小盘成长混合(LOF)', 1),\n", " ('华安创业板50指数', 1),\n", " ('中海量化策略混合', 1),\n", " ('万家恒利债券A', 1),\n", " ('大成有色金属期货ETF联接A', 1),\n", " ('南方天天利货币B', 1),\n", " ('交银丰润收益债C', 1),\n", " ('工银绝对收益混合B', 1),\n", " ('广发高端制造股票', 1),\n", " ('融通产业趋势股票', 1),\n", " ('建信中债国开行债C', 1),\n", " ('建信鑫泽回报混合C', 1),\n", " ('建信沪深300指数增强C', 1),\n", " ('广发医药卫生联接C', 1),\n", " ('华夏创蓝筹ETF联接C', 1),\n", " ('富国天益价值混合', 1),\n", " ('宝盈品牌消费股票A', 1),\n", " ('广发内需增长混合A', 1),\n", " ('鹏华双债增利债券', 1),\n", " ('南方安泰混合', 1),\n", " ('易方达纯债A', 1),\n", " ('兴业添利债券', 1),\n", " ('博时丝路主题股票A', 1),\n", " ('景顺长城成长之星', 1),\n", " ('工银养老产业股票', 1),\n", " ('中海医疗保健主题股票', 1),\n", " ('泓德优选成长混合', 1),\n", " ('民生加银策略精选', 1),\n", " ('广发稳健增长混合C类', 1)]" ] }, "metadata": {}, "execution_count": 15 } ], "source": [ "list(sorted(result.items(),key=lambda x:x[1],reverse=True))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Help on built-in function sorted in module builtins:\n\nsorted(iterable, /, *, key=None, reverse=False)\n Return a new list containing all items from the iterable in ascending order.\n \n A custom key function can be supplied to customize the sort order, and the\n reverse flag can be set to request the result in descending order.\n\n" ] } ], "source": [ "help(sorted)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "result_=list(sorted(result.items(),key=lambda x:x[1],reverse=True))" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "result_dict_=[]\n", "for name,count in result_:\n", " d={}\n", " d['name']=name\n", " d['count']=count\n", " result_dict_.append(d)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'name': '广发稳健增长混合C类', 'count': 1}" ] }, "metadata": {}, "execution_count": 21 } ], "source": [ "result_dict_" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result_dict_)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " name count\n", "0 易方达蓝筹精选混合 21\n", "1 易方达中概互联50ETF联接人民币A 19\n", "2 富国天惠成长LOF 15\n", "3 工银金融地产混合 14\n", "4 交银新成长混合 13" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
namecount
0易方达蓝筹精选混合21
1易方达中概互联50ETF联接人民币A19
2富国天惠成长LOF15
3工银金融地产混合14
4交银新成长混合13
\n
" }, "metadata": {}, "execution_count": 24 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "df.to_excel('fund_count_.xls',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "found_day_list=[]\n", "for item in doc.find({},{'found_days':1}):\n", " found_day_list.append(item['found_days'])" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "543.455223880597\n" ] } ], "source": [ "print(np.array(found_day_list).mean())" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "543.455223880597" ] }, "metadata": {}, "execution_count": 43 } ], "source": [ "result_np.mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "3.8.3-final" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: analysis/Untitled.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "db = DBSelector()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "mongo_db = db.mongo()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "product_doc=mongo_db['fund']['etf_product']" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "product_list =[]\n", "for item in product_doc.find({},{'_id':0}):\n", " product_list.append(item)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'etf_code': '000001',\n", " 'etf_name': '上证指数',\n", " 'etf_product': ['汇添富上证综合指数', '富国上证综指ETF', '富国上证综指ETF联接', '国泰上证综合ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000010',\n", " 'etf_name': '上证180',\n", " 'etf_product': ['万家180指数', '华安上证180ETF', '华安上证180ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000012',\n", " 'etf_name': '国债指数',\n", " 'etf_product': ['南方高股息股票A', '南方高股息股票C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000015',\n", " 'etf_name': '红利指数',\n", " 'etf_product': ['华泰柏瑞上证红利ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000300',\n", " 'etf_name': '沪深300',\n", " 'etf_product': ['博时沪深300指数A',\n", " '长盛全债指数增强债券',\n", " '长城久泰沪深300指数A',\n", " '嘉实沪深300ETF联接(LOF)A',\n", " '大成沪深300指数A/B'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000905',\n", " 'etf_name': '中证500',\n", " 'etf_product': ['南方中证500ETF联接(LOF)A',\n", " '广发500ETF联接(LOF)A',\n", " '鹏华中证500指数(LOF)A',\n", " '富国中证500指数增强(LOF)',\n", " '农银中证500指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000914',\n", " 'etf_name': '300金融',\n", " 'etf_product': ['国投金融地产ETF联接基金', '国投瑞银金融地产ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000919',\n", " 'etf_name': '300价值',\n", " 'etf_product': ['银河沪深300价值指数', '申万沪深300价值指数A', '申万沪深300价值指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11014',\n", " 'etf_name': '中证短融',\n", " 'etf_product': ['海富通中证短融ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000029',\n", " 'etf_name': '180价值',\n", " 'etf_product': ['华宝兴业上证180价值ETF', '华宝上证180价值ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000037',\n", " 'etf_name': '上证医药',\n", " 'etf_product': ['华夏医药ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000925',\n", " 'etf_name': '基本面50',\n", " 'etf_product': ['嘉实基本面50指数(LOF)A', '嘉实基本面50指数(LOF)C', '嘉实中证锐联基本面50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000042',\n", " 'etf_name': '上证央企',\n", " 'etf_product': ['工银上证央企50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000046',\n", " 'etf_name': '上证中小',\n", " 'etf_product': ['华泰柏瑞上证中小盘ETF', '华泰柏瑞上证中小盘ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000933',\n", " 'etf_name': '中证医药',\n", " 'etf_product': ['汇添富中证医药卫生ETF',\n", " '嘉实中证医药卫生ETF',\n", " '鹏华中证医药A(LOF)',\n", " '添富中证医药ETF联接A',\n", " '添富中证医药ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000935',\n", " 'etf_name': '中证信息',\n", " 'etf_product': ['鹏华中证信息技术指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931461',\n", " 'etf_name': '电子50',\n", " 'etf_product': ['华宝中证电子50ETF', '华安中证电子50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000944',\n", " 'etf_name': '内地资源',\n", " 'etf_product': ['民生加银中证内地资源主题指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000949',\n", " 'etf_name': '中证农业',\n", " 'etf_product': ['富国中证农业主题ETF', '银华中证农业主题ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000056',\n", " 'etf_name': '上证国企',\n", " 'etf_product': ['中银上证国企100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000901',\n", " 'etf_name': '小康指数',\n", " 'etf_product': ['南方小康ETF', '南方小康ETF联接A', '南方小康ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000961',\n", " 'etf_name': '中证上游',\n", " 'etf_product': ['国投瑞银中证资源指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000963',\n", " 'etf_name': '中证下游',\n", " 'etf_product': ['国投瑞银中证消费服务指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000066',\n", " 'etf_name': '上证商品',\n", " 'etf_product': ['国联安上证商品ETF', '国联安上证商品ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399701',\n", " 'etf_name': '深证F60',\n", " 'etf_product': ['深证基本面60ETF', '建信深证基本面60ETF联接A', '建信深证基本面60ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399702',\n", " 'etf_name': '深证F120',\n", " 'etf_product': ['嘉实深证基本面120ETF', '嘉实深证基本面120ETF联接A', '嘉实深证基本面120ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000969',\n", " 'etf_name': '300非周',\n", " 'etf_product': ['长安沪深300非周期指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000009',\n", " 'etf_name': '上证380',\n", " 'etf_product': ['南方上证380ETF联接A', '南方上证380ETF', '南方上证380ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000971',\n", " 'etf_name': '等权90',\n", " 'etf_product': ['银华中证等权重90指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000978',\n", " 'etf_name': '医药100',\n", " 'etf_product': ['国联安中证医药100A',\n", " '天弘中证医药100指数A',\n", " '天弘中证医药100指数C',\n", " '国联安中证医药100C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000984',\n", " 'etf_name': '300等权',\n", " 'etf_product': ['中银沪深300等权重指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000986',\n", " 'etf_name': '全指能源',\n", " 'etf_product': ['广发中证全指能源ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000991',\n", " 'etf_name': '全指医药',\n", " 'etf_product': ['广发中证全指医药卫生交易ETF',\n", " '广发医药卫生联接A',\n", " '广发医药卫生联接C',\n", " '银华中证全指医药卫生指数增强发起式'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000993',\n", " 'etf_name': '全指信息',\n", " 'etf_product': ['广发中证全指信息技术交易ETF', '广发信息技术联接ETFA', '广发信息技术联接ETFC'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399959',\n", " 'etf_name': '军工指数',\n", " 'etf_product': ['前海开源中航军工指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11136',\n", " 'etf_name': '中国互联网',\n", " 'etf_product': ['交银中证海外中国互联网指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000802',\n", " 'etf_name': '500沪市',\n", " 'etf_product': ['中证500沪市ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000998',\n", " 'etf_name': '中证TMT',\n", " 'etf_product': ['中信保诚中证TMT产业主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000805',\n", " 'etf_name': 'A股资源',\n", " 'etf_product': ['鹏华中证A股资源产业指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000808',\n", " 'etf_name': '医药生物',\n", " 'etf_product': ['申万菱信中证申万医药生物指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000815',\n", " 'etf_name': '细分食品',\n", " 'etf_product': ['华宝中证细分食品饮料产业主题ETF', '华夏中证细分食品饮料产业主题ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000819',\n", " 'etf_name': '有色金属',\n", " 'etf_product': ['南方中证申万有色金属ETF', '南方有色金属联接A', '南方有色金属联接C', '南方有色金属联接E'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000824',\n", " 'etf_name': '国企红利',\n", " 'etf_product': ['西部利得中证国有企业红利指数增强A', '西部利得中证国有企业红利指数增强C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000832',\n", " 'etf_name': '中证转债',\n", " 'etf_product': ['东吴中证可转债指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000827',\n", " 'etf_name': '中证环保',\n", " 'etf_product': ['广发中证环保产业ETF',\n", " '广发中证环保ETF联接基金A',\n", " '广发中证环保ETF联接基金C',\n", " '中证环保指数(LOF)A',\n", " '中证环保指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000846',\n", " 'etf_name': 'ESG 100',\n", " 'etf_product': ['中证财通可持续发展100指数A', '中证财通可持续发展100指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000841',\n", " 'etf_name': '800医药',\n", " 'etf_product': ['中信保诚中证800医药指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399965',\n", " 'etf_name': '800地产',\n", " 'etf_product': ['鹏华中证800地产指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399966',\n", " 'etf_name': '800证保',\n", " 'etf_product': ['鹏华中证800证券保险指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30031',\n", " 'etf_name': '800有色',\n", " 'etf_product': ['中信保诚中证800有色指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11077',\n", " 'etf_name': '10年国债',\n", " 'etf_product': ['上证10年期国债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30089',\n", " 'etf_name': '红利潜力',\n", " 'etf_product': ['建信中证红利潜力指数A', '建信中证红利潜力指数C', '山西证券中证红利潜力ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30094',\n", " 'etf_name': '消费红利',\n", " 'etf_product': ['方正富邦消费红利指数增强(LOF)', '泰达消费红利指数A', '泰达消费红利指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399975',\n", " 'etf_name': '证券公司',\n", " 'etf_product': ['国泰中证全指证券公司ETF',\n", " '华宝中证全指证券公司ETF',\n", " '南方全指证券联接A',\n", " '南方全指证券联接C',\n", " '南方中证全指证券公司ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30165',\n", " 'etf_name': '房地产',\n", " 'etf_product': ['南方中证全指房地产ETF',\n", " '南方房地产联接A',\n", " '南方房地产联接C',\n", " '华夏中证全指房地产ETF',\n", " '华夏中证全指房地产ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30184',\n", " 'etf_name': '半导体',\n", " 'etf_product': ['国联安中证全指半导体ETF', '国联安中证全指半导体ETF联接A', '国联安中证全指半导体ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931008',\n", " 'etf_name': '汽车指数',\n", " 'etf_product': ['广发中证全指汽车指数A', '广发中证全指汽车指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11098',\n", " 'etf_name': '沪城投债',\n", " 'etf_product': ['海富通上证城投债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399967',\n", " 'etf_name': '中证军工',\n", " 'etf_product': ['前海开源中证军工指数A',\n", " '前海开源中证军工指数C',\n", " '国泰中证军工ETF',\n", " '华宝中证军工ETF',\n", " '广发中证军工ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H50040',\n", " 'etf_name': '上红低波',\n", " 'etf_product': ['兴业上证红利低波动ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399973',\n", " 'etf_name': '中证国防',\n", " 'etf_product': ['鹏华中证国防ETF', '鹏华中证国防指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399970',\n", " 'etf_name': '移动互联',\n", " 'etf_product': ['富国中证移动互联网指数', '鹏华中证移动互联网指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399812',\n", " 'etf_name': '养老产业',\n", " 'etf_product': ['广发养老指数A', '广发养老指数C', '国寿安保中证养老产业指数增强'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30344',\n", " 'etf_name': '健康产业',\n", " 'etf_product': ['前海开源中证健康产业指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30359',\n", " 'etf_name': '转型成长',\n", " 'etf_product': ['浙商汇金中证转型成长指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399806',\n", " 'etf_name': '环境治理',\n", " 'etf_product': ['交银施罗德中证环境治理(LOF)',\n", " '汇添富中证环境治理指数(LOF)A',\n", " '汇添富中证环境治理指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30372',\n", " 'etf_name': '中证安全',\n", " 'etf_product': ['东海中证社会发展安全产业主题'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399974',\n", " 'etf_name': '国企改革',\n", " 'etf_product': ['南方中证国有企业改革指数(LOF)A',\n", " '南方中证国有企业改革指数(LOF)C',\n", " '富国中证国有企业改革指数',\n", " '易方达中证国企改革指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399989',\n", " 'etf_name': '中证医疗',\n", " 'etf_product': ['华宝中证医疗ETF',\n", " '广发中证医疗指数(LOF)A',\n", " '广发中证医疗指数(LOF)C',\n", " '国泰中证医疗交易型开放式指数ETF',\n", " '华宝中证医疗指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399976',\n", " 'etf_name': 'CS新能车',\n", " 'etf_product': ['华夏中证新能源汽车ETF',\n", " '国泰中证新能源汽车ETF',\n", " '国泰中证新能源汽车ETF联接A',\n", " '国泰中证新能源汽车ETF联接C',\n", " '博时新能源汽车ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399987',\n", " 'etf_name': '中证酒',\n", " 'etf_product': ['鹏华中证酒ETF', '鹏华中证酒指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30533',\n", " 'etf_name': '中国互联网50',\n", " 'etf_product': ['易方达中证海外中国互联网50ETF',\n", " '易方达中证海外联接人民币A',\n", " '易方达中证海外联接美元A',\n", " '易方达中证海外联接人民币C',\n", " '易方达中证海外联接美元C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399990',\n", " 'etf_name': '煤炭等权',\n", " 'etf_product': ['招商中证煤炭等权指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399997',\n", " 'etf_name': '中证白酒',\n", " 'etf_product': ['招商中证白酒指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30537',\n", " 'etf_name': '淘金100',\n", " 'etf_product': ['博时中证淘金大数据100A', '博时中证淘金大数据100I'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30588',\n", " 'etf_name': '中证证保',\n", " 'etf_product': ['天弘中证证券保险指数A', '天弘中证证券保险指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399804',\n", " 'etf_name': '中证体育',\n", " 'etf_product': ['富国中证体育产业指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399803',\n", " 'etf_name': '工业4.0',\n", " 'etf_product': ['富国中证工业4.0指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399809',\n", " 'etf_name': '保险主题',\n", " 'etf_product': ['方正富邦中证保险主题指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399998',\n", " 'etf_name': '中证煤炭',\n", " 'etf_product': ['国泰中证煤炭ETF',\n", " '国泰中证煤炭ETF联接A',\n", " '国泰中证煤炭ETF联接C',\n", " '中融中证煤炭指数',\n", " '富国中证煤炭指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H50069',\n", " 'etf_name': '港股通',\n", " 'etf_product': ['招商上证港股通ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930620',\n", " 'etf_name': 'CSSW丝路',\n", " 'etf_product': ['长盛中证申万一带一路主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399993',\n", " 'etf_name': 'CSWD生科',\n", " 'etf_product': ['易方达中证万得生物科技指数(LOF)A', '易方达中证万得生物科技指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930641',\n", " 'etf_name': '中证中药',\n", " 'etf_product': ['汇添富中证中药指数(LOF)A', '汇添富中证中药指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930653',\n", " 'etf_name': 'CS食品饮',\n", " 'etf_product': ['天弘中证食品饮料指数A', '天弘中证食品饮料指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930697',\n", " 'etf_name': '家用电器',\n", " 'etf_product': ['广发中证全指家用电器指数A',\n", " '广发中证全指家用电器指数C',\n", " '国泰中证全指家用电器ETF',\n", " '国泰中证全指家用电器ETF联接A',\n", " '国泰中证全指家用电器ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930701',\n", " 'etf_name': 'CS京津冀',\n", " 'etf_product': ['工银京津冀指数A',\n", " '广发中证京津冀ETF联接A',\n", " '广发中证京津冀ETF联接C',\n", " '广发中证京津冀ETF',\n", " '工银京津冀指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000016',\n", " 'etf_name': '上证50',\n", " 'etf_product': ['华夏上证50ETF',\n", " '易方达上证50指数A',\n", " '中海上证50指数增强',\n", " '万家上证50ETF',\n", " '华夏上证50ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000903',\n", " 'etf_name': '中证100',\n", " 'etf_product': ['长盛中证100指数',\n", " '中银中证100指数增强',\n", " '华宝中证100指数A',\n", " '海富通中证100指数(LOF)A',\n", " '诺安中证100指数A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000904',\n", " 'etf_name': '中证200',\n", " 'etf_product': ['泰信中证200指数基金', '民生加银中证200指数增强A', '民生加银中证200指数增强C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000906',\n", " 'etf_name': '中证800',\n", " 'etf_product': ['长盛同庆中证800(LOF)',\n", " '天弘中证800指数A',\n", " '天弘中证800指数C',\n", " '添富中证800ETF',\n", " '易方达中证800ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000913',\n", " 'etf_name': '300医药',\n", " 'etf_product': ['易方达沪深300医药ETF', '易方达沪深300医药卫生ETF联接A', '易方达沪深300医药卫生ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000018',\n", " 'etf_name': '180金融',\n", " 'etf_product': ['国泰上证180金融ETF', '国泰上证180金融ETF联接', '兴业上证180金融ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11001',\n", " 'etf_name': '中证全债',\n", " 'etf_product': ['湘财长源股票型A', '湘财长源股票型C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000922',\n", " 'etf_name': '中证红利',\n", " 'etf_product': ['富国中证红利指数增强A',\n", " '大成中证红利指数A',\n", " '万家中证红利指数(LOF)',\n", " '大成中证红利指数C',\n", " '招商中证红利ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000021',\n", " 'etf_name': '180治理',\n", " 'etf_product': ['交银上证180公司治理ETF', '交银上证180公司治理ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000036',\n", " 'etf_name': '上证消费',\n", " 'etf_product': ['华夏消费ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000038',\n", " 'etf_name': '上证金融',\n", " 'etf_product': ['华夏金融ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000043',\n", " 'etf_name': '超大盘',\n", " 'etf_product': ['博时上证超大盘ETF', '博时上证超大盘ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000044',\n", " 'etf_name': '上证中盘',\n", " 'etf_product': ['易方达上证中盘ETF', '易方达上证中盘ETF联接A', '易方达上证中盘ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000928',\n", " 'etf_name': '中证能源',\n", " 'etf_product': ['汇添富中证能源ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000932',\n", " 'etf_name': '中证消费',\n", " 'etf_product': ['汇添富中证主要消费ETF',\n", " '嘉实中证主要消费ETF',\n", " '汇添富中证主要消费ETF联接',\n", " '嘉实中证主要消费ETF联接A',\n", " '嘉实中证主要消费ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000934',\n", " 'etf_name': '中证金融',\n", " 'etf_product': ['汇添富中证金融地产ETF',\n", " '嘉实中证金融地产ETF',\n", " '嘉实中证金融地产ETF联接A',\n", " '嘉实中证金融地产ETF联接C',\n", " '长盛中证金融地产指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000048',\n", " 'etf_name': '责任指数',\n", " 'etf_product': ['建信上证社会责任ETF', '建信上证社会责任ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000063',\n", " 'etf_name': '上证周期',\n", " 'etf_product': ['海富通上证周期ETF', '海富通上证周期ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000064',\n", " 'etf_name': '非周期',\n", " 'etf_product': ['海富通上证非周期ETF', '海富通上证非周期ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000065',\n", " 'etf_name': '上证龙头',\n", " 'etf_product': ['华安上证龙头ETF', '华安上证龙头ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000964',\n", " 'etf_name': '中证新兴',\n", " 'etf_product': ['东吴中证新兴'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000068',\n", " 'etf_name': '上证资源',\n", " 'etf_product': ['博时上证自然资源ETF', '博时上证自然资源ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000069',\n", " 'etf_name': '消费80',\n", " 'etf_product': ['招商上证消费80ETF', '招商上证消费80ETF联接A', '招商上证消费80ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000966',\n", " 'etf_name': '基本400',\n", " 'etf_product': ['浦银安盛基本面400指数', '泰信中证锐联基本面400指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11017',\n", " 'etf_name': '中期国债',\n", " 'etf_product': ['嘉实中证金边中期国债ETF联接A', '嘉实中证金边中期国债ETF联接C', '嘉实中证中期国债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000982',\n", " 'etf_name': '500等权',\n", " 'etf_product': ['前海开源中证500等权ETF', '招商中证500等权重指数增强A', '招商中证500等权重指数增强C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000987',\n", " 'etf_name': '全指材料',\n", " 'etf_product': ['广发中证全指原材料ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000989',\n", " 'etf_name': '全指可选',\n", " 'etf_product': ['广发中证全指可选消费ETF', '广发中证全指可选消费ETF联接A', '广发中证全指可选消费ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000992',\n", " 'etf_name': '全指金融',\n", " 'etf_product': ['广发中证全指金融地产ETF', '广发中证全指金融地产ETF联接A', '广发中证全指金融地产ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000979',\n", " 'etf_name': '大宗商品',\n", " 'etf_product': ['招商中证商品指数基金(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000806',\n", " 'etf_name': '消费服务',\n", " 'etf_product': ['上投摩根中证消费服务指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000814',\n", " 'etf_name': '细分医药',\n", " 'etf_product': ['华安中证医药ETF', '华安中证细分医药交易A', '华安中证细分医药交易C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000821',\n", " 'etf_name': '300红利',\n", " 'etf_product': ['建信沪深300红利ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000828',\n", " 'etf_name': '300高贝',\n", " 'etf_product': ['招商沪深300高贝塔指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399802',\n", " 'etf_name': '500深市',\n", " 'etf_product': ['大成中证500深市ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H00140',\n", " 'etf_name': '5年国债',\n", " 'etf_product': ['国泰上证5年期国债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30035',\n", " 'etf_name': '300非银',\n", " 'etf_product': ['易方达沪深300非银ETF', '易方达沪深300非银行金融交易A', '易方达沪深300非银行金融交易C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30124',\n", " 'etf_name': '安中动态',\n", " 'etf_product': ['汇添富沪深300安中指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399986',\n", " 'etf_name': '中证银行',\n", " 'etf_product': ['富国中证银行指数', '南方中证银行ETF', '南方银行联接A', '南方银行联接C', '华宝中证银行ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931009',\n", " 'etf_name': '建筑材料',\n", " 'etf_product': ['广发中证全指建筑材料指数A', '广发中证全指建筑材料指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931160',\n", " 'etf_name': '通信设备',\n", " 'etf_product': ['国泰中证全指通信设备ETF', '国泰中证全指通信设备交易联接A', '国泰中证全指通信设备交易联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30257',\n", " 'etf_name': '500信息',\n", " 'etf_product': ['中证500信息技术指数ETF', '南方中证500信息技术ETF联接A', '南方中证500信息技术ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30263',\n", " 'etf_name': '腾讯济安',\n", " 'etf_product': ['定投宝'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399983',\n", " 'etf_name': '地产等权',\n", " 'etf_product': ['招商沪深300地产等权重指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30269',\n", " 'etf_name': '红利低波',\n", " 'etf_product': ['创金合信中证红利低波动指数A',\n", " '创金合信中证红利低波动指数C',\n", " '华泰柏瑞中证红利低波动ETF',\n", " '华泰柏瑞中证红利低波ETF联接A',\n", " '华泰柏瑞中证红利低波ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399971',\n", " 'etf_name': '中证传媒',\n", " 'etf_product': ['广发中证传媒ETF',\n", " '广发中证传媒ETF联接A',\n", " '广发中证传媒ETF联接C',\n", " '鹏华中证传媒ETF',\n", " '工银传媒指数A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30318',\n", " 'etf_name': '科技传媒通信150',\n", " 'etf_product': ['景顺长城中证科技传媒通信150ETF', '景顺长城中证科技传媒通信150ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11018',\n", " 'etf_name': '沪质城投',\n", " 'etf_product': ['海富通上证城投债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399814',\n", " 'etf_name': '大农业',\n", " 'etf_product': ['前海开源中证大农业指数增强'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30373',\n", " 'etf_name': '百发100',\n", " 'etf_product': ['广发百发100指数A', '广发百发100指数E'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399996',\n", " 'etf_name': '智能家居',\n", " 'etf_product': ['中信保诚中证智能家居指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000852',\n", " 'etf_name': '中证1000',\n", " 'etf_product': ['南方中证1000ETF',\n", " '创金合信中证1000指数增强A',\n", " '创金合信中证1000指数增强C',\n", " '招商中证1000指数A',\n", " '招商中证1000指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30531',\n", " 'etf_name': '精工制造',\n", " 'etf_product': ['建信精工制造指数增强'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30535',\n", " 'etf_name': '互联网',\n", " 'etf_product': ['南方中证互联网指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399807',\n", " 'etf_name': '高铁产业',\n", " 'etf_product': ['南方中证高铁产业指数(LOF)', '鹏华中证高铁产业指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399991',\n", " 'etf_name': '一带一路',\n", " 'etf_product': ['鹏华中证一带一路主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399994',\n", " 'etf_name': '信息安全',\n", " 'etf_product': ['中信保诚中证信息安全指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399995',\n", " 'etf_name': '基建工程',\n", " 'etf_product': ['信诚中证基建工程指数(LOF)', '广发中证基建工程指数A', '广发中证基建工程指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930606',\n", " 'etf_name': '中证钢铁',\n", " 'etf_product': ['国泰中证钢铁ETF', '国泰中证钢铁ETF联接A', '国泰中证钢铁ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399707',\n", " 'etf_name': 'CSSW证券',\n", " 'etf_product': ['国泰中证申万证券行业指数(LOF)', '申万菱信中证申万证券行业指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399992',\n", " 'etf_name': 'CSWD并购',\n", " 'etf_product': ['易方达中证万得并购重组指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930648',\n", " 'etf_name': 'CS智消费',\n", " 'etf_product': ['博时中证智能消费ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930651',\n", " 'etf_name': 'CS计算机',\n", " 'etf_product': ['国泰中证计算机主题ETF',\n", " '天弘中证计算机主题ETF',\n", " '天弘中证计算机主题ETF联接A',\n", " '天弘中证计算机主题ETF联接C',\n", " '国泰中证计算机主题ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930652',\n", " 'etf_name': 'CS电子',\n", " 'etf_product': ['天弘中证电子ETF', '天弘中证电子ETF联接A', '天弘中证电子ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930703',\n", " 'etf_name': '福建50',\n", " 'etf_product': ['兴业中证福建50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930713',\n", " 'etf_name': 'CS人工智',\n", " 'etf_product': ['融通人工智能指数(LOF)A',\n", " '平安人工智能ETF',\n", " '华夏中证人工智能主题ETF',\n", " '融通人工智能指数(LOF)C',\n", " '华夏中证人工智能主题ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399811',\n", " 'etf_name': 'CSSW电子',\n", " 'etf_product': ['申万菱信中证申万电子行业投资指数(LOF)A', '申万菱信中证申万电子行业投资指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930719',\n", " 'etf_name': 'CS精准医',\n", " 'etf_product': ['汇添富中证精准医指数A(LOF)', '汇添富中证精准医指数C(LOF)', '融通中证精准医疗主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930720',\n", " 'etf_name': 'CS互医疗',\n", " 'etf_product': ['汇添富中证互联网医疗指数(LOF)A', '汇添富中证互联网医疗指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930721',\n", " 'etf_name': 'CS智汽车',\n", " 'etf_product': ['富国中证智能汽车指数(LOF)',\n", " '富国中证智能汽车主题ETF',\n", " '天弘中证智能汽车A',\n", " '天弘中证智能汽车C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930723',\n", " 'etf_name': '沪港深F100',\n", " 'etf_product': ['浦银沪港深基本面'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930726',\n", " 'etf_name': 'CS生医',\n", " 'etf_product': ['国泰中证生物医药ETF', '国泰中证生物医药ETF联接A', '国泰中证生物医药ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930734',\n", " 'etf_name': '360互联+',\n", " 'etf_product': ['大成中证360A', '大成中证360C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930729',\n", " 'etf_name': '银智100',\n", " 'etf_product': ['博时银智大数据100A', '博时银智大数据100C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930743',\n", " 'etf_name': '中证生科',\n", " 'etf_product': ['汇添富中证生物科技指数(LOF)A', '汇添富中证生物科技指数(LOF)C', '易方达中证生物科技主题ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950090',\n", " 'etf_name': '上证50优选',\n", " 'etf_product': ['华夏上证50AH优选指数(LOF)A', '华夏上证50AH优选指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930780',\n", " 'etf_name': '中证兴业中高债',\n", " 'etf_product': ['中证兴业中高等级信用债指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930782',\n", " 'etf_name': '500SNLV',\n", " 'etf_product': ['景顺长城中证500行业中性低波动指数',\n", " '华安中证500低波ETF',\n", " '华安中证500低波ETF联接A',\n", " '华安中证500低波ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930784',\n", " 'etf_name': 'HK红利EW',\n", " 'etf_product': ['财通中证香港红利等权投资指数A', '财通中证香港红利等权投资指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930790',\n", " 'etf_name': 'CS娱乐TI',\n", " 'etf_product': ['富国中证娱乐主题指数增强型(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930791',\n", " 'etf_name': 'CS医药TI',\n", " 'etf_product': ['富国中证医药主题指数增强(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930792',\n", " 'etf_name': 'HK银行',\n", " 'etf_product': ['泰康香港银行指数A', '泰康香港银行指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930794',\n", " 'etf_name': '中美互联网',\n", " 'etf_product': ['天弘中证中美互联网指数(QDII)A', '天弘中证中美互联网指数(QDII)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930820',\n", " 'etf_name': 'CS高端制',\n", " 'etf_product': ['富国中证高端制造指数增强型(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950096',\n", " 'etf_name': '上海国企',\n", " 'etf_product': ['中证上海国企ETF', '中证上海国企ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930836',\n", " 'etf_name': '沪港深高股息',\n", " 'etf_product': ['信达澳银中证沪港深高股息精选'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930838',\n", " 'etf_name': 'CS高股息',\n", " 'etf_product': ['浦银安盛中证高股息ETF', '浦银安盛中证高股息ETF联接A', '浦银安盛中证高股息ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930839',\n", " 'etf_name': 'HK高股息',\n", " 'etf_product': ['民生加银中证港股通高股息精选A', '民生加银中证港股通高股息精选C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930846',\n", " 'etf_name': '300SNLV',\n", " 'etf_product': ['华安沪深300行业中性低波动ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930865',\n", " 'etf_name': '5年地债',\n", " 'etf_product': ['鹏华中证5年地债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930851',\n", " 'etf_name': '云计算',\n", " 'etf_product': ['融通中证云计算与大数据主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930874',\n", " 'etf_name': '政金债8-10',\n", " 'etf_product': ['建信中证政策性金融债8-10年指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930875',\n", " 'etf_name': '空天军工',\n", " 'etf_product': ['鹏华空天一体A(LOF)', '鹏华空天一体C(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930902',\n", " 'etf_name': '中证数据',\n", " 'etf_product': ['富国中证大数据产业ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950105',\n", " 'etf_name': '上证证券',\n", " 'etf_product': ['汇安上证证券ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950109',\n", " 'etf_name': '上证10年地债',\n", " 'etf_product': ['上证10年期地方政府债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930914',\n", " 'etf_name': '港股通高股息',\n", " 'etf_product': ['汇添富中证港股通高股息投资指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930916',\n", " 'etf_name': '中证10年国债',\n", " 'etf_product': ['富国中证10年期国债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930917',\n", " 'etf_name': 'SHS高股息',\n", " 'etf_product': ['银河中证沪港深高股息指数A(LOF)', '银河中证沪港深高股息指数C(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000171',\n", " 'etf_name': '新兴成指',\n", " 'etf_product': ['华夏战略新兴成指ETF', '华夏战略新兴成指ETF联接A', '华夏战略新兴成指ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950113',\n", " 'etf_name': '沪质中高债3-5',\n", " 'etf_product': ['华夏3-5年中高级可质押信用债ETF',\n", " '华夏3-5年中高级可质押信用债ETF联接A',\n", " '华夏3-5年中高级可质押信用债ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930949',\n", " 'etf_name': '价值回报',\n", " 'etf_product': ['中邮中证价值回报量化策略指数A', '中邮中证价值回报量化策略指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930954',\n", " 'etf_name': '5年久期国开债',\n", " 'etf_product': ['华富中证5年恒定久期国开债指数A', '华富中证5年恒定久期国开债指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930955',\n", " 'etf_name': '红利低波100',\n", " 'etf_product': ['天弘中证红利低波动100A', '天弘中证红利低波动100C', '景顺长城中证红利低波动100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930997',\n", " 'etf_name': '新能源车',\n", " 'etf_product': ['汇添富中证新能源汽车产业指数(LOF)A',\n", " '汇添富中证新能源汽车产业指数(LOF)C',\n", " '平安中证新能源汽车产业ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930999',\n", " 'etf_name': 'SHS大湾区',\n", " 'etf_product': ['建信中证沪港深粤港澳大湾区发展主题ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931000',\n", " 'etf_name': '大湾区',\n", " 'etf_product': ['粤港澳大湾区ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931018',\n", " 'etf_name': '中证5-10年国债活跃券',\n", " 'etf_product': ['平安中证5-10年期国债活跃券ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931024',\n", " 'etf_name': 'HKC非银',\n", " 'etf_product': ['泰康中证港股通非银指数A', '泰康中证港股通非银指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931033',\n", " 'etf_name': '杭州湾区',\n", " 'etf_product': ['南华中证杭州湾区交易ETF', '南华中证杭州湾区ETF联接A', '南华中证杭州湾区ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931052',\n", " 'etf_name': '国信价值',\n", " 'etf_product': ['富国中证价值ETF', '富国中证价值ETF联接A', '富国中证价值ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931062',\n", " 'etf_name': '质量低波',\n", " 'etf_product': ['恒生前海中证质量成长A', '恒生前海中证质量成长C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931066',\n", " 'etf_name': '军工龙头',\n", " 'etf_product': ['富国中证军工龙头ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931069',\n", " 'etf_name': '中金300',\n", " 'etf_product': ['中金中证优选300指数(LOF)A', '中金中证优选300指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931067',\n", " 'etf_name': '绩优策略',\n", " 'etf_product': ['泰达宏利中证绩优指数A', '泰达宏利中证绩优指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000860',\n", " 'etf_name': '结构调整',\n", " 'etf_product': ['博时央企结构调整ETF',\n", " '华夏中证央企ETF',\n", " '银华中证央企ETF',\n", " '华夏中证央企ETF联接A',\n", " '华夏中证央企ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930738',\n", " 'etf_name': '四川国改',\n", " 'etf_product': ['华夏中证四川国改ETF', '华夏中证四川国改发起式ETF联接A', '华夏中证四川国改发起式ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931071',\n", " 'etf_name': '人工智能',\n", " 'etf_product': ['华富中证人工智能产业ETF', '华富中证人工智能产业ETF联接A', '华富中证人工智能产业ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930939',\n", " 'etf_name': '500质量',\n", " 'etf_product': ['鹏扬中证500质量成长指数A', '鹏扬中证500质量成长指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931068',\n", " 'etf_name': '消费龙头',\n", " 'etf_product': ['华宝中证消费龙头指数(LOF)A', '华宝中证消费龙头指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930758',\n", " 'etf_name': '凤凰50',\n", " 'etf_product': ['浙商汇金中证浙江凤凰行动50ETF', '浙商之江凤凰联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930740',\n", " 'etf_name': '300 红利LV',\n", " 'etf_product': ['嘉实沪深300红利低波动ETF',\n", " '嘉实沪深300红利低波动ETF联接A',\n", " '嘉实沪深300红利低波动ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931127',\n", " 'etf_name': '浙江新动能',\n", " 'etf_product': ['易方达中证浙江新动能ETF(QDII)',\n", " '易方达中证新动能ETF联接(QDII)A',\n", " '易方达中证新动能ETF联接(QDII)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931136',\n", " 'etf_name': '深圳科技',\n", " 'etf_product': ['安信深圳科技指数(LOF)A', '安信深圳科技指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931078',\n", " 'etf_name': '中证转债及可交换债',\n", " 'etf_product': ['中泰中证可转债及可交债指数A', '中泰中证可转债及可交债指数C', '博时中证可转债及可交换债券ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950045',\n", " 'etf_name': '上证5年期地债',\n", " 'etf_product': ['海富通上证5年期地方政府债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931134',\n", " 'etf_name': 'AH经济蓝筹',\n", " 'etf_product': ['华夏中证AH经济蓝筹股票指数A', '华夏中证AH经济蓝筹股票指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931142',\n", " 'etf_name': '东证竞争',\n", " 'etf_product': ['东方红中证竞争力指数A', '东方红中证竞争力指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931087',\n", " 'etf_name': '科技龙头',\n", " 'etf_product': ['华宝中证科技龙头ETF', '华宝科技ETF联接A', '华宝科技ETF联接C', '工银瑞信中证科技龙头ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931139',\n", " 'etf_name': 'CS消费50',\n", " 'etf_product': ['富国中证消费50ETF',\n", " '富国中证消费50ETF联接A',\n", " '富国中证消费50ETF联接C',\n", " '东兴中证消费50指数A',\n", " '东兴中证消费50指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931140',\n", " 'etf_name': '医药50',\n", " 'etf_product': ['富国中证医药50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931141',\n", " 'etf_name': 'CS长三角',\n", " 'etf_product': ['添富中证长三角ETF', '汇添富中证长三角ETF联接A', '汇添富中证长三角ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931151',\n", " 'etf_name': '光伏产业',\n", " 'etf_product': ['华泰柏瑞中证光伏产业ETF', '银华中证光伏产业ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931152',\n", " 'etf_name': 'CS创新药',\n", " 'etf_product': ['银华中证创新药产业ETF', '广发中证创新药产业ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950041',\n", " 'etf_name': '上证投资级转债及可交换债',\n", " 'etf_product': ['海富通上证投资级可转债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950047',\n", " 'etf_name': '上证1-5年地债',\n", " 'etf_product': ['兴业上证1-5年期地方政府债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931161',\n", " 'etf_name': '0-4年地债',\n", " 'etf_product': ['鹏华中证0-4年期地方政府债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931162',\n", " 'etf_name': '中证转债及可交换债50',\n", " 'etf_product': ['长信中证转债及可交换债50指数A', '长信中证转债及可交换债50指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931079',\n", " 'etf_name': '5G通信',\n", " 'etf_product': ['华夏中证5G通信主题ETF',\n", " '华夏中证5G通信主题ETF联接A',\n", " '华夏中证5G通信主题ETF联接C',\n", " '银华中证5GETF',\n", " '银华中证5G通信主题ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931157',\n", " 'etf_name': 'SHS红利成长LV',\n", " 'etf_product': ['景顺沪港深红利成长低波动指数A', '景顺沪港深红利成长低波动指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931165',\n", " 'etf_name': '新兴科技100',\n", " 'etf_product': ['嘉实中证新兴科技100ETF', '嘉实新兴科技100ETF联接A', '嘉实新兴科技100ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931166',\n", " 'etf_name': '医药健康100',\n", " 'etf_product': ['嘉实医药健康100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931167',\n", " 'etf_name': '先进制造100',\n", " 'etf_product': ['嘉实先进制造100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931163',\n", " 'etf_name': '浙江100',\n", " 'etf_product': ['招商中证浙江100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000859',\n", " 'etf_name': '国企一带一路',\n", " 'etf_product': ['易方达中证国企一带一路ETF',\n", " '富国中证国企一带一路ETF',\n", " '添富中证国企一带一路ETF',\n", " '富国中证国企一带一路ETF联接A',\n", " '富国中证国企一带一路ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000861',\n", " 'etf_name': '央企创新',\n", " 'etf_product': ['富国央企创新ETF',\n", " '博时央企创新驱动ETF',\n", " '广发中证央企创新驱动ETF',\n", " '嘉实中证央企创新驱动ETF',\n", " '广发央企创新驱动ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931159',\n", " 'etf_name': '创新100',\n", " 'etf_product': ['诺德研发创新100',\n", " '申万菱信中证研发创新100ETF',\n", " '申万菱信中证研发创新100ETF联接A',\n", " '申万菱信中证研发创新100ETF联接C',\n", " '银华中证研发创新100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931186',\n", " 'etf_name': '中证科技',\n", " 'etf_product': ['富国中证科技50策略ETF', '富国中证科技50策略ETF联接A', '富国中证科技50策略ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931144',\n", " 'etf_name': '通信技术',\n", " 'etf_product': ['东财通信A', '东财通信C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931187',\n", " 'etf_name': '科技100',\n", " 'etf_product': ['华泰柏瑞中证科技100ETF',\n", " '华泰柏瑞中证科技ETF联接A',\n", " '华泰柏瑞中证科技ETF联接C',\n", " '天弘中证科技100指数增强A',\n", " '天弘中证科技100指数增强C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931175',\n", " 'etf_name': '银行50金融债',\n", " 'etf_product': ['兴业中证银行50金融债指数A', '兴业中证银行50金融债指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931172',\n", " 'etf_name': '信用主体50',\n", " 'etf_product': ['安信信用主体50债券指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931268',\n", " 'etf_name': '持续发展',\n", " 'etf_product': ['博时可持续发展100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931373',\n", " 'etf_name': '股息龙头',\n", " 'etf_product': ['鹏华中证高股息龙头ETF', '鹏华股息龙头ETF联接A', '鹏华股息龙头ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931357',\n", " 'etf_name': '优选消费50',\n", " 'etf_product': ['中金中证沪港深优选消费50指数A', '中金中证沪港深优选消费50指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931306',\n", " 'etf_name': '国债及政金债1-5',\n", " 'etf_product': ['农银中证国债及政金债1-5年指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931381',\n", " 'etf_name': '中证长三角',\n", " 'etf_product': ['海富通中证长三角领先ETF联接', '海富通中证长三角领先ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931380',\n", " 'etf_name': '科技50',\n", " 'etf_product': ['易方达中证科技50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931372',\n", " 'etf_name': '浙江国资',\n", " 'etf_product': ['华夏中证浙江国资创新发展ETF',\n", " '华夏中证浙江国资创新发展ETF联接A',\n", " '华夏中证浙江国资创新发展ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931406',\n", " 'etf_name': '5G 50',\n", " 'etf_product': ['博时中证5G产业50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000688',\n", " 'etf_name': '科创50',\n", " 'etf_product': ['工银上证科创板50成份ETF',\n", " '华泰柏瑞上证科创板50成份ETF',\n", " '华夏上证科创板50成份ETF',\n", " '易方达上证科创板50成份ETF'],\n", " 'crawltime': '2021-01-24'}]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "product_list" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "code_list = list(map(lambda x:x.get('etf_code'),product_list))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['000001',\n", " '000010',\n", " '000012',\n", " '000015',\n", " '000300',\n", " '000905',\n", " '000914',\n", " '000919',\n", " 'H11014',\n", " '000029',\n", " '000037',\n", " '000925',\n", " '000042',\n", " '000046',\n", " '000933',\n", " '000935',\n", " '931461',\n", " '000944',\n", " '000949',\n", " '000056',\n", " '000901',\n", " '000961',\n", " '000963',\n", " '000066',\n", " '399701',\n", " '399702',\n", " '000969',\n", " '000009',\n", " '000971',\n", " '000978',\n", " '000984',\n", " '000986',\n", " '000991',\n", " '000993',\n", " '399959',\n", " 'H11136',\n", " '000802',\n", " '000998',\n", " '000805',\n", " '000808',\n", " '000815',\n", " '000819',\n", " '000824',\n", " '000832',\n", " '000827',\n", " '000846',\n", " '000841',\n", " '399965',\n", " '399966',\n", " 'H30031',\n", " 'H11077',\n", " 'H30089',\n", " 'H30094',\n", " '399975',\n", " 'H30165',\n", " 'H30184',\n", " '931008',\n", " 'H11098',\n", " '399967',\n", " 'H50040',\n", " '399973',\n", " '399970',\n", " '399812',\n", " 'H30344',\n", " 'H30359',\n", " '399806',\n", " 'H30372',\n", " '399974',\n", " '399989',\n", " '399976',\n", " '399987',\n", " 'H30533',\n", " '399990',\n", " '399997',\n", " 'H30537',\n", " 'H30588',\n", " '399804',\n", " '399803',\n", " '399809',\n", " '399998',\n", " 'H50069',\n", " '930620',\n", " '399993',\n", " '930641',\n", " '930653',\n", " '930697',\n", " '930701',\n", " '000016',\n", " '000903',\n", " '000904',\n", " '000906',\n", " '000913',\n", " '000018',\n", " 'H11001',\n", " '000922',\n", " '000021',\n", " '000036',\n", " '000038',\n", " '000043',\n", " '000044',\n", " '000928',\n", " '000932',\n", " '000934',\n", " '000048',\n", " '000063',\n", " '000064',\n", " '000065',\n", " '000964',\n", " '000068',\n", " '000069',\n", " '000966',\n", " 'H11017',\n", " '000982',\n", " '000987',\n", " '000989',\n", " '000992',\n", " '000979',\n", " '000806',\n", " '000814',\n", " '000821',\n", " '000828',\n", " '399802',\n", " 'H00140',\n", " 'H30035',\n", " 'H30124',\n", " '399986',\n", " '931009',\n", " '931160',\n", " 'H30257',\n", " 'H30263',\n", " '399983',\n", " 'H30269',\n", " '399971',\n", " 'H30318',\n", " 'H11018',\n", " '399814',\n", " 'H30373',\n", " '399996',\n", " '000852',\n", " 'H30531',\n", " 'H30535',\n", " '399807',\n", " '399991',\n", " '399994',\n", " '399995',\n", " '930606',\n", " '399707',\n", " '399992',\n", " '930648',\n", " '930651',\n", " '930652',\n", " '930703',\n", " '930713',\n", " '399811',\n", " '930719',\n", " '930720',\n", " '930721',\n", " '930723',\n", " '930726',\n", " '930734',\n", " '930729',\n", " '930743',\n", " '950090',\n", " '930780',\n", " '930782',\n", " '930784',\n", " '930790',\n", " '930791',\n", " '930792',\n", " '930794',\n", " '930820',\n", " '950096',\n", " '930836',\n", " '930838',\n", " '930839',\n", " '930846',\n", " '930865',\n", " '930851',\n", " '930874',\n", " '930875',\n", " '930902',\n", " '950105',\n", " '950109',\n", " '930914',\n", " '930916',\n", " '930917',\n", " '000171',\n", " '950113',\n", " '930949',\n", " '930954',\n", " '930955',\n", " '930997',\n", " '930999',\n", " '931000',\n", " '931018',\n", " '931024',\n", " '931033',\n", " '931052',\n", " '931062',\n", " '931066',\n", " '931069',\n", " '931067',\n", " '000860',\n", " '930738',\n", " '931071',\n", " '930939',\n", " '931068',\n", " '930758',\n", " '930740',\n", " '931127',\n", " '931136',\n", " '931078',\n", " '950045',\n", " '931134',\n", " '931142',\n", " '931087',\n", " '931139',\n", " '931140',\n", " '931141',\n", " '931151',\n", " '931152',\n", " '950041',\n", " '950047',\n", " '931161',\n", " '931162',\n", " '931079',\n", " '931157',\n", " '931165',\n", " '931166',\n", " '931167',\n", " '931163',\n", " '000859',\n", " '000861',\n", " '931159',\n", " '931186',\n", " '931144',\n", " '931187',\n", " '931175',\n", " '931172',\n", " '931268',\n", " '931373',\n", " '931357',\n", " '931306',\n", " '931381',\n", " '931380',\n", " '931372',\n", " '931406',\n", " '000688']" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "code_list" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "etf_doc = mongo_db['fund']['etf_quanzhong']" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "etf_list=[]\n", "for item in etf_doc.find({},{'_id':0}):\n", " if item['ETF代码'] in code_list:\n", " etf_list.append(item)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "248" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(etf_list)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'ETF代码': '000012',\n", " 'ETF名称': '国债指数',\n", " '权重': [{'代码': '019639', '名称': '20特国04', '行业': None, '权重': 2.39},\n", " {'代码': '019637', '名称': '20特国03', '行业': None, '权重': 2.36},\n", " {'代码': '019632', '名称': '20国债06', '行业': None, '权重': 2.29},\n", " {'代码': '019634', '名称': '20国债08', '行业': None, '权重': 2.27},\n", " {'代码': '019631', '名称': '20国债05', '行业': None, '权重': 2.16},\n", " {'代码': '019641', '名称': '20国债11', '行业': None, '权重': 2.0},\n", " {'代码': '019614', '名称': '19国债04', '行业': None, '权重': 1.97},\n", " {'代码': '019643', '名称': '20国债13', '行业': None, '权重': 1.97},\n", " {'代码': '019617', '名称': '19国债07', '行业': None, '权重': 1.93},\n", " {'代码': '019616', '名称': '19国债06', '行业': None, '权重': 1.89}]}" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "etf_list[0]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "300金融 000914\n", "####################\n", "上证医药 000037\n", "####################\n", "上证金融 000038\n", "####################\n", "上证周期 000063\n", "####################\n", "细分医药 000814\n", "####################\n", "5年国债 H00140\n", "####################\n", "800医药 000841\n", "####################\n", "800有色 H30031\n", "####################\n", "'权重'\n", "{'ETF代码': 'H30359', 'ETF名称': '转型成长', '权重': []}\n", "中证安全 H30372\n", "####################\n", "'权重'\n", "{'ETF代码': 'H30373', 'ETF名称': '百发100', '权重': []}\n", "中国互联网50 H30533\n", "####################\n", "中证白酒 399997\n", "####################\n", "'权重'\n", "{'ETF代码': 'H30537', 'ETF名称': '淘金100', '权重': []}\n", "港股通 H50069\n", "####################\n", "CSSW证券 399707\n", "####################\n", "300医药 000913\n", "####################\n", "180金融 000018\n", "####################\n", "上证央企 000042\n", "####################\n", "中证能源 000928\n", "####################\n", "责任指数 000048\n", "####################\n", "非周期 000064\n", "####################\n", "细分食品 000815\n", "####################\n", "800地产 399965\n", "####################\n", "300非银 H30035\n", "####################\n", "证券公司 399975\n", "####################\n", "中证银行 399986\n", "####################\n", "建筑材料 931009\n", "####################\n", "汽车指数 931008\n", "####################\n", "高铁产业 399807\n", "####################\n", "保险主题 399809\n", "####################\n", "家用电器 930697\n", "####################\n", "'权重'\n", "{'ETF代码': '930734', 'ETF名称': '360互联+', '权重': []}\n", "'权重'\n", "{'ETF代码': '930729', 'ETF名称': '银智100', '权重': []}\n", "上证证券 950105\n", "####################\n", "中证10年国债 930916\n", "####################\n", "中证5-10年国债活跃券 931018\n", "####################\n", "HKC非银 931024\n", "####################\n", "四川国改 930738\n", "####################\n", "消费龙头 931068\n", "####################\n", "CS消费50 931139\n", "####################\n" ] } ], "source": [ "for item in etf_list:\n", " qz=item['权重']\n", " df =pd.DataFrame(qz)\n", " try:\n", " df=df.sort_values(by='权重',ascending=False)\n", " if df.iloc[0]['权重']>15:\n", " print(item['ETF名称'],item['ETF代码'])\n", " print('#'*20)\n", " except Exception as e:\n", " print(e)\n", " print(item)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/Untitled1.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "import pandas as pd\n", "sys.path.append('..')\n", "from configure.settings import DBSelector\n", "db = DBSelector()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "engine = db.get_engine('db_stock','qq')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "df = pd.read_sql('tb_bond_jisilu',con=engine)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
可转债代码可转债名称可转债价格正股名称正股代码正股现价正股涨跌幅最新转股价溢价率可转债涨幅...下修提示下调次数转债剩余占总市值比剩余规模发行规模股东配售率发出强赎公告强赎日期担保更新日期
0127029中钢转债169.593中钢国际00092811.02-1.785.89-9.36-0.91...06.99.6009.60020.710XNone2021-05-26 15:03
1113541荣晟转债132.370荣晟环保60316514.808.9010.84-3.055.70...16.22.3523.30024.502XNone股份质押和保证2021-05-26 15:03
2128085鸿达转债107.240鸿达兴业0020024.319.673.92-2.465.92...08.811.06724.27026.280XNone无担保2021-05-26 15:03
3113527维格转债199.000锦泓集团60351819.99-2.119.85-1.94-3.38...18.74.7757.4604.910XNone无担保2021-05-26 15:03
4113559永创转债141.120永创智能60390114.730.0710.32-1.130.08...06.54.1435.12057.120XNone股份质押和保证2021-05-26 15:03
\n", "

5 rows × 28 columns

\n", "
" ], "text/plain": [ " 可转债代码 可转债名称 可转债价格 正股名称 正股代码 正股现价 正股涨跌幅 最新转股价 溢价率 可转债涨幅 ... \\\n", "0 127029 中钢转债 169.593 中钢国际 000928 11.02 -1.78 5.89 -9.36 -0.91 ... \n", "1 113541 荣晟转债 132.370 荣晟环保 603165 14.80 8.90 10.84 -3.05 5.70 ... \n", "2 128085 鸿达转债 107.240 鸿达兴业 002002 4.31 9.67 3.92 -2.46 5.92 ... \n", "3 113527 维格转债 199.000 锦泓集团 603518 19.99 -2.11 9.85 -1.94 -3.38 ... \n", "4 113559 永创转债 141.120 永创智能 603901 14.73 0.07 10.32 -1.13 0.08 ... \n", "\n", " 下修提示 下调次数 转债剩余占总市值比 剩余规模 发行规模 股东配售率 发出强赎公告 强赎日期 担保 \\\n", "0 0 6.9 9.600 9.600 20.710 X None 无 \n", "1 1 6.2 2.352 3.300 24.502 X None 股份质押和保证 \n", "2 0 8.8 11.067 24.270 26.280 X None 无担保 \n", "3 1 8.7 4.775 7.460 4.910 X None 无担保 \n", "4 0 6.5 4.143 5.120 57.120 X None 股份质押和保证 \n", "\n", " 更新日期 \n", "0 2021-05-26 15:03 \n", "1 2021-05-26 15:03 \n", "2 2021-05-26 15:03 \n", "3 2021-05-26 15:03 \n", "4 2021-05-26 15:03 \n", "\n", "[5 rows x 28 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df2=pd.read_excel(r'D:\\Download\\roe_pe.xlsx')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0bondnameperoezg_code
00110031航信转债13.57307.503275600271
11110033国贸转债5.02216.168038600755
22110034九州转债9.75414.559387600998
33110038济川转债13.648719.987800600566
44110041蒙电转债18.42474.442312600863
\n", "
" ], "text/plain": [ " Unnamed: 0 bond name pe roe zg_code\n", "0 0 110031 航信转债 13.5730 7.503275 600271\n", "1 1 110033 国贸转债 5.0221 6.168038 600755\n", "2 2 110034 九州转债 9.7541 4.559387 600998\n", "3 3 110038 济川转债 13.6487 19.987800 600566\n", "4 4 110041 蒙电转债 18.4247 4.442312 600863" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.head()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "df3=pd.merge(df,df2,left_on='可转债代码',right_on='bond')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "df2['bond']=df2['bond'].astype(str)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
可转债代码可转债名称可转债价格正股名称正股代码正股现价正股涨跌幅最新转股价溢价率可转债涨幅...发出强赎公告强赎日期担保更新日期Unnamed: 0bondnameperoezg_code
0127029中钢转债169.593中钢国际00092811.02-1.785.89-9.36-0.91...XNone2021-05-26 15:03260127029中钢转债19.69736.024312928
1113541荣晟转债132.370荣晟环保60316514.808.9010.84-3.055.70...XNone股份质押和保证2021-05-26 15:0381113541荣晟转债13.803611.290425603165
2128085鸿达转债107.240鸿达兴业0020024.319.673.92-2.465.92...XNone无担保2021-05-26 15:03313128085鸿达转债12.80376.9404872002
3113527维格转债199.000锦泓集团60351819.99-2.119.85-1.94-3.38...XNone无担保2021-05-26 15:0373113527维格转债-10.73004.044400603518
4113559永创转债141.120永创智能60390114.730.0710.32-1.130.08...XNone股份质押和保证2021-05-26 15:0389113559永创转债31.56104.627650603901
\n", "

5 rows × 34 columns

\n", "
" ], "text/plain": [ " 可转债代码 可转债名称 可转债价格 正股名称 正股代码 正股现价 正股涨跌幅 最新转股价 溢价率 可转债涨幅 ... \\\n", "0 127029 中钢转债 169.593 中钢国际 000928 11.02 -1.78 5.89 -9.36 -0.91 ... \n", "1 113541 荣晟转债 132.370 荣晟环保 603165 14.80 8.90 10.84 -3.05 5.70 ... \n", "2 128085 鸿达转债 107.240 鸿达兴业 002002 4.31 9.67 3.92 -2.46 5.92 ... \n", "3 113527 维格转债 199.000 锦泓集团 603518 19.99 -2.11 9.85 -1.94 -3.38 ... \n", "4 113559 永创转债 141.120 永创智能 603901 14.73 0.07 10.32 -1.13 0.08 ... \n", "\n", " 发出强赎公告 强赎日期 担保 更新日期 Unnamed: 0 bond name pe \\\n", "0 X None 无 2021-05-26 15:03 260 127029 中钢转债 19.6973 \n", "1 X None 股份质押和保证 2021-05-26 15:03 81 113541 荣晟转债 13.8036 \n", "2 X None 无担保 2021-05-26 15:03 313 128085 鸿达转债 12.8037 \n", "3 X None 无担保 2021-05-26 15:03 73 113527 维格转债 -10.7300 \n", "4 X None 股份质押和保证 2021-05-26 15:03 89 113559 永创转债 31.5610 \n", "\n", " roe zg_code \n", "0 6.024312 928 \n", "1 11.290425 603165 \n", "2 6.940487 2002 \n", "3 4.044400 603518 \n", "4 4.627650 603901 \n", "\n", "[5 rows x 34 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.head()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "df_bond = df3[['可转债代码','可转债名称','正股名称','正股代码','溢价率','可转债价格','pe','roe','担保']]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
可转债代码可转债名称正股名称正股代码溢价率peroe担保
0127029中钢转债中钢国际000928-9.3619.69736.024312
1113541荣晟转债荣晟环保603165-3.0513.803611.290425股份质押和保证
2128085鸿达转债鸿达兴业002002-2.4612.80376.940487无担保
3113527维格转债锦泓集团603518-1.94-10.73004.044400无担保
4113559永创转债永创智能603901-1.1331.56104.627650股份质押和保证
\n", "
" ], "text/plain": [ " 可转债代码 可转债名称 正股名称 正股代码 溢价率 pe roe 担保\n", "0 127029 中钢转债 中钢国际 000928 -9.36 19.6973 6.024312 无\n", "1 113541 荣晟转债 荣晟环保 603165 -3.05 13.8036 11.290425 股份质押和保证\n", "2 128085 鸿达转债 鸿达兴业 002002 -2.46 12.8037 6.940487 无担保\n", "3 113527 维格转债 锦泓集团 603518 -1.94 -10.7300 4.044400 无担保\n", "4 113559 永创转债 永创智能 603901 -1.13 31.5610 4.627650 股份质押和保证" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_bond.head()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":2: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " df_bond['pe']=df_bond['pe'].astype(np.float64)\n", ":3: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " df_bond['roe']=df_bond['roe'].astype(np.float64)\n" ] } ], "source": [ "import numpy as np\n", "df_bond['pe']=df_bond['pe'].astype(np.float64)\n", "df_bond['roe']=df_bond['roe'].astype(np.float64)\n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
可转债代码可转债名称正股名称正股代码溢价率可转债价格peroe担保
244110038济川转债济川药业60056631.48106.20013.648719.987800无担保
44127023华菱转2华菱钢铁0009324.06143.0005.723019.917738无担保
103110045海澜转债海澜之家60039811.49109.51013.504918.056487无担保
298123039开润转债开润股份30057745.13107.50156.453617.951825无担保
166127017万青转债万年青00078919.00118.1607.274317.575463无担保
..............................
359128041盛路转债盛路通信002446238.18291.58224.7298-0.544175无担保
319128023亚太转债亚太股份00228453.58104.26781.7978-0.567812无担保
279128036金农转债金新农00254840.02120.90749.6904-2.104125无担保
268128015久其转债久其软件00227938.45103.49033.5197-8.805338无担保
358128062亚药转债亚太药业002370207.8178.80075.8917-34.779625无担保
\n", "

362 rows × 9 columns

\n", "
" ], "text/plain": [ " 可转债代码 可转债名称 正股名称 正股代码 溢价率 可转债价格 pe roe 担保\n", "244 110038 济川转债 济川药业 600566 31.48 106.200 13.6487 19.987800 无担保\n", "44 127023 华菱转2 华菱钢铁 000932 4.06 143.000 5.7230 19.917738 无担保\n", "103 110045 海澜转债 海澜之家 600398 11.49 109.510 13.5049 18.056487 无担保\n", "298 123039 开润转债 开润股份 300577 45.13 107.501 56.4536 17.951825 无担保\n", "166 127017 万青转债 万年青 000789 19.00 118.160 7.2743 17.575463 无担保\n", ".. ... ... ... ... ... ... ... ... ...\n", "359 128041 盛路转债 盛路通信 002446 238.18 291.582 24.7298 -0.544175 无担保\n", "319 128023 亚太转债 亚太股份 002284 53.58 104.267 81.7978 -0.567812 无担保\n", "279 128036 金农转债 金新农 002548 40.02 120.907 49.6904 -2.104125 无担保\n", "268 128015 久其转债 久其软件 002279 38.45 103.490 33.5197 -8.805338 无担保\n", "358 128062 亚药转债 亚太药业 002370 207.81 78.800 75.8917 -34.779625 无担保\n", "\n", "[362 rows x 9 columns]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_bond.sort_values(by='roe',ascending=False)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "19.9878" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2['roe'].max()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "df_bond.to_excel('bond_roe.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: analysis/apply_people_count.ipynb ================================================ { "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3-final" }, "orig_nbformat": 2, "kernelspec": { "name": "python3", "display_name": "Python 3", "language": "python" } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "df = pd.read_excel('港股打新人数.xls')" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 上市日期 申购人数\n", "0 2015-01-09 1668\n", "1 2015-01-13 704\n", "2 2015-01-14 3338\n", "3 2015-01-15 3662\n", "4 2015-01-15 1618" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
上市日期申购人数
02015-01-091668
12015-01-13704
22015-01-143338
32015-01-153662
42015-01-151618
\n
" }, "metadata": {}, "execution_count": 29 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "df2 = pd.DataFrame(df.values.T,)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 0 1 2 \\\n", "0 2015-01-09 00:00:00 2015-01-13 00:00:00 2015-01-14 00:00:00 \n", "1 1668 704 3338 \n", "\n", " 3 4 5 \\\n", "0 2015-01-15 00:00:00 2015-01-15 00:00:00 2015-01-15 00:00:00 \n", "1 3662 1618 784 \n", "\n", " 6 7 8 \\\n", "0 2015-01-16 00:00:00 2015-01-30 00:00:00 2015-02-13 00:00:00 \n", "1 1196 1226 422 \n", "\n", " 9 ... 833 834 \\\n", "0 2015-03-11 00:00:00 ... 2021-01-15 00:00:00 2021-01-15 00:00:00 \n", "1 3505 ... 35479 26091 \n", "\n", " 835 836 837 \\\n", "0 2021-01-15 00:00:00 2021-01-18 00:00:00 2021-01-19 00:00:00 \n", "1 313721 37522 92145 \n", "\n", " 838 839 840 \\\n", "0 2021-01-26 00:00:00 2021-02-04 00:00:00 2021-02-05 00:00:00 \n", "1 331495 567475 87981 \n", "\n", " 841 842 \n", "0 2021-02-05 00:00:00 2021-02-08 00:00:00 \n", "1 1422977 264120 \n", "\n", "[2 rows x 843 columns]" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
0123456789...833834835836837838839840841842
02015-01-09 00:00:002015-01-13 00:00:002015-01-14 00:00:002015-01-15 00:00:002015-01-15 00:00:002015-01-15 00:00:002015-01-16 00:00:002015-01-30 00:00:002015-02-13 00:00:002015-03-11 00:00:00...2021-01-15 00:00:002021-01-15 00:00:002021-01-15 00:00:002021-01-18 00:00:002021-01-19 00:00:002021-01-26 00:00:002021-02-04 00:00:002021-02-05 00:00:002021-02-05 00:00:002021-02-08 00:00:00
11668704333836621618784119612264223505...35479260913137213752292145331495567475879811422977264120
\n

2 rows × 843 columns

\n
" }, "metadata": {}, "execution_count": 11 } ], "source": [ "df2.head()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\nRangeIndex: 843 entries, 0 to 842\nData columns (total 2 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 上市日期 843 non-null datetime64[ns]\n 1 申购人数 843 non-null int64 \ndtypes: datetime64[ns](1), int64(1)\nmemory usage: 13.3 KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "output_type": "error", "ename": "ValueError", "evalue": "column index (256) not an int in range(256)", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdf2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_excel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'people3.xls'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mindex\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mheader\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36mto_excel\u001b[1;34m(self, excel_writer, sheet_name, na_rep, float_format, columns, header, index, index_label, startrow, startcol, engine, merge_cells, encoding, inf_rep, verbose, freeze_panes)\u001b[0m\n\u001b[0;32m 2173\u001b[0m \u001b[0minf_rep\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0minf_rep\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2174\u001b[0m )\n\u001b[1;32m-> 2175\u001b[1;33m formatter.write(\n\u001b[0m\u001b[0;32m 2176\u001b[0m \u001b[0mexcel_writer\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2177\u001b[0m \u001b[0msheet_name\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msheet_name\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\pandas\\io\\formats\\excel.py\u001b[0m in \u001b[0;36mwrite\u001b[1;34m(self, writer, sheet_name, startrow, startcol, freeze_panes, engine)\u001b[0m\n\u001b[0;32m 728\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 729\u001b[0m \u001b[0mformatted_cells\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_formatted_cells\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 730\u001b[1;33m writer.write_cells(\n\u001b[0m\u001b[0;32m 731\u001b[0m \u001b[0mformatted_cells\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 732\u001b[0m \u001b[0msheet_name\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\pandas\\io\\excel\\_xlwt.py\u001b[0m in \u001b[0;36mwrite_cells\u001b[1;34m(self, cells, sheet_name, startrow, startcol, freeze_panes)\u001b[0m\n\u001b[0;32m 75\u001b[0m )\n\u001b[0;32m 76\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 77\u001b[1;33m \u001b[0mwks\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstartrow\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mcell\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrow\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstartcol\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mcell\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcol\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mval\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstyle\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 78\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 79\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\xlwt\\Worksheet.py\u001b[0m in \u001b[0;36mwrite\u001b[1;34m(self, r, c, label, style)\u001b[0m\n\u001b[0;32m 1086\u001b[0m \u001b[1;33m:\u001b[0m\u001b[1;32mclass\u001b[0m\u001b[1;33m:\u001b[0m\u001b[0;31m`\u001b[0m\u001b[1;33m~\u001b[0m\u001b[0mxlwt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mStyle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mXFStyle\u001b[0m\u001b[0;31m`\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1087\u001b[0m \"\"\"\n\u001b[1;32m-> 1088\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrow\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstyle\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1089\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1090\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mwrite_rich_text\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrich_text_list\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstyle\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mStyle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdefault_style\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\xlwt\\Row.py\u001b[0m in \u001b[0;36mwrite\u001b[1;34m(self, col, label, style)\u001b[0m\n\u001b[0;32m 228\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mwrite\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcol\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstyle\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mStyle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdefault_style\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 229\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__adjust_height\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstyle\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 230\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__adjust_bound_col_idx\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcol\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 231\u001b[0m \u001b[0mstyle_index\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__parent_wb\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_style\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstyle\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 232\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlabel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbasestring\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\xlwt\\Row.py\u001b[0m in \u001b[0;36m__adjust_bound_col_idx\u001b[1;34m(self, *args)\u001b[0m\n\u001b[0;32m 71\u001b[0m \u001b[0miarg\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 72\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m \u001b[1;33m<=\u001b[0m \u001b[0miarg\u001b[0m \u001b[1;33m<=\u001b[0m \u001b[1;36m255\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0marg\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0miarg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 73\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"column index (%r) not an int in range(256)\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 74\u001b[0m \u001b[0msheet\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__parent\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 75\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0miarg\u001b[0m \u001b[1;33m<\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__min_col_idx\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: column index (256) not an int in range(256)" ] } ], "source": [ "df2.to_excel('people3.xls',index=None,header=None)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "import xlsxwriter #导入模块\n", "workbook = xlsxwriter.Workbook('new_excel.xlsx') #新建excel表\n", "worksheet = workbook.add_worksheet('sheet1') #新建sheet(sheet的名称为\"sheet1\")\n", "headings = ['Number','testA','testB'] \n", " #设置表头\n", "data = [\n", " ['2017-9-1','2017-9-2','2017-9-3','2017-9-4','2017-9-5','2017-9-6'],\n", " [10,40,50,20,10,50],\n", " [30,60,70,50,40,30],\n", "] #自己造的数据\n", " \n", "worksheet.write_row('A1',headings)\n", "worksheet.write_column('A2',data[0])\n", "worksheet.write_column('B2',data[1])\n", "worksheet.write_column('C2',data[2]) #将数据插入到表格中\n", " \n", "workbook.close()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "import xlsxwriter #导入模块\n", "workbook = xlsxwriter.Workbook('new_people.xlsx') #新建excel表\n", "worksheet = workbook.add_worksheet('sheet1') #新建sheet(sheet的名称为\"sheet1\")" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 上市日期 申购人数\n", "0 2015-01-09 00:00:00 1668\n", "1 2015-01-13 00:00:00 704" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
上市日期申购人数
02015-01-09 00:00:001668
12015-01-13 00:00:00704
\n
" }, "metadata": {}, "execution_count": 19 } ], "source": [ "df.head(2)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "for index,item in df.iterrows():\n", " date=item['上市日期']\n", " count=item['申购人数']\n", " date=date.replace(' 00:00:00','')\n", " worksheet.write(0,index,date)\n", " worksheet.write(1,index,count)\n", "\n", "workbook.close()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\nRangeIndex: 843 entries, 0 to 842\nData columns (total 2 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 上市日期 843 non-null object\n 1 申购人数 843 non-null int64 \ndtypes: int64(1), object(1)\nmemory usage: 13.3+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "df= df.set_index('上市日期')" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 上市日期 申购人数\n", "0 2015-01-09 1668\n", "1 2015-01-13 704\n", "2 2015-01-14 3338\n", "3 2015-01-15 3662\n", "4 2015-01-15 1618" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
上市日期申购人数
02015-01-091668
12015-01-13704
22015-01-143338
32015-01-153662
42015-01-151618
\n
" }, "metadata": {}, "execution_count": 32 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 申购人数\n", "上市日期 \n", "2015-01-09 1668\n", "2015-01-13 704\n", "2015-01-14 3338\n", "2015-01-15 3662\n", "2015-01-15 1618" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
申购人数
上市日期
2015-01-091668
2015-01-13704
2015-01-143338
2015-01-153662
2015-01-151618
\n
" }, "metadata": {}, "execution_count": 34 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "df_m = df.resample('M').sum()" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 申购人数\n", "上市日期 \n", "2015-01-31 14196\n", "2015-02-28 422\n", "2015-03-31 39179\n", "2015-04-30 142838\n", "2015-05-31 110068" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
申购人数
上市日期
2015-01-3114196
2015-02-28422
2015-03-3139179
2015-04-30142838
2015-05-31110068
\n
" }, "metadata": {}, "execution_count": 40 } ], "source": [ "df_m.head()" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "line=0\n", "for index,item in df_m.iterrows():\n", " # print(index)\n", " # print(type(index))\n", " date=str(index).replace(' 00:00:00','')\n", " date=date[:-3]\n", " count=item['申购人数']\n", " # date=item.index\n", " # print(date)\n", " # print(type(date))\n", " # count=item['申购人数']\n", " # date=date.replace(' 00:00:00','')\n", " worksheet.write(0,line,date)\n", " worksheet.write(1,line,count)\n", " line+=1\n", "\n", "workbook.close()" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 申购人数\n", "上市日期 \n", "2016-02-29 0" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
申购人数
上市日期
2016-02-290
\n
" }, "metadata": {}, "execution_count": 56 } ], "source": [ "df_m[df_m['申购人数']==0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ] } ================================================ FILE: analysis/bond_daily_report.py ================================================ import sys sys.path.append('..') import pandas as pd from configure.settings import DBSelector from configure.util import calendar engine = DBSelector().get_engine('db_jisilu') date_list = calendar('2024-01-01', '2024-12-31') for date in date_list: table = 'tb_jsl_{}'.format(date) df = pd.read_sql(table, engine) trade_amount = df['成交额(万元)'].sum() print(date, round(trade_amount/10000,2),'亿') ================================================ FILE: analysis/closed_fund_analysis.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# 封闭基金净增" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "\n", "import xcsc_tushare as xc \n", "import datetime\n", "import re\n", "import sys\n", "sys.path.append('..')\n", "from configure.settings import config\n", "\n", "xc_server=config['xc_server']\n", "xc_token_pro=config['xc_token_pro']\n", "\n", "\n", "xc.set_token(xc_token_pro)\n", "pro = xc.pro_api(env='prd',server=xc_server)\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "df = pro.fund_basic(market='E',status='L')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ts_codenamemanagementcustodianfund_typefound_datedue_datelist_dateissue_datedelist_date...exp_returnbenchmarkstatusinvest_typetypetrusteepurc_startdateredm_startdatemarketupdate_flag
0159611.SZ电力ETF广发基金中国建设银行股票型20211229None2022010720211220None...None中证全指电力公用事业指数收益率L被动指数型契约型开放式None2022010720220107E1
1560800.SH数字经济ETF鹏扬基金招商银行股票型20211222None2022010720211206None...None中证数字经济主题指数收益率L被动指数型契约型开放式None2022010720220107E1
2562510.SH旅游ETF华夏基金中国银行股票型20211221None2021123020211116None...None中证旅游主题指数收益率L被动指数型契约型开放式None2021123020211230E1
3159758.SZ红利50ETF华夏基金中信银行股票型20211220None2021122820211111None...None中证红利质量指数收益率L被动指数型契约型开放式None2021122820211228E1
4562300.SH碳中和ETF基金银华基金招商银行股票型20211220None2022010520211110None...None中证内地低碳经济主题指数收益率L被动指数型契约型开放式None2022010520220105E1
\n", "

5 rows × 26 columns

\n", "
" ], "text/plain": [ " ts_code name management custodian fund_type found_date due_date \\\n", "0 159611.SZ 电力ETF 广发基金 中国建设银行 股票型 20211229 None \n", "1 560800.SH 数字经济ETF 鹏扬基金 招商银行 股票型 20211222 None \n", "2 562510.SH 旅游ETF 华夏基金 中国银行 股票型 20211221 None \n", "3 159758.SZ 红利50ETF 华夏基金 中信银行 股票型 20211220 None \n", "4 562300.SH 碳中和ETF基金 银华基金 招商银行 股票型 20211220 None \n", "\n", " list_date issue_date delist_date ... exp_return benchmark status \\\n", "0 20220107 20211220 None ... None 中证全指电力公用事业指数收益率 L \n", "1 20220107 20211206 None ... None 中证数字经济主题指数收益率 L \n", "2 20211230 20211116 None ... None 中证旅游主题指数收益率 L \n", "3 20211228 20211111 None ... None 中证红利质量指数收益率 L \n", "4 20220105 20211110 None ... None 中证内地低碳经济主题指数收益率 L \n", "\n", " invest_type type trustee purc_startdate redm_startdate market \\\n", "0 被动指数型 契约型开放式 None 20220107 20220107 E \n", "1 被动指数型 契约型开放式 None 20220107 20220107 E \n", "2 被动指数型 契约型开放式 None 20211230 20211230 E \n", "3 被动指数型 契约型开放式 None 20211228 20211228 E \n", "4 被动指数型 契约型开放式 None 20220105 20220105 E \n", "\n", " update_flag \n", "0 1 \n", "1 1 \n", "2 1 \n", "3 1 \n", "4 1 \n", "\n", "[5 rows x 26 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 1081 entries, 0 to 1080\n", "Data columns (total 26 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 ts_code 1081 non-null object \n", " 1 name 1081 non-null object \n", " 2 management 1081 non-null object \n", " 3 custodian 1081 non-null object \n", " 4 fund_type 1081 non-null object \n", " 5 found_date 1081 non-null object \n", " 6 due_date 8 non-null object \n", " 7 list_date 1081 non-null object \n", " 8 issue_date 1074 non-null object \n", " 9 delist_date 0 non-null object \n", " 10 issue_amount 1066 non-null float64\n", " 11 m_fee 1081 non-null float64\n", " 12 c_fee 1081 non-null float64\n", " 13 duration_year 11 non-null float64\n", " 14 p_value 1081 non-null float64\n", " 15 min_amount 1021 non-null float64\n", " 16 exp_return 0 non-null object \n", " 17 benchmark 1070 non-null object \n", " 18 status 1081 non-null object \n", " 19 invest_type 1070 non-null object \n", " 20 type 1081 non-null object \n", " 21 trustee 0 non-null object \n", " 22 purc_startdate 1008 non-null object \n", " 23 redm_startdate 1008 non-null object \n", " 24 market 1081 non-null object \n", " 25 update_flag 1081 non-null object \n", "dtypes: float64(6), object(20)\n", "memory usage: 219.7+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "f_df = pro.fund_daily(ts_code='160527.SZ', start_date='20200101', end_date='20220105')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ts_codetrade_datepre_closeopenhighlowclosechangepct_chgvolamount
0160527.SZ202201051.0911.0861.0901.0761.081-0.010-0.91661401.57151.630
1160527.SZ202201041.0931.0871.0921.0841.091-0.002-0.18301050.59114.123
2160527.SZ202112311.0911.0881.0931.0881.0930.0020.18331315.00143.221
3160527.SZ202112301.0881.0921.0931.0911.0910.0030.27571453.00158.654
4160527.SZ202112291.0971.0941.0941.0841.088-0.009-0.8204924.00100.847
\n", "
" ], "text/plain": [ " ts_code trade_date pre_close open high low close change \\\n", "0 160527.SZ 20220105 1.091 1.086 1.090 1.076 1.081 -0.010 \n", "1 160527.SZ 20220104 1.093 1.087 1.092 1.084 1.091 -0.002 \n", "2 160527.SZ 20211231 1.091 1.088 1.093 1.088 1.093 0.002 \n", "3 160527.SZ 20211230 1.088 1.092 1.093 1.091 1.091 0.003 \n", "4 160527.SZ 20211229 1.097 1.094 1.094 1.084 1.088 -0.009 \n", "\n", " pct_chg vol amount \n", "0 -0.9166 1401.57 151.630 \n", "1 -0.1830 1050.59 114.123 \n", "2 0.1833 1315.00 143.221 \n", "3 0.2757 1453.00 158.654 \n", "4 -0.8204 924.00 100.847 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f_df.head()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "df_netvalue = pro.fund_nav(ts_code='160527.SZ')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ts_codeann_dateend_dateunit_navaccum_navaccum_divnet_assettotal_netassetadj_navupdate_flag
0160527.SZ20220106202201051.13051.1635NoneNoneNone1.1622260
\n", "
" ], "text/plain": [ " ts_code ann_date end_date unit_nav accum_nav accum_div net_asset \\\n", "0 160527.SZ 20220106 20220105 1.1305 1.1635 None None \n", "\n", " total_netasset adj_nav update_flag \n", "0 None 1.162226 0 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_netvalue.head()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "df2 = pro.fund_nav(ts_code='160527.SZ')" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ts_codeann_dateend_dateunit_navaccum_navaccum_divnet_assettotal_netassetadj_navupdate_flag
396160527.SZ20200418202004171.01461.0146NoneNaNNaN1.01461
397160527.SZ20200411202004101.00721.0072NoneNaNNaN1.00721
398160527.SZ20200404202004031.00151.0015NoneNaNNaN1.00151
399160527.SZ20200328202003270.99960.9996NoneNaNNaN0.99961
400160527.SZ20200321202003201.00001.0000None2.053794e+092.126906e+091.00001
\n", "
" ], "text/plain": [ " ts_code ann_date end_date unit_nav accum_nav accum_div \\\n", "396 160527.SZ 20200418 20200417 1.0146 1.0146 None \n", "397 160527.SZ 20200411 20200410 1.0072 1.0072 None \n", "398 160527.SZ 20200404 20200403 1.0015 1.0015 None \n", "399 160527.SZ 20200328 20200327 0.9996 0.9996 None \n", "400 160527.SZ 20200321 20200320 1.0000 1.0000 None \n", "\n", " net_asset total_netasset adj_nav update_flag \n", "396 NaN NaN 1.0146 1 \n", "397 NaN NaN 1.0072 1 \n", "398 NaN NaN 1.0015 1 \n", "399 NaN NaN 0.9996 1 \n", "400 2.053794e+09 2.126906e+09 1.0000 1 " ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.tail()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ts_codeann_dateend_dateunit_navaccum_navaccum_divnet_assettotal_netassetadj_navupdate_flag
396160527.SZ20200418202004171.01461.0146NoneNaNNaN1.01461
397160527.SZ20200411202004101.00721.0072NoneNaNNaN1.00721
398160527.SZ20200404202004031.00151.0015NoneNaNNaN1.00151
399160527.SZ20200328202003270.99960.9996NoneNaNNaN0.99961
400160527.SZ20200321202003201.00001.0000None2.053794e+092.126906e+091.00001
\n", "
" ], "text/plain": [ " ts_code ann_date end_date unit_nav accum_nav accum_div \\\n", "396 160527.SZ 20200418 20200417 1.0146 1.0146 None \n", "397 160527.SZ 20200411 20200410 1.0072 1.0072 None \n", "398 160527.SZ 20200404 20200403 1.0015 1.0015 None \n", "399 160527.SZ 20200328 20200327 0.9996 0.9996 None \n", "400 160527.SZ 20200321 20200320 1.0000 1.0000 None \n", "\n", " net_asset total_netasset adj_nav update_flag \n", "396 NaN NaN 1.0146 1 \n", "397 NaN NaN 1.0072 1 \n", "398 NaN NaN 1.0015 1 \n", "399 NaN NaN 0.9996 1 \n", "400 2.053794e+09 2.126906e+09 1.0000 1 " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_netvalue.tail()" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')\n", "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "engine = DBSelector().get_engine('db_closed_end_daily')" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "excel_file = '/home/xda/hub/stock/data/closed_end_data.xlsx'" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "df = pd.read_excel(excel_file)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenamepricepercentnetvalue_incrementdaily_diffvolnetvaluetradedateevaluatepreiumrateend_dateremain_yearremain_year_profityear_perium_ratioweek_netvalue_incrementweek_diffstock_percentreport_datecompany
0160143创业LOF1.143-0.0112-0.00510.0061135.361.19172022-01-071.19170.040872022-09-010.650.06297-0.0756-0.0554-0.02020.97482021-09-30南方基金
1160325华夏创业1.127-0.0088-0.00370.0051384.111.18182022-01-071.18180.046372022-07-240.540.08555-0.0795-0.0701-0.00930.90912021-09-30华夏基金
2160526博时优势1.271-0.0047-0.00050.00423.291.32002022-01-071.32000.037122022-06-030.400.09211-0.0165-0.02230.00580.81252021-09-30博时基金
3160527研究优选1.075-0.00280.00050.00338.621.13352022-01-071.13350.051612023-03-201.200.04312-0.0264-0.0165-0.00990.96492021-09-30博时基金
4160529创业博时1.198-0.0058-0.00080.005091.371.26252022-01-071.26250.051092022-09-030.660.07800-0.0564-0.0485-0.00800.87652021-09-30博时基金
\n", "
" ], "text/plain": [ " code name price percent netvalue_increment daily_diff vol \\\n", "0 160143 创业LOF 1.143 -0.0112 -0.0051 0.0061 135.36 \n", "1 160325 华夏创业 1.127 -0.0088 -0.0037 0.0051 384.11 \n", "2 160526 博时优势 1.271 -0.0047 -0.0005 0.0042 3.29 \n", "3 160527 研究优选 1.075 -0.0028 0.0005 0.0033 8.62 \n", "4 160529 创业博时 1.198 -0.0058 -0.0008 0.0050 91.37 \n", "\n", " netvalue tradedate evaluate preiumrate end_date remain_year \\\n", "0 1.1917 2022-01-07 1.1917 0.04087 2022-09-01 0.65 \n", "1 1.1818 2022-01-07 1.1818 0.04637 2022-07-24 0.54 \n", "2 1.3200 2022-01-07 1.3200 0.03712 2022-06-03 0.40 \n", "3 1.1335 2022-01-07 1.1335 0.05161 2023-03-20 1.20 \n", "4 1.2625 2022-01-07 1.2625 0.05109 2022-09-03 0.66 \n", "\n", " remain_year_profit year_perium_ratio week_netvalue_increment week_diff \\\n", "0 0.06297 -0.0756 -0.0554 -0.0202 \n", "1 0.08555 -0.0795 -0.0701 -0.0093 \n", "2 0.09211 -0.0165 -0.0223 0.0058 \n", "3 0.04312 -0.0264 -0.0165 -0.0099 \n", "4 0.07800 -0.0564 -0.0485 -0.0080 \n", "\n", " stock_percent report_date company \n", "0 0.9748 2021-09-30 南方基金 \n", "1 0.9091 2021-09-30 华夏基金 \n", "2 0.8125 2021-09-30 博时基金 \n", "3 0.9649 2021-09-30 博时基金 \n", "4 0.8765 2021-09-30 博时基金 " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "df['code']=df['code'].map(lambda x:str(x))" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "codes = df['code'].values" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "for code in codes:\n", " for _ in range(5):\n", " if code.startswith('1'):\n", " code=code+'.SZ'\n", " else:\n", " code=code+'.SH'\n", " try:\n", " fund_netvalue = pro.fund_nav(ts_code=code)\n", " fund_netvalue.to_sql(code,con=engine,if_exists='replace')\n", " except Exception as e:\n", " print(e)\n", " else:\n", " break" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "9aa71a1095d6a6dd446f2b486146a60837bd82849c2fc6b4bf786ffe99bd2ba1" }, "kernelspec": { "display_name": "Python 3.9.5 64-bit ('3.9': conda)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/closed_fund_backtest.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# 封基回测" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "9aa71a1095d6a6dd446f2b486146a60837bd82849c2fc6b4bf786ffe99bd2ba1" }, "kernelspec": { "display_name": "Python 3.9.5 64-bit ('3.9': conda)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/column_between_hours.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import tushare as ts\n", "api = ts.get_apis()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = ts.tick('002930',conn=api,date='2018-04-18')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['datetime']=pd.to_datetime(df['datetime'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = df.set_index(df['datetime'],drop=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['2018-04-18 09':'2018-04-18 10']['vol'].sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total = df['vol'].sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "night = df['2018-04-18 09']['vol'].sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "float(night)/total*100" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ten = df['2018-04-18 10']['vol'].sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "float(ten)/total*100" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "eleven = df['2018-04-18 11']['vol'].sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "float(eleven)/total*100" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "thirteen = df['2018-04-18 13']['vol'].sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "float(thirteen)/total*100" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total_share =6083*10000" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "turnover =float(total)/total_share*100*100" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "turnover" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "float(night)/total_share*100*100" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df= ts.broker_tops()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "jg_df = ts.inst_tops()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.sort_values(by='count',ascending=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/daily_zt_report.py ================================================ # -*-coding=utf-8-*- ''' __author__ = 'Rocky' http://30daydo.com Email: weigesysu@qq.com 每日涨停报告 ''' import datetime import fire import pandas as pd import sys sys.path.append('..') from configure.settings import DBSelector from configure.util import send_from_aliyun_ssl from filterstock import FilterStock def get_zt_info(obj, now): ''' 数据库获取新股的涨停信息 ''' today_str = now.strftime('%Y%m%d') tb_name = today_str + 'zdt' end = str(now.year) + '-' + str(now.month).zfill(2) start = '2015-01' df = obj.get_new_stock(start, end) code_list = df['code'].values engine = DBSelector().get_engine('db_zdt') zt_df = pd.read_sql(tb_name, engine, index_col='index') zt_df['涨停强度'] = zt_df['涨停强度'].map(lambda x: round(x, 0)) ret_df = zt_df[zt_df['代码'].isin(code_list)] s = "" if not ret_df.empty: s = ret_df[['代码', '名称', '涨停强度', '打开次数', '第一次涨停时间', '最后一次涨停时间']].to_string() save_local = False # 保存在本地 if save_local: excel_name = today_str + '_次新.xls' ret_df.to_excel(excel_name, encoding='gbk') # # tb_name_save = today_str + '_cx' # ret_df.to_sql(tb_name_save, engine) return s def send_zt_report(today=None): if today is None: now = datetime.datetime.now().strftime("%Y%m%d") else: now = datetime.datetime.strptime(str(today), '%Y%m%d') obj = FilterStock() info = get_zt_info(obj, now) send_from_aliyun_ssl(str(today) + '次新涨停', info) if __name__ == '__main__': fire.Fire(send_zt_report) ================================================ FILE: analysis/data_sync_uqer.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')\n", "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "db = DBSelector().mongo('qq')" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "doc = db['db_uqer']['bond_daily']" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "path='../data/优矿最后一天拔下来/dialy_lohc.csv'" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "df = pd.read_csv(path)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "336358" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(df)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 336358 entries, 0 to 336357\n", "Data columns (total 20 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Unnamed: 0 336358 non-null int64 \n", " 1 secID 336358 non-null object \n", " 2 ticker 336358 non-null int64 \n", " 3 secShortName 336358 non-null object \n", " 4 exchangeCD 336358 non-null object \n", " 5 tradeDate 336358 non-null object \n", " 6 preClosePrice 336358 non-null float64\n", " 7 openPrice 336358 non-null float64\n", " 8 highestPrice 336358 non-null float64\n", " 9 lowestPrice 336358 non-null float64\n", " 10 closePrice 336358 non-null float64\n", " 11 turnoverVol 336358 non-null int64 \n", " 12 turnoverValue 336358 non-null float64\n", " 13 dealAmount 336358 non-null int64 \n", " 14 accrInterest 336310 non-null float64\n", " 15 YTM 57683 non-null float64\n", " 16 VWAP 336358 non-null float64\n", " 17 grossClosePrice 336358 non-null float64\n", " 18 netClosePrice 336358 non-null float64\n", " 19 isOpen 336358 non-null int64 \n", "dtypes: float64(11), int64(5), object(4)\n", "memory usage: 51.3+ MB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "del df['Unnamed: 0']" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "json_data = df.to_json(orient='records',force_ascii=False)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "import json" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "js=json.loads(json_data)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'secID': '110030.XSHG',\n", " 'ticker': 110030,\n", " 'secShortName': '格力转债',\n", " 'exchangeCD': 'XSHG',\n", " 'tradeDate': '2017-01-03',\n", " 'preClosePrice': 113.83,\n", " 'openPrice': 113.8,\n", " 'highestPrice': 114.15,\n", " 'lowestPrice': 113.8,\n", " 'closePrice': 114.04,\n", " 'turnoverVol': 3650,\n", " 'turnoverValue': 4163418.0,\n", " 'dealAmount': 0,\n", " 'accrInterest': 0.027397,\n", " 'YTM': None,\n", " 'VWAP': 114.066,\n", " 'grossClosePrice': 114.04,\n", " 'netClosePrice': 114.012603,\n", " 'isOpen': 1}" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "js[0]" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "batch=5000 # 每次1000\n", "count = int(len(js)/batch+1)\n", "\n", "for i in range(count):\n", "\n", " doc.insert_many(js[batch*i:batch*(i+1)])" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "336358" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(js)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "906064a35c7980fda78a8b97014bc5560dca56efd2e047844bdf4fb8a9b9c8a3" }, "kernelspec": { "display_name": "Python 3.9.7 ('cpy')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/deal_company_analysis.ipynb ================================================ { "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3-final" }, "orig_nbformat": 2, "kernelspec": { "name": "python3", "display_name": "Python 3.8.3 64-bit (conda)", "metadata": { "interpreter": { "hash": "513dc2e41d739bb2c947903f3c0bbf636d03aa53ab50e61c694a27481c81805e" } } } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [ "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'c:\\\\git\\\\stock\\\\notebook'" ] }, "metadata": {}, "execution_count": 57 } ], "source": [ "import os\n", "os.getcwd()" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [], "source": [ "db = DBSelector().mongo()" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "doc = db['db_parker']['deal_company']" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [], "source": [ "result=[]\n", "for item in doc.find({},{'com_des':0,'closure_type':0}):\n", " del item['_id']\n", " result.append(item)" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "23200" ] }, "metadata": {}, "execution_count": 117 } ], "source": [ "len(result)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "error", "ename": "TypeError", "evalue": "unhashable type: 'dict'", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mno_dup_result\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mset\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: unhashable type: 'dict'" ] } ], "source": [ "no_dup_result = list(set(result))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'com_name': '米聊',\n", " 'born': '2011-01-01',\n", " 'cat_name': '社交网络',\n", " 'closure_type': [{'id': 4, 'name': '业务调整', 'p_id': 21}],\n", " 'close': '2021-02-19',\n", " 'com_prov': '北京',\n", " 'live_time': 3702,\n", " 'total_money': None,\n", " 'com_des': '米聊是一个手机聊天通信工具及社交网络,小米公司旗下产品。'}" ] }, "metadata": {}, "execution_count": 9 } ], "source": [ "result[0]" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " com_name born cat_name close com_prov live_time \\\n", "0 米聊 2011-01-01 社交网络 2021-02-19 北京 3702 \n", "1 虾米音乐 2007-10-01 文娱传媒 2021-02-05 浙江 4876 \n", "2 悟空问答 2017-01-01 文娱传媒 2021-02-03 北京 1494 \n", "3 盼达用车 2015-05-01 汽车交通 2021-02-01 重庆 2103 \n", "4 TT直播健身-VIPFIT 2018-07-01 体育运动 2021-01-19 北京 933 \n", "\n", " total_money \n", "0 NaN \n", "1 11600.0 \n", "2 NaN \n", "3 1575.0 \n", "4 2300.0 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
com_nameborncat_nameclosecom_provlive_timetotal_money
0米聊2011-01-01社交网络2021-02-19北京3702NaN
1虾米音乐2007-10-01文娱传媒2021-02-05浙江487611600.0
2悟空问答2017-01-01文娱传媒2021-02-03北京1494NaN
3盼达用车2015-05-01汽车交通2021-02-01重庆21031575.0
4TT直播健身-VIPFIT2018-07-01体育运动2021-01-19北京9332300.0
\n
" }, "metadata": {}, "execution_count": 135 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [], "source": [ "df.drop_duplicates(['com_name','born'],inplace=True)" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "14510" ] }, "metadata": {}, "execution_count": 120 } ], "source": [ "len(df)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " com_name born cat_name \\\n", "0 米聊 2011-01-01 社交网络 \n", "1 虾米音乐 2007-10-01 文娱传媒 \n", "2 悟空问答 2017-01-01 文娱传媒 \n", "3 盼达用车 2015-05-01 汽车交通 \n", "4 TT直播健身-VIPFIT 2018-07-01 体育运动 \n", "\n", " closure_type close com_prov \\\n", "0 [{'id': 4, 'name': '业务调整', 'p_id': 21}] 2021-02-19 北京 \n", "1 [{'id': 4, 'name': '业务调整', 'p_id': 21}, {'id':... 2021-02-05 浙江 \n", "2 [{'id': 4, 'name': '业务调整', 'p_id': 21}] 2021-02-03 北京 \n", "3 [{'id': 11, 'name': '烧钱', 'p_id': 24}, {'id': ... 2021-02-01 重庆 \n", "4 [{'id': 12, 'name': '现金流断裂', 'p_id': 24}, {'id... 2021-01-19 北京 \n", "\n", " live_time total_money com_des \n", "0 3702 NaN 米聊是一个手机聊天通信工具及社交网络,小米公司旗下产品。 \n", "1 4876 11600.0 虾米音乐是一款提供各类音乐的音频资源聚合平台,用户可以在平台上查找、收听自己喜欢的音乐内容,... \n", "2 1494 NaN 悟空问答是今日头条旗下的问答产品,明星专家为你答疑解惑,个性化推荐热点讨论,打发时间利器,北... \n", "3 2103 1575.0 盼达用车是一家新能源汽车共享租赁平台,专注于提供分时租赁、专车租赁、企事业机构团体长租等汽车... \n", "4 933 2300.0 TT直播健身(VIPFIT)是一个在线真人健身私教服务平台,根据个人身体基础和环境为用户量身... " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
com_nameborncat_nameclosure_typeclosecom_provlive_timetotal_moneycom_des
0米聊2011-01-01社交网络[{'id': 4, 'name': '业务调整', 'p_id': 21}]2021-02-19北京3702NaN米聊是一个手机聊天通信工具及社交网络,小米公司旗下产品。
1虾米音乐2007-10-01文娱传媒[{'id': 4, 'name': '业务调整', 'p_id': 21}, {'id':...2021-02-05浙江487611600.0虾米音乐是一款提供各类音乐的音频资源聚合平台,用户可以在平台上查找、收听自己喜欢的音乐内容,...
2悟空问答2017-01-01文娱传媒[{'id': 4, 'name': '业务调整', 'p_id': 21}]2021-02-03北京1494NaN悟空问答是今日头条旗下的问答产品,明星专家为你答疑解惑,个性化推荐热点讨论,打发时间利器,北...
3盼达用车2015-05-01汽车交通[{'id': 11, 'name': '烧钱', 'p_id': 24}, {'id': ...2021-02-01重庆21031575.0盼达用车是一家新能源汽车共享租赁平台,专注于提供分时租赁、专车租赁、企事业机构团体长租等汽车...
4TT直播健身-VIPFIT2018-07-01体育运动[{'id': 12, 'name': '现金流断裂', 'p_id': 24}, {'id...2021-01-19北京9332300.0TT直播健身(VIPFIT)是一个在线真人健身私教服务平台,根据个人身体基础和环境为用户量身...
\n
" }, "metadata": {}, "execution_count": 24 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "企业服务 76\n体育运动 4\n先进制造 5\n农业 6\n区块链 14\n医疗健康 18\n工具软件 21\n广告营销 16\n房产服务 9\n教育 37\n文娱传媒 43\n旅游 20\n智能硬件 11\n本地生活 34\n汽车交通 25\n游戏 29\n物流 4\n生产制造 2\n电子商务 71\n社交网络 17\n金融 68\n" ] } ], "source": [ "for cate,_ in df.groupby('cat_name'):\n", " print(cate,len(_))" ] }, { "cell_type": "code", "execution_count": 161, "metadata": {}, "outputs": [], "source": [ "def close_year(x):\n", " return int(x[:4])\n", " # return x[:-3]" ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [], "source": [ "df['close_year']=df['close'].apply(close_year)" ] }, { "cell_type": "code", "execution_count": 152, "metadata": {}, "outputs": [], "source": [ "df['born_year']=df['born'].apply(close_year)" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " com_name born cat_name close com_prov live_time \\\n", "0 米聊 2011-01-01 社交网络 2021-02-19 北京 3702 \n", "1 虾米音乐 2007-10-01 文娱传媒 2021-02-05 浙江 4876 \n", "2 悟空问答 2017-01-01 文娱传媒 2021-02-03 北京 1494 \n", "3 盼达用车 2015-05-01 汽车交通 2021-02-01 重庆 2103 \n", "4 TT直播健身-VIPFIT 2018-07-01 体育运动 2021-01-19 北京 933 \n", "\n", " total_money close_year \n", "0 NaN 2021-02 \n", "1 11600.0 2021-02 \n", "2 NaN 2021-02 \n", "3 1575.0 2021-02 \n", "4 2300.0 2021-01 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
com_nameborncat_nameclosecom_provlive_timetotal_moneyclose_year
0米聊2011-01-01社交网络2021-02-19北京3702NaN2021-02
1虾米音乐2007-10-01文娱传媒2021-02-05浙江487611600.02021-02
2悟空问答2017-01-01文娱传媒2021-02-03北京1494NaN2021-02
3盼达用车2015-05-01汽车交通2021-02-01重庆21031575.02021-02
4TT直播健身-VIPFIT2018-07-01体育运动2021-01-19北京9332300.02021-01
\n
" }, "metadata": {}, "execution_count": 123 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 153, "metadata": {}, "outputs": [], "source": [ "area = list(df['cat_name'].unique())" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['社交网络',\n", " '文娱传媒',\n", " '汽车交通',\n", " '体育运动',\n", " '企业服务',\n", " '游戏',\n", " '广告营销',\n", " '电子商务',\n", " '教育',\n", " '本地生活',\n", " '金融',\n", " '房产服务',\n", " '智能硬件',\n", " '物流',\n", " '医疗健康',\n", " '工具软件',\n", " '旅游',\n", " '农业',\n", " '区块链',\n", " '先进制造',\n", " '生产制造']" ] }, "metadata": {}, "execution_count": 43 } ], "source": [ "area" ] }, { "cell_type": "code", "execution_count": 154, "metadata": {}, "outputs": [], "source": [ "for item in area:\n", " df[item]=df['cat_name'].str.contains(item).apply(lambda x:1 if x else 0)" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " com_name born cat_name close com_prov live_time \\\n", "0 米聊 2011-01-01 社交网络 2021-02-19 北京 3702 \n", "1 虾米音乐 2007-10-01 文娱传媒 2021-02-05 浙江 4876 \n", "2 悟空问答 2017-01-01 文娱传媒 2021-02-03 北京 1494 \n", "3 盼达用车 2015-05-01 汽车交通 2021-02-01 重庆 2103 \n", "4 TT直播健身-VIPFIT 2018-07-01 体育运动 2021-01-19 北京 933 \n", "\n", " total_money close_year 社交网络 文娱传媒 ... 房产服务 智能硬件 物流 医疗健康 工具软件 旅游 \\\n", "0 NaN 2021-02 1 0 ... 0 0 0 0 0 0 \n", "1 11600.0 2021-02 0 1 ... 0 0 0 0 0 0 \n", "2 NaN 2021-02 0 1 ... 0 0 0 0 0 0 \n", "3 1575.0 2021-02 0 0 ... 0 0 0 0 0 0 \n", "4 2300.0 2021-01 0 0 ... 0 0 0 0 0 0 \n", "\n", " 农业 区块链 先进制造 生产制造 \n", "0 0 0 0 0 \n", "1 0 0 0 0 \n", "2 0 0 0 0 \n", "3 0 0 0 0 \n", "4 0 0 0 0 \n", "\n", "[5 rows x 29 columns]" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
com_nameborncat_nameclosecom_provlive_timetotal_moneyclose_year社交网络文娱传媒...房产服务智能硬件物流医疗健康工具软件旅游农业区块链先进制造生产制造
0米聊2011-01-01社交网络2021-02-19北京3702NaN2021-0210...0000000000
1虾米音乐2007-10-01文娱传媒2021-02-05浙江487611600.02021-0201...0000000000
2悟空问答2017-01-01文娱传媒2021-02-03北京1494NaN2021-0201...0000000000
3盼达用车2015-05-01汽车交通2021-02-01重庆21031575.02021-0200...0000000000
4TT直播健身-VIPFIT2018-07-01体育运动2021-01-19北京9332300.02021-0100...0000000000
\n

5 rows × 29 columns

\n
" }, "metadata": {}, "execution_count": 126 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 155, "metadata": {}, "outputs": [], "source": [ "industry_df = df.loc[:,area]" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 社交网络 文娱传媒 汽车交通 体育运动 企业服务 游戏 广告营销 电子商务 教育 本地生活 ... 房产服务 智能硬件 \\\n", "0 1 0 0 0 0 0 0 0 0 0 ... 0 0 \n", "1 0 1 0 0 0 0 0 0 0 0 ... 0 0 \n", "2 0 1 0 0 0 0 0 0 0 0 ... 0 0 \n", "3 0 0 1 0 0 0 0 0 0 0 ... 0 0 \n", "4 0 0 0 1 0 0 0 0 0 0 ... 0 0 \n", "\n", " 物流 医疗健康 工具软件 旅游 农业 区块链 先进制造 生产制造 \n", "0 0 0 0 0 0 0 0 0 \n", "1 0 0 0 0 0 0 0 0 \n", "2 0 0 0 0 0 0 0 0 \n", "3 0 0 0 0 0 0 0 0 \n", "4 0 0 0 0 0 0 0 0 \n", "\n", "[5 rows x 21 columns]" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
社交网络文娱传媒汽车交通体育运动企业服务游戏广告营销电子商务教育本地生活...房产服务智能硬件物流医疗健康工具软件旅游农业区块链先进制造生产制造
01000000000...0000000000
10100000000...0000000000
20100000000...0000000000
30010000000...0000000000
40001000000...0000000000
\n

5 rows × 21 columns

\n
" }, "metadata": {}, "execution_count": 142 } ], "source": [ "industry_df.head()" ] }, { "cell_type": "code", "execution_count": 156, "metadata": {}, "outputs": [], "source": [ "industry_df.index=df['close_year']" ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 社交网络 文娱传媒 汽车交通 体育运动 企业服务 游戏 广告营销 电子商务 教育 本地生活 ... 房产服务 \\\n", "close_year ... \n", "2021-02 1 0 0 0 0 0 0 0 0 0 ... 0 \n", "2021-02 0 1 0 0 0 0 0 0 0 0 ... 0 \n", "2021-02 0 1 0 0 0 0 0 0 0 0 ... 0 \n", "2021-02 0 0 1 0 0 0 0 0 0 0 ... 0 \n", "2021-01 0 0 0 1 0 0 0 0 0 0 ... 0 \n", "\n", " 智能硬件 物流 医疗健康 工具软件 旅游 农业 区块链 先进制造 生产制造 \n", "close_year \n", "2021-02 0 0 0 0 0 0 0 0 0 \n", "2021-02 0 0 0 0 0 0 0 0 0 \n", "2021-02 0 0 0 0 0 0 0 0 0 \n", "2021-02 0 0 0 0 0 0 0 0 0 \n", "2021-01 0 0 0 0 0 0 0 0 0 \n", "\n", "[5 rows x 21 columns]" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
社交网络文娱传媒汽车交通体育运动企业服务游戏广告营销电子商务教育本地生活...房产服务智能硬件物流医疗健康工具软件旅游农业区块链先进制造生产制造
close_year
2021-021000000000...0000000000
2021-020100000000...0000000000
2021-020100000000...0000000000
2021-020010000000...0000000000
2021-010001000000...0000000000
\n

5 rows × 21 columns

\n
" }, "metadata": {}, "execution_count": 145 } ], "source": [ "industry_df.head()" ] }, { "cell_type": "code", "execution_count": 157, "metadata": {}, "outputs": [], "source": [ "_industry_df = industry_df.groupby('close_year').sum()" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 社交网络 文娱传媒 汽车交通 体育运动 企业服务 游戏 广告营销 电子商务 教育 本地生活 ... 房产服务 \\\n", "close_year ... \n", "2006-07 0 0 0 0 1 0 0 0 1 0 ... 0 \n", "2006-08 0 0 0 0 1 0 0 0 0 0 ... 0 \n", "2006-12 1 1 0 0 0 0 0 1 0 0 ... 0 \n", "2007-04 0 0 0 0 1 0 0 0 0 0 ... 0 \n", "2007-07 0 1 0 0 0 0 0 0 1 0 ... 0 \n", "\n", " 智能硬件 物流 医疗健康 工具软件 旅游 农业 区块链 先进制造 生产制造 \n", "close_year \n", "2006-07 0 0 0 0 0 0 0 0 0 \n", "2006-08 0 0 1 1 0 0 0 0 0 \n", "2006-12 0 0 1 0 0 0 0 0 0 \n", "2007-04 0 0 0 0 0 0 0 0 0 \n", "2007-07 0 0 1 0 0 0 0 0 0 \n", "\n", "[5 rows x 21 columns]" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
社交网络文娱传媒汽车交通体育运动企业服务游戏广告营销电子商务教育本地生活...房产服务智能硬件物流医疗健康工具软件旅游农业区块链先进制造生产制造
close_year
2006-070000100010...0000000000
2006-080000100000...0001100000
2006-121100000100...0001000000
2007-040000100000...0000000000
2007-070100000010...0001000000
\n

5 rows × 21 columns

\n
" }, "metadata": {}, "execution_count": 132 } ], "source": [ "_industry_df.head()" ] }, { "cell_type": "code", "execution_count": 158, "metadata": {}, "outputs": [], "source": [ "_industry_df.T.to_excel('close_company_year.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 159, "metadata": {}, "outputs": [], "source": [ "df_1 = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": 160, "metadata": {}, "outputs": [], "source": [ "df_1.drop_duplicates(['com_name','born'],inplace=True)" ] }, { "cell_type": "code", "execution_count": 163, "metadata": {}, "outputs": [], "source": [ "df_1['close_year']=df_1['close'].apply(close_year)" ] }, { "cell_type": "code", "execution_count": 164, "metadata": {}, "outputs": [], "source": [ "df_1['born_year']=df_1['born'].apply(close_year)" ] }, { "cell_type": "code", "execution_count": 165, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " com_name born cat_name close com_prov live_time \\\n", "0 米聊 2011-01-01 社交网络 2021-02-19 北京 3702 \n", "1 虾米音乐 2007-10-01 文娱传媒 2021-02-05 浙江 4876 \n", "2 悟空问答 2017-01-01 文娱传媒 2021-02-03 北京 1494 \n", "3 盼达用车 2015-05-01 汽车交通 2021-02-01 重庆 2103 \n", "4 TT直播健身-VIPFIT 2018-07-01 体育运动 2021-01-19 北京 933 \n", "... ... ... ... ... ... ... \n", "23195 阿里测 2004-01-01 工具软件 2006-08-09 浙江 951 \n", "23196 九极 2003-05-01 医疗健康 2006-08-08 广东 1195 \n", "23197 上海金略软件 2003-01-01 企业服务 2006-08-02 上海 1309 \n", "23198 安派克 1994-11-01 企业服务 2006-07-31 上海 4290 \n", "23199 辣妈育儿 2003-08-01 教育 2006-07-26 北京 1090 \n", "\n", " total_money close_year born_year \n", "0 NaN 2021 2011 \n", "1 11600.0 2021 2007 \n", "2 NaN 2021 2017 \n", "3 1575.0 2021 2015 \n", "4 2300.0 2021 2018 \n", "... ... ... ... \n", "23195 NaN 2006 2004 \n", "23196 NaN 2006 2003 \n", "23197 NaN 2006 2003 \n", "23198 NaN 2006 1994 \n", "23199 NaN 2006 2003 \n", "\n", "[14510 rows x 9 columns]" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
com_nameborncat_nameclosecom_provlive_timetotal_moneyclose_yearborn_year
0米聊2011-01-01社交网络2021-02-19北京3702NaN20212011
1虾米音乐2007-10-01文娱传媒2021-02-05浙江487611600.020212007
2悟空问答2017-01-01文娱传媒2021-02-03北京1494NaN20212017
3盼达用车2015-05-01汽车交通2021-02-01重庆21031575.020212015
4TT直播健身-VIPFIT2018-07-01体育运动2021-01-19北京9332300.020212018
..............................
23195阿里测2004-01-01工具软件2006-08-09浙江951NaN20062004
23196九极2003-05-01医疗健康2006-08-08广东1195NaN20062003
23197上海金略软件2003-01-01企业服务2006-08-02上海1309NaN20062003
23198安派克1994-11-01企业服务2006-07-31上海4290NaN20061994
23199辣妈育儿2003-08-01教育2006-07-26北京1090NaN20062003
\n

14510 rows × 9 columns

\n
" }, "metadata": {}, "execution_count": 165 } ], "source": [ "df_1" ] }, { "cell_type": "code", "execution_count": 168, "metadata": {}, "outputs": [], "source": [ "df_born = df_1.groupby('born_year')" ] }, { "cell_type": "code", "execution_count": 169, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " com_name born cat_name close com_prov live_time total_money \\\n", "born_year \n", "1981 1 1 1 1 1 1 1 \n", "1989 1 1 1 1 1 1 1 \n", "1993 4 4 4 4 4 4 0 \n", "1994 2 2 2 2 2 2 0 \n", "1995 2 2 2 2 2 2 0 \n", "\n", " close_year \n", "born_year \n", "1981 1 \n", "1989 1 \n", "1993 4 \n", "1994 2 \n", "1995 2 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
com_nameborncat_nameclosecom_provlive_timetotal_moneyclose_year
born_year
198111111111
198911111111
199344444404
199422222202
199522222202
\n
" }, "metadata": {}, "execution_count": 169 } ], "source": [ "df_born.head()" ] }, { "cell_type": "code", "execution_count": 170, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " com_name born cat_name close com_prov live_time total_money \\\n", "born_year \n", "2015 2928 2928 2928 2928 2928 2928 604 \n", "2016 1439 1439 1439 1439 1439 1439 232 \n", "2017 877 877 877 877 877 877 99 \n", "2018 434 434 434 434 434 434 42 \n", "2019 43 43 43 43 43 43 1 \n", "\n", " close_year \n", "born_year \n", "2015 2928 \n", "2016 1439 \n", "2017 877 \n", "2018 434 \n", "2019 43 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
com_nameborncat_nameclosecom_provlive_timetotal_moneyclose_year
born_year
20152928292829282928292829286042928
20161439143914391439143914392321439
201787787787787787787799877
201843443443443443443442434
2019434343434343143
\n
" }, "metadata": {}, "execution_count": 170 } ], "source": [ "df_born.tail()" ] }, { "cell_type": "code", "execution_count": 172, "metadata": {}, "outputs": [], "source": [ "born_dict ={}\n", "for year,sub_df in df_1.groupby('born_year'):\n", " # print(year)\n", " # len(sub_df['born']\n", " born_dict[year]=len(sub_df)" ] }, { "cell_type": "code", "execution_count": 173, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{1981: 1,\n", " 1989: 1,\n", " 1993: 4,\n", " 1994: 2,\n", " 1995: 2,\n", " 1996: 4,\n", " 1997: 3,\n", " 1998: 14,\n", " 1999: 9,\n", " 2000: 21,\n", " 2001: 23,\n", " 2002: 26,\n", " 2003: 49,\n", " 2004: 54,\n", " 2005: 78,\n", " 2006: 102,\n", " 2007: 147,\n", " 2008: 159,\n", " 2009: 266,\n", " 2010: 462,\n", " 2011: 886,\n", " 2012: 1367,\n", " 2013: 2059,\n", " 2014: 3050,\n", " 2015: 2928,\n", " 2016: 1439,\n", " 2017: 877,\n", " 2018: 434,\n", " 2019: 43}" ] }, "metadata": {}, "execution_count": 173 } ], "source": [ "born_dict" ] }, { "cell_type": "code", "execution_count": 174, "metadata": {}, "outputs": [], "source": [ "dead_dict ={}\n", "for year,sub_df in df_1.groupby('close_year'):\n", " # print(year)\n", " # len(sub_df['born']\n", " dead_dict[year]=len(sub_df)" ] }, { "cell_type": "code", "execution_count": 175, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{2006: 9,\n", " 2007: 12,\n", " 2008: 14,\n", " 2009: 24,\n", " 2010: 35,\n", " 2011: 54,\n", " 2012: 71,\n", " 2013: 193,\n", " 2014: 346,\n", " 2015: 1036,\n", " 2016: 1647,\n", " 2017: 2493,\n", " 2018: 2498,\n", " 2019: 5068,\n", " 2020: 1005,\n", " 2021: 5}" ] }, "metadata": {}, "execution_count": 175 } ], "source": [ "dead_dict" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ] } ================================================ FILE: analysis/df_sql_analysis.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import tushare as ts" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "df = ts.get_stock_basics()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssetsreserved...bvpspbtimeToMarketundpperundprevprofitgprnprholders
code
002959N小熊家用电器广东23.160.301.2011.897.751.190.63...12.703.88201908234.123.430.000.0036.0010.7560075.0
300110华仁药业化学制药山东261.9711.7811.8230.5315.5012.325.28...1.852.35201008254.180.353.03116.5956.691.4749331.0
002505大康农业农业综合湖南95.5254.8554.85162.9288.1528.742.54...0.842.0620101118-7.47-0.14-4.6435.058.410.72138483.0
002121科陆电子电器仪表深圳0.009.2914.08118.6761.5027.5119.04...2.432.2420070306-0.30-0.02-23.09-219.9728.05-5.1169768.0
002337赛象科技化工机械天津0.005.885.8915.4411.802.124.25...2.022.00201001151.070.18-51.88-65.0129.51-56.0677476.0
\n", "

5 rows × 22 columns

\n", "
" ], "text/plain": [ " name industry area pe outstanding totals totalAssets \\\n", "code \n", "002959 N小熊 家用电器 广东 23.16 0.30 1.20 11.89 \n", "300110 华仁药业 化学制药 山东 261.97 11.78 11.82 30.53 \n", "002505 大康农业 农业综合 湖南 95.52 54.85 54.85 162.92 \n", "002121 科陆电子 电器仪表 深圳 0.00 9.29 14.08 118.67 \n", "002337 赛象科技 化工机械 天津 0.00 5.88 5.89 15.44 \n", "\n", " liquidAssets fixedAssets reserved ... bvps pb timeToMarket \\\n", "code ... \n", "002959 7.75 1.19 0.63 ... 12.70 3.88 20190823 \n", "300110 15.50 12.32 5.28 ... 1.85 2.35 20100825 \n", "002505 88.15 28.74 2.54 ... 0.84 2.06 20101118 \n", "002121 61.50 27.51 19.04 ... 2.43 2.24 20070306 \n", "002337 11.80 2.12 4.25 ... 2.02 2.00 20100115 \n", "\n", " undp perundp rev profit gpr npr holders \n", "code \n", "002959 4.12 3.43 0.00 0.00 36.00 10.75 60075.0 \n", "300110 4.18 0.35 3.03 116.59 56.69 1.47 49331.0 \n", "002505 -7.47 -0.14 -4.64 35.05 8.41 0.72 138483.0 \n", "002121 -0.30 -0.02 -23.09 -219.97 28.05 -5.11 69768.0 \n", "002337 1.07 0.18 -51.88 -65.01 29.51 -56.06 77476.0 \n", "\n", "[5 rows x 22 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "df=df.reset_index()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "df=df[df['code'].str.match('688.*?')]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...bvpspbtimeToMarketundpperundprevprofitgprnprholders
715688010福光股份电器仪表福建122.400.351.549.954.362.43...11.306.53201907223.162.060.00.036.4717.0730737.0
2265688029南微医学医疗保健江苏53.740.311.3310.907.141.38...17.426.95201907223.342.510.00.065.8624.3127600.0
2840688321微芯生物化学制药深圳958.030.414.108.282.870.12...3.5223.2320190812-0.22-0.050.00.096.1121.3827993.0
3339688333铂力特机械基件陕西0.000.180.807.973.743.15...12.405.96201907220.680.850.00.035.25-2.1813218.0
3474688009中国通号运输设备北京38.2411.84105.90836.01687.3439.11...3.502.792019072293.100.880.00.024.438.58696322.0
\n", "

5 rows × 23 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals totalAssets \\\n", "715 688010 福光股份 电器仪表 福建 122.40 0.35 1.54 9.95 \n", "2265 688029 南微医学 医疗保健 江苏 53.74 0.31 1.33 10.90 \n", "2840 688321 微芯生物 化学制药 深圳 958.03 0.41 4.10 8.28 \n", "3339 688333 铂力特 机械基件 陕西 0.00 0.18 0.80 7.97 \n", "3474 688009 中国通号 运输设备 北京 38.24 11.84 105.90 836.01 \n", "\n", " liquidAssets fixedAssets ... bvps pb timeToMarket undp \\\n", "715 4.36 2.43 ... 11.30 6.53 20190722 3.16 \n", "2265 7.14 1.38 ... 17.42 6.95 20190722 3.34 \n", "2840 2.87 0.12 ... 3.52 23.23 20190812 -0.22 \n", "3339 3.74 3.15 ... 12.40 5.96 20190722 0.68 \n", "3474 687.34 39.11 ... 3.50 2.79 20190722 93.10 \n", "\n", " perundp rev profit gpr npr holders \n", "715 2.06 0.0 0.0 36.47 17.07 30737.0 \n", "2265 2.51 0.0 0.0 65.86 24.31 27600.0 \n", "2840 -0.05 0.0 0.0 96.11 21.38 27993.0 \n", "3339 0.85 0.0 0.0 35.25 -2.18 13218.0 \n", "3474 0.88 0.0 0.0 24.43 8.58 696322.0 \n", "\n", "[5 rows x 23 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "上海 7\n", "北京 6\n", "江苏 4\n", "浙江 3\n", "陕西 2\n", "广东 2\n", "深圳 2\n", "黑龙江 1\n", "福建 1\n", "山东 1\n", "Name: area, dtype: int64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['area'].value_counts()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.6" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/diagnose_stock.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Email: weigesysu@qq.com ''' import sys sys.path.append('..') from configure.settings import DBSelector from common.BaseService import BaseService from common.SecurityBase import StockBase # 是否黑名单,东北股 class StockDoctor(BaseService, StockBase): def __init__(self): BaseService.__init__(self, f'log/{self.__class__.__name__}.log') # 新写法 StockBase.__init__(self) self.logger.info('start') self.DB = DBSelector() self.conn = self.DB.get_mysql_conn('db_stock', 'qq') self.cursor = self.conn.cursor() # 是否黑名单 def check_blacklist(self, code): cmd = 'select * from tb_blacklist where code=%s' self.cursor.execute(cmd, args=(code,)) ret = self.cursor.fetchone() if ret: return True else: return False # 是否是东北的 def north_east(self, code): north_east_area = ['黑龙江', '吉林', '辽宁'] cmd = 'select area from tb_basic_info where code=%s' self.cursor.execute(cmd, args=(code,)) ret = self.cursor.fetchone() if ret and ret in north_east_area: return True else: return False def get_code(self, name): cmd = 'select code from tb_basic_info where name=%s' self.cursor.execute(cmd, args=(name)) ret = self.cursor.fetchone() return ret def diagnose(self, code): if not self.valid_code(code): raise ValueError('输入有误') issue = False if self.check_blacklist(code): self.logger.info('存在黑名单') issue = True if self.north_east(code): self.logger.info('是东北股') issue = True if issue: self.logger.info(f'{code} 问题股') def main(): code = input('输入诊断个股的代码: ') doctor = StockDoctor() doctor.diagnose(code) if __name__ == '__main__': main() ================================================ FILE: analysis/fd_money.py ================================================ # @Time : 2020/1/14 0:05 # @File : fd_money.py # 涨停封单数据 from configure.settings import DBSelector import datetime import pyecharts.options as opts from pyecharts.charts import Line DAY = 100 # 查看最近的天数 class FDPlot: def __init__(self): self.dataset=[] self.date=[] def fetch_data(self): DB = DBSelector() conn = DB.get_mysql_conn('db_zdt', 'tencent-1c') cursor = conn.cursor() for d in range(DAY): day = datetime.datetime.now() + datetime.timedelta(days=-1 * d) sql = 'select sum(`封单金额`) as total_money from `{}zdt`'.format(day.strftime('%Y%m%d')) try: cursor.execute(sql) ret = cursor.fetchone() self.dataset.append(int(ret[0]/100000000)) self.date.append(day.strftime('%Y%m%d')) except Exception as e: print(e) def plot(self): self.fetch_data() dataset_ = self.dataset[::-1] date_ = self.date[::-1] title='封单金额(亿)' c = ( Line() .add_xaxis(date_) .add_yaxis(title, dataset_, is_smooth=True, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2,color='rgb(255, 0, 0)'), ).set_global_opts( title_opts=opts.TitleOpts(title=title), xaxis_opts=opts.AxisOpts( name='日期', splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(rotate=55), ), yaxis_opts=opts.AxisOpts(name=title, splitline_opts=opts.SplitLineOpts(is_show=True), ) ) .set_colors(['red']) # 点的颜色 .render("data/最近{}天股票涨停封单.html".format(DAY)) ) if __name__ == '__main__': app = FDPlot() app.plot() ================================================ FILE: analysis/filterstock.py ================================================ # -*-coding=utf-8-*- ''' __author__ = 'Rocky' email: weigesysu@qq.com ''' import datetime import tushare as ts import os import pandas as pd from collections import OrderedDict import matplotlib import numpy as np import matplotlib.pyplot as plt import sys sys.path.append('..') from configure.settings import DBSelector matplotlib.use("Pdf") pd.set_option('display.max_rows', None) # 过滤器,剔除不想要的个股 class FilterStock(): def __init__(self): self.change_work_dir() self.today = datetime.datetime.now().strftime("%Y-%m-%d") self.engine = DBSelector().get_engine('db_stock') self.conn = DBSelector().get_engine('db_stock') def change_work_dir(self): current = os.path.dirname(__file__) work_space = os.path.join(current, 'data') if os.path.exists(work_space) == False: os.mkdir(work_space) os.chdir(work_space) def get_location(self): df = ts.get_area_classified() print(df) # df.to_excel('location.xls') self.save_to_excel(df, 'location.xls') def get_ST(self): # 暂停上市 zt = ts.get_suspended() print(zt) # 终止上市 zz = ts.get_terminated() print(zz) def get_achievement(self): fc = ts.forecast_data(2016, 4) print(fc) def daily_market(self): ''' 保存每天收盘后的市场行情 :return: ''' df = ts.get_today_all() print(df) try: df.to_sql(self.today, self.engine, if_exists='replace') except Exception as e: print(e) print("Save {} data to MySQL".format(self.today)) def break_low(self, date): ''' 筛选出一年内创新低的股票 :param date: 某一天的日期 ‘'2017-11-11 :return: ''' # cmd = 'select * from `{}`'.format(date) df = pd.read_sql_table(date, self.engine, index_col='index') # **** 这里的index需要删除一个 low_db = self.conn('db_selection') low_cursor = low_db.cursor() for i in range(len(df)): code = df.loc[i]['code'] cur_low = df.loc[i]['low'] mins_date, mins = self.get_lowest(code, '2017', date) if not mins_date: continue if mins and float(cur_low) <= float(mins) and float(cur_low) != 0.0: print(code, ) print(df.loc[i]['name']) print('year mins {} at {}'.format(mins, mins_date)) print('curent mins ', cur_low) create_cmd = 'create table if not exists break_low' \ '(`index` int primary key auto_increment,datetime datetime,code text,name text,low_price float,last_price float, last_price_date datetime);' low_cursor.execute(create_cmd) insert_cmd = 'insert into break_low (datetime,code,name,low_price,last_price,last_price_date) values (%s,%s,%s,%s,%s,%s);' insert_data = (date, code, df.loc[i]['name'], cur_low, mins, mins_date) low_cursor.execute(insert_cmd, insert_data) low_db.commit() def get_lowest(self, code, date, current_date): ''' 返回个股某一年最低价 :param code: 股票代码 :param date: 年份 :return: ''' date = date + '-01-01' cmd = 'select * from `{}` where datetime > \'{}\' and datetime <\'{}\''.format(code, date, current_date) try: df = pd.read_sql(cmd, self.engine, index_col='index') except Exception as e: print(e) return None, None # print(df.dtypes) # 不知道为啥,这里的类型发生改变 if len(df) < 1: return None, None df['low'] = df['low'].astype('float64') idx = df['low'].idxmin() min_date = df.loc[idx] return min_date['datetime'], min_date['low'] def get_highest(self, code, date): ''' 返回个股某一年最高价 :param code: 股票代码 :param date: 年份 :return: ''' date = date + '-01-01' cmd = 'select high from `{}` where datetime > \'{}\''.format(code, date) df = pd.read_sql(cmd, self.engine) return df['high'].max() def save_to_excel(self, df, filename, encoding='gbk'): try: df.to_csv('temp.csv', encoding=encoding, index=False) df = pd.read_csv('temp.csv', encoding=encoding, dtype={'code': str}) df.to_excel(filename, encoding=encoding) return True except Exception as e: print("Save to excel faile") print(e) return None # 专门用来存储数据,数据保存为excel,不必每次都要从网络读取 def store_data(self): # 预测 # year_2016=ts.forecast_data(2016, 4) # self.save_to_excel(year_2016,'2016-profit.xls') # year_2017=ts.forecast_data(2017, 4) # self.save_to_excel(year_2017,'2017-profit.xls') # 盈利能力 # profit_2016=ts.get_profit_data(2016,4) # profit_2017=ts.get_profit_data(2017,3) # self.save_to_excel(profit_2016, '2016-profit.xls') # self.save_to_excel(profit_2017, '2017-3rdprofit.xls') # 股票基本信息 # basic=ts.get_stock_basics() # basic.to_csv('temp.xls',encoding='gbk') # df=pd.read_csv('temp.xls',encoding='gbk',dtype={'code':str}) # # print(df) # self.save_to_excel(df,'Markets.xls') # 基本面 每股净资产<1 df = ts.get_report_data(2017, 3) self.save_to_excel(df, '2017-3rd-report.xls') def to_be_ST(self): ''' df_2016=pd.read_excel('2016-profit.xls',dtype={'code':str}) df_2017=pd.read_excel('2017-3rdprofit.xls',dtype={'code':str}) loss_2016=set(df_2016[df_2016['net_profits']<0]['code']) loss_2017=set(df_2017[df_2017['net_profits']<0]['code']) st= list(loss_2016 & loss_2017) basic=pd.read_excel('Markets.xls',dtype={'code':str}) # print(basic.head(5)) # for x in st: # print(x) # print(basic[basic['code']==st]) for i in st: print(basic[basic['code']==i][['code','name']]) ''' # 每股净资产小于0 df_bpvs = pd.read_excel('2017-3rd-report.xls', dtype={'code': str}) # print(df_bpvs.head()) print(df_bpvs[df_bpvs['bvps'] < 0][['code', 'name']]) # 返回新股信息 def get_new_stock(self, start='2010', end='2011'): ''' :param start: 开始年份 如 '2010' :param end: 结束年份 如 '2011' :return: ''' df = pd.read_sql('tb_basic_info', self.engine, index_col='index') df = df[df['list_date'] != 0] df['list_date'] = pd.to_datetime(df['list_date'], format='%Y%m%d') df = df.set_index('list_date', drop=True) new_stock = df[start:end] # 返回df格式 return new_stock def plot_new_stock_distibution(self, df, start, end): years = OrderedDict() values = [] for year in range(start, end): years[year] = len(df[str(year)]) values.append(len(df[str(year)])) x = np.arange(1994, 2019) plt.figure(figsize=(10, 9)) rect = plt.bar(x, values) self.rect_show(rect) plt.xticks(x[::2]) plt.show() def rect_show(self, rects): for rect in rects: height = rect.get_height() plt.text(rect.get_x(), 1.05 * height, '%s' % int(height)) # 只是用于测试,展示数据 def show(self): df = self.get_new_stock() # print(df) # 返回黑名单的代码 def get_blacklist(self): # conn=self.conn('db_stock','local') cursor = self.conn.cursor() query = 'select CODE from tb_blacklist' cursor.execute(query) ret = cursor.fetchall() return [i[0] for i in ret] # 可转债过滤 class Filter_CB(object): def __init__(self): self.engine = DBSelector().get_engine('db_stock', 'tencent-1c') # self.bonds = pd.read_sql('tb_bond_jisilu', con=self.engine) # 获取新股的可转债,一般比较猛 def get_new_stock_bond(self, start='2017', end='2019'): ''' :return: 返回新股对应的转债数据 df ''' obj = FilterStock() new_stock_df = obj.get_new_stock(start, end) # index是timeToMarket code_list = list(new_stock_df['code'].values) new_stock_bond_df = self.bonds[self.bonds['正股代码'].isin(code_list)] for code in new_stock_bond_df['正股代码'].values: print(code) t_market = new_stock_df[new_stock_df['code'] == code].index.values[0] return new_stock_bond_df def show(self): df = self.get_new_stock_bond() print(df) def run(self): df = pd.read_sql('tb_bond_jisilu', con=self.engine) want_cb_df = df[((df['可转债价格'] <= 125) & (df['溢价率'] <= 15))] want_cb_df = want_cb_df[['可转债代码', '可转债名称', '可转债价格', '溢价率']] # want_cb_df.rename(columns={'可转债代码':''}) want_cb_df.loc[:, '优先级'] = 0 # 默认都为0 want_cb_df.loc[:, '当前日期'] = datetime.date.today() try: want_cb_df.to_sql('tb_stock_candidates', con=self.engine, if_exists='replace') except Exception as e: print(e) def main(): # obj = Filter_Stock() # obj.show() # obj.get_blacklist() # obj.get_ST() # obj.get_achievement() # obj.get_location('深圳') # obj.break_low() # obj.break_low('2017-11-17') # print(type(obj.get_lowest('300333','2017'))) # print(obj.get_lowest('300333', '2017')) # print(obj.get_highest('300333', '2017')) # obj.break_low('2017-11-17') # obj.store_data() # obj.to_be_ST() # obj.get_location() # print(obj.get_new_stock()) # obj.get_location() obj_cb = Filter_CB() obj_cb.show() if __name__ == '__main__': main() ================================================ FILE: analysis/fupan.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' __doc__=''' 复盘数据与流程 ''' from configure.settings import DBSelector import pandas as pd import pymongo pd.set_option('expand_frame_repr', False) client = pymongo.MongoClient('raspberrypi') db = client['stock'] doc = db['industry'] today = '2018-05-08' # TODAY = datetime.datetime.now().strftime('%Y-%m-%d') # daily_engine = DBSelector().get_engine('db_daily','qq') daily_df = pd.read_sql(today, daily_engine, index_col='index') class IndustryFupan: ''' 每天板块分析 ''' def __init__(self): self.engine = DBSelector() # 保存到mongo def save_industry(self): try: doc.drop() except Exception as e: print(e) engine = get_engine('db_stock') basic_df = pd.read_sql('tb_basic_info', engine, index_col='index') # print(basic_df) for name, group in basic_df.groupby('industry'): # print(name, group) d = dict() d['板块名称'] = name d['代码'] = group['code'].values.tolist() d['更新日期'] = today try: # pass doc.insert(d) except Exception as e: print(e) def hot_industry(): engine = get_engine('db_stock') basic_df = pd.read_sql('tb_basic_info', engine, index_col='index') industry_dict = {} for name, group in basic_df.groupby('industry'): # print(name, group) industry_dict[name] = group['code'].values.tolist() result = {} for k, v in industry_dict.items(): mean = 0.0 for i in v: try: percent = daily_df[daily_df['code'] == i]['changepercent'].values[0] name = daily_df[daily_df['code'] == i]['name'].values[0] except: percent = 0 name = '' # print(i,name,percent) mean = mean + float(percent) m = round(mean / len(v), 2) # print('{} mean : {}'.format(k,m)) result[k] = m all_result = sorted(result.items(), key=lambda x: x[1], reverse=True) kind = '元器件' select_detail = {} for code in industry_dict.get(kind): try: percent = daily_df[daily_df['code'] == code]['changepercent'].values[0] except: percent = 0 try: name = daily_df[daily_df['code'] == code]['name'].values[0] except: name = '' select_detail[name] = float(percent) print('\n\n{} detail\n'.format(kind)) select_detail = sorted(select_detail.items(), key=lambda x: x[1], reverse=True) for n, p in select_detail: print(n, p) def get_industry(): industry = {} for i in doc.find({}, {'_id': 0}): print(i.get('板块名称')) industry[i.get('板块名称')] = i.get('代码') return industry def daily_hot_industry(): industry = get_industry() result = {} for item, code_list in industry.items(): for code in code_list: mean = 0.0 try: percent = daily_df[daily_df['code'] == code]['changepercent'].values[0] name = daily_df[daily_df['code'] == code]['name'].values[0] except: percent = 0 name = '' # print(i,name,percent) mean = mean + float(percent) m = round(mean / len(code_list), 2) result[item] = m all_result = sorted(result.items(), key=lambda x: x[1], reverse=True) return all_result # 保存行业的平均涨幅到mongo def industry_hot_mongo(): result = daily_hot_industry() collection = db['industry_rank'] collection.drop() for item in result: d = {} d['板块'] = item[0] d['涨跌幅'] = item[1] d['日期'] = today try: collection.insert(d) except Exception as e: print(e) def industry_detail(kind): select_detail = {} industry_list = get_industry() for code in industry_list.get(kind): try: percent = daily_df[daily_df['code'] == code]['changepercent'].values[0] except: percent = 0 try: name = daily_df[daily_df['code'] == code]['name'].values[0] except: name = '' select_detail[name] = float(percent) print('\n\n{} detail\n'.format(kind)) select_detail = sorted(select_detail.items(), key=lambda x: x[1], reverse=True) for n, p in select_detail: print(n, p) if __name__ == "__main__": # save_industry() # hot_industry() # get_industry() # daily_hot_industry() # industry_hot_mongo() industry_detail('电器连锁') ================================================ FILE: analysis/get_break_high_low.py ================================================ # -*-coding=utf-8-*- import time __author__ = 'rocky' # 获取破指定天数内的新高 比如破60日新高 import tushare as ts import datetime import pandas as pd from configure.settings import DBSelector,_json_data import pymongo from config import token # from filter_stock import Filter_Stock db = DBSelector() INFO = _json_data['mongo']['arm'] host = INFO['host'] port = INFO['port'] user = INFO['user'] password = INFO['password'] class BreakPoint(object): def __init__(self): self.engine = db.get_engine('db_stock', 'qq') self.conn = db.get_mysql_conn('db_stock', 'qq') self.info = pd.read_sql('tb_basic_info', con=self.engine, index_col='code') connect_uri = f'mongodb://{user}:{password}@{host}:{port}' self.db = pymongo.MongoClient(connect_uri) self.doc = self.db['db_stock']['break_low_high'] ts.set_token(token) self.pro = ts.pro_api() self.count = 0 # 获取新高,新低 def loop_stocks(self, day): total = 200 + 10 each_loop = 60 / total for idx, row in self.info.iterrows(): stock_code = idx print('Checking {}'.format(stock_code)) self.is_break(stock_code, day, stock_type='stock') time.sleep(each_loop) def code_convert(self, code): if code[0] == '6': return code + '.SH' else: return code + '.SZ' def is_break(self, stockID, day, stock_type): end_day = datetime.datetime.now() days = day * 7 / 5 # 考虑到周六日非交易 start_day = end_day - datetime.timedelta(days) start_day = start_day.strftime("%Y%m%d") end_day = end_day.strftime("%Y%m%d") name = self.info.ix[stockID]['name'] # get_h_data 有问题。 try: # df = ts.get_k_data(stockID, start=start_day, end=end_day) ts_code = self.code_convert(stockID) df = ts.pro_bar(ts_code=ts_code, adj='qfq', start_date=start_day, end_date=end_day) # df 第0个数据是最新的。 except Exception as e: print(e) print('{} {}获取行情识别'.format(stockID, name)) time.sleep(30) return False if df is None or df.empty: print('{} {} df is None or empty'.format(stockID, name)) return False if len(df) < 5: print('上市时间太短'.format(stockID, name)) return False period_high = df['close'][1:].max() today_high = df.iloc[0]['high'] if today_high >= period_high: stock_h = [] stock_h.append(stockID) stock_h.append(name) insert_dict = {'类型': '新高', '范围': days, '名称': name, '代码': stockID, 'run_time': datetime.datetime.now(), '品种': stock_type, '开始日期': start_day, '结束日期': end_day} self.doc.insert_one(insert_dict) period_low = df['close'][1:].min() today_low = df.iloc[0]['low'] if today_low <= period_low: stock_l = [] name = self.info.ix[stockID]['name'] stock_l.append(stockID) stock_l.append(name) print('新低', stock_l) insert_dict = {'类型': '新低', '范围': days, '名称': name, '代码': stockID, 'run_time': datetime.datetime.now(), '品种': stock_type, '开始日期': start_day, '结束日期': end_day} self.doc.insert_one(insert_dict) if __name__ == '__main__': obj = BreakPoint() cal_day = 90 obj.loop_stocks(cal_day) print("Done") ================================================ FILE: analysis/hk_new_stock_ratio.ipynb ================================================ { "metadata": { "orig_nbformat": 2, "kernelspec": { "name": "python3", "display_name": "Python 3", "language": "python" } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')\n", "import pandas as pd\n", "import numpy as np\n", "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "db = DBSelector().mongo('qq')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "new_stock_info =[]\n", "for item in db['db_stock']['hk_new_stock'].find():\n", " del item['_id']\n", " new_stock_info.append(item)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'stock_code': '02170',\n", " 'stock_name': '贝康医疗-B',\n", " 'winning_rate_substr': '200',\n", " 'crawltime': datetime.datetime(2021, 2, 16, 23, 22, 5, 595000),\n", " '保荐机构': '中信里昂证券资本市场',\n", " '发行定价': '27.360',\n", " '发行市值': '72.96亿',\n", " '回拨比例': '50.0000',\n", " '是否有基石': '有',\n", " '是否有绿鞋': None,\n", " '暗盘涨幅': '14.04',\n", " '稳中一手': '200/1',\n", " '累计涨幅': '-0.40',\n", " '行业': '医疗保健',\n", " '首日涨幅': '1.24',\n", " '上市日期': '2021-02-08 00:00:00',\n", " '申购人数': '264120',\n", " '超额申购倍数': 402.8,\n", " '一手中签率': 10}" ] }, "metadata": {}, "execution_count": 8 } ], "source": [ "new_stock_info[0]" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(new_stock_info)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "df['首日涨幅']=df['首日涨幅'].astype(np.float)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\nRangeIndex: 844 entries, 0 to 843\nData columns (total 19 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 stock_code 844 non-null object \n 1 stock_name 844 non-null object \n 2 winning_rate_substr 843 non-null object \n 3 crawltime 844 non-null datetime64[ns]\n 4 保荐机构 844 non-null object \n 5 发行定价 844 non-null object \n 6 发行市值 844 non-null object \n 7 回拨比例 843 non-null object \n 8 是否有基石 844 non-null object \n 9 是否有绿鞋 668 non-null object \n 10 暗盘涨幅 843 non-null object \n 11 稳中一手 843 non-null object \n 12 累计涨幅 843 non-null object \n 13 行业 844 non-null object \n 14 首日涨幅 843 non-null float64 \n 15 上市日期 844 non-null object \n 16 申购人数 843 non-null object \n 17 超额申购倍数 843 non-null float64 \n 18 一手中签率 843 non-null float64 \ndtypes: datetime64[ns](1), float64(3), object(15)\nmemory usage: 125.4+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "df['暗盘涨幅']=df['暗盘涨幅'].astype(np.float)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "df['累计涨幅']=df['累计涨幅'].astype(np.float)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "df['暗盘涨幅']=df['暗盘涨幅'].replace('--','0')" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " stock_code stock_name winning_rate_substr crawltime \\\n", "0 02170 贝康医疗-B 200 2021-02-16 23:22:05.595 \n", "1 01024 快手-W 500 2021-02-16 23:22:05.595 \n", "2 02161 健倍苗苗 100 2021-02-16 23:22:05.595 \n", "3 02160 心通医疗-B 400 2021-02-16 23:22:05.595 \n", "4 06668 星盛商业 100 2021-02-16 23:22:05.595 \n", "\n", " 保荐机构 发行定价 发行市值 回拨比例 是否有基石 是否有绿鞋 \\\n", "0 中信里昂证券资本市场 27.360 72.96亿 50.0000 有 None \n", "1 摩根士丹利亚洲,美林远东,华兴证券(香港) 115.000 4724.42亿 6.0000 有 None \n", "2 中国银河国际证券(香港) 1.200 10.72亿 无 无 None \n", "3 摩根大通证券(远东),花旗环球金融亚洲,中国国际金融香港证券 12.200 288.67亿 50.0000 无 None \n", "4 建银国际金融,中信建投(国际)融资 3.860 38.60亿 50.0000 有 None \n", "\n", " 暗盘涨幅 稳中一手 累计涨幅 行业 首日涨幅 上市日期 申购人数 超额申购倍数 \\\n", "0 14.04 200/1 -0.40 医疗保健 1.24 2021-02-08 00:00:00 264120 402.80 \n", "1 170.09 500/1 250.43 软件服务 160.87 2021-02-05 00:00:00 1422977 1204.16 \n", "2 14.17 100/1 100.00 医疗保健 80.00 2021-02-05 00:00:00 87981 22.47 \n", "3 65.57 400/1 61.31 医疗保健 54.26 2021-02-04 00:00:00 567475 769.00 \n", "4 21.50 100/1 0.26 居民服务 3.63 2021-01-26 00:00:00 331495 756.85 \n", "\n", " 一手中签率 \n", "0 10.00 \n", "1 4.00 \n", "2 8.00 \n", "3 7.50 \n", "4 1.29 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
stock_codestock_namewinning_rate_substrcrawltime保荐机构发行定价发行市值回拨比例是否有基石是否有绿鞋暗盘涨幅稳中一手累计涨幅行业首日涨幅上市日期申购人数超额申购倍数一手中签率
002170贝康医疗-B2002021-02-16 23:22:05.595中信里昂证券资本市场27.36072.96亿50.0000None14.04200/1-0.40医疗保健1.242021-02-08 00:00:00264120402.8010.00
101024快手-W5002021-02-16 23:22:05.595摩根士丹利亚洲,美林远东,华兴证券(香港)115.0004724.42亿6.0000None170.09500/1250.43软件服务160.872021-02-05 00:00:0014229771204.164.00
202161健倍苗苗1002021-02-16 23:22:05.595中国银河国际证券(香港)1.20010.72亿None14.17100/1100.00医疗保健80.002021-02-05 00:00:008798122.478.00
302160心通医疗-B4002021-02-16 23:22:05.595摩根大通证券(远东),花旗环球金融亚洲,中国国际金融香港证券12.200288.67亿50.0000None65.57400/161.31医疗保健54.262021-02-04 00:00:00567475769.007.50
406668星盛商业1002021-02-16 23:22:05.595建银国际金融,中信建投(国际)融资3.86038.60亿50.0000None21.50100/10.26居民服务3.632021-01-26 00:00:00331495756.851.29
\n
" }, "metadata": {}, "execution_count": 33 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "industry_list =[]\n", "for industry,sub_df in df.groupby('行业'):\n", " industry_dict ={}\n", " industry_dict['industry']=industry\n", " industry_dict['首日涨幅均值']= round(sub_df['首日涨幅'].mean(),2)\n", " industry_dict['行业个数']= len(sub_df)\n", " industry_dict['首日涨幅波动率']= round(sub_df['首日涨幅'].std(),2)\n", " industry_dict['首日涨幅最大']= round(sub_df['首日涨幅'].max(),2)\n", " industry_dict['首日涨幅最小']= round(sub_df['首日涨幅'].min(),2)\n", " industry_dict['累计涨幅均值']= round(sub_df['累计涨幅'].mean(),2)\n", "\n", " industry_list.append(industry_dict)\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "sorted_result = list(sorted(industry_list,key=lambda x:x.get('首日涨幅均值'),reverse=True))" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "df1= pd.DataFrame(sorted_result)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "df1.to_excel('hk_new_stock.xls',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\nRangeIndex: 844 entries, 0 to 843\nData columns (total 19 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 stock_code 844 non-null object \n 1 stock_name 844 non-null object \n 2 winning_rate_substr 843 non-null object \n 3 crawltime 844 non-null datetime64[ns]\n 4 保荐机构 844 non-null object \n 5 发行定价 844 non-null object \n 6 发行市值 844 non-null object \n 7 回拨比例 843 non-null object \n 8 是否有基石 844 non-null object \n 9 是否有绿鞋 668 non-null object \n 10 暗盘涨幅 843 non-null float64 \n 11 稳中一手 843 non-null object \n 12 累计涨幅 843 non-null float64 \n 13 行业 844 non-null object \n 14 首日涨幅 843 non-null float64 \n 15 上市日期 844 non-null object \n 16 申购人数 843 non-null object \n 17 超额申购倍数 843 non-null float64 \n 18 一手中签率 843 non-null float64 \ndtypes: datetime64[ns](1), float64(5), object(13)\nmemory usage: 125.4+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 暗盘涨幅 累计涨幅 首日涨幅 超额申购倍数 一手中签率\n", "count 843.000000 843.000000 843.000000 843.000000 843.000000\n", "mean 13.731625 3.930486 14.100344 139.656892 62.150629\n", "std 32.942431 117.044810 41.670514 380.552028 36.072675\n", "min -42.500000 -97.550000 -56.880000 0.030000 0.430000\n", "25% -0.885000 -52.040000 -2.640000 3.440000 26.560000\n", "50% 4.170000 -19.940000 2.670000 14.790000 60.070000\n", "75% 18.825000 11.680000 16.835000 81.610000 100.000000\n", "max 575.000000 1496.970000 431.670000 6289.000000 100.000000" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
暗盘涨幅累计涨幅首日涨幅超额申购倍数一手中签率
count843.000000843.000000843.000000843.000000843.000000
mean13.7316253.93048614.100344139.65689262.150629
std32.942431117.04481041.670514380.55202836.072675
min-42.500000-97.550000-56.8800000.0300000.430000
25%-0.885000-52.040000-2.6400003.44000026.560000
50%4.170000-19.9400002.67000014.79000060.070000
75%18.82500011.68000016.83500081.610000100.000000
max575.0000001496.970000431.6700006289.000000100.000000
\n
" }, "metadata": {}, "execution_count": 69 } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "stock_code 01716\n", "stock_name 毛记葵涌\n", "winning_rate_substr 1000\n", "crawltime 2021-02-16 23:22:08.423000\n", "保荐机构 长雄证券\n", "发行定价 1.20\n", "发行市值 3.24亿\n", "回拨比例 50\n", "是否有基石 无\n", "是否有绿鞋 无\n", "暗盘涨幅 575\n", "稳中一手 1000/1\n", "累计涨幅 -23.33\n", "行业 影视传媒\n", "首日涨幅 431.67\n", "上市日期 2018-03-28 00:00:00\n", "申购人数 143001\n", "超额申购倍数 6289\n", "一手中签率 0.8\n", "Name: 469, dtype: object" ] }, "metadata": {}, "execution_count": 71 } ], "source": [ "df.iloc[df['暗盘涨幅'].argmax()]" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "stock_code 01957\n", "stock_name MBV INTL\n", "winning_rate_substr 5\n", "crawltime 2021-02-16 23:22:06.293000\n", "保荐机构 南华融资\n", "发行定价 0.800\n", "发行市值 5.02亿\n", "回拨比例 30\n", "是否有基石 无\n", "是否有绿鞋 有\n", "暗盘涨幅 -42.5\n", "稳中一手 5/1\n", "累计涨幅 -60\n", "行业 纺织服饰\n", "首日涨幅 -56.88\n", "上市日期 2020-07-08 00:00:00\n", "申购人数 14348\n", "超额申购倍数 23.5\n", "一手中签率 65.01\n", "Name: 98, dtype: object" ] }, "metadata": {}, "execution_count": 72 } ], "source": [ "df.iloc[df['暗盘涨幅'].argmin()]" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "df_normal = df1[df1['行业个数']>2]" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [], "source": [ "df_normal.head(10).to_excel('top10.xls')" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "df_normal.tail(10).to_excel('last10.xls')" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\nRangeIndex: 844 entries, 0 to 843\nData columns (total 19 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 stock_code 844 non-null object \n 1 stock_name 844 non-null object \n 2 winning_rate_substr 843 non-null object \n 3 crawltime 844 non-null datetime64[ns]\n 4 保荐机构 844 non-null object \n 5 发行定价 844 non-null object \n 6 发行市值 844 non-null object \n 7 回拨比例 843 non-null object \n 8 是否有基石 844 non-null object \n 9 是否有绿鞋 668 non-null object \n 10 暗盘涨幅 843 non-null float64 \n 11 稳中一手 843 non-null object \n 12 累计涨幅 843 non-null float64 \n 13 行业 844 non-null object \n 14 首日涨幅 843 non-null float64 \n 15 上市日期 844 non-null object \n 16 申购人数 843 non-null object \n 17 超额申购倍数 843 non-null float64 \n 18 一手中签率 843 non-null float64 \ndtypes: datetime64[ns](1), float64(5), object(13)\nmemory usage: 125.4+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "output_type": "error", "ename": "TypeError", "evalue": "int() argument must be a string, a bytes-like object or a number, not 'NoneType'", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'申购人数'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'申购人数'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mint\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36mastype\u001b[1;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[0;32m 5696\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5697\u001b[0m \u001b[1;31m# else, only a single dtype is given\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 5698\u001b[1;33m \u001b[0mnew_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5699\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_constructor\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnew_data\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__finalize__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5700\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\managers.py\u001b[0m in \u001b[0;36mastype\u001b[1;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[0;32m 580\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 581\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mastype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"raise\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 582\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"astype\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 583\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 584\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mconvert\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\managers.py\u001b[0m in \u001b[0;36mapply\u001b[1;34m(self, f, filter, **kwargs)\u001b[0m\n\u001b[0;32m 440\u001b[0m \u001b[0mapplied\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 441\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 442\u001b[1;33m \u001b[0mapplied\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 443\u001b[0m \u001b[0mresult_blocks\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_extend_blocks\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mapplied\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mresult_blocks\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 444\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\blocks.py\u001b[0m in \u001b[0;36mastype\u001b[1;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[0;32m 623\u001b[0m \u001b[0mvals1d\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 624\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 625\u001b[1;33m \u001b[0mvalues\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mastype_nansafe\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvals1d\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 626\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mValueError\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 627\u001b[0m \u001b[1;31m# e.g. astype_nansafe can fail on object-dtype of strings\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\Anaconda3\\lib\\site-packages\\pandas\\core\\dtypes\\cast.py\u001b[0m in \u001b[0;36mastype_nansafe\u001b[1;34m(arr, dtype, copy, skipna)\u001b[0m\n\u001b[0;32m 872\u001b[0m \u001b[1;31m# work around NumPy brokenness, #1987\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 873\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0missubdtype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minteger\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 874\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mastype_intsafe\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 875\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 876\u001b[0m \u001b[1;31m# if we have a datetime/timedelta array of objects\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mpandas\\_libs\\lib.pyx\u001b[0m in \u001b[0;36mpandas._libs.lib.astype_intsafe\u001b[1;34m()\u001b[0m\n", "\u001b[1;31mTypeError\u001b[0m: int() argument must be a string, a bytes-like object or a number, not 'NoneType'" ] } ], "source": [ "df['申购人数']=df['申购人数'].astype(np.int)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "df_people = df[~df['申购人数'].isnull()]" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "844" ] }, "metadata": {}, "execution_count": 87 } ], "source": [ "len(df)" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "843" ] }, "metadata": {}, "execution_count": 88 } ], "source": [ "len(df_people)" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [], "source": [ "import matplotlib\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 91 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "df_people['申购人数']=df_people['申购人数'].astype(np.int)\n", "df_people['申购人数'].plot()" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 92 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "plt.plot(df_people['上市日期'],df_people['申购人数'])" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "new_stock_info_ =[]\n", "for item in db['db_stock']['hk_new_stock'].find({'stock_name':{'$regex':'S'}}):\n", " del item['_id']\n", " new_stock_info_.append(item)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0" ] }, "metadata": {}, "execution_count": 7 } ], "source": [ "len(new_stock_info_)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df=pd.DataFrame(new_stock_info_)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "df=df[df['stock_code']!='01691']" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "df_selected = df[['stock_code','stock_name','暗盘涨幅','首日涨幅','申购人数','上市日期','一手中签率']]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "df_selected.to_html('tb.html',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "source": [ "# 价格分布" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "db=DBSelector()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "conn = db.get_engine('db_stock')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df = pd.read_sql('tb_hk_new_stock',conn)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " id name code issue_date each_hand_stock share_value_Yi \\\n", "0 1 森松国际 02155.HK 2021-06-28 1,000 22.00-24.80 \n", "1 2 越秀服务 06626.HK 2021-06-28 500 72.16-96.41 \n", "2 3 科济药业-B 02171.HK 2021-06-18 500 167.93-186.09 \n", "3 4 优然牧业 09858.HK 2021-06-18 1,000 264.92-328.68 \n", "4 5 时代天使 06699.HK 2021-06-16 200 243.74-286.85 \n", "\n", " margin_price price over_price_part hit_least_num hit_ratio \\\n", "0 2.20-2.48 2.48 22.7 25 80.0 \n", "1 4.88-6.52 4.88 8.9 12 50.0 \n", "2 29.60-32.80 32.80 433.6 70 5.0 \n", "3 6.98-8.66 6.98 2.7 3 80.0 \n", "4 147.00-173.00 173.00 2,078.2 750 1.5 \n", "\n", " current_price first_day_raise accumulate_raise crawltime \n", "0 8.90 258.870 258.871 2021-06-29 09:19:36 \n", "1 4.88 0.000 0.000 2021-06-29 09:19:36 \n", "2 31.70 -8.537 -3.354 2021-06-29 09:19:36 \n", "3 6.12 -11.891 -12.321 2021-06-29 09:19:36 \n", "4 402.00 131.792 132.370 2021-06-29 09:19:36 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idnamecodeissue_dateeach_hand_stockshare_value_Yimargin_pricepriceover_price_parthit_least_numhit_ratiocurrent_pricefirst_day_raiseaccumulate_raisecrawltime
01森松国际02155.HK2021-06-281,00022.00-24.802.20-2.482.4822.72580.08.90258.870258.8712021-06-29 09:19:36
12越秀服务06626.HK2021-06-2850072.16-96.414.88-6.524.888.91250.04.880.0000.0002021-06-29 09:19:36
23科济药业-B02171.HK2021-06-18500167.93-186.0929.60-32.8032.80433.6705.031.70-8.537-3.3542021-06-29 09:19:36
34优然牧业09858.HK2021-06-181,000264.92-328.686.98-8.666.982.7380.06.12-11.891-12.3212021-06-29 09:19:36
45时代天使06699.HK2021-06-16200243.74-286.85147.00-173.00173.002,078.27501.5402.00131.792132.3702021-06-29 09:19:36
\n
" }, "metadata": {}, "execution_count": 7 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def convert_digit(x):\n", " return int(x.replace(',',''))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "df['each_hand_stock']=df['each_hand_stock'].map(convert_digit)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " id name code issue_date each_hand_stock share_value_Yi \\\n", "0 1 森松国际 02155.HK 2021-06-28 1000 22.00-24.80 \n", "1 2 越秀服务 06626.HK 2021-06-28 500 72.16-96.41 \n", "2 3 科济药业-B 02171.HK 2021-06-18 500 167.93-186.09 \n", "3 4 优然牧业 09858.HK 2021-06-18 1000 264.92-328.68 \n", "4 5 时代天使 06699.HK 2021-06-16 200 243.74-286.85 \n", "\n", " margin_price price over_price_part hit_least_num hit_ratio \\\n", "0 2.20-2.48 2.48 22.7 25 80.0 \n", "1 4.88-6.52 4.88 8.9 12 50.0 \n", "2 29.60-32.80 32.80 433.6 70 5.0 \n", "3 6.98-8.66 6.98 2.7 3 80.0 \n", "4 147.00-173.00 173.00 2,078.2 750 1.5 \n", "\n", " current_price first_day_raise accumulate_raise crawltime \n", "0 8.90 258.870 258.871 2021-06-29 09:19:36 \n", "1 4.88 0.000 0.000 2021-06-29 09:19:36 \n", "2 31.70 -8.537 -3.354 2021-06-29 09:19:36 \n", "3 6.12 -11.891 -12.321 2021-06-29 09:19:36 \n", "4 402.00 131.792 132.370 2021-06-29 09:19:36 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idnamecodeissue_dateeach_hand_stockshare_value_Yimargin_pricepriceover_price_parthit_least_numhit_ratiocurrent_pricefirst_day_raiseaccumulate_raisecrawltime
01森松国际02155.HK2021-06-28100022.00-24.802.20-2.482.4822.72580.08.90258.870258.8712021-06-29 09:19:36
12越秀服务06626.HK2021-06-2850072.16-96.414.88-6.524.888.91250.04.880.0000.0002021-06-29 09:19:36
23科济药业-B02171.HK2021-06-18500167.93-186.0929.60-32.8032.80433.6705.031.70-8.537-3.3542021-06-29 09:19:36
34优然牧业09858.HK2021-06-181000264.92-328.686.98-8.666.982.7380.06.12-11.891-12.3212021-06-29 09:19:36
45时代天使06699.HK2021-06-16200243.74-286.85147.00-173.00173.002,078.27501.5402.00131.792132.3702021-06-29 09:19:36
\n
" }, "metadata": {}, "execution_count": 10 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "df['one_hand_capital']=df['each_hand_stock']*df['price']" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "count 352.000000\n", "mean 4999.548295\n", "std 4587.291903\n", "min 2000.000000\n", "25% 2500.000000\n", "50% 3250.000000\n", "75% 5000.000000\n", "max 34600.000000\n", "Name: one_hand_capital, dtype: float64" ] }, "metadata": {}, "execution_count": 13 } ], "source": [ "df['one_hand_capital'].describe()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "x=df['name'].tolist()\n", "y=df['one_hand_capital'].tolist()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "from pyecharts import options as opts\n", "from pyecharts.charts import Scatter\n", "from pyecharts.commons.utils import JsCode\n", "\n", "\n", "c = (\n", " Scatter()\n", " .add_xaxis(x)\n", " .add_yaxis(\n", " \"一手资金分布\",\n", " y,\n", " label_opts=opts.LabelOpts(\n", " formatter=JsCode(\n", " \"function(params){return params.value[1] +' : '+ params.value[2];}\"\n", " )\n", " ),\n", " )\n", " .set_global_opts(\n", " title_opts=opts.TitleOpts(title=\"Scatter-多维度数据\"),\n", " tooltip_opts=opts.TooltipOpts(\n", " formatter=JsCode(\n", " \"function (params) {return params.name + ' : ' + params.value[2];}\"\n", " )\n", " ),\n", " visualmap_opts=opts.VisualMapOpts(\n", " type_=\"color\", max_=150, min_=20, dimension=1\n", " ),\n", " )\n", " .render(\"scatter_multi_dimension.html\")\n", ")" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "bins=range(0,44000,2000)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[1000,\n", " 3000,\n", " 5000,\n", " 7000,\n", " 9000,\n", " 11000,\n", " 13000,\n", " 15000,\n", " 17000,\n", " 19000,\n", " 21000,\n", " 23000,\n", " 25000,\n", " 27000,\n", " 29000,\n", " 31000,\n", " 33000,\n", " 35000,\n", " 37000,\n", " 39000,\n", " 41000]" ] }, "metadata": {}, "execution_count": 26 } ], "source": [ "list(bins)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "labels=[str(i) for i in bins[:-1]]" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['1000',\n", " '3000',\n", " '5000',\n", " '7000',\n", " '9000',\n", " '11000',\n", " '13000',\n", " '15000',\n", " '17000',\n", " '19000',\n", " '21000',\n", " '23000',\n", " '25000',\n", " '27000',\n", " '29000',\n", " '31000',\n", " '33000',\n", " '35000',\n", " '37000',\n", " '39000']" ] }, "metadata": {}, "execution_count": 28 } ], "source": [ "labels" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "df['one_hand_capital_category']=pd.cut(df['one_hand_capital'],bins,labels=labels)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "0 25\n2000 205\n4000 53\n6000 17\n8000 11\n10000 13\n12000 9\n14000 4\n16000 9\n18000 0\n20000 1\n22000 0\n24000 0\n26000 2\n28000 2\n30000 0\n32000 0\n34000 1\n36000 0\n38000 0\n40000 0\n" ] } ], "source": [ "for cat,row in df.groupby('one_hand_capital_category'):\n", " print(cat,len(row))" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "6" ] }, "metadata": {}, "execution_count": 39 } ], "source": [ "len(df[df['one_hand_capital']>20000])" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " id name code issue_date each_hand_stock share_value_Yi \\\n", "2 3 科济药业-B 02171.HK 2021-06-18 500 167.93-186.09 \n", "4 5 时代天使 06699.HK 2021-06-16 200 243.74-286.85 \n", "10 11 携程集团-S 09961.HK 2021-04-19 50 2,106.93 \n", "13 14 百融云-W 06608.HK 2021-03-31 500 131.25-157.50 \n", "15 16 哔哩哔哩-SW 09626.HK 2021-03-29 20 3,760.45 \n", "16 17 智欣集团控股 02187.HK 2021-03-26 8000 11.22 \n", "17 18 百度集团-SW 09888.HK 2021-03-23 50 8,345.08 \n", "19 20 汽车之家-S 02518.HK 2021-03-15 100 1,282.64 \n", "23 24 昭衍新药 06127.HK 2021-02-26 100 20.74-23.55 \n", "25 26 诺辉健康-B 06606.HK 2021-02-18 500 94.87-111.43 \n", "26 27 贝康医疗-B 02170.HK 2021-02-08 500 21.33-22.14 \n", "27 28 快手-W 01024.HK 2021-02-05 100 4,366.88-4,782.77 \n", "29 30 心通医疗-B 02160.HK 2021-02-04 1000 266.07-292.44 \n", "56 113 和铂医药-B 02142.HK 2020-12-10 1000 89.84-99.21 \n", "64 121 融创服务 01516.HK 2020-11-19 1000 327.42-392.59 \n", "70 127 新东方-S 09901.HK 2020-11-09 10 2,380.62 \n", "71 128 荣昌生物-B 09995.HK 2020-11-09 500 53.75-55.68 \n", "72 129 药明巨诺-B 02126.HK 2020-11-03 500 75.24-89.53 \n", "74 131 世茂服务 00873.HK 2020-10-30 1000 348.24-404.71 \n", "77 134 先声药业 02096.HK 2020-10-27 1000 315.29-356.98 \n", "82 139 卓越商企服务 06989.HK 2020-10-19 1000 111.60-128.16 \n", "87 144 云顶新耀-B 01952.HK 2020-10-09 500 146.61-161.27 \n", "88 145 嘉和生物-B 06998.HK 2020-10-07 500 99.68-117.85 \n", "90 147 中通快递-SW 02057.HK 2020-09-29 50 2,292.21 \n", "93 150 再鼎医药-SB 09688.HK 2020-09-28 50 570.40 \n", "94 151 明源云 00909.HK 2020-09-25 1000 280.65-308.72 \n", "96 153 华住集团-S 01179.HK 2020-09-22 50 1,168.21 \n", "100 157 百胜中国-S 09987.HK 2020-09-10 50 1,961.42 \n", "114 171 祖龙娱乐 09990.HK 2020-07-15 1000 79.92-94.60 \n", "120 177 思摩尔国际 06969.HK 2020-07-10 1000 559.65-722.88 \n", "121 178 永泰生物-B 06978.HK 2020-07-10 1000 54.03-56.60 \n", "132 189 京东集团-SW 09618.HK 2020-06-18 50 7,293.28 \n", "133 190 网易-S 09999.HK 2020-06-11 100 4,321.04 \n", "137 194 开拓药业-B 09939.HK 2020-05-22 500 65.75-74.43 \n", "140 197 沛嘉医疗-B 09996.HK 2020-05-15 1000 93.70 \n", "145 202 康方生物-B 09926.HK 2020-04-24 1000 113.55-123.47 \n", "202 259 康宁杰瑞制药-B 09966.HK 2019-12-12 1000 84.08-94.24 \n", "204 261 启明医疗-B 02500.HK 2019-12-10 500 49.57-56.41 \n", "210 267 阿里巴巴-SW 09988.HK 2019-11-26 100 40,348.15 \n", "285 342 锦欣生殖 01951.HK 2019-06-25 2000 188.91-207.90 \n", "290 347 翰森制药 03692.HK 2019-06-14 2000 745.19-813.66 \n", "\n", " margin_price price over_price_part hit_least_num hit_ratio \\\n", "2 29.60-32.80 32.80 433.6 70 5.0 \n", "4 147.00-173.00 173.00 2,078.2 750 1.5 \n", "10 333.00 268.00 16.8 18 35.0 \n", "13 26.50-31.80 31.80 149.7 30 10.0 \n", "15 988.00 808.00 173.2 25 10.0 \n", "16 1.50 1.50 24.2 45 10.0 \n", "17 295.00 252.00 111.0 50 15.0 \n", "19 251.80 176.30 9.7 100 35.0 \n", "23 133.00-151.00 151.00 309.0 60 5.0 \n", "25 22.70-26.66 26.66 4,132.2 4000 2.0 \n", "26 26.36-27.36 27.36 401.8 200 10.0 \n", "27 105.00-115.00 115.00 1,203.2 500 4.0 \n", "29 11.10-12.20 12.20 768.0 400 7.5 \n", "56 11.70-12.92 12.38 77.5 20 10.0 \n", "64 10.55-12.65 11.60 9.4 15 30.0 \n", "70 1,399.00 1190.00 0.6 1 100.0 \n", "71 50.30-52.10 52.10 52.4 5 90.0 \n", "72 20.00-23.80 23.80 448.4 80 5.0 \n", "74 14.80-17.20 16.60 12.9 20 50.0 \n", "77 12.10-13.70 13.70 588.5 90 5.0 \n", "82 9.30-10.68 10.68 651.1 100 10.0 \n", "87 50.00-55.00 55.00 653.4 80 2.0 \n", "88 20.30-24.00 24.00 1,246.5 180 3.0 \n", "90 268.00 218.00 5.7 10 70.0 \n", "93 648.00 562.00 2.4 3 50.0 \n", "94 15.00-16.50 16.50 643.3 150 10.0 \n", "96 368.00 297.00 2.4 1 100.0 \n", "100 468.00 412.00 51.3 14 25.0 \n", "114 9.80-11.60 11.60 122.0 20 20.0 \n", "120 9.60-12.40 12.40 115.0 20 20.0 \n", "121 10.50-11.00 11.00 258.6 100 20.0 \n", "132 236.00 226.00 177.9 40 10.0 \n", "133 126.00 123.00 359.5 45 8.0 \n", "137 17.80-20.15 20.15 550.3 90 10.0 \n", "140 15.36 15.36 1,183.4 200 8.5 \n", "145 14.88-16.18 16.18 638.2 100 12.0 \n", "202 9.10-10.20 10.20 191.1 15 40.0 \n", "204 29.00-33.00 33.00 311.4 30 30.0 \n", "210 188.00 176.00 41.4 5 80.0 \n", "285 7.76-8.54 8.54 98.3 7 65.0 \n", "290 13.06-14.26 14.26 10.8 4 60.0 \n", "\n", " current_price first_day_raise accumulate_raise crawltime \\\n", "2 31.70 -8.537 -3.354 2021-06-29 09:19:36 \n", "4 402.00 131.792 132.370 2021-06-29 09:19:36 \n", "10 279.00 4.552 4.104 2021-06-29 09:19:36 \n", "13 20.90 -16.038 -34.277 2021-06-29 09:19:36 \n", "15 979.00 -0.990 21.163 2021-06-29 09:19:36 \n", "16 1.21 -29.333 -19.333 2021-06-29 09:19:36 \n", "17 196.70 0.000 -21.944 2021-06-29 09:19:36 \n", "19 126.00 2.099 -28.531 2021-06-29 09:19:42 \n", "23 128.80 -8.609 -14.702 2021-06-29 09:19:43 \n", "25 83.10 215.079 211.703 2021-06-29 09:19:43 \n", "26 22.75 1.243 -16.849 2021-06-29 09:19:43 \n", "27 205.20 160.870 78.435 2021-06-29 09:19:43 \n", "29 16.68 54.262 36.721 2021-06-29 09:19:43 \n", "56 9.92 -10.985 -19.871 2021-06-29 09:20:03 \n", "64 28.00 21.897 141.379 2021-06-29 09:20:03 \n", "70 63.85 14.710 -94.634 2021-06-29 09:20:03 \n", "71 123.40 33.973 136.852 2021-06-29 09:20:03 \n", "72 29.00 -7.563 21.849 2021-06-29 09:20:03 \n", "74 25.65 0.000 54.518 2021-06-29 09:20:03 \n", "77 13.30 -19.854 -2.920 2021-06-29 09:20:12 \n", "82 8.77 2.996 -17.884 2021-06-29 09:20:13 \n", "87 77.35 32.273 40.636 2021-06-29 09:20:13 \n", "88 18.94 16.458 -21.083 2021-06-29 09:20:13 \n", "90 236.40 9.174 8.440 2021-06-29 09:20:13 \n", "93 1356.00 8.541 141.281 2021-06-29 09:20:13 \n", "94 39.30 86.061 138.182 2021-06-29 09:20:19 \n", "96 NaN 4.714 NaN 2021-06-29 09:20:19 \n", "100 510.00 -5.291 23.786 2021-06-29 09:20:19 \n", "114 14.80 75.000 27.586 2021-06-29 09:20:28 \n", "120 45.40 150.000 266.129 2021-06-29 09:20:28 \n", "121 18.28 40.727 66.182 2021-06-29 09:20:28 \n", "132 303.00 3.540 34.071 2021-06-29 09:20:28 \n", "133 178.60 5.691 45.203 2021-06-29 09:20:34 \n", "137 65.60 6.700 225.558 2021-06-29 09:20:34 \n", "140 37.40 67.969 143.490 2021-06-29 09:20:34 \n", "145 64.60 50.185 299.258 2021-06-29 09:20:34 \n", "202 26.10 32.353 155.882 2021-06-29 09:21:11 \n", "204 68.85 30.455 108.636 2021-06-29 09:21:11 \n", "210 224.00 6.591 27.273 2021-06-29 09:21:11 \n", "285 20.20 8.665 136.534 2021-06-29 09:21:49 \n", "290 35.35 36.746 147.896 2021-06-29 09:21:49 \n", "\n", " one_hand_capital one_hand_capital_category \n", "2 16400.0 16000 \n", "4 34600.0 34000 \n", "10 13400.0 12000 \n", "13 15900.0 14000 \n", "15 16160.0 16000 \n", "16 12000.0 10000 \n", "17 12600.0 12000 \n", "19 17630.0 16000 \n", "23 15100.0 14000 \n", "25 13330.0 12000 \n", "26 13680.0 12000 \n", "27 11500.0 10000 \n", "29 12200.0 12000 \n", "56 12380.0 12000 \n", "64 11600.0 10000 \n", "70 11900.0 10000 \n", "71 26050.0 26000 \n", "72 11900.0 10000 \n", "74 16600.0 16000 \n", "77 13700.0 12000 \n", "82 10680.0 10000 \n", "87 27500.0 26000 \n", "88 12000.0 10000 \n", "90 10900.0 10000 \n", "93 28100.0 28000 \n", "94 16500.0 16000 \n", "96 14850.0 14000 \n", "100 20600.0 20000 \n", "114 11600.0 10000 \n", "120 12400.0 12000 \n", "121 11000.0 10000 \n", "132 11300.0 10000 \n", "133 12300.0 12000 \n", "137 10075.0 10000 \n", "140 15360.0 14000 \n", "145 16180.0 16000 \n", "202 10200.0 10000 \n", "204 16500.0 16000 \n", "210 17600.0 16000 \n", "285 17080.0 16000 \n", "290 28520.0 28000 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idnamecodeissue_dateeach_hand_stockshare_value_Yimargin_pricepriceover_price_parthit_least_numhit_ratiocurrent_pricefirst_day_raiseaccumulate_raisecrawltimeone_hand_capitalone_hand_capital_category
23科济药业-B02171.HK2021-06-18500167.93-186.0929.60-32.8032.80433.6705.031.70-8.537-3.3542021-06-29 09:19:3616400.016000
45时代天使06699.HK2021-06-16200243.74-286.85147.00-173.00173.002,078.27501.5402.00131.792132.3702021-06-29 09:19:3634600.034000
1011携程集团-S09961.HK2021-04-19502,106.93333.00268.0016.81835.0279.004.5524.1042021-06-29 09:19:3613400.012000
1314百融云-W06608.HK2021-03-31500131.25-157.5026.50-31.8031.80149.73010.020.90-16.038-34.2772021-06-29 09:19:3615900.014000
1516哔哩哔哩-SW09626.HK2021-03-29203,760.45988.00808.00173.22510.0979.00-0.99021.1632021-06-29 09:19:3616160.016000
1617智欣集团控股02187.HK2021-03-26800011.221.501.5024.24510.01.21-29.333-19.3332021-06-29 09:19:3612000.010000
1718百度集团-SW09888.HK2021-03-23508,345.08295.00252.00111.05015.0196.700.000-21.9442021-06-29 09:19:3612600.012000
1920汽车之家-S02518.HK2021-03-151001,282.64251.80176.309.710035.0126.002.099-28.5312021-06-29 09:19:4217630.016000
2324昭衍新药06127.HK2021-02-2610020.74-23.55133.00-151.00151.00309.0605.0128.80-8.609-14.7022021-06-29 09:19:4315100.014000
2526诺辉健康-B06606.HK2021-02-1850094.87-111.4322.70-26.6626.664,132.240002.083.10215.079211.7032021-06-29 09:19:4313330.012000
2627贝康医疗-B02170.HK2021-02-0850021.33-22.1426.36-27.3627.36401.820010.022.751.243-16.8492021-06-29 09:19:4313680.012000
2728快手-W01024.HK2021-02-051004,366.88-4,782.77105.00-115.00115.001,203.25004.0205.20160.87078.4352021-06-29 09:19:4311500.010000
2930心通医疗-B02160.HK2021-02-041000266.07-292.4411.10-12.2012.20768.04007.516.6854.26236.7212021-06-29 09:19:4312200.012000
56113和铂医药-B02142.HK2020-12-10100089.84-99.2111.70-12.9212.3877.52010.09.92-10.985-19.8712021-06-29 09:20:0312380.012000
64121融创服务01516.HK2020-11-191000327.42-392.5910.55-12.6511.609.41530.028.0021.897141.3792021-06-29 09:20:0311600.010000
70127新东方-S09901.HK2020-11-09102,380.621,399.001190.000.61100.063.8514.710-94.6342021-06-29 09:20:0311900.010000
71128荣昌生物-B09995.HK2020-11-0950053.75-55.6850.30-52.1052.1052.4590.0123.4033.973136.8522021-06-29 09:20:0326050.026000
72129药明巨诺-B02126.HK2020-11-0350075.24-89.5320.00-23.8023.80448.4805.029.00-7.56321.8492021-06-29 09:20:0311900.010000
74131世茂服务00873.HK2020-10-301000348.24-404.7114.80-17.2016.6012.92050.025.650.00054.5182021-06-29 09:20:0316600.016000
77134先声药业02096.HK2020-10-271000315.29-356.9812.10-13.7013.70588.5905.013.30-19.854-2.9202021-06-29 09:20:1213700.012000
82139卓越商企服务06989.HK2020-10-191000111.60-128.169.30-10.6810.68651.110010.08.772.996-17.8842021-06-29 09:20:1310680.010000
87144云顶新耀-B01952.HK2020-10-09500146.61-161.2750.00-55.0055.00653.4802.077.3532.27340.6362021-06-29 09:20:1327500.026000
88145嘉和生物-B06998.HK2020-10-0750099.68-117.8520.30-24.0024.001,246.51803.018.9416.458-21.0832021-06-29 09:20:1312000.010000
90147中通快递-SW02057.HK2020-09-29502,292.21268.00218.005.71070.0236.409.1748.4402021-06-29 09:20:1310900.010000
93150再鼎医药-SB09688.HK2020-09-2850570.40648.00562.002.4350.01356.008.541141.2812021-06-29 09:20:1328100.028000
94151明源云00909.HK2020-09-251000280.65-308.7215.00-16.5016.50643.315010.039.3086.061138.1822021-06-29 09:20:1916500.016000
96153华住集团-S01179.HK2020-09-22501,168.21368.00297.002.41100.0NaN4.714NaN2021-06-29 09:20:1914850.014000
100157百胜中国-S09987.HK2020-09-10501,961.42468.00412.0051.31425.0510.00-5.29123.7862021-06-29 09:20:1920600.020000
114171祖龙娱乐09990.HK2020-07-15100079.92-94.609.80-11.6011.60122.02020.014.8075.00027.5862021-06-29 09:20:2811600.010000
120177思摩尔国际06969.HK2020-07-101000559.65-722.889.60-12.4012.40115.02020.045.40150.000266.1292021-06-29 09:20:2812400.012000
121178永泰生物-B06978.HK2020-07-10100054.03-56.6010.50-11.0011.00258.610020.018.2840.72766.1822021-06-29 09:20:2811000.010000
132189京东集团-SW09618.HK2020-06-18507,293.28236.00226.00177.94010.0303.003.54034.0712021-06-29 09:20:2811300.010000
133190网易-S09999.HK2020-06-111004,321.04126.00123.00359.5458.0178.605.69145.2032021-06-29 09:20:3412300.012000
137194开拓药业-B09939.HK2020-05-2250065.75-74.4317.80-20.1520.15550.39010.065.606.700225.5582021-06-29 09:20:3410075.010000
140197沛嘉医疗-B09996.HK2020-05-15100093.7015.3615.361,183.42008.537.4067.969143.4902021-06-29 09:20:3415360.014000
145202康方生物-B09926.HK2020-04-241000113.55-123.4714.88-16.1816.18638.210012.064.6050.185299.2582021-06-29 09:20:3416180.016000
202259康宁杰瑞制药-B09966.HK2019-12-12100084.08-94.249.10-10.2010.20191.11540.026.1032.353155.8822021-06-29 09:21:1110200.010000
204261启明医疗-B02500.HK2019-12-1050049.57-56.4129.00-33.0033.00311.43030.068.8530.455108.6362021-06-29 09:21:1116500.016000
210267阿里巴巴-SW09988.HK2019-11-2610040,348.15188.00176.0041.4580.0224.006.59127.2732021-06-29 09:21:1117600.016000
285342锦欣生殖01951.HK2019-06-252000188.91-207.907.76-8.548.5498.3765.020.208.665136.5342021-06-29 09:21:4917080.016000
290347翰森制药03692.HK2019-06-142000745.19-813.6613.06-14.2614.2610.8460.035.3536.746147.8962021-06-29 09:21:4928520.028000
\n
" }, "metadata": {}, "execution_count": 42 } ], "source": [ "df[df['one_hand_capital']>10000]" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 49 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAD4CAYAAAANbUbJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAUp0lEQVR4nO3df6zd9X3f8edrkJAfN+FHHa48g2ZSudkIzlK4Y+kyRfeOptAkipnUSEakMxOTtY1kbCLazCKN7g801qmdMqXZ5BUUd0TcUJoOD5Y2zO1dNCmB2gmJMYTiFkZsKF6WQHOzjtbpe3/cL8mZufY9Pj987snn+ZCsc87n+znn+7pf26/7vZ97fqSqkCT9aPsLkw4gSRo/y16SGmDZS1IDLHtJaoBlL0kNOHvSAQA2bNhQmzdvnnSMvn3ve9/jjW9846RjnLZpzQ1mn4RpzQ3tZD9w4MC3quot/cxdF2W/efNm9u/fP+kYfVtaWmJ+fn7SMU7btOYGs0/CtOaGdrIn+Z/9Pq7LOJLUAMtekhpg2UtSAyx7SWqAZS9JDbDsJakBlr0kNcCyl6QGWPaS1IB18QraYW3e9WBf85654/1jTiJJ65Nn9pLUgDXLPsldSY4leeyE8Y8meTLJoSS/2DN+a5LD3barxxFaknR6+lnG+TTwSeDXXhlIsgBsA95RVS8nubAbvxTYDrwd+IvAf0vyE1X1/VEHlyT1b80z+6r6IvDtE4b/AXBHVb3czTnWjW8DFqvq5ap6GjgMXDnCvJKkAaSq1p6UbAYeqKrLutuPAvcD1wD/F/hYVf1ekk8CX66qu7t5dwKfr6r7VnnMncBOgNnZ2SsWFxcH/iIOHn2pr3lbN5078D56LS8vMzMzM5LHOpOmNTeYfRKmNTe0k31hYeFAVc31M3fQZ+OcDZwPvAv4a8C9Sd4KZJW5q343qardwG6Aubm5Gua9p2/o99k41w++j17T+l7Z05obzD4J05obzL6aQZ+NcwT4XK14BPhzYEM3fnHPvIuA54aLKEka1qBl/5+BvwWQ5CeA1wLfAvYC25Ock+QSYAvwyCiCSpIGt+YyTpJ7gHlgQ5IjwG3AXcBd3dMx/xTYUSuL/4eS3As8DhwHbvKZOJI0eWuWfVVdd5JNHz7J/NuB24cJJUkaLV9BK0kNsOwlqQGWvSQ1wLKXpAZY9pLUAMtekhpg2UtSAyx7SWqAZS9JDbDsJakBlr0kNcCyl6QGWPaS1ADLXpIaYNlLUgMse0lqwJpln+SuJMe6T6U6cdvHklSSDT1jtyY5nOTJJFePOrAk6fT1c2b/aeCaEweTXAy8F3i2Z+xSYDvw9u4+n0py1kiSSpIGtmbZV9UXgW+vsunfAv8UqJ6xbcBiVb1cVU8Dh4ErRxFUkjS4rHxO+BqTks3AA1V1WXf7g8BVVXVzkmeAuar6VpJPAl+uqru7eXcCn6+q+1Z5zJ3AToDZ2dkrFhcXB/4iDh59qa95WzedO/A+ei0vLzMzMzOSxzqTpjU3mH0SpjU3tJN9YWHhQFXN9TN3zQ8cP1GSNwAfB35mtc2rjK363aSqdgO7Aebm5mp+fv50o/zADbse7GveM9cPvo9eS0tLDJN3UqY1N5h9EqY1N5h9Nadd9sCPA5cAX0sCcBHwlSRXAkeAi3vmXgQ8N2xISdJwTvupl1V1sKourKrNVbWZlYK/vKr+CNgLbE9yTpJLgC3AIyNNLEk6bf089fIe4EvA25IcSXLjyeZW1SHgXuBx4LeAm6rq+6MKK0kazJrLOFV13RrbN59w+3bg9uFiSZJGyVfQSlIDLHtJaoBlL0kNsOwlqQGWvSQ1wLKXpAZY9pLUAMtekhpg2UtSAyx7SWqAZS9JDbDsJakBlr0kNcCyl6QGWPaS1ADLXpIa0M8nVd2V5FiSx3rG/k2SbyT5epLfTHJez7ZbkxxO8mSSq8cVXJLUv37O7D8NXHPC2EPAZVX1DuD3gVsBklwKbAfe3t3nU0nOGllaSdJA1iz7qvoi8O0Txr5QVce7m18GLuqubwMWq+rlqnoaOAxcOcK8kqQBpKrWnpRsBh6oqstW2fZfgM9W1d1JPgl8uaru7rbdCXy+qu5b5X47gZ0As7OzVywuLg78RRw8+lJf87ZuOnfgffRaXl5mZmZmJI91Jk1rbjD7JExrbmgn+8LCwoGqmutn7pofOH4qST4OHAc+88rQKtNW/W5SVbuB3QBzc3M1Pz8/cI4bdj3Y17xnrh98H72WlpYYJu+kTGtuMPskTGtuMPtqBi77JDuADwBX1Q9/PDgCXNwz7SLgucHjSZJGYaCnXia5BvhnwAer6v/0bNoLbE9yTpJLgC3AI8PHlCQNY80z+yT3APPAhiRHgNtYefbNOcBDSWBlnf7vV9WhJPcCj7OyvHNTVX1/XOElSf1Zs+yr6rpVhu88xfzbgduHCSVJGi1fQStJDbDsJakBlr0kNcCyl6QGWPaS1ADLXpIaYNlLUgMse0lqgGUvSQ2w7CWpAZa9JDXAspekBlj2ktQAy16SGmDZS1IDLHtJasCaZZ/kriTHkjzWM3ZBkoeSPNVdnt+z7dYkh5M8meTqcQWXJPWvnzP7TwPXnDC2C9hXVVuAfd1tklwKbAfe3t3nU0nOGllaSdJA1iz7qvoi8O0ThrcBe7rre4Bre8YXq+rlqnoaOAxcOaKskqQBDbpmP1tVzwN0lxd245uAb/bMO9KNSZImKFW19qRkM/BAVV3W3X6xqs7r2f6dqjo/ya8AX6qqu7vxO4H/WlW/scpj7gR2AszOzl6xuLg48Bdx8OhLfc3buuncgffRa3l5mZmZmZE81pk0rbnB7JMwrbmhnewLCwsHqmqun7lnD5jnhSQbq+r5JBuBY934EeDinnkXAc+t9gBVtRvYDTA3N1fz8/MDRoEbdj3Y17xnrh98H72WlpYYJu+kTGtuMPskTGtuMPtqBl3G2Qvs6K7vAO7vGd+e5JwklwBbgEeGiyhJGtaaZ/ZJ7gHmgQ1JjgC3AXcA9ya5EXgW+BBAVR1Kci/wOHAcuKmqvj+m7JKkPq1Z9lV13Uk2XXWS+bcDtw8TSpI0Wr6CVpIaYNlLUgMse0lqgGUvSQ2w7CWpAZa9JDXAspekBlj2ktQAy16SGmDZS1IDLHtJaoBlL0kNsOwlqQGWvSQ1wLKXpAZY9pLUAMtekhowVNkn+SdJDiV5LMk9SV6X5IIkDyV5qrs8f1RhJUmDGbjsk2wC/hEwV1WXAWcB24FdwL6q2gLs625LkiZo2GWcs4HXJzkbeAPwHLAN2NNt3wNcO+Q+JElDSlUNfufkZlY+XPxPgC9U1fVJXqyq83rmfKeqXrWUk2QnsBNgdnb2isXFxYFzHDz6Ul/ztm46d+B99FpeXmZmZmYkj3UmTWtuMPskTGtuaCf7wsLCgaqa62fu2YMG6tbitwGXAC8Cv57kw/3ev6p2A7sB5ubman5+ftAo3LDrwb7mPXP94PvotbS0xDB5J2Vac4PZJ2Fac4PZVzPMMs5PA09X1f+qqj8DPgf8DeCFJBsBustjw8eUJA1jmLJ/FnhXkjckCXAV8ASwF9jRzdkB3D9cREnSsAZexqmqh5PcB3wFOA58lZVlmRng3iQ3svIN4UOjCCpJGtzAZQ9QVbcBt50w/DIrZ/mSpHXCV9BKUgMse0lqgGUvSQ2w7CWpAZa9JDVgqGfjTJvN/b7S9o73jzmJJJ1ZntlLUgMse0lqgGUvSQ2w7CWpAZa9JDXAspekBlj2ktQAy16SGmDZS1IDLHtJasBQZZ/kvCT3JflGkieS/FSSC5I8lOSp7vL8UYWVJA1m2DP7TwC/VVV/GfirrHwG7S5gX1VtAfZ1tyVJEzRw2Sd5M/Ae4E6AqvrTqnoR2Abs6abtAa4dNqQkaTipqsHumLyTlQ8Yf5yVs/oDwM3A0ao6r2fed6rqVUs5SXYCOwFmZ2evWFxcHCgHwMGjLw1839Vs3XTuKbcvLy8zMzMz0n2eCdOaG8w+CdOaG9rJvrCwcKCq5vqZO0zZzwFfBt5dVQ8n+QTwx8BH+yn7XnNzc7V///6BckD/b13cr7Xe4nhpaYn5+fmR7vNMmNbcYPZJmNbc0E72JH2X/TBr9keAI1X1cHf7PuBy4IUkG7sgG4FjQ+xDkjQCA5d9Vf0R8M0kb+uGrmJlSWcvsKMb2wHcP1RCSdLQhv2kqo8Cn0nyWuAPgb/LyjeQe5PcCDwLfGjIfUiShjRU2VfVo8Bq60VXDfO4kqTR8hW0ktQAy16SGmDZS1IDLHtJaoBlL0kNsOwlqQGWvSQ1wLKXpAZY9pLUAMtekhpg2UtSAyx7SWqAZS9JDbDsJakBlr0kNcCyl6QGDF32Sc5K8tUkD3S3L0jyUJKnustTfti4JGn8RnFmfzPwRM/tXcC+qtoC7OtuS5ImaKiyT3IR8H7gV3uGtwF7uut7gGuH2YckaXipqsHvnNwH/CvgTcDHquoDSV6sqvN65nynql61lJNkJ7ATYHZ29orFxcWBcxw8+tLA913N1k3nnnL78vIyMzMzI93nmTCtucHskzCtuaGd7AsLCweqarXPAX+VgT9wPMkHgGNVdSDJ/Onev6p2A7sB5ubman7+tB/iB27Y9eDA913NM9fPn3L70tISw+SdlGnNDWafhGnNDWZfzcBlD7wb+GCS9wGvA96c5G7ghSQbq+r5JBuBY6MIKkka3MBr9lV1a1VdVFWbge3A71TVh4G9wI5u2g7g/qFTSpKGMo7n2d8BvDfJU8B7u9uSpAkaZhnnB6pqCVjqrv9v4KpRPK4kaTR8Ba0kNcCyl6QGWPaS1ICRrNn/qNm8xvP2b9l6nBt2Pcgzd7z/DCWSpOF4Zi9JDbDsJakBlr0kNcCyl6QGWPaS1ADLXpIaYNlLUgMse0lqgGUvSQ2w7CWpAZa9JDXAspekBgxc9kkuTvK7SZ5IcijJzd34BUkeSvJUd3n+6OJKkgYxzJn9ceCWqvorwLuAm5JcCuwC9lXVFmBfd1uSNEHDfOD481X1le76d4EngE3ANmBPN20PcO2wISVJwxnJmn2SzcBPAg8Ds1X1PKx8QwAuHMU+JEmDS1UN9wDJDPDfgdur6nNJXqyq83q2f6eqXrVun2QnsBNgdnb2isXFxYEzHDz60sD3HcTs6+GFP4Gtm849o/sd1vLyMjMzM5OOMRCzn3nTmhvayb6wsHCgqub6mTtU2Sd5DfAA8NtV9cvd2JPAfFU9n2QjsFRVbzvV48zNzdX+/fsHzrHWJ0uN2i1bj/NLB8+euk+qWlpaYn5+ftIxBmL2M29ac0M72ZP0XfbDPBsnwJ3AE68UfWcvsKO7vgO4f9B9SJJGY5jPoH038PPAwSSPdmP/HLgDuDfJjcCzwIeGiyhJGtbAZV9V/wPISTZfNejjSpJGz1fQSlIDhlnGaV6/vxietl/kSvrR45m9JDXAspekBlj2ktQA1+zPANf2JU2aZ/aS1ADLXpIa4DLOOjINyz3TkFHSq3lmL0kNsOwlqQEu4+hHyum83bVLTWqJZS/gzH8mgKQzy7KfQoMW8y1bj3ODpS41yTV7SWqAZ/YaC5+iKa0vlr2mwsGjL7kEJQ1hbGWf5BrgE8BZwK9W1R3j2pc0CH/6WH/8OxmfsazZJzkL+BXgZ4FLgeuSXDqOfUmS1jauM/srgcNV9YcASRaBbcDjY9qfplS/Z3K3bB1zkDPoR+ns1afsntx6+3tOVY3+QZOfA66pqr/X3f554K9X1Ud65uwEdnY33wY8OfIg47MB+NakQwxgWnOD2SdhWnNDO9n/UlW9pZ+J4zqzzypj/993laraDewe0/7HKsn+qpqbdI7TNa25weyTMK25weyrGdfz7I8AF/fcvgh4bkz7kiStYVxl/3vAliSXJHktsB3YO6Z9SZLWMJZlnKo6nuQjwG+z8tTLu6rq0Dj2NSFTufzE9OYGs0/CtOYGs7/KWH5BK0laX3xvHElqgGUvSQ2w7DtJnklyMMmjSfZ3YxckeSjJU93l+T3zb01yOMmTSa7uGb+ie5zDSf5dktWehjpMzruSHEvyWM/YyHImOSfJZ7vxh5NsHnP2X0hytDvujyZ533rLnuTiJL+b5Ikkh5Lc3I2v++N+iuzTcNxfl+SRJF/rsv/LbnxdH/dT5J7sMa8q/6z83uIZYMMJY78I7Oqu7wL+dXf9UuBrwDnAJcAfAGd12x4BfoqV1xp8HvjZEed8D3A58Ng4cgL/EPgP3fXtwGfHnP0XgI+tMnfdZAc2Apd3198E/H6Xb90f91Nkn4bjHmCmu/4a4GHgXev9uJ8i90SPuWf2p7YN2NNd3wNc2zO+WFUvV9XTwGHgyiQbgTdX1Zdq5W/h13ruMxJV9UXg22PM2ftY9wFXvXI2MabsJ7NuslfV81X1le76d4EngE1MwXE/RfaTWU/Zq6qWu5uv6f4U6/y4nyL3yZyR3Jb9DxXwhSQHsvJWDgCzVfU8rPynAS7sxjcB3+y575FubFN3/cTxcRtlzh/cp6qOAy8BPza25Cs+kuTrWVnmeeVH8nWZvftx+SdZOVubquN+QnaYguOe5KwkjwLHgIeqaiqO+0lywwSPuWX/Q++uqstZeafOm5K85xRzT/Z2EGu+TcQZNkjOM/01/Hvgx4F3As8Dv7RGjollTzID/Abwj6vqj0819SQ51lP2qTjuVfX9qnonK6/CvzLJZaeYvm6ynyT3RI+5Zd+pque6y2PAb7Lyzp0vdD9K0V0e66af7O0gjnTXTxwft1Hm/MF9kpwNnEv/Sy+nrape6P5j/DnwH1k57usue5LXsFKWn6mqz3XDU3HcV8s+Lcf9FVX1IrAEXMOUHPcTc0/6mFv2QJI3JnnTK9eBnwEeY+UtHnZ003YA93fX9wLbu9+IXwJsAR7pfqT8bpJ3detnf6fnPuM0ypy9j/VzwO9064Vj8cp/2s7fZuW4r6vs3X7uBJ6oql/u2bTuj/vJsk/JcX9LkvO6668Hfhr4Buv8uJ8s98SP+Vq/wW3hD/BWVn4b/jXgEPDxbvzHgH3AU93lBT33+TgrvzV/kp5n3ABz3V/iHwCfpHuV8giz3sPKj4B/xsp39xtHmRN4HfDrrPyS6BHgrWPO/p+Ag8DXu3/AG9dbduBvsvIj8teBR7s/75uG436K7NNw3N8BfLXL+BjwL0b9/3Ic2U+Re6LH3LdLkKQGuIwjSQ2w7CWpAZa9JDXAspekBlj2ktQAy16SGmDZS1ID/h9zbCd5bAMrFAAAAABJRU5ErkJggg==\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "df['one_hand_capital'].hist(bins=30)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", "image/png": "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jic5niSHDh06evr06S2tY7ecO3/uqvc5evjotu2/H1y4cCEHDx7sXga7yMznx8znx8znx8znx8znp2Pma2tr58YYK5e6b5Eo/RNJPjXGODLd/svZ+Pzon06yOsY4X1WHk6yPMV57pedaWVkZZ8+e3dI6dkudrKveZ5z49p/tovvvB+vr61ldXe1eBrvIzOfHzOfHzOfHzOfHzOenY+ZVddko3fLpu2OM/53ky1X1THDemuRXk9yf5Ni07ViS+7b6GgAAACy3Awvu/+4kP11V35HkN5L83WyE7seq6s4kX0ryjgVfAwAAgCW1UJSOMR5Ocqm3YG9d5HkBAACYh0V/TykAAABsmSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgjSgFAACgzcJRWlXXVNVnquoT0+3rq+qBqnp8+nrd4ssEAABgGW3HO6XvSfLYptt3JTkzxrg5yZnpNgAAAFxkoSitqpuS/LUkH9q0+bYkp6brp5LcvshrAAAAsLxqjLH1navuTfJPk7wsyY+NMX6oqp4eY1y76TFfG2NcdApvVR1PcjxJDh06dPT06dNbXsduOHf+3FXvc/Tw0W3bf7ueYydduHAhBw8e3LXXo5+Zz4+Zz4+Zz4+Zz4+Zz0/HzNfW1s6NMVYudd+Wo7SqfijJ28cYP1JVq7nKKN1sZWVlnD17dkvr2C11sq56n3Hi23+2i+6/Xc+xk9bX17O6urprr0c/M58fM58fM58fM58fM5+fjplX1WWj9MACz/umJH+9qt6e5CVJXl5VP5Xkq1V1eIxxvqoOJ3lqgdcAAABgiW35M6VjjPeOMW4aYxxJckeSXx5j/O0k9yc5Nj3sWJL7Fl4lAAAAS2knfk/p+5P8YFU9nuQHp9sAAABwkUVO333WGGM9yfp0/f8kuXU7nhcAAIDlthPvlAIAAMALIkoBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoI0oBAABoc6B7AeyeOllXvc84MXZgJQAAABu8UwoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAEAbUQoAAECbLUdpVb2qqj5ZVY9V1aNV9Z5p+/VV9UBVPT59vW77lgsAAMAyWeSd0m8l+UdjjD+b5I1J3lVVtyS5K8mZMcbNSc5MtwEAAOAiW47SMcb5Mcanp+tfT/JYkhuT3Jbk1PSwU0luX3SRAAAALKdt+UxpVR1J8n1JHkxyaIxxPtkI1ySv3I7XAAAAYPnUGGOxJ6g6mOS/JnnfGOPjVfX0GOPaTfd/bYxx0edKq+p4kuNJcujQoaOnT59eaB077dz5c1e9z9HDR7dt/72yhiu5cOFCDh48eNWvwf5l5vNj5vNj5vNj5vNj5vPTMfO1tbVzY4yVS923UJRW1YuSfCLJL44xfnLa9oUkq2OM81V1OMn6GOO1V3qelZWVcfbs2S2vYzfUybrqfcaJb//ZLrr/XlnDlayvr2d1dfWqX4P9y8znx8znx8znx8znx8znp2PmVXXZKF3kp+9Wkg8neeyZIJ3cn+TYdP1Ykvu2+hoAAAAstwML7PumJD+c5PNV9fC07R8neX+Sj1XVnUm+lOQdiy0RAACAZbXlKB1j/Lcklzsf9NatPi8AAADzsS0/fRcAAAC2QpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQRpQCAADQ5kD3Atg/6mRd8f67v+furJ1c+yPbxomxk0sCAAD2Oe+UAgAA0EaUAgAA0EaUAgAA0EaUAgAA0EaUAgAA0EaUAgAA0EaUAgAA0EaUAgAA0EaUAgAA0EaUAgAA0OZA9wKYjzpZV73PODF2YCUAAMBe4Z1SAAAA2ohSAAAA2ohSAAAA2ohSAAAA2ohSAAAA2ohSAAAA2viVMMyKX0sDAAB7i3dKAQAAaCNKAQAAaCNKAQAAaOMzpcDs+GwxAMDe4Z1SAAAA2ohSAAAA2ohSAAAA2ohSAAAA2ohSAAAA2ohSAAAA2viVMHAV/CoRAADYXt4pBQAAoI0oBQAAoI0oBQAAoI3PlLKvLMNnOpfhewAAgO3inVIAAADaiFIAAADaOH0XuCqbTz+++3vuztrJtRe033aegrwMp0Avw/fQzZ8hACwH75QCAADQRpQCAADQRpQCAADQxmdKYZ9Zhs/RLcP3wOL2wt+DvbAGAJg775QCAADQRpQCAADQRpQCAADQxmdKYWZ8ho7t4u8SwB/lfxdha7xTCgAAQBtRCgAAQJsdO323qt6a5ANJrknyoTHG+3fqtQB22zKcorWV7+GTf+WTO7AS9rNlOBbYHsvwd2EZvgeWw9z+Lu7IO6VVdU2Sf5XkbUluSfLOqrplJ14LAACA/WunTt99Q5Inxhi/Mcb4gySnk9y2Q68FAADAPrVTUXpjki9vuv3ktA0AAACeVWNs/7nHVfWOJG8ZY/y96fYPJ3nDGOPdmx5zPMnx6eZrk3xh2xfCbrshye90L4JdZebzY+bzY+bzY+bzY+bz0zHzPznGeMWl7tipH3T0ZJJXbbp9U5KvbH7AGOOeJPfs0OvToKrOjjFWutfB7jHz+THz+THz+THz+THz+dlrM9+p03f/R5Kbq+rVVfUdSe5Icv8OvRYAAAD71I68UzrG+FZV/WiSX8zGr4T5yBjj0Z14LQAAAPavHfs9pWOMn0/y8zv1/OxJTseeHzOfHzOfHzOfHzOfHzOfnz018x35QUcAAADwQuzUZ0oBAADgeYlSrqiqfrOqPl9VD1fV2Wnb9VX1QFU9Pn29btPj31tVT1TVF6rqLZu2H52e54mq+pdVVR3fDxerqo9U1VNV9cimbds246p6cVX9zLT9wao6spvfHxe7zMx/oqp+azrWH66qt2+6z8z3uap6VVV9sqoeq6pHq+o903bH+pK6wswd60uqql5SVQ9V1WenmZ+ctjvOl9QVZr7/jvMxhovLZS9JfjPJDc/Z9s+T3DVdvyvJP5uu35Lks0lenOTVSX49yTXTfQ8l+f4kleQXkryt+3tzeXaeb07y+iSP7MSMk/xIkn87Xb8jyc90f89zv1xm5j+R5Mcu8VgzX4JLksNJXj9df1mS/znN1rG+pJcrzNyxvqSXaT4Hp+svSvJgkjc6zpf3coWZ77vj3DulbMVtSU5N108luX3T9tNjjG+OMb6Y5Ikkb6iqw0lePsb472Pjb/R/3LQPzcYYv5Lkd5+zeTtnvPm57k1y6zP/+kaPy8z8csx8CYwxzo8xPj1d/3qSx5LcGMf60rrCzC/HzPe5seHCdPNF02XEcb60rjDzy9mzMxelPJ+R5Jeq6lxVHZ+2HRpjnE82/qOX5JXT9huTfHnTvk9O226crj93O3vXds742X3GGN9K8ntJvnvHVs4ifrSqPlcbp/c+c3qXmS+Z6dSr78vGv6g71mfgOTNPHOtLq6quqaqHkzyV5IExhuN8yV1m5sk+O85FKc/nTWOM1yd5W5J3VdWbr/DYS/2rybjCdvafrczY/PeHf5PkTyX53iTnk/yLabuZL5GqOpjk55L8gzHG71/poZfYZu770CVm7lhfYmOMPxxjfG+Sm7LxDtjrrvBwM18Cl5n5vjvORSlXNMb4yvT1qST/Ockbknx1eps/09enpoc/meRVm3a/KclXpu03XWI7e9d2zvjZfarqQJI/nhd+6ii7ZIzx1ek/bP8vyb/LxrGemPnSqKoXZSNOfnqM8fFps2N9iV1q5o71eRhjPJ1kPclb4zifhc0z34/HuSjlsqrqpVX1smeuJ/mrSR5Jcn+SY9PDjiW5b7p+f5I7pp/S9eokNyd5aDpV5OtV9cbpHPS/s2kf9qbtnPHm5/qbSX55+rwCe8gz/4dl8jeycawnZr4Uphl9OMljY4yf3HSXY31JXW7mjvXlVVWvqKprp+vfmeQHkvxaHOdL63Iz35fH+aI/KclleS9JXpONn9D12SSPJvnxaft3JzmT5PHp6/Wb9vnxbPwkry9k00/YTbIyHRC/nuSDSar7+3N5djYfzcapHf83G/8adud2zjjJS5L8bDY+TP9Qktd0f89zv1xm5v8pyeeTfC4b/wE6bObLc0nyl7JxutXnkjw8Xd7uWF/eyxVm7lhf0kuSP5/kM9NsH0nyT6btjvMlvVxh5vvuOH/mxQAAAGDXOX0XAACANqIUAACANqIUAACANqIUAACANqIUAACANqIUAACANqIUAACANqIUAACANv8fqp1981/RyJcAAAAASUVORK5CYII=\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "plt.figure(figsize=(16,8))\n", "plt.hist(df['one_hand_capital'],bins=50,rwidth=0.8,facecolor='green')\n", "# plt.title(u'港股新股一手金额分布')\n", "plt.grid(True)\n", "plt.savefig('hkstock.png')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "43" ] }, "metadata": {}, "execution_count": 67 } ], "source": [ "len(df[df['one_hand_capital']>=10000])" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.11931818181818182" ] }, "metadata": {}, "execution_count": 68 } ], "source": [ "42/352" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ] } ================================================ FILE: analysis/hugutong.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ">" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = 'http://hqdata.jrj.com.cn/sgt/trade_history_sz_1year.js'\n", "r = requests.get(url)\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "import re\n", "\n", "s = re.findall('var trahis_sz_1year=(.*?);',r.text,re.S)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "u'var trahis_sz_1year={\"summary\":{\"time\":\"2018-05-31 08:40:00\",\"total\":232}, \\r\\n\"Column\":{HqDate:0,Inflow:1,DailyBalance:2,DailyBalanceRatio:3,TotalBalance:4,NetBuyTurnover:5,BuyTurnover:6,SellTurnover:7,IndexVal:8,Pl:9},\\r\\n\"Data\":[\\r\\n[\"2018-05-30\",1708.91,50291.09,96.71,0.0,1648.29,5867.44,4219.15,10105.795,-2.35],[\"2018-05-29\",1268.03,50731.97,97.56,0.0,1229.65,5149.99,3920.34,10349.065,-1.11],[\"2018-05-28\",1740.37,50259.63,96.65,0.0,1653.06,5182.88,3529.82,10465.537,0.17],[\"2018-05-25\",670.51,51329.49,98.71,0.0,590.96,4394.71,3803.75,10448.225,-1.1],[\"2018-05-24\",1364.57,50635.43,97.38,0.0,1322.02,4551.27,3229.25,10564.127,-0.63],[\"2018-05-23\",1503.53,50496.47,97.11,0.0,1418.73,5568.09,4149.36,10631.124,-1.25],[\"2018-05-18\",1142.69,50857.31,97.8,0.0,1080.57,3806.96,2726.39,10672.522,0.35],[\"2018-05-17\",1035.65,50964.35,98.01,0.0,991.62,3778.65,2787.03,10635.499,-0.62],[\"2018-05-16\",966.16,51033.84,98.14,0.0,909.18,4692.32,3783.14,10701.323,-0.43],[\"2018-05-15\",2241.04,49758.96,95.69,0.0,2150.79,5283.05,3132.26,10747.993,0.72],[\"2018-05-14\",2364.31,49635.69,95.45,0.0,2286.8,5681.17,3394.37,10671.458,0.35],[\"2018-05-11\",484.21,51515.79,99.07,0.0,442.47,4025.43,3582.96,10634.3,-0.89],[\"2018-05-10\",1334.72,50665.28,97.43,0.0,1249.05,4284.35,3035.3,10729.766,0.38],[\"2018-05-09\",1449.13,50550.87,97.21,0.0,1397.31,3903.43,2506.12,10689.072,-0.17],[\"2018-05-08\",599.68,51400.32,98.85,0.0,528.8,4435.95,3907.15,10707.804,0.77],[\"2018-05-07\",1135.98,50864.02,97.82,0.0,1080.69,4703.24,3622.55,10626.509,1.92],[\"2018-05-04\",-787.07,52787.07,101.51,0.0,-849.69,3113.59,3963.28,10426.188,-0.31],[\"2018-05-02\",2338.11,49661.89,95.5,0.0,2248.73,6485.96,4237.23,10342.846,0.18],[\"2018-04-27\",-202.02,13202.02,101.55,0.0,-253.37,6274.58,6527.95,10324.468,0.31],[\"2018-04-26\",-3198.04,16198.04,124.6,0.0,-3231.45,4714.36,7945.81,10292.12,-2.42],[\"2018-04-25\",407.09,12592.91,96.87,0.0,351.01,3973.78,3622.77,10547.099,-0.09],[\"2018-04-24\",1570.99,11429.01,87.92,0.0,1525.23,5304.15,3778.92,10556.822,2.19],[\"2018-04-23\",977.02,12022.98,92.48,0.0,929.57,4889.2,3959.63,10330.629,-0.75],[\"2018-04-20\",-295.36,13295.36,102.27,0.0,-348.14,4041.88,4390.02,10408.91,-1.79],[\"2018-04-19\",1867.43,11132.57,85.64,0.0,1816.02,5526.81,3710.79,10598.353,1.02],[\"2018-04-18\",3301.66,9698.34,74.6,0.0,3238.81,7511.56,4272.75,10491.15,0.92],[\"2018-04-17\",-378.51,13378.51,102.91,0.0,-424.24,4720.19,5144.43,10395.157,-2.13],[\"2018-04-16\",1322.51,11677.49,89.83,0.0,1264.44,5080.06,3815.62,10621.788,-0.61],[\"2018-04-13\",1400.64,11599.36,89.23,0.0,1356.18,4116.38,2760.2,10687.018,-0.37],[\"2018-04-12\",1365.72,11634.28,89.49,0.0,1339.07,4063.63,2724.56,10726.955,-0.75],[\"2018-04-11\",842.49,12157.51,93.52,0.0,754.79,4856.24,4101.45,10808.37,0.4],[\"2018-04-10\",845.48,12154.52,93.5,0.0,802.33,4414.22,3611.89,10765.615,1.05],[\"2018-04-09\",985.49,12014.51,92.42,0.0,934.59,4186.66,3252.07,10653.376,-0.29],[\"2018-04-04\",665.91,12334.09,94.88,0.0,624.67,4294.88,3670.21,10684.562,-0.65],[\"2018-04-03\",560.58,12439.42,95.69,0.0,511.77,5546.6,5034.83,10754.286,-0.91],[\"2018-03-28\",-138.06,13138.06,101.06,0.0,-184.58,4652.3,4836.88,10630.689,-1.35],[\"2018-03-27\",-531.11,13531.11,104.09,0.0,-573.64,4775.64,5349.28,10775.71,2.0],[\"2018-03-26\",1894.02,11105.98,85.43,0.0,1816.83,5231.4,3414.57,10564.375,1.19],[\"2018-03-23\",-278.57,13278.57,102.14,0.0,-336.64,5379.94,5716.58,10439.986,-4.02],[\"2018-03-22\",305.38,12694.62,97.65,0.0,244.57,3715.13,3470.56,10877.252,-0.94],[\"2018-03-21\",780.52,12219.48,94.0,0.0,733.83,3945.9,3212.07,10980.549,-0.88],[\"2018-03-20\",-195.58,13195.58,101.5,0.0,-296.37,3292.68,3589.05,11077.801,0.08],[\"2018-03-19\",541.06,12458.94,95.84,0.0,463.58,3199.35,2735.77,11068.493,0.16],[\"2018-03-16\",-860.1,13860.1,106.62,0.0,-944.84,4147.46,5092.3,11051.122,-1.01],[\"2018-03-15\",539.18,12460.82,95.85,0.0,423.87,4020.29,3596.42,11163.654,0.22],[\"2018-03-14\",319.98,12680.02,97.54,0.0,252.64,3619.52,3366.88,11139.627,-0.91],[\"2018-03-13\",91.74,12908.26,99.29,0.0,58.3,3860.02,3801.72,11241.406,-0.75],[\"2018-03-12\",573.64,12426.36,95.59,0.0,504.17,4414.11,3909.94,11326.272,1.17],[\"2018-03-09\",444.33,12555.67,96.58,0.0,390.86,4093.65,3702.79,11194.914,1.6],[\"2018-03-08\",842.31,12157.69,93.52,0.0,788.46,3680.34,2891.88,11019.078,1.05],[\"2018-03-07\",-783.25,13783.25,106.02,0.0,-822.5,2951.53,3774.03,10904.988,-0.94],[\"2018-03-06\",419.69,12580.31,96.77,0.0,343.69,4198.03,3854.34,11007.952,1.22],[\"2018-03-05\",-54.99,13054.99,100.42,0.0,-102.06,3276.1,3378.16,10875.68,0.18],[\"2018-03-02\",-119.78,13119.78,100.92,0.0,-183.55,3758.13,3941.68,10856.246,-0.79],[\"2018-03-01\",831.55,12168.45,93.6,0.0,768.64,4195.93,3427.29,10943.131,1.06],[\"2018-02-28\",245.33,12754.67,98.11,0.0,205.21,4690.14,4484.93,10828.73,0.2],[\"2018-02-27\",993.33,12006.67,92.36,0.0,952.19,5093.66,4141.47,10807.535,-0.81],[\"2018-02-26\",1297.64,11702.36,90.02,0.0,1165.05,4233.93,3068.88,10895.562,2.18],[\"2018-02-23\",687.02,12312.98,94.72,0.0,593.54,3205.07,2611.53,10662.791,0.04],[\"2018-02-22\",1400.07,11599.93,89.23,0.0,1323.72,4585.64,3261.92,10658.937,2.18],[\"2018-02-14\",802.43,12197.57,93.83,0.0,761.17,2738.77,1977.6,10431.914,0.67],[\"2018-02-13\",-839.46,13839.46,106.46,0.0,-867.07,3119.3,3986.37,10362.432,0.69],[\"2018-02-12\",109.55,12890.45,99.16,0.0,46.42,4634.56,4588.14,10291.882,2.91],[\"2018-02-09\",-467.29,13467.29,103.59,0.0,-501.48,5387.95,5889.43,10001.227,-3.58],[\"2018-02-08\",1712.55,11287.45,86.83,0.0,1645.0,5969.16,4324.16,10372.588,1.23],[\"2018-02-07\",1961.18,11038.82,84.91,0.0,1927.64,7013.67,5086.03,10246.974,-1.26],[\"2018-02-06\",-2298.03,15298.03,117.68,0.0,-2360.32,4987.66,7347.98,10377.61,-4.23],[\"2018-02-05\",165.72,12834.28,98.73,0.0,89.4,4638.57,4549.17,10836.252,-0.81],[\"2018-02-02\",1174.73,11825.27,90.96,0.0,1101.97,5047.36,3945.39,10925.161,0.56],[\"2018-02-01\",1213.53,11786.47,90.67,0.0,1152.31,5445.7,4293.39,10864.342,-2.65],[\"2018-01-31\",356.18,12643.82,97.26,0.0,286.23,4285.83,3999.6,11159.676,-1.06],[\"2018-01-30\",701.3,12298.7,94.61,0.0,643.58,4348.74,3705.16,11278.781,-0.65],[\"2018-01-29\",-283.18,13283.18,102.18,0.0,-347.1,4483.21,4830.31,11352.716,-1.77],[\"2018-01-26\",1143.27,11856.73,91.21,0.0,1046.88,4078.35,3031.47,11557.816,0.05],[\"2018-01-25\",984.32,12015.68,92.43,0.0,919.6,4792.88,3873.28,11552.562,-0.47],[\"2018-01-24\",979.79,12020.21,92.46,0.0,820.04,4758.9,3938.86,11607.569,0.45],[\"2018-01-23\",348.6,12651.4,97.32,0.0,245.02,4583.49,4338.47,11555.255,0.37],[\"2018-01-22\",1237.07,11762.93,90.48,0.0,1121.34,4511.32,3389.98,11513.081,1.92],[\"2018-01-19\",844.28,12155.72,93.51,0.0,792.44,4025.66,3233.22,11296.273,-0.21],[\"2018-01-18\",633.75,12366.25,95.13,0.0,556.03,3924.87,3368.84,11319.905,0.14],[\"2018-01-17\",-350.91,13350.91,102.7,0.0,-423.15,4597.99,5021.14,11303.967,-0.73],[\"2018-01-16\",1587.98,11412.02,87.78,0.0,1489.76,4606.63,3116.87,11386.91,0.7],[\"2018-01-15\",8.73,12991.27,99.93,0.0,-53.28,3830.05,3883.33,11307.46,-1.35],[\"2018-01-12\",693.35,12306.65,94.67,0.0,615.0,3403.29,2788.29,11461.991,-0.02],[\"2018-01-11\",312.57,12687.43,97.6,0.0,232.56,3482.06,3249.5,11464.196,0.24],[\"2018-01-10\",319.56,12680.44,97.54,0.0,217.94,3638.48,3420.54,11437.084,-0.09],[\"2018-01-09\",1603.99,11396.01,87.66,0.0,1482.39,4124.02,2641.63,11447.091,0.57],[\"2018-01-08\",1180.74,11819.26,90.92,0.0,1077.36,4150.1,3072.74,11382.717,0.35],[\"2018-01-05\",1567.99,11432.01,87.94,0.0,1482.0,4144.62,2662.62,11342.848,0.01],[\"2018-01-04\",1702.95,11297.05,86.9,0.0,1618.65,4170.06,2551.41,11341.345,0.54],[\"2018-01-03\",1937.38,11062.62,85.1,0.0,1835.87,4652.43,2816.56,11280.296,0.91],[\"2018-01-02\",1399.9,11600.1,89.23,0.0,1355.62,3564.8,2209.18,11178.052,1.25],[\"2017-12-29\",769.88,12230.12,94.08,0.0,714.69,2691.98,1977.29,11040.45,0.61],[\"2017-12-28\",1464.13,11535.87,88.74,0.0,1347.0,3893.5,2546.5,10974.007,0.58],[\"2017-12-27\",130.12,12869.88,99.0,0.0,80.75,3281.38,3200.63,10911.212,-1.0],[\"2017-12-21\",623.96,12376.04,95.2,0.0,565.46,2831.64,2266.18,11118.247,1.04],[\"2017-12-20\",-281.83,13281.83,102.17,0.0,-347.92,2301.3,2649.22,11003.333,-0.65],[\"2017-12-19\",801.59,12198.41,93.83,0.0,735.77,2712.36,1976.59,11074.995,1.05],[\"2017-12-18\",442.26,12557.74,96.6,0.0,366.68,2511.65,2144.97,10960.116,-0.35],[\"2017-12-15\",-1458.53,14458.53,111.22,0.0,-1499.81,2378.88,3878.69,10998.117,-1.01],[\"2017-12-14\",461.28,12538.72,96.45,0.0,417.13,2998.99,2581.86,11110.178,-0.3],[\"2017-12-13\",857.43,12142.57,93.4,0.0,813.95,3012.4,2198.45,11143.889,0.91],[\"2017-12-12\",-172.95,13172.95,101.33,0.0,-209.21,2658.61,2867.82,11043.212,-0.9],[\"2017-12-11\",597.43,12402.57,95.4,0.0,528.26,3657.25,3128.99,11143.261,1.9],[\"2017-12-08\",1065.15,11934.85,91.81,0.0,882.1,3985.21,3103.11,10935.057,1.24],[\"2017-12-07\",-624.71,13624.71,104.81,0.0,-668.38,2986.72,3655.1,10801.253,-1.01],[\"2017-12-06\",-19.79,13019.79,100.15,0.0,-72.31,4017.53,4089.84,10911.329,0.52],[\"2017-12-05\",-417.15,13417.15,103.21,0.0,-483.71,3038.13,3521.84,10854.755,-1.45],[\"2017-12-04\",278.63,12721.37,97.86,0.0,221.48,3538.9,3317.42,11014.549,0.01],[\"2017-12-01\",2132.82,10867.18,83.59,0.0,2070.24,4270.66,2200.42,11013.154,0.63],[\"2017-11-30\",-467.95,13467.95,103.6,0.0,-726.85,2889.44,3616.29,10944.099,-1.25],[\"2017-11-29\",424.0,12576.0,96.74,0.0,358.96,3657.52,3298.56,11082.132,-0.08],[\"2017-11-28\",1370.18,11629.82,89.46,0.0,1281.55,3719.18,2437.63,11091.137,1.25],[\"2017-11-27\",-575.46,13575.46,104.43,0.0,-636.61,3415.22,4051.83,10954.181,-1.92],[\"2017-11-24\",41.66,12958.34,99.68,0.0,-41.91,4476.08,4517.99,11168.393,-0.06],[\"2017-11-23\",-75.43,13075.43,100.58,0.0,-125.33,4510.92,4636.25,11175.47,-3.33],[\"2017-11-22\",169.33,12830.67,98.7,0.0,87.85,3751.39,3663.54,11560.797,-0.36],[\"2017-11-21\",-102.55,13102.55,100.79,0.0,-185.11,4285.06,4470.17,11602.1,1.44],[\"2017-11-20\",774.65,12225.35,94.04,0.0,676.05,4690.93,4014.88,11437.546,1.28],[\"2017-11-17\",964.33,12035.67,92.58,0.0,894.81,4722.14,3827.33,11292.934,-2.12],[\"2017-11-16\",614.94,12385.06,95.27,0.0,491.34,3667.76,3176.42,11537.956,0.66],[\"2017-11-15\",-787.59,13787.59,106.06,0.0,-890.23,3595.02,4485.25,11462.11,-1.04],[\"2017-11-14\",443.92,12556.08,96.59,0.0,397.37,4101.96,3704.59,11582.925,-0.96],[\"2017-11-13\",540.07,12459.93,95.85,0.0,466.03,3995.22,3529.19,11694.996,0.43],[\"2017-11-10\",174.95,12825.05,98.65,0.0,117.84,3532.85,3415.01,11645.047,0.79],[\"2017-11-09\",1413.81,11586.19,89.12,0.0,1305.42,3998.96,2693.54,11553.24,0.92],[\"2017-11-08\",915.08,12084.92,92.96,0.0,841.45,4159.94,3318.49,11447.401,-0.18],[\"2017-11-07\",666.76,12333.24,94.87,0.0,614.32,4062.33,3448.01,11467.969,0.83],[\"2017-11-06\",655.57,12344.43,94.96,0.0,593.05,3899.37,3306.32,11373.736,1.41],[\"2017-11-03\",533.76,12466.24,95.89,0.0,446.81,3282.11,2835.3,11215.194,-0.68],[\"2017-11-02\",779.18,12220.82,94.01,0.0,707.21,2999.0,2291.79,11292.422,-0.51],[\"2017-11-01\",1053.04,11946.96,91.9,0.0,1002.05,3571.01,2568.96,11350.321,-0.15],[\"2017-10-31\",690.81,12309.19,94.69,0.0,632.29,3634.88,3002.59,11367.619,0.49],[\"2017-10-30\",239.83,12760.17,98.16,0.0,173.38,3504.45,3331.07,11312.607,-1.15],[\"2017-10-27\",215.39,12784.61,98.34,0.0,167.06,3057.27,2890.21,11444.524,-0.15],[\"2017-10-26\",241.66,12758.34,98.14,0.0,182.2,3765.41,3583.21,11461.285,0.21],[\"2017-10-25\",328.13,12671.87,97.48,0.0,257.29,2783.81,2526.52,11437.209,0.86],[\"2017-10-24\",-943.46,13943.46,107.26,0.0,-1012.92,2539.9,3552.82,11339.127,0.29],[\"2017-10-23\",-190.19,13190.19,101.46,0.0,-248.59,2544.9,2793.49,11306.307,0.6],[\"2017-10-20\",90.91,12909.09,99.3,0.0,30.77,2764.75,2733.98,11238.877,0.44],[\"2017-10-19\",167.7,12832.3,98.71,0.0,114.12,3032.19,2918.07,11189.553,-0.83],[\"2017-10-18\",223.47,12776.53,98.28,0.0,157.65,2585.82,2428.17,11282.747,0.07],[\"2017-10-17\",1592.31,11407.69,87.75,0.0,1528.46,3794.13,2265.67,11275.341,0.04],[\"2017-10-16\",1208.51,11791.49,90.7,0.0,1099.43,3733.65,2634.22,11271.199,-1.12],[\"2017-10-13\",1084.13,11915.87,91.66,0.0,985.75,2888.8,1903.05,11399.094,0.81],[\"2017-10-12\",893.54,12106.46,93.13,0.0,822.77,2698.49,1875.72,11307.325,-0.05],[\"2017-10-11\",1147.25,11852.75,91.17,0.0,1057.26,4158.56,3101.3,11312.496,-0.15],[\"2017-10-10\",1754.27,11245.73,86.51,0.0,1693.44,3839.09,2145.65,11329.513,0.58],[\"2017-10-09\",2968.41,10031.59,77.17,0.0,2888.99,5159.83,2270.84,11264.273,1.6],[\"2017-09-29\",778.02,12221.98,94.02,0.0,732.21,2482.95,1750.74,11087.187,0.51],[\"2017-09-28\",-138.14,13138.14,101.06,0.0,-180.98,1797.79,1978.77,11031.421,-0.05],[\"2017-09-27\",876.26,12123.74,93.26,0.0,843.99,2425.46,1581.47,11036.78,0.79],[\"2017-09-26\",211.66,12788.34,98.37,0.0,168.5,2348.68,2180.18,10950.769,0.18],[\"2017-09-25\",157.41,12842.59,98.79,0.0,111.87,2579.91,2468.04,10930.67,-1.26],[\"2017-09-22\",1050.18,11949.82,91.92,0.0,969.4,2900.77,1931.37,11069.822,-0.26],[\"2017-09-21\",405.5,12594.5,96.88,0.0,372.22,2831.07,2458.85,11098.339,-0.83],[\"2017-09-20\",1157.62,11842.38,91.1,0.0,1095.32,3076.15,1980.83,11191.13,0.97],[\"2017-09-19\",330.59,12669.41,97.46,0.0,292.05,2833.24,2541.19,11083.899,-0.62],[\"2017-09-18\",1905.98,11094.02,85.34,0.0,1862.39,3602.84,1740.45,11153.532,0.82],[\"2017-09-15\",-99.38,13099.38,100.76,0.0,-303.41,2807.93,3111.34,11063.104,-0.07],[\"2017-09-14\",387.5,12612.5,97.02,0.0,341.51,2316.0,1974.49,11070.492,-0.19],[\"2017-09-13\",634.62,12365.38,95.12,0.0,575.33,2445.49,1870.16,11091.493,0.43],[\"2017-09-11\",309.94,12690.06,97.62,0.0,258.02,2388.46,2130.44,11053.729,0.76],[\"2017-09-08\",822.38,12177.62,93.67,0.0,734.06,2800.19,2066.13,10970.773,0.01],[\"2017-09-07\",809.51,12190.49,93.77,0.0,762.43,2808.82,2046.39,10969.127,-0.5],[\"2017-09-06\",209.43,12790.57,98.39,0.0,130.03,2111.89,1981.86,11024.586,0.34],[\"2017-09-05\",895.93,12104.07,93.11,0.0,831.72,2472.62,1640.9,10986.948,0.22],[\"2017-09-04\",1317.01,11682.99,89.87,0.0,1217.76,3180.59,1962.83,10962.854,0.76],[\"2017-09-01\",2055.2,10944.8,84.19,0.0,2016.81,3712.71,1695.9,10880.557,0.59],[\"2017-08-31\",784.27,12215.73,93.97,0.0,642.37,2768.02,2125.65,10816.644,0.03],[\"2017-08-30\",1136.84,11863.16,91.26,0.0,1052.23,2614.15,1561.92,10813.927,0.48],[\"2017-08-29\",921.23,12078.77,92.91,0.0,871.87,2510.39,1638.52,10762.366,-0.44],[\"2017-08-28\",1959.42,11040.58,84.93,0.0,1921.23,3748.43,1827.2,10809.736,1.41],[\"2017-08-25\",1452.0,11548.0,88.83,0.0,1395.31,3239.05,1843.74,10659.009,1.0],[\"2017-08-24\",590.73,12409.27,95.46,0.0,529.4,2394.38,1864.98,10552.962,-0.63],[\"2017-08-22\",304.58,12695.42,97.66,0.0,264.11,2214.17,1950.06,0.0,0.0],[\"2017-08-21\",435.21,12564.79,96.65,0.0,341.18,2149.21,1808.03,10689.773,0.71],[\"2017-08-18\",-1011.18,14011.18,107.78,0.0,-1060.53,1924.42,2984.95,10614.083,-0.37],[\"2017-08-17\",814.64,12185.36,93.73,0.0,706.97,2291.43,1584.46,10653.73,0.5],[\"2017-08-16\",715.18,12284.82,94.5,0.0,663.75,2381.5,1717.75,10600.779,0.39],[\"2017-08-15\",221.06,12778.94,98.3,0.0,187.27,1911.15,1723.88,10559.778,0.38],[\"2017-08-14\",537.85,12462.15,95.86,0.0,487.5,2198.51,1711.01,10519.804,2.22],[\"2017-08-11\",-91.15,13091.15,100.7,0.0,-126.57,1987.69,2114.26,10291.347,-1.81],[\"2017-08-10\",247.88,12752.12,98.09,0.0,212.11,1989.84,1777.73,10480.641,-0.61],[\"2017-08-09\",570.53,12429.47,95.61,0.0,515.29,1859.29,1344.0,10544.589,0.46],[\"2017-08-08\",864.55,12135.45,93.35,0.0,809.13,2063.98,1254.85,10496.246,0.43],[\"2017-08-07\",1323.62,11676.38,89.82,0.0,1236.35,2440.16,1203.81,10451.083,0.87],[\"2017-08-04\",868.53,12131.47,93.32,0.0,798.0,2221.35,1423.35,10361.231,-0.72],[\"2017-08-03\",1184.02,11815.98,90.89,0.0,1065.1,2534.98,1469.88,10436.172,-0.32],[\"2017-08-01\",635.1,12364.9,95.11,0.0,591.6,1861.07,1269.47,10525.346,0.19],[\"2017-07-31\",1063.16,11936.84,91.82,0.0,1000.68,2226.3,1225.62,10505.044,0.64],[\"2017-07-28\",940.43,12059.57,92.77,0.0,895.6,2238.69,1343.09,10437.938,0.41],[\"2017-07-26\",589.45,12410.55,95.47,0.0,546.98,2386.0,1839.02,10297.343,-0.54],[\"2017-07-25\",1289.14,11710.86,90.08,0.0,1255.91,2534.75,1278.84,10353.211,-0.49],[\"2017-07-21\",1218.5,11781.5,90.63,0.0,1192.78,2174.4,981.62,10364.82,-0.02],[\"2017-07-20\",396.56,12603.44,96.95,0.0,357.94,1848.37,1490.43,10366.983,0.69],[\"2017-07-19\",1107.74,11892.26,91.48,0.0,1049.84,2486.77,1436.93,10295.575,1.9],[\"2017-07-18\",969.04,12030.96,92.55,0.0,917.2,2566.0,1648.8,10103.763,0.48],[\"2017-07-17\",1371.96,11628.04,89.45,0.0,1330.94,2928.17,1597.23,10055.796,-3.57],[\"2017-07-14\",267.33,12732.67,97.94,0.0,196.2,1481.94,1285.74,10427.787,-0.37],[\"2017-07-13\",651.52,12348.48,94.99,0.0,599.63,2001.54,1401.91,10466.103,0.12],[\"2017-07-12\",1079.17,11920.83,91.7,0.0,953.42,2340.87,1387.45,10453.193,-0.14],[\"2017-07-11\",753.74,12246.26,94.2,0.0,702.29,2007.49,1305.2,10467.711,-0.36],[\"2017-07-10\",894.62,12105.38,93.12,0.0,819.65,2105.93,1286.28,10505.601,-0.55],[\"2017-07-07\",481.96,12518.04,96.29,0.0,443.89,1595.59,1151.7,10563.717,0.02],[\"2017-07-06\",-196.51,13196.51,101.51,0.0,-228.07,1564.29,1792.36,10562.055,0.01],[\"2017-07-05\",339.22,12660.78,97.39,0.0,281.07,1517.62,1236.55,10561.089,0.82],[\"2017-07-04\",-201.72,13201.72,101.55,0.0,-239.38,1572.81,1812.19,10474.828,-0.57],[\"2017-07-03\",321.76,12678.24,97.52,0.0,264.57,1474.73,1210.16,10535.046,0.05],[\"2017-06-30\",-112.32,13112.32,100.86,0.0,-150.95,1396.31,1547.26,10529.609,0.17],[\"2017-06-29\",1021.08,11978.92,92.15,0.0,923.7,2362.6,1438.9,10511.86,0.58],[\"2017-06-28\",401.52,12598.48,96.91,0.0,352.53,2677.21,2324.68,10451.565,-0.8],[\"2017-06-27\",750.26,12249.74,94.23,0.0,702.66,2254.52,1551.86,10535.364,-0.02],[\"2017-06-26\",475.64,12524.36,96.34,0.0,441.41,2182.41,1741.0,10537.591,1.65],[\"2017-06-23\",1061.9,11938.1,91.83,0.0,928.0,2502.22,1574.22,10366.777,0.99],[\"2017-06-22\",1279.85,11720.15,90.15,0.0,1242.75,3014.58,1771.83,10265.2,-0.98],[\"2017-06-21\",1050.47,11949.53,91.92,0.0,984.98,2256.29,1271.31,10367.173,0.76],[\"2017-06-20\",494.46,12505.54,96.2,0.0,453.37,1765.51,1312.14,10288.527,0.25],[\"2017-06-19\",1194.85,11805.15,90.81,0.0,1151.21,2338.43,1187.22,10262.8,0.7],[\"2017-06-16\",488.89,12511.11,96.24,0.0,444.57,2407.59,1963.02,10191.24,-0.3],[\"2017-06-15\",869.3,12130.7,93.31,0.0,837.4,2331.77,1494.37,10221.692,0.69],[\"2017-06-14\",-258.04,13258.04,101.98,0.0,-287.79,1608.76,1896.55,10151.534,-0.72],[\"2017-06-13\",697.3,12302.7,94.64,0.0,647.62,2225.87,1578.25,10224.818,1.04],[\"2017-06-12\",97.72,12902.28,99.25,0.0,21.12,2121.16,2100.04,10119.987,-0.56],[\"2017-06-09\",564.23,12435.77,95.66,0.0,503.35,2489.18,1985.83,10177.447,0.28],[\"2017-06-08\",1390.35,11609.65,89.31,0.0,1326.63,2631.47,1304.84,10148.722,0.38],[\"2017-06-07\",1807.93,11192.07,86.09,0.0,1742.92,3208.27,1465.35,10109.876,1.96],[\"2017-06-06\",1232.6,11767.4,90.52,0.0,1186.83,2198.93,1012.1,9915.923,0.74],[\"2017-06-05\",1016.79,11983.21,92.18,0.0,992.85,2043.07,1050.22,9842.602,0.49],[\"2017-06-02\",1026.1,11973.9,92.11,0.0,965.89,2022.76,1056.87,9794.889,0.66],[\"2017-06-01\",266.02,12733.98,97.95,0.0,238.61,1904.18,1665.57,9730.326,-1.36],[\"2017-05-31\",-213.71,13213.71,101.64,0.0,-241.58,1666.11,1907.69,9864.845,0.06]]}; '" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r.text" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print(type(s)\n",) "# ret = eval(s)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'HqDate' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mret\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0ms\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m\u001b[0meval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mret\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n", "\u001b[1;31mNameError\u001b[0m: name 'HqDate' is not defined" ] } ], "source": [ "ret = s[0]\n", "result =eval(ret)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "Expecting property name enclosed in double quotes: line 2 column 11 (char 67)", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mjson\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mjs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mjson\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mloads\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mret\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32mc:\\python27\\lib\\json\\__init__.pyc\u001b[0m in \u001b[0;36mloads\u001b[1;34m(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)\u001b[0m\n\u001b[0;32m 337\u001b[0m \u001b[0mparse_int\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mNone\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mparse_float\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mNone\u001b[0m \u001b[1;32mand\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 338\u001b[0m parse_constant is None and object_pairs_hook is None and not kw):\n\u001b[1;32m--> 339\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0m_default_decoder\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 340\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mcls\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 341\u001b[0m \u001b[0mcls\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mJSONDecoder\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mc:\\python27\\lib\\json\\decoder.pyc\u001b[0m in \u001b[0;36mdecode\u001b[1;34m(self, s, _w)\u001b[0m\n\u001b[0;32m 362\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 363\u001b[0m \"\"\"\n\u001b[1;32m--> 364\u001b[1;33m \u001b[0mobj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mend\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mraw_decode\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0midx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0m_w\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 365\u001b[0m \u001b[0mend\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_w\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mend\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 366\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mend\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mc:\\python27\\lib\\json\\decoder.pyc\u001b[0m in \u001b[0;36mraw_decode\u001b[1;34m(self, s, idx)\u001b[0m\n\u001b[0;32m 378\u001b[0m \"\"\"\n\u001b[0;32m 379\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 380\u001b[1;33m \u001b[0mobj\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mend\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscan_once\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0midx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 381\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mStopIteration\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 382\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"No JSON object could be decoded\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: Expecting property name enclosed in double quotes: line 2 column 11 (char 67)" ] } ], "source": [ "import json\n", "js = json.loads(ret)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": true }, "outputs": [ { "ename": "AttributeError", "evalue": "'str' object has no attribute 'get'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mjs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'sumary'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m: 'str' object has no attribute 'get'" ] } ], "source": [ "js.get('sumary')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "unicode" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(ret)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "u'{\"summary\":{\"time\":\"2018-05-31 08:40:00\",\"total\":232}, \\r\\n\"Column\":{HqDate:0,Inflow:1,DailyBalance:2,DailyBalanceRatio:3,TotalBalance:4,NetBuyTurnover:5,BuyTurnover:6,SellTurnover:7,IndexVal:8,Pl:9},\\r\\n\"Data\":[\\r\\n[\"2018-05-30\",1708.91,50291.09,96.71,0.0,1648.29,5867.44,4219.15,10105.795,-2.35],[\"2018-05-29\",1268.03,50731.97,97.56,0.0,1229.65,5149.99,3920.34,10349.065,-1.11],[\"2018-05-28\",1740.37,50259.63,96.65,0.0,1653.06,5182.88,3529.82,10465.537,0.17],[\"2018-05-25\",670.51,51329.49,98.71,0.0,590.96,4394.71,3803.75,10448.225,-1.1],[\"2018-05-24\",1364.57,50635.43,97.38,0.0,1322.02,4551.27,3229.25,10564.127,-0.63],[\"2018-05-23\",1503.53,50496.47,97.11,0.0,1418.73,5568.09,4149.36,10631.124,-1.25],[\"2018-05-18\",1142.69,50857.31,97.8,0.0,1080.57,3806.96,2726.39,10672.522,0.35],[\"2018-05-17\",1035.65,50964.35,98.01,0.0,991.62,3778.65,2787.03,10635.499,-0.62],[\"2018-05-16\",966.16,51033.84,98.14,0.0,909.18,4692.32,3783.14,10701.323,-0.43],[\"2018-05-15\",2241.04,49758.96,95.69,0.0,2150.79,5283.05,3132.26,10747.993,0.72],[\"2018-05-14\",2364.31,49635.69,95.45,0.0,2286.8,5681.17,3394.37,10671.458,0.35],[\"2018-05-11\",484.21,51515.79,99.07,0.0,442.47,4025.43,3582.96,10634.3,-0.89],[\"2018-05-10\",1334.72,50665.28,97.43,0.0,1249.05,4284.35,3035.3,10729.766,0.38],[\"2018-05-09\",1449.13,50550.87,97.21,0.0,1397.31,3903.43,2506.12,10689.072,-0.17],[\"2018-05-08\",599.68,51400.32,98.85,0.0,528.8,4435.95,3907.15,10707.804,0.77],[\"2018-05-07\",1135.98,50864.02,97.82,0.0,1080.69,4703.24,3622.55,10626.509,1.92],[\"2018-05-04\",-787.07,52787.07,101.51,0.0,-849.69,3113.59,3963.28,10426.188,-0.31],[\"2018-05-02\",2338.11,49661.89,95.5,0.0,2248.73,6485.96,4237.23,10342.846,0.18],[\"2018-04-27\",-202.02,13202.02,101.55,0.0,-253.37,6274.58,6527.95,10324.468,0.31],[\"2018-04-26\",-3198.04,16198.04,124.6,0.0,-3231.45,4714.36,7945.81,10292.12,-2.42],[\"2018-04-25\",407.09,12592.91,96.87,0.0,351.01,3973.78,3622.77,10547.099,-0.09],[\"2018-04-24\",1570.99,11429.01,87.92,0.0,1525.23,5304.15,3778.92,10556.822,2.19],[\"2018-04-23\",977.02,12022.98,92.48,0.0,929.57,4889.2,3959.63,10330.629,-0.75],[\"2018-04-20\",-295.36,13295.36,102.27,0.0,-348.14,4041.88,4390.02,10408.91,-1.79],[\"2018-04-19\",1867.43,11132.57,85.64,0.0,1816.02,5526.81,3710.79,10598.353,1.02],[\"2018-04-18\",3301.66,9698.34,74.6,0.0,3238.81,7511.56,4272.75,10491.15,0.92],[\"2018-04-17\",-378.51,13378.51,102.91,0.0,-424.24,4720.19,5144.43,10395.157,-2.13],[\"2018-04-16\",1322.51,11677.49,89.83,0.0,1264.44,5080.06,3815.62,10621.788,-0.61],[\"2018-04-13\",1400.64,11599.36,89.23,0.0,1356.18,4116.38,2760.2,10687.018,-0.37],[\"2018-04-12\",1365.72,11634.28,89.49,0.0,1339.07,4063.63,2724.56,10726.955,-0.75],[\"2018-04-11\",842.49,12157.51,93.52,0.0,754.79,4856.24,4101.45,10808.37,0.4],[\"2018-04-10\",845.48,12154.52,93.5,0.0,802.33,4414.22,3611.89,10765.615,1.05],[\"2018-04-09\",985.49,12014.51,92.42,0.0,934.59,4186.66,3252.07,10653.376,-0.29],[\"2018-04-04\",665.91,12334.09,94.88,0.0,624.67,4294.88,3670.21,10684.562,-0.65],[\"2018-04-03\",560.58,12439.42,95.69,0.0,511.77,5546.6,5034.83,10754.286,-0.91],[\"2018-03-28\",-138.06,13138.06,101.06,0.0,-184.58,4652.3,4836.88,10630.689,-1.35],[\"2018-03-27\",-531.11,13531.11,104.09,0.0,-573.64,4775.64,5349.28,10775.71,2.0],[\"2018-03-26\",1894.02,11105.98,85.43,0.0,1816.83,5231.4,3414.57,10564.375,1.19],[\"2018-03-23\",-278.57,13278.57,102.14,0.0,-336.64,5379.94,5716.58,10439.986,-4.02],[\"2018-03-22\",305.38,12694.62,97.65,0.0,244.57,3715.13,3470.56,10877.252,-0.94],[\"2018-03-21\",780.52,12219.48,94.0,0.0,733.83,3945.9,3212.07,10980.549,-0.88],[\"2018-03-20\",-195.58,13195.58,101.5,0.0,-296.37,3292.68,3589.05,11077.801,0.08],[\"2018-03-19\",541.06,12458.94,95.84,0.0,463.58,3199.35,2735.77,11068.493,0.16],[\"2018-03-16\",-860.1,13860.1,106.62,0.0,-944.84,4147.46,5092.3,11051.122,-1.01],[\"2018-03-15\",539.18,12460.82,95.85,0.0,423.87,4020.29,3596.42,11163.654,0.22],[\"2018-03-14\",319.98,12680.02,97.54,0.0,252.64,3619.52,3366.88,11139.627,-0.91],[\"2018-03-13\",91.74,12908.26,99.29,0.0,58.3,3860.02,3801.72,11241.406,-0.75],[\"2018-03-12\",573.64,12426.36,95.59,0.0,504.17,4414.11,3909.94,11326.272,1.17],[\"2018-03-09\",444.33,12555.67,96.58,0.0,390.86,4093.65,3702.79,11194.914,1.6],[\"2018-03-08\",842.31,12157.69,93.52,0.0,788.46,3680.34,2891.88,11019.078,1.05],[\"2018-03-07\",-783.25,13783.25,106.02,0.0,-822.5,2951.53,3774.03,10904.988,-0.94],[\"2018-03-06\",419.69,12580.31,96.77,0.0,343.69,4198.03,3854.34,11007.952,1.22],[\"2018-03-05\",-54.99,13054.99,100.42,0.0,-102.06,3276.1,3378.16,10875.68,0.18],[\"2018-03-02\",-119.78,13119.78,100.92,0.0,-183.55,3758.13,3941.68,10856.246,-0.79],[\"2018-03-01\",831.55,12168.45,93.6,0.0,768.64,4195.93,3427.29,10943.131,1.06],[\"2018-02-28\",245.33,12754.67,98.11,0.0,205.21,4690.14,4484.93,10828.73,0.2],[\"2018-02-27\",993.33,12006.67,92.36,0.0,952.19,5093.66,4141.47,10807.535,-0.81],[\"2018-02-26\",1297.64,11702.36,90.02,0.0,1165.05,4233.93,3068.88,10895.562,2.18],[\"2018-02-23\",687.02,12312.98,94.72,0.0,593.54,3205.07,2611.53,10662.791,0.04],[\"2018-02-22\",1400.07,11599.93,89.23,0.0,1323.72,4585.64,3261.92,10658.937,2.18],[\"2018-02-14\",802.43,12197.57,93.83,0.0,761.17,2738.77,1977.6,10431.914,0.67],[\"2018-02-13\",-839.46,13839.46,106.46,0.0,-867.07,3119.3,3986.37,10362.432,0.69],[\"2018-02-12\",109.55,12890.45,99.16,0.0,46.42,4634.56,4588.14,10291.882,2.91],[\"2018-02-09\",-467.29,13467.29,103.59,0.0,-501.48,5387.95,5889.43,10001.227,-3.58],[\"2018-02-08\",1712.55,11287.45,86.83,0.0,1645.0,5969.16,4324.16,10372.588,1.23],[\"2018-02-07\",1961.18,11038.82,84.91,0.0,1927.64,7013.67,5086.03,10246.974,-1.26],[\"2018-02-06\",-2298.03,15298.03,117.68,0.0,-2360.32,4987.66,7347.98,10377.61,-4.23],[\"2018-02-05\",165.72,12834.28,98.73,0.0,89.4,4638.57,4549.17,10836.252,-0.81],[\"2018-02-02\",1174.73,11825.27,90.96,0.0,1101.97,5047.36,3945.39,10925.161,0.56],[\"2018-02-01\",1213.53,11786.47,90.67,0.0,1152.31,5445.7,4293.39,10864.342,-2.65],[\"2018-01-31\",356.18,12643.82,97.26,0.0,286.23,4285.83,3999.6,11159.676,-1.06],[\"2018-01-30\",701.3,12298.7,94.61,0.0,643.58,4348.74,3705.16,11278.781,-0.65],[\"2018-01-29\",-283.18,13283.18,102.18,0.0,-347.1,4483.21,4830.31,11352.716,-1.77],[\"2018-01-26\",1143.27,11856.73,91.21,0.0,1046.88,4078.35,3031.47,11557.816,0.05],[\"2018-01-25\",984.32,12015.68,92.43,0.0,919.6,4792.88,3873.28,11552.562,-0.47],[\"2018-01-24\",979.79,12020.21,92.46,0.0,820.04,4758.9,3938.86,11607.569,0.45],[\"2018-01-23\",348.6,12651.4,97.32,0.0,245.02,4583.49,4338.47,11555.255,0.37],[\"2018-01-22\",1237.07,11762.93,90.48,0.0,1121.34,4511.32,3389.98,11513.081,1.92],[\"2018-01-19\",844.28,12155.72,93.51,0.0,792.44,4025.66,3233.22,11296.273,-0.21],[\"2018-01-18\",633.75,12366.25,95.13,0.0,556.03,3924.87,3368.84,11319.905,0.14],[\"2018-01-17\",-350.91,13350.91,102.7,0.0,-423.15,4597.99,5021.14,11303.967,-0.73],[\"2018-01-16\",1587.98,11412.02,87.78,0.0,1489.76,4606.63,3116.87,11386.91,0.7],[\"2018-01-15\",8.73,12991.27,99.93,0.0,-53.28,3830.05,3883.33,11307.46,-1.35],[\"2018-01-12\",693.35,12306.65,94.67,0.0,615.0,3403.29,2788.29,11461.991,-0.02],[\"2018-01-11\",312.57,12687.43,97.6,0.0,232.56,3482.06,3249.5,11464.196,0.24],[\"2018-01-10\",319.56,12680.44,97.54,0.0,217.94,3638.48,3420.54,11437.084,-0.09],[\"2018-01-09\",1603.99,11396.01,87.66,0.0,1482.39,4124.02,2641.63,11447.091,0.57],[\"2018-01-08\",1180.74,11819.26,90.92,0.0,1077.36,4150.1,3072.74,11382.717,0.35],[\"2018-01-05\",1567.99,11432.01,87.94,0.0,1482.0,4144.62,2662.62,11342.848,0.01],[\"2018-01-04\",1702.95,11297.05,86.9,0.0,1618.65,4170.06,2551.41,11341.345,0.54],[\"2018-01-03\",1937.38,11062.62,85.1,0.0,1835.87,4652.43,2816.56,11280.296,0.91],[\"2018-01-02\",1399.9,11600.1,89.23,0.0,1355.62,3564.8,2209.18,11178.052,1.25],[\"2017-12-29\",769.88,12230.12,94.08,0.0,714.69,2691.98,1977.29,11040.45,0.61],[\"2017-12-28\",1464.13,11535.87,88.74,0.0,1347.0,3893.5,2546.5,10974.007,0.58],[\"2017-12-27\",130.12,12869.88,99.0,0.0,80.75,3281.38,3200.63,10911.212,-1.0],[\"2017-12-21\",623.96,12376.04,95.2,0.0,565.46,2831.64,2266.18,11118.247,1.04],[\"2017-12-20\",-281.83,13281.83,102.17,0.0,-347.92,2301.3,2649.22,11003.333,-0.65],[\"2017-12-19\",801.59,12198.41,93.83,0.0,735.77,2712.36,1976.59,11074.995,1.05],[\"2017-12-18\",442.26,12557.74,96.6,0.0,366.68,2511.65,2144.97,10960.116,-0.35],[\"2017-12-15\",-1458.53,14458.53,111.22,0.0,-1499.81,2378.88,3878.69,10998.117,-1.01],[\"2017-12-14\",461.28,12538.72,96.45,0.0,417.13,2998.99,2581.86,11110.178,-0.3],[\"2017-12-13\",857.43,12142.57,93.4,0.0,813.95,3012.4,2198.45,11143.889,0.91],[\"2017-12-12\",-172.95,13172.95,101.33,0.0,-209.21,2658.61,2867.82,11043.212,-0.9],[\"2017-12-11\",597.43,12402.57,95.4,0.0,528.26,3657.25,3128.99,11143.261,1.9],[\"2017-12-08\",1065.15,11934.85,91.81,0.0,882.1,3985.21,3103.11,10935.057,1.24],[\"2017-12-07\",-624.71,13624.71,104.81,0.0,-668.38,2986.72,3655.1,10801.253,-1.01],[\"2017-12-06\",-19.79,13019.79,100.15,0.0,-72.31,4017.53,4089.84,10911.329,0.52],[\"2017-12-05\",-417.15,13417.15,103.21,0.0,-483.71,3038.13,3521.84,10854.755,-1.45],[\"2017-12-04\",278.63,12721.37,97.86,0.0,221.48,3538.9,3317.42,11014.549,0.01],[\"2017-12-01\",2132.82,10867.18,83.59,0.0,2070.24,4270.66,2200.42,11013.154,0.63],[\"2017-11-30\",-467.95,13467.95,103.6,0.0,-726.85,2889.44,3616.29,10944.099,-1.25],[\"2017-11-29\",424.0,12576.0,96.74,0.0,358.96,3657.52,3298.56,11082.132,-0.08],[\"2017-11-28\",1370.18,11629.82,89.46,0.0,1281.55,3719.18,2437.63,11091.137,1.25],[\"2017-11-27\",-575.46,13575.46,104.43,0.0,-636.61,3415.22,4051.83,10954.181,-1.92],[\"2017-11-24\",41.66,12958.34,99.68,0.0,-41.91,4476.08,4517.99,11168.393,-0.06],[\"2017-11-23\",-75.43,13075.43,100.58,0.0,-125.33,4510.92,4636.25,11175.47,-3.33],[\"2017-11-22\",169.33,12830.67,98.7,0.0,87.85,3751.39,3663.54,11560.797,-0.36],[\"2017-11-21\",-102.55,13102.55,100.79,0.0,-185.11,4285.06,4470.17,11602.1,1.44],[\"2017-11-20\",774.65,12225.35,94.04,0.0,676.05,4690.93,4014.88,11437.546,1.28],[\"2017-11-17\",964.33,12035.67,92.58,0.0,894.81,4722.14,3827.33,11292.934,-2.12],[\"2017-11-16\",614.94,12385.06,95.27,0.0,491.34,3667.76,3176.42,11537.956,0.66],[\"2017-11-15\",-787.59,13787.59,106.06,0.0,-890.23,3595.02,4485.25,11462.11,-1.04],[\"2017-11-14\",443.92,12556.08,96.59,0.0,397.37,4101.96,3704.59,11582.925,-0.96],[\"2017-11-13\",540.07,12459.93,95.85,0.0,466.03,3995.22,3529.19,11694.996,0.43],[\"2017-11-10\",174.95,12825.05,98.65,0.0,117.84,3532.85,3415.01,11645.047,0.79],[\"2017-11-09\",1413.81,11586.19,89.12,0.0,1305.42,3998.96,2693.54,11553.24,0.92],[\"2017-11-08\",915.08,12084.92,92.96,0.0,841.45,4159.94,3318.49,11447.401,-0.18],[\"2017-11-07\",666.76,12333.24,94.87,0.0,614.32,4062.33,3448.01,11467.969,0.83],[\"2017-11-06\",655.57,12344.43,94.96,0.0,593.05,3899.37,3306.32,11373.736,1.41],[\"2017-11-03\",533.76,12466.24,95.89,0.0,446.81,3282.11,2835.3,11215.194,-0.68],[\"2017-11-02\",779.18,12220.82,94.01,0.0,707.21,2999.0,2291.79,11292.422,-0.51],[\"2017-11-01\",1053.04,11946.96,91.9,0.0,1002.05,3571.01,2568.96,11350.321,-0.15],[\"2017-10-31\",690.81,12309.19,94.69,0.0,632.29,3634.88,3002.59,11367.619,0.49],[\"2017-10-30\",239.83,12760.17,98.16,0.0,173.38,3504.45,3331.07,11312.607,-1.15],[\"2017-10-27\",215.39,12784.61,98.34,0.0,167.06,3057.27,2890.21,11444.524,-0.15],[\"2017-10-26\",241.66,12758.34,98.14,0.0,182.2,3765.41,3583.21,11461.285,0.21],[\"2017-10-25\",328.13,12671.87,97.48,0.0,257.29,2783.81,2526.52,11437.209,0.86],[\"2017-10-24\",-943.46,13943.46,107.26,0.0,-1012.92,2539.9,3552.82,11339.127,0.29],[\"2017-10-23\",-190.19,13190.19,101.46,0.0,-248.59,2544.9,2793.49,11306.307,0.6],[\"2017-10-20\",90.91,12909.09,99.3,0.0,30.77,2764.75,2733.98,11238.877,0.44],[\"2017-10-19\",167.7,12832.3,98.71,0.0,114.12,3032.19,2918.07,11189.553,-0.83],[\"2017-10-18\",223.47,12776.53,98.28,0.0,157.65,2585.82,2428.17,11282.747,0.07],[\"2017-10-17\",1592.31,11407.69,87.75,0.0,1528.46,3794.13,2265.67,11275.341,0.04],[\"2017-10-16\",1208.51,11791.49,90.7,0.0,1099.43,3733.65,2634.22,11271.199,-1.12],[\"2017-10-13\",1084.13,11915.87,91.66,0.0,985.75,2888.8,1903.05,11399.094,0.81],[\"2017-10-12\",893.54,12106.46,93.13,0.0,822.77,2698.49,1875.72,11307.325,-0.05],[\"2017-10-11\",1147.25,11852.75,91.17,0.0,1057.26,4158.56,3101.3,11312.496,-0.15],[\"2017-10-10\",1754.27,11245.73,86.51,0.0,1693.44,3839.09,2145.65,11329.513,0.58],[\"2017-10-09\",2968.41,10031.59,77.17,0.0,2888.99,5159.83,2270.84,11264.273,1.6],[\"2017-09-29\",778.02,12221.98,94.02,0.0,732.21,2482.95,1750.74,11087.187,0.51],[\"2017-09-28\",-138.14,13138.14,101.06,0.0,-180.98,1797.79,1978.77,11031.421,-0.05],[\"2017-09-27\",876.26,12123.74,93.26,0.0,843.99,2425.46,1581.47,11036.78,0.79],[\"2017-09-26\",211.66,12788.34,98.37,0.0,168.5,2348.68,2180.18,10950.769,0.18],[\"2017-09-25\",157.41,12842.59,98.79,0.0,111.87,2579.91,2468.04,10930.67,-1.26],[\"2017-09-22\",1050.18,11949.82,91.92,0.0,969.4,2900.77,1931.37,11069.822,-0.26],[\"2017-09-21\",405.5,12594.5,96.88,0.0,372.22,2831.07,2458.85,11098.339,-0.83],[\"2017-09-20\",1157.62,11842.38,91.1,0.0,1095.32,3076.15,1980.83,11191.13,0.97],[\"2017-09-19\",330.59,12669.41,97.46,0.0,292.05,2833.24,2541.19,11083.899,-0.62],[\"2017-09-18\",1905.98,11094.02,85.34,0.0,1862.39,3602.84,1740.45,11153.532,0.82],[\"2017-09-15\",-99.38,13099.38,100.76,0.0,-303.41,2807.93,3111.34,11063.104,-0.07],[\"2017-09-14\",387.5,12612.5,97.02,0.0,341.51,2316.0,1974.49,11070.492,-0.19],[\"2017-09-13\",634.62,12365.38,95.12,0.0,575.33,2445.49,1870.16,11091.493,0.43],[\"2017-09-11\",309.94,12690.06,97.62,0.0,258.02,2388.46,2130.44,11053.729,0.76],[\"2017-09-08\",822.38,12177.62,93.67,0.0,734.06,2800.19,2066.13,10970.773,0.01],[\"2017-09-07\",809.51,12190.49,93.77,0.0,762.43,2808.82,2046.39,10969.127,-0.5],[\"2017-09-06\",209.43,12790.57,98.39,0.0,130.03,2111.89,1981.86,11024.586,0.34],[\"2017-09-05\",895.93,12104.07,93.11,0.0,831.72,2472.62,1640.9,10986.948,0.22],[\"2017-09-04\",1317.01,11682.99,89.87,0.0,1217.76,3180.59,1962.83,10962.854,0.76],[\"2017-09-01\",2055.2,10944.8,84.19,0.0,2016.81,3712.71,1695.9,10880.557,0.59],[\"2017-08-31\",784.27,12215.73,93.97,0.0,642.37,2768.02,2125.65,10816.644,0.03],[\"2017-08-30\",1136.84,11863.16,91.26,0.0,1052.23,2614.15,1561.92,10813.927,0.48],[\"2017-08-29\",921.23,12078.77,92.91,0.0,871.87,2510.39,1638.52,10762.366,-0.44],[\"2017-08-28\",1959.42,11040.58,84.93,0.0,1921.23,3748.43,1827.2,10809.736,1.41],[\"2017-08-25\",1452.0,11548.0,88.83,0.0,1395.31,3239.05,1843.74,10659.009,1.0],[\"2017-08-24\",590.73,12409.27,95.46,0.0,529.4,2394.38,1864.98,10552.962,-0.63],[\"2017-08-22\",304.58,12695.42,97.66,0.0,264.11,2214.17,1950.06,0.0,0.0],[\"2017-08-21\",435.21,12564.79,96.65,0.0,341.18,2149.21,1808.03,10689.773,0.71],[\"2017-08-18\",-1011.18,14011.18,107.78,0.0,-1060.53,1924.42,2984.95,10614.083,-0.37],[\"2017-08-17\",814.64,12185.36,93.73,0.0,706.97,2291.43,1584.46,10653.73,0.5],[\"2017-08-16\",715.18,12284.82,94.5,0.0,663.75,2381.5,1717.75,10600.779,0.39],[\"2017-08-15\",221.06,12778.94,98.3,0.0,187.27,1911.15,1723.88,10559.778,0.38],[\"2017-08-14\",537.85,12462.15,95.86,0.0,487.5,2198.51,1711.01,10519.804,2.22],[\"2017-08-11\",-91.15,13091.15,100.7,0.0,-126.57,1987.69,2114.26,10291.347,-1.81],[\"2017-08-10\",247.88,12752.12,98.09,0.0,212.11,1989.84,1777.73,10480.641,-0.61],[\"2017-08-09\",570.53,12429.47,95.61,0.0,515.29,1859.29,1344.0,10544.589,0.46],[\"2017-08-08\",864.55,12135.45,93.35,0.0,809.13,2063.98,1254.85,10496.246,0.43],[\"2017-08-07\",1323.62,11676.38,89.82,0.0,1236.35,2440.16,1203.81,10451.083,0.87],[\"2017-08-04\",868.53,12131.47,93.32,0.0,798.0,2221.35,1423.35,10361.231,-0.72],[\"2017-08-03\",1184.02,11815.98,90.89,0.0,1065.1,2534.98,1469.88,10436.172,-0.32],[\"2017-08-01\",635.1,12364.9,95.11,0.0,591.6,1861.07,1269.47,10525.346,0.19],[\"2017-07-31\",1063.16,11936.84,91.82,0.0,1000.68,2226.3,1225.62,10505.044,0.64],[\"2017-07-28\",940.43,12059.57,92.77,0.0,895.6,2238.69,1343.09,10437.938,0.41],[\"2017-07-26\",589.45,12410.55,95.47,0.0,546.98,2386.0,1839.02,10297.343,-0.54],[\"2017-07-25\",1289.14,11710.86,90.08,0.0,1255.91,2534.75,1278.84,10353.211,-0.49],[\"2017-07-21\",1218.5,11781.5,90.63,0.0,1192.78,2174.4,981.62,10364.82,-0.02],[\"2017-07-20\",396.56,12603.44,96.95,0.0,357.94,1848.37,1490.43,10366.983,0.69],[\"2017-07-19\",1107.74,11892.26,91.48,0.0,1049.84,2486.77,1436.93,10295.575,1.9],[\"2017-07-18\",969.04,12030.96,92.55,0.0,917.2,2566.0,1648.8,10103.763,0.48],[\"2017-07-17\",1371.96,11628.04,89.45,0.0,1330.94,2928.17,1597.23,10055.796,-3.57],[\"2017-07-14\",267.33,12732.67,97.94,0.0,196.2,1481.94,1285.74,10427.787,-0.37],[\"2017-07-13\",651.52,12348.48,94.99,0.0,599.63,2001.54,1401.91,10466.103,0.12],[\"2017-07-12\",1079.17,11920.83,91.7,0.0,953.42,2340.87,1387.45,10453.193,-0.14],[\"2017-07-11\",753.74,12246.26,94.2,0.0,702.29,2007.49,1305.2,10467.711,-0.36],[\"2017-07-10\",894.62,12105.38,93.12,0.0,819.65,2105.93,1286.28,10505.601,-0.55],[\"2017-07-07\",481.96,12518.04,96.29,0.0,443.89,1595.59,1151.7,10563.717,0.02],[\"2017-07-06\",-196.51,13196.51,101.51,0.0,-228.07,1564.29,1792.36,10562.055,0.01],[\"2017-07-05\",339.22,12660.78,97.39,0.0,281.07,1517.62,1236.55,10561.089,0.82],[\"2017-07-04\",-201.72,13201.72,101.55,0.0,-239.38,1572.81,1812.19,10474.828,-0.57],[\"2017-07-03\",321.76,12678.24,97.52,0.0,264.57,1474.73,1210.16,10535.046,0.05],[\"2017-06-30\",-112.32,13112.32,100.86,0.0,-150.95,1396.31,1547.26,10529.609,0.17],[\"2017-06-29\",1021.08,11978.92,92.15,0.0,923.7,2362.6,1438.9,10511.86,0.58],[\"2017-06-28\",401.52,12598.48,96.91,0.0,352.53,2677.21,2324.68,10451.565,-0.8],[\"2017-06-27\",750.26,12249.74,94.23,0.0,702.66,2254.52,1551.86,10535.364,-0.02],[\"2017-06-26\",475.64,12524.36,96.34,0.0,441.41,2182.41,1741.0,10537.591,1.65],[\"2017-06-23\",1061.9,11938.1,91.83,0.0,928.0,2502.22,1574.22,10366.777,0.99],[\"2017-06-22\",1279.85,11720.15,90.15,0.0,1242.75,3014.58,1771.83,10265.2,-0.98],[\"2017-06-21\",1050.47,11949.53,91.92,0.0,984.98,2256.29,1271.31,10367.173,0.76],[\"2017-06-20\",494.46,12505.54,96.2,0.0,453.37,1765.51,1312.14,10288.527,0.25],[\"2017-06-19\",1194.85,11805.15,90.81,0.0,1151.21,2338.43,1187.22,10262.8,0.7],[\"2017-06-16\",488.89,12511.11,96.24,0.0,444.57,2407.59,1963.02,10191.24,-0.3],[\"2017-06-15\",869.3,12130.7,93.31,0.0,837.4,2331.77,1494.37,10221.692,0.69],[\"2017-06-14\",-258.04,13258.04,101.98,0.0,-287.79,1608.76,1896.55,10151.534,-0.72],[\"2017-06-13\",697.3,12302.7,94.64,0.0,647.62,2225.87,1578.25,10224.818,1.04],[\"2017-06-12\",97.72,12902.28,99.25,0.0,21.12,2121.16,2100.04,10119.987,-0.56],[\"2017-06-09\",564.23,12435.77,95.66,0.0,503.35,2489.18,1985.83,10177.447,0.28],[\"2017-06-08\",1390.35,11609.65,89.31,0.0,1326.63,2631.47,1304.84,10148.722,0.38],[\"2017-06-07\",1807.93,11192.07,86.09,0.0,1742.92,3208.27,1465.35,10109.876,1.96],[\"2017-06-06\",1232.6,11767.4,90.52,0.0,1186.83,2198.93,1012.1,9915.923,0.74],[\"2017-06-05\",1016.79,11983.21,92.18,0.0,992.85,2043.07,1050.22,9842.602,0.49],[\"2017-06-02\",1026.1,11973.9,92.11,0.0,965.89,2022.76,1056.87,9794.889,0.66],[\"2017-06-01\",266.02,12733.98,97.95,0.0,238.61,1904.18,1665.57,9730.326,-1.36],[\"2017-05-31\",-213.71,13213.71,101.64,0.0,-241.58,1666.11,1907.69,9864.845,0.06]]}'" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ret" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/index_stock.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')\n", "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "db = DBSelector()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "mongo_db = db.mongo()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "product_doc=mongo_db['fund']['etf_product']" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "product_list =[]\n", "for item in product_doc.find({},{'_id':0}):\n", " product_list.append(item)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'etf_code': '000001',\n", " 'etf_name': '上证指数',\n", " 'etf_product': ['汇添富上证综合指数', '富国上证综指ETF', '富国上证综指ETF联接', '国泰上证综合ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000010',\n", " 'etf_name': '上证180',\n", " 'etf_product': ['万家180指数', '华安上证180ETF', '华安上证180ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000012',\n", " 'etf_name': '国债指数',\n", " 'etf_product': ['南方高股息股票A', '南方高股息股票C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000015',\n", " 'etf_name': '红利指数',\n", " 'etf_product': ['华泰柏瑞上证红利ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000300',\n", " 'etf_name': '沪深300',\n", " 'etf_product': ['博时沪深300指数A',\n", " '长盛全债指数增强债券',\n", " '长城久泰沪深300指数A',\n", " '嘉实沪深300ETF联接(LOF)A',\n", " '大成沪深300指数A/B'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000905',\n", " 'etf_name': '中证500',\n", " 'etf_product': ['南方中证500ETF联接(LOF)A',\n", " '广发500ETF联接(LOF)A',\n", " '鹏华中证500指数(LOF)A',\n", " '富国中证500指数增强(LOF)',\n", " '农银中证500指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000914',\n", " 'etf_name': '300金融',\n", " 'etf_product': ['国投金融地产ETF联接基金', '国投瑞银金融地产ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000919',\n", " 'etf_name': '300价值',\n", " 'etf_product': ['银河沪深300价值指数', '申万沪深300价值指数A', '申万沪深300价值指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11014',\n", " 'etf_name': '中证短融',\n", " 'etf_product': ['海富通中证短融ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000029',\n", " 'etf_name': '180价值',\n", " 'etf_product': ['华宝兴业上证180价值ETF', '华宝上证180价值ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000037',\n", " 'etf_name': '上证医药',\n", " 'etf_product': ['华夏医药ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000925',\n", " 'etf_name': '基本面50',\n", " 'etf_product': ['嘉实基本面50指数(LOF)A', '嘉实基本面50指数(LOF)C', '嘉实中证锐联基本面50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000042',\n", " 'etf_name': '上证央企',\n", " 'etf_product': ['工银上证央企50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000046',\n", " 'etf_name': '上证中小',\n", " 'etf_product': ['华泰柏瑞上证中小盘ETF', '华泰柏瑞上证中小盘ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000933',\n", " 'etf_name': '中证医药',\n", " 'etf_product': ['汇添富中证医药卫生ETF',\n", " '嘉实中证医药卫生ETF',\n", " '鹏华中证医药A(LOF)',\n", " '添富中证医药ETF联接A',\n", " '添富中证医药ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000935',\n", " 'etf_name': '中证信息',\n", " 'etf_product': ['鹏华中证信息技术指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931461',\n", " 'etf_name': '电子50',\n", " 'etf_product': ['华宝中证电子50ETF', '华安中证电子50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000944',\n", " 'etf_name': '内地资源',\n", " 'etf_product': ['民生加银中证内地资源主题指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000949',\n", " 'etf_name': '中证农业',\n", " 'etf_product': ['富国中证农业主题ETF', '银华中证农业主题ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000056',\n", " 'etf_name': '上证国企',\n", " 'etf_product': ['中银上证国企100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000901',\n", " 'etf_name': '小康指数',\n", " 'etf_product': ['南方小康ETF', '南方小康ETF联接A', '南方小康ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000961',\n", " 'etf_name': '中证上游',\n", " 'etf_product': ['国投瑞银中证资源指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000963',\n", " 'etf_name': '中证下游',\n", " 'etf_product': ['国投瑞银中证消费服务指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000066',\n", " 'etf_name': '上证商品',\n", " 'etf_product': ['国联安上证商品ETF', '国联安上证商品ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399701',\n", " 'etf_name': '深证F60',\n", " 'etf_product': ['深证基本面60ETF', '建信深证基本面60ETF联接A', '建信深证基本面60ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399702',\n", " 'etf_name': '深证F120',\n", " 'etf_product': ['嘉实深证基本面120ETF', '嘉实深证基本面120ETF联接A', '嘉实深证基本面120ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000969',\n", " 'etf_name': '300非周',\n", " 'etf_product': ['长安沪深300非周期指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000009',\n", " 'etf_name': '上证380',\n", " 'etf_product': ['南方上证380ETF联接A', '南方上证380ETF', '南方上证380ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000971',\n", " 'etf_name': '等权90',\n", " 'etf_product': ['银华中证等权重90指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000978',\n", " 'etf_name': '医药100',\n", " 'etf_product': ['国联安中证医药100A',\n", " '天弘中证医药100指数A',\n", " '天弘中证医药100指数C',\n", " '国联安中证医药100C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000984',\n", " 'etf_name': '300等权',\n", " 'etf_product': ['中银沪深300等权重指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000986',\n", " 'etf_name': '全指能源',\n", " 'etf_product': ['广发中证全指能源ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000991',\n", " 'etf_name': '全指医药',\n", " 'etf_product': ['广发中证全指医药卫生交易ETF',\n", " '广发医药卫生联接A',\n", " '广发医药卫生联接C',\n", " '银华中证全指医药卫生指数增强发起式'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000993',\n", " 'etf_name': '全指信息',\n", " 'etf_product': ['广发中证全指信息技术交易ETF', '广发信息技术联接ETFA', '广发信息技术联接ETFC'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399959',\n", " 'etf_name': '军工指数',\n", " 'etf_product': ['前海开源中航军工指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11136',\n", " 'etf_name': '中国互联网',\n", " 'etf_product': ['交银中证海外中国互联网指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000802',\n", " 'etf_name': '500沪市',\n", " 'etf_product': ['中证500沪市ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000998',\n", " 'etf_name': '中证TMT',\n", " 'etf_product': ['中信保诚中证TMT产业主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000805',\n", " 'etf_name': 'A股资源',\n", " 'etf_product': ['鹏华中证A股资源产业指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000808',\n", " 'etf_name': '医药生物',\n", " 'etf_product': ['申万菱信中证申万医药生物指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000815',\n", " 'etf_name': '细分食品',\n", " 'etf_product': ['华宝中证细分食品饮料产业主题ETF', '华夏中证细分食品饮料产业主题ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000819',\n", " 'etf_name': '有色金属',\n", " 'etf_product': ['南方中证申万有色金属ETF', '南方有色金属联接A', '南方有色金属联接C', '南方有色金属联接E'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000824',\n", " 'etf_name': '国企红利',\n", " 'etf_product': ['西部利得中证国有企业红利指数增强A', '西部利得中证国有企业红利指数增强C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000832',\n", " 'etf_name': '中证转债',\n", " 'etf_product': ['东吴中证可转债指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000827',\n", " 'etf_name': '中证环保',\n", " 'etf_product': ['广发中证环保产业ETF',\n", " '广发中证环保ETF联接基金A',\n", " '广发中证环保ETF联接基金C',\n", " '中证环保指数(LOF)A',\n", " '中证环保指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000846',\n", " 'etf_name': 'ESG 100',\n", " 'etf_product': ['中证财通可持续发展100指数A', '中证财通可持续发展100指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000841',\n", " 'etf_name': '800医药',\n", " 'etf_product': ['中信保诚中证800医药指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399965',\n", " 'etf_name': '800地产',\n", " 'etf_product': ['鹏华中证800地产指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399966',\n", " 'etf_name': '800证保',\n", " 'etf_product': ['鹏华中证800证券保险指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30031',\n", " 'etf_name': '800有色',\n", " 'etf_product': ['中信保诚中证800有色指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11077',\n", " 'etf_name': '10年国债',\n", " 'etf_product': ['上证10年期国债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30089',\n", " 'etf_name': '红利潜力',\n", " 'etf_product': ['建信中证红利潜力指数A', '建信中证红利潜力指数C', '山西证券中证红利潜力ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30094',\n", " 'etf_name': '消费红利',\n", " 'etf_product': ['方正富邦消费红利指数增强(LOF)', '泰达消费红利指数A', '泰达消费红利指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399975',\n", " 'etf_name': '证券公司',\n", " 'etf_product': ['国泰中证全指证券公司ETF',\n", " '华宝中证全指证券公司ETF',\n", " '南方全指证券联接A',\n", " '南方全指证券联接C',\n", " '南方中证全指证券公司ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30165',\n", " 'etf_name': '房地产',\n", " 'etf_product': ['南方中证全指房地产ETF',\n", " '南方房地产联接A',\n", " '南方房地产联接C',\n", " '华夏中证全指房地产ETF',\n", " '华夏中证全指房地产ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30184',\n", " 'etf_name': '半导体',\n", " 'etf_product': ['国联安中证全指半导体ETF', '国联安中证全指半导体ETF联接A', '国联安中证全指半导体ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931008',\n", " 'etf_name': '汽车指数',\n", " 'etf_product': ['广发中证全指汽车指数A', '广发中证全指汽车指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11098',\n", " 'etf_name': '沪城投债',\n", " 'etf_product': ['海富通上证城投债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399967',\n", " 'etf_name': '中证军工',\n", " 'etf_product': ['前海开源中证军工指数A',\n", " '前海开源中证军工指数C',\n", " '国泰中证军工ETF',\n", " '华宝中证军工ETF',\n", " '广发中证军工ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H50040',\n", " 'etf_name': '上红低波',\n", " 'etf_product': ['兴业上证红利低波动ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399973',\n", " 'etf_name': '中证国防',\n", " 'etf_product': ['鹏华中证国防ETF', '鹏华中证国防指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399970',\n", " 'etf_name': '移动互联',\n", " 'etf_product': ['富国中证移动互联网指数', '鹏华中证移动互联网指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399812',\n", " 'etf_name': '养老产业',\n", " 'etf_product': ['广发养老指数A', '广发养老指数C', '国寿安保中证养老产业指数增强'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30344',\n", " 'etf_name': '健康产业',\n", " 'etf_product': ['前海开源中证健康产业指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30359',\n", " 'etf_name': '转型成长',\n", " 'etf_product': ['浙商汇金中证转型成长指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399806',\n", " 'etf_name': '环境治理',\n", " 'etf_product': ['交银施罗德中证环境治理(LOF)',\n", " '汇添富中证环境治理指数(LOF)A',\n", " '汇添富中证环境治理指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30372',\n", " 'etf_name': '中证安全',\n", " 'etf_product': ['东海中证社会发展安全产业主题'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399974',\n", " 'etf_name': '国企改革',\n", " 'etf_product': ['南方中证国有企业改革指数(LOF)A',\n", " '南方中证国有企业改革指数(LOF)C',\n", " '富国中证国有企业改革指数',\n", " '易方达中证国企改革指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399989',\n", " 'etf_name': '中证医疗',\n", " 'etf_product': ['华宝中证医疗ETF',\n", " '广发中证医疗指数(LOF)A',\n", " '广发中证医疗指数(LOF)C',\n", " '国泰中证医疗交易型开放式指数ETF',\n", " '华宝中证医疗指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399976',\n", " 'etf_name': 'CS新能车',\n", " 'etf_product': ['华夏中证新能源汽车ETF',\n", " '国泰中证新能源汽车ETF',\n", " '国泰中证新能源汽车ETF联接A',\n", " '国泰中证新能源汽车ETF联接C',\n", " '博时新能源汽车ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399987',\n", " 'etf_name': '中证酒',\n", " 'etf_product': ['鹏华中证酒ETF', '鹏华中证酒指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30533',\n", " 'etf_name': '中国互联网50',\n", " 'etf_product': ['易方达中证海外中国互联网50ETF',\n", " '易方达中证海外联接人民币A',\n", " '易方达中证海外联接美元A',\n", " '易方达中证海外联接人民币C',\n", " '易方达中证海外联接美元C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399990',\n", " 'etf_name': '煤炭等权',\n", " 'etf_product': ['招商中证煤炭等权指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399997',\n", " 'etf_name': '中证白酒',\n", " 'etf_product': ['招商中证白酒指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30537',\n", " 'etf_name': '淘金100',\n", " 'etf_product': ['博时中证淘金大数据100A', '博时中证淘金大数据100I'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30588',\n", " 'etf_name': '中证证保',\n", " 'etf_product': ['天弘中证证券保险指数A', '天弘中证证券保险指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399804',\n", " 'etf_name': '中证体育',\n", " 'etf_product': ['富国中证体育产业指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399803',\n", " 'etf_name': '工业4.0',\n", " 'etf_product': ['富国中证工业4.0指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399809',\n", " 'etf_name': '保险主题',\n", " 'etf_product': ['方正富邦中证保险主题指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399998',\n", " 'etf_name': '中证煤炭',\n", " 'etf_product': ['国泰中证煤炭ETF',\n", " '国泰中证煤炭ETF联接A',\n", " '国泰中证煤炭ETF联接C',\n", " '中融中证煤炭指数',\n", " '富国中证煤炭指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H50069',\n", " 'etf_name': '港股通',\n", " 'etf_product': ['招商上证港股通ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930620',\n", " 'etf_name': 'CSSW丝路',\n", " 'etf_product': ['长盛中证申万一带一路主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399993',\n", " 'etf_name': 'CSWD生科',\n", " 'etf_product': ['易方达中证万得生物科技指数(LOF)A', '易方达中证万得生物科技指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930641',\n", " 'etf_name': '中证中药',\n", " 'etf_product': ['汇添富中证中药指数(LOF)A', '汇添富中证中药指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930653',\n", " 'etf_name': 'CS食品饮',\n", " 'etf_product': ['天弘中证食品饮料指数A', '天弘中证食品饮料指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930697',\n", " 'etf_name': '家用电器',\n", " 'etf_product': ['广发中证全指家用电器指数A',\n", " '广发中证全指家用电器指数C',\n", " '国泰中证全指家用电器ETF',\n", " '国泰中证全指家用电器ETF联接A',\n", " '国泰中证全指家用电器ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930701',\n", " 'etf_name': 'CS京津冀',\n", " 'etf_product': ['工银京津冀指数A',\n", " '广发中证京津冀ETF联接A',\n", " '广发中证京津冀ETF联接C',\n", " '广发中证京津冀ETF',\n", " '工银京津冀指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000016',\n", " 'etf_name': '上证50',\n", " 'etf_product': ['华夏上证50ETF',\n", " '易方达上证50指数A',\n", " '中海上证50指数增强',\n", " '万家上证50ETF',\n", " '华夏上证50ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000903',\n", " 'etf_name': '中证100',\n", " 'etf_product': ['长盛中证100指数',\n", " '中银中证100指数增强',\n", " '华宝中证100指数A',\n", " '海富通中证100指数(LOF)A',\n", " '诺安中证100指数A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000904',\n", " 'etf_name': '中证200',\n", " 'etf_product': ['泰信中证200指数基金', '民生加银中证200指数增强A', '民生加银中证200指数增强C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000906',\n", " 'etf_name': '中证800',\n", " 'etf_product': ['长盛同庆中证800(LOF)',\n", " '天弘中证800指数A',\n", " '天弘中证800指数C',\n", " '添富中证800ETF',\n", " '易方达中证800ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000913',\n", " 'etf_name': '300医药',\n", " 'etf_product': ['易方达沪深300医药ETF', '易方达沪深300医药卫生ETF联接A', '易方达沪深300医药卫生ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000018',\n", " 'etf_name': '180金融',\n", " 'etf_product': ['国泰上证180金融ETF', '国泰上证180金融ETF联接', '兴业上证180金融ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11001',\n", " 'etf_name': '中证全债',\n", " 'etf_product': ['湘财长源股票型A', '湘财长源股票型C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000922',\n", " 'etf_name': '中证红利',\n", " 'etf_product': ['富国中证红利指数增强A',\n", " '大成中证红利指数A',\n", " '万家中证红利指数(LOF)',\n", " '大成中证红利指数C',\n", " '招商中证红利ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000021',\n", " 'etf_name': '180治理',\n", " 'etf_product': ['交银上证180公司治理ETF', '交银上证180公司治理ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000036',\n", " 'etf_name': '上证消费',\n", " 'etf_product': ['华夏消费ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000038',\n", " 'etf_name': '上证金融',\n", " 'etf_product': ['华夏金融ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000043',\n", " 'etf_name': '超大盘',\n", " 'etf_product': ['博时上证超大盘ETF', '博时上证超大盘ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000044',\n", " 'etf_name': '上证中盘',\n", " 'etf_product': ['易方达上证中盘ETF', '易方达上证中盘ETF联接A', '易方达上证中盘ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000928',\n", " 'etf_name': '中证能源',\n", " 'etf_product': ['汇添富中证能源ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000932',\n", " 'etf_name': '中证消费',\n", " 'etf_product': ['汇添富中证主要消费ETF',\n", " '嘉实中证主要消费ETF',\n", " '汇添富中证主要消费ETF联接',\n", " '嘉实中证主要消费ETF联接A',\n", " '嘉实中证主要消费ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000934',\n", " 'etf_name': '中证金融',\n", " 'etf_product': ['汇添富中证金融地产ETF',\n", " '嘉实中证金融地产ETF',\n", " '嘉实中证金融地产ETF联接A',\n", " '嘉实中证金融地产ETF联接C',\n", " '长盛中证金融地产指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000048',\n", " 'etf_name': '责任指数',\n", " 'etf_product': ['建信上证社会责任ETF', '建信上证社会责任ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000063',\n", " 'etf_name': '上证周期',\n", " 'etf_product': ['海富通上证周期ETF', '海富通上证周期ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000064',\n", " 'etf_name': '非周期',\n", " 'etf_product': ['海富通上证非周期ETF', '海富通上证非周期ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000065',\n", " 'etf_name': '上证龙头',\n", " 'etf_product': ['华安上证龙头ETF', '华安上证龙头ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000964',\n", " 'etf_name': '中证新兴',\n", " 'etf_product': ['东吴中证新兴'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000068',\n", " 'etf_name': '上证资源',\n", " 'etf_product': ['博时上证自然资源ETF', '博时上证自然资源ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000069',\n", " 'etf_name': '消费80',\n", " 'etf_product': ['招商上证消费80ETF', '招商上证消费80ETF联接A', '招商上证消费80ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000966',\n", " 'etf_name': '基本400',\n", " 'etf_product': ['浦银安盛基本面400指数', '泰信中证锐联基本面400指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11017',\n", " 'etf_name': '中期国债',\n", " 'etf_product': ['嘉实中证金边中期国债ETF联接A', '嘉实中证金边中期国债ETF联接C', '嘉实中证中期国债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000982',\n", " 'etf_name': '500等权',\n", " 'etf_product': ['前海开源中证500等权ETF', '招商中证500等权重指数增强A', '招商中证500等权重指数增强C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000987',\n", " 'etf_name': '全指材料',\n", " 'etf_product': ['广发中证全指原材料ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000989',\n", " 'etf_name': '全指可选',\n", " 'etf_product': ['广发中证全指可选消费ETF', '广发中证全指可选消费ETF联接A', '广发中证全指可选消费ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000992',\n", " 'etf_name': '全指金融',\n", " 'etf_product': ['广发中证全指金融地产ETF', '广发中证全指金融地产ETF联接A', '广发中证全指金融地产ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000979',\n", " 'etf_name': '大宗商品',\n", " 'etf_product': ['招商中证商品指数基金(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000806',\n", " 'etf_name': '消费服务',\n", " 'etf_product': ['上投摩根中证消费服务指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000814',\n", " 'etf_name': '细分医药',\n", " 'etf_product': ['华安中证医药ETF', '华安中证细分医药交易A', '华安中证细分医药交易C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000821',\n", " 'etf_name': '300红利',\n", " 'etf_product': ['建信沪深300红利ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000828',\n", " 'etf_name': '300高贝',\n", " 'etf_product': ['招商沪深300高贝塔指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399802',\n", " 'etf_name': '500深市',\n", " 'etf_product': ['大成中证500深市ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H00140',\n", " 'etf_name': '5年国债',\n", " 'etf_product': ['国泰上证5年期国债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30035',\n", " 'etf_name': '300非银',\n", " 'etf_product': ['易方达沪深300非银ETF', '易方达沪深300非银行金融交易A', '易方达沪深300非银行金融交易C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30124',\n", " 'etf_name': '安中动态',\n", " 'etf_product': ['汇添富沪深300安中指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399986',\n", " 'etf_name': '中证银行',\n", " 'etf_product': ['富国中证银行指数', '南方中证银行ETF', '南方银行联接A', '南方银行联接C', '华宝中证银行ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931009',\n", " 'etf_name': '建筑材料',\n", " 'etf_product': ['广发中证全指建筑材料指数A', '广发中证全指建筑材料指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931160',\n", " 'etf_name': '通信设备',\n", " 'etf_product': ['国泰中证全指通信设备ETF', '国泰中证全指通信设备交易联接A', '国泰中证全指通信设备交易联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30257',\n", " 'etf_name': '500信息',\n", " 'etf_product': ['中证500信息技术指数ETF', '南方中证500信息技术ETF联接A', '南方中证500信息技术ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30263',\n", " 'etf_name': '腾讯济安',\n", " 'etf_product': ['定投宝'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399983',\n", " 'etf_name': '地产等权',\n", " 'etf_product': ['招商沪深300地产等权重指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30269',\n", " 'etf_name': '红利低波',\n", " 'etf_product': ['创金合信中证红利低波动指数A',\n", " '创金合信中证红利低波动指数C',\n", " '华泰柏瑞中证红利低波动ETF',\n", " '华泰柏瑞中证红利低波ETF联接A',\n", " '华泰柏瑞中证红利低波ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399971',\n", " 'etf_name': '中证传媒',\n", " 'etf_product': ['广发中证传媒ETF',\n", " '广发中证传媒ETF联接A',\n", " '广发中证传媒ETF联接C',\n", " '鹏华中证传媒ETF',\n", " '工银传媒指数A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30318',\n", " 'etf_name': '科技传媒通信150',\n", " 'etf_product': ['景顺长城中证科技传媒通信150ETF', '景顺长城中证科技传媒通信150ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H11018',\n", " 'etf_name': '沪质城投',\n", " 'etf_product': ['海富通上证城投债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399814',\n", " 'etf_name': '大农业',\n", " 'etf_product': ['前海开源中证大农业指数增强'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30373',\n", " 'etf_name': '百发100',\n", " 'etf_product': ['广发百发100指数A', '广发百发100指数E'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399996',\n", " 'etf_name': '智能家居',\n", " 'etf_product': ['中信保诚中证智能家居指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000852',\n", " 'etf_name': '中证1000',\n", " 'etf_product': ['南方中证1000ETF',\n", " '创金合信中证1000指数增强A',\n", " '创金合信中证1000指数增强C',\n", " '招商中证1000指数A',\n", " '招商中证1000指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30531',\n", " 'etf_name': '精工制造',\n", " 'etf_product': ['建信精工制造指数增强'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': 'H30535',\n", " 'etf_name': '互联网',\n", " 'etf_product': ['南方中证互联网指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399807',\n", " 'etf_name': '高铁产业',\n", " 'etf_product': ['南方中证高铁产业指数(LOF)', '鹏华中证高铁产业指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399991',\n", " 'etf_name': '一带一路',\n", " 'etf_product': ['鹏华中证一带一路主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399994',\n", " 'etf_name': '信息安全',\n", " 'etf_product': ['中信保诚中证信息安全指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399995',\n", " 'etf_name': '基建工程',\n", " 'etf_product': ['信诚中证基建工程指数(LOF)', '广发中证基建工程指数A', '广发中证基建工程指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930606',\n", " 'etf_name': '中证钢铁',\n", " 'etf_product': ['国泰中证钢铁ETF', '国泰中证钢铁ETF联接A', '国泰中证钢铁ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399707',\n", " 'etf_name': 'CSSW证券',\n", " 'etf_product': ['国泰中证申万证券行业指数(LOF)', '申万菱信中证申万证券行业指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399992',\n", " 'etf_name': 'CSWD并购',\n", " 'etf_product': ['易方达中证万得并购重组指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930648',\n", " 'etf_name': 'CS智消费',\n", " 'etf_product': ['博时中证智能消费ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930651',\n", " 'etf_name': 'CS计算机',\n", " 'etf_product': ['国泰中证计算机主题ETF',\n", " '天弘中证计算机主题ETF',\n", " '天弘中证计算机主题ETF联接A',\n", " '天弘中证计算机主题ETF联接C',\n", " '国泰中证计算机主题ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930652',\n", " 'etf_name': 'CS电子',\n", " 'etf_product': ['天弘中证电子ETF', '天弘中证电子ETF联接A', '天弘中证电子ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930703',\n", " 'etf_name': '福建50',\n", " 'etf_product': ['兴业中证福建50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930713',\n", " 'etf_name': 'CS人工智',\n", " 'etf_product': ['融通人工智能指数(LOF)A',\n", " '平安人工智能ETF',\n", " '华夏中证人工智能主题ETF',\n", " '融通人工智能指数(LOF)C',\n", " '华夏中证人工智能主题ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '399811',\n", " 'etf_name': 'CSSW电子',\n", " 'etf_product': ['申万菱信中证申万电子行业投资指数(LOF)A', '申万菱信中证申万电子行业投资指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930719',\n", " 'etf_name': 'CS精准医',\n", " 'etf_product': ['汇添富中证精准医指数A(LOF)', '汇添富中证精准医指数C(LOF)', '融通中证精准医疗主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930720',\n", " 'etf_name': 'CS互医疗',\n", " 'etf_product': ['汇添富中证互联网医疗指数(LOF)A', '汇添富中证互联网医疗指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930721',\n", " 'etf_name': 'CS智汽车',\n", " 'etf_product': ['富国中证智能汽车指数(LOF)',\n", " '富国中证智能汽车主题ETF',\n", " '天弘中证智能汽车A',\n", " '天弘中证智能汽车C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930723',\n", " 'etf_name': '沪港深F100',\n", " 'etf_product': ['浦银沪港深基本面'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930726',\n", " 'etf_name': 'CS生医',\n", " 'etf_product': ['国泰中证生物医药ETF', '国泰中证生物医药ETF联接A', '国泰中证生物医药ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930734',\n", " 'etf_name': '360互联+',\n", " 'etf_product': ['大成中证360A', '大成中证360C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930729',\n", " 'etf_name': '银智100',\n", " 'etf_product': ['博时银智大数据100A', '博时银智大数据100C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930743',\n", " 'etf_name': '中证生科',\n", " 'etf_product': ['汇添富中证生物科技指数(LOF)A', '汇添富中证生物科技指数(LOF)C', '易方达中证生物科技主题ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950090',\n", " 'etf_name': '上证50优选',\n", " 'etf_product': ['华夏上证50AH优选指数(LOF)A', '华夏上证50AH优选指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930780',\n", " 'etf_name': '中证兴业中高债',\n", " 'etf_product': ['中证兴业中高等级信用债指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930782',\n", " 'etf_name': '500SNLV',\n", " 'etf_product': ['景顺长城中证500行业中性低波动指数',\n", " '华安中证500低波ETF',\n", " '华安中证500低波ETF联接A',\n", " '华安中证500低波ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930784',\n", " 'etf_name': 'HK红利EW',\n", " 'etf_product': ['财通中证香港红利等权投资指数A', '财通中证香港红利等权投资指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930790',\n", " 'etf_name': 'CS娱乐TI',\n", " 'etf_product': ['富国中证娱乐主题指数增强型(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930791',\n", " 'etf_name': 'CS医药TI',\n", " 'etf_product': ['富国中证医药主题指数增强(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930792',\n", " 'etf_name': 'HK银行',\n", " 'etf_product': ['泰康香港银行指数A', '泰康香港银行指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930794',\n", " 'etf_name': '中美互联网',\n", " 'etf_product': ['天弘中证中美互联网指数(QDII)A', '天弘中证中美互联网指数(QDII)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930820',\n", " 'etf_name': 'CS高端制',\n", " 'etf_product': ['富国中证高端制造指数增强型(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950096',\n", " 'etf_name': '上海国企',\n", " 'etf_product': ['中证上海国企ETF', '中证上海国企ETF联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930836',\n", " 'etf_name': '沪港深高股息',\n", " 'etf_product': ['信达澳银中证沪港深高股息精选'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930838',\n", " 'etf_name': 'CS高股息',\n", " 'etf_product': ['浦银安盛中证高股息ETF', '浦银安盛中证高股息ETF联接A', '浦银安盛中证高股息ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930839',\n", " 'etf_name': 'HK高股息',\n", " 'etf_product': ['民生加银中证港股通高股息精选A', '民生加银中证港股通高股息精选C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930846',\n", " 'etf_name': '300SNLV',\n", " 'etf_product': ['华安沪深300行业中性低波动ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930865',\n", " 'etf_name': '5年地债',\n", " 'etf_product': ['鹏华中证5年地债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930851',\n", " 'etf_name': '云计算',\n", " 'etf_product': ['融通中证云计算与大数据主题指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930874',\n", " 'etf_name': '政金债8-10',\n", " 'etf_product': ['建信中证政策性金融债8-10年指数(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930875',\n", " 'etf_name': '空天军工',\n", " 'etf_product': ['鹏华空天一体A(LOF)', '鹏华空天一体C(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930902',\n", " 'etf_name': '中证数据',\n", " 'etf_product': ['富国中证大数据产业ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950105',\n", " 'etf_name': '上证证券',\n", " 'etf_product': ['汇安上证证券ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950109',\n", " 'etf_name': '上证10年地债',\n", " 'etf_product': ['上证10年期地方政府债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930914',\n", " 'etf_name': '港股通高股息',\n", " 'etf_product': ['汇添富中证港股通高股息投资指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930916',\n", " 'etf_name': '中证10年国债',\n", " 'etf_product': ['富国中证10年期国债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930917',\n", " 'etf_name': 'SHS高股息',\n", " 'etf_product': ['银河中证沪港深高股息指数A(LOF)', '银河中证沪港深高股息指数C(LOF)'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000171',\n", " 'etf_name': '新兴成指',\n", " 'etf_product': ['华夏战略新兴成指ETF', '华夏战略新兴成指ETF联接A', '华夏战略新兴成指ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950113',\n", " 'etf_name': '沪质中高债3-5',\n", " 'etf_product': ['华夏3-5年中高级可质押信用债ETF',\n", " '华夏3-5年中高级可质押信用债ETF联接A',\n", " '华夏3-5年中高级可质押信用债ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930949',\n", " 'etf_name': '价值回报',\n", " 'etf_product': ['中邮中证价值回报量化策略指数A', '中邮中证价值回报量化策略指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930954',\n", " 'etf_name': '5年久期国开债',\n", " 'etf_product': ['华富中证5年恒定久期国开债指数A', '华富中证5年恒定久期国开债指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930955',\n", " 'etf_name': '红利低波100',\n", " 'etf_product': ['天弘中证红利低波动100A', '天弘中证红利低波动100C', '景顺长城中证红利低波动100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930997',\n", " 'etf_name': '新能源车',\n", " 'etf_product': ['汇添富中证新能源汽车产业指数(LOF)A',\n", " '汇添富中证新能源汽车产业指数(LOF)C',\n", " '平安中证新能源汽车产业ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930999',\n", " 'etf_name': 'SHS大湾区',\n", " 'etf_product': ['建信中证沪港深粤港澳大湾区发展主题ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931000',\n", " 'etf_name': '大湾区',\n", " 'etf_product': ['粤港澳大湾区ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931018',\n", " 'etf_name': '中证5-10年国债活跃券',\n", " 'etf_product': ['平安中证5-10年期国债活跃券ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931024',\n", " 'etf_name': 'HKC非银',\n", " 'etf_product': ['泰康中证港股通非银指数A', '泰康中证港股通非银指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931033',\n", " 'etf_name': '杭州湾区',\n", " 'etf_product': ['南华中证杭州湾区交易ETF', '南华中证杭州湾区ETF联接A', '南华中证杭州湾区ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931052',\n", " 'etf_name': '国信价值',\n", " 'etf_product': ['富国中证价值ETF', '富国中证价值ETF联接A', '富国中证价值ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931062',\n", " 'etf_name': '质量低波',\n", " 'etf_product': ['恒生前海中证质量成长A', '恒生前海中证质量成长C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931066',\n", " 'etf_name': '军工龙头',\n", " 'etf_product': ['富国中证军工龙头ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931069',\n", " 'etf_name': '中金300',\n", " 'etf_product': ['中金中证优选300指数(LOF)A', '中金中证优选300指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931067',\n", " 'etf_name': '绩优策略',\n", " 'etf_product': ['泰达宏利中证绩优指数A', '泰达宏利中证绩优指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000860',\n", " 'etf_name': '结构调整',\n", " 'etf_product': ['博时央企结构调整ETF',\n", " '华夏中证央企ETF',\n", " '银华中证央企ETF',\n", " '华夏中证央企ETF联接A',\n", " '华夏中证央企ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930738',\n", " 'etf_name': '四川国改',\n", " 'etf_product': ['华夏中证四川国改ETF', '华夏中证四川国改发起式ETF联接A', '华夏中证四川国改发起式ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931071',\n", " 'etf_name': '人工智能',\n", " 'etf_product': ['华富中证人工智能产业ETF', '华富中证人工智能产业ETF联接A', '华富中证人工智能产业ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930939',\n", " 'etf_name': '500质量',\n", " 'etf_product': ['鹏扬中证500质量成长指数A', '鹏扬中证500质量成长指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931068',\n", " 'etf_name': '消费龙头',\n", " 'etf_product': ['华宝中证消费龙头指数(LOF)A', '华宝中证消费龙头指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930758',\n", " 'etf_name': '凤凰50',\n", " 'etf_product': ['浙商汇金中证浙江凤凰行动50ETF', '浙商之江凤凰联接'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '930740',\n", " 'etf_name': '300 红利LV',\n", " 'etf_product': ['嘉实沪深300红利低波动ETF',\n", " '嘉实沪深300红利低波动ETF联接A',\n", " '嘉实沪深300红利低波动ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931127',\n", " 'etf_name': '浙江新动能',\n", " 'etf_product': ['易方达中证浙江新动能ETF(QDII)',\n", " '易方达中证新动能ETF联接(QDII)A',\n", " '易方达中证新动能ETF联接(QDII)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931136',\n", " 'etf_name': '深圳科技',\n", " 'etf_product': ['安信深圳科技指数(LOF)A', '安信深圳科技指数(LOF)C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931078',\n", " 'etf_name': '中证转债及可交换债',\n", " 'etf_product': ['中泰中证可转债及可交债指数A', '中泰中证可转债及可交债指数C', '博时中证可转债及可交换债券ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950045',\n", " 'etf_name': '上证5年期地债',\n", " 'etf_product': ['海富通上证5年期地方政府债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931134',\n", " 'etf_name': 'AH经济蓝筹',\n", " 'etf_product': ['华夏中证AH经济蓝筹股票指数A', '华夏中证AH经济蓝筹股票指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931142',\n", " 'etf_name': '东证竞争',\n", " 'etf_product': ['东方红中证竞争力指数A', '东方红中证竞争力指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931087',\n", " 'etf_name': '科技龙头',\n", " 'etf_product': ['华宝中证科技龙头ETF', '华宝科技ETF联接A', '华宝科技ETF联接C', '工银瑞信中证科技龙头ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931139',\n", " 'etf_name': 'CS消费50',\n", " 'etf_product': ['富国中证消费50ETF',\n", " '富国中证消费50ETF联接A',\n", " '富国中证消费50ETF联接C',\n", " '东兴中证消费50指数A',\n", " '东兴中证消费50指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931140',\n", " 'etf_name': '医药50',\n", " 'etf_product': ['富国中证医药50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931141',\n", " 'etf_name': 'CS长三角',\n", " 'etf_product': ['添富中证长三角ETF', '汇添富中证长三角ETF联接A', '汇添富中证长三角ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931151',\n", " 'etf_name': '光伏产业',\n", " 'etf_product': ['华泰柏瑞中证光伏产业ETF', '银华中证光伏产业ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931152',\n", " 'etf_name': 'CS创新药',\n", " 'etf_product': ['银华中证创新药产业ETF', '广发中证创新药产业ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950041',\n", " 'etf_name': '上证投资级转债及可交换债',\n", " 'etf_product': ['海富通上证投资级可转债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '950047',\n", " 'etf_name': '上证1-5年地债',\n", " 'etf_product': ['兴业上证1-5年期地方政府债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931161',\n", " 'etf_name': '0-4年地债',\n", " 'etf_product': ['鹏华中证0-4年期地方政府债ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931162',\n", " 'etf_name': '中证转债及可交换债50',\n", " 'etf_product': ['长信中证转债及可交换债50指数A', '长信中证转债及可交换债50指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931079',\n", " 'etf_name': '5G通信',\n", " 'etf_product': ['华夏中证5G通信主题ETF',\n", " '华夏中证5G通信主题ETF联接A',\n", " '华夏中证5G通信主题ETF联接C',\n", " '银华中证5GETF',\n", " '银华中证5G通信主题ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931157',\n", " 'etf_name': 'SHS红利成长LV',\n", " 'etf_product': ['景顺沪港深红利成长低波动指数A', '景顺沪港深红利成长低波动指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931165',\n", " 'etf_name': '新兴科技100',\n", " 'etf_product': ['嘉实中证新兴科技100ETF', '嘉实新兴科技100ETF联接A', '嘉实新兴科技100ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931166',\n", " 'etf_name': '医药健康100',\n", " 'etf_product': ['嘉实医药健康100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931167',\n", " 'etf_name': '先进制造100',\n", " 'etf_product': ['嘉实先进制造100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931163',\n", " 'etf_name': '浙江100',\n", " 'etf_product': ['招商中证浙江100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000859',\n", " 'etf_name': '国企一带一路',\n", " 'etf_product': ['易方达中证国企一带一路ETF',\n", " '富国中证国企一带一路ETF',\n", " '添富中证国企一带一路ETF',\n", " '富国中证国企一带一路ETF联接A',\n", " '富国中证国企一带一路ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000861',\n", " 'etf_name': '央企创新',\n", " 'etf_product': ['富国央企创新ETF',\n", " '博时央企创新驱动ETF',\n", " '广发中证央企创新驱动ETF',\n", " '嘉实中证央企创新驱动ETF',\n", " '广发央企创新驱动ETF联接A'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931159',\n", " 'etf_name': '创新100',\n", " 'etf_product': ['诺德研发创新100',\n", " '申万菱信中证研发创新100ETF',\n", " '申万菱信中证研发创新100ETF联接A',\n", " '申万菱信中证研发创新100ETF联接C',\n", " '银华中证研发创新100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931186',\n", " 'etf_name': '中证科技',\n", " 'etf_product': ['富国中证科技50策略ETF', '富国中证科技50策略ETF联接A', '富国中证科技50策略ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931144',\n", " 'etf_name': '通信技术',\n", " 'etf_product': ['东财通信A', '东财通信C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931187',\n", " 'etf_name': '科技100',\n", " 'etf_product': ['华泰柏瑞中证科技100ETF',\n", " '华泰柏瑞中证科技ETF联接A',\n", " '华泰柏瑞中证科技ETF联接C',\n", " '天弘中证科技100指数增强A',\n", " '天弘中证科技100指数增强C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931175',\n", " 'etf_name': '银行50金融债',\n", " 'etf_product': ['兴业中证银行50金融债指数A', '兴业中证银行50金融债指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931172',\n", " 'etf_name': '信用主体50',\n", " 'etf_product': ['安信信用主体50债券指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931268',\n", " 'etf_name': '持续发展',\n", " 'etf_product': ['博时可持续发展100ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931373',\n", " 'etf_name': '股息龙头',\n", " 'etf_product': ['鹏华中证高股息龙头ETF', '鹏华股息龙头ETF联接A', '鹏华股息龙头ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931357',\n", " 'etf_name': '优选消费50',\n", " 'etf_product': ['中金中证沪港深优选消费50指数A', '中金中证沪港深优选消费50指数C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931306',\n", " 'etf_name': '国债及政金债1-5',\n", " 'etf_product': ['农银中证国债及政金债1-5年指数'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931381',\n", " 'etf_name': '中证长三角',\n", " 'etf_product': ['海富通中证长三角领先ETF联接', '海富通中证长三角领先ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931380',\n", " 'etf_name': '科技50',\n", " 'etf_product': ['易方达中证科技50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931372',\n", " 'etf_name': '浙江国资',\n", " 'etf_product': ['华夏中证浙江国资创新发展ETF',\n", " '华夏中证浙江国资创新发展ETF联接A',\n", " '华夏中证浙江国资创新发展ETF联接C'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '931406',\n", " 'etf_name': '5G 50',\n", " 'etf_product': ['博时中证5G产业50ETF'],\n", " 'crawltime': '2021-01-24'},\n", " {'etf_code': '000688',\n", " 'etf_name': '科创50',\n", " 'etf_product': ['工银上证科创板50成份ETF',\n", " '华泰柏瑞上证科创板50成份ETF',\n", " '华夏上证科创板50成份ETF',\n", " '易方达上证科创板50成份ETF'],\n", " 'crawltime': '2021-01-24'}]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "product_list" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "code_list = list(map(lambda x:x.get('etf_code'),product_list))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['000001',\n", " '000010',\n", " '000012',\n", " '000015',\n", " '000300',\n", " '000905',\n", " '000914',\n", " '000919',\n", " 'H11014',\n", " '000029',\n", " '000037',\n", " '000925',\n", " '000042',\n", " '000046',\n", " '000933',\n", " '000935',\n", " '931461',\n", " '000944',\n", " '000949',\n", " '000056',\n", " '000901',\n", " '000961',\n", " '000963',\n", " '000066',\n", " '399701',\n", " '399702',\n", " '000969',\n", " '000009',\n", " '000971',\n", " '000978',\n", " '000984',\n", " '000986',\n", " '000991',\n", " '000993',\n", " '399959',\n", " 'H11136',\n", " '000802',\n", " '000998',\n", " '000805',\n", " '000808',\n", " '000815',\n", " '000819',\n", " '000824',\n", " '000832',\n", " '000827',\n", " '000846',\n", " '000841',\n", " '399965',\n", " '399966',\n", " 'H30031',\n", " 'H11077',\n", " 'H30089',\n", " 'H30094',\n", " '399975',\n", " 'H30165',\n", " 'H30184',\n", " '931008',\n", " 'H11098',\n", " '399967',\n", " 'H50040',\n", " '399973',\n", " '399970',\n", " '399812',\n", " 'H30344',\n", " 'H30359',\n", " '399806',\n", " 'H30372',\n", " '399974',\n", " '399989',\n", " '399976',\n", " '399987',\n", " 'H30533',\n", " '399990',\n", " '399997',\n", " 'H30537',\n", " 'H30588',\n", " '399804',\n", " '399803',\n", " '399809',\n", " '399998',\n", " 'H50069',\n", " '930620',\n", " '399993',\n", " '930641',\n", " '930653',\n", " '930697',\n", " '930701',\n", " '000016',\n", " '000903',\n", " '000904',\n", " '000906',\n", " '000913',\n", " '000018',\n", " 'H11001',\n", " '000922',\n", " '000021',\n", " '000036',\n", " '000038',\n", " '000043',\n", " '000044',\n", " '000928',\n", " '000932',\n", " '000934',\n", " '000048',\n", " '000063',\n", " '000064',\n", " '000065',\n", " '000964',\n", " '000068',\n", " '000069',\n", " '000966',\n", " 'H11017',\n", " '000982',\n", " '000987',\n", " '000989',\n", " '000992',\n", " '000979',\n", " '000806',\n", " '000814',\n", " '000821',\n", " '000828',\n", " '399802',\n", " 'H00140',\n", " 'H30035',\n", " 'H30124',\n", " '399986',\n", " '931009',\n", " '931160',\n", " 'H30257',\n", " 'H30263',\n", " '399983',\n", " 'H30269',\n", " '399971',\n", " 'H30318',\n", " 'H11018',\n", " '399814',\n", " 'H30373',\n", " '399996',\n", " '000852',\n", " 'H30531',\n", " 'H30535',\n", " '399807',\n", " '399991',\n", " '399994',\n", " '399995',\n", " '930606',\n", " '399707',\n", " '399992',\n", " '930648',\n", " '930651',\n", " '930652',\n", " '930703',\n", " '930713',\n", " '399811',\n", " '930719',\n", " '930720',\n", " '930721',\n", " '930723',\n", " '930726',\n", " '930734',\n", " '930729',\n", " '930743',\n", " '950090',\n", " '930780',\n", " '930782',\n", " '930784',\n", " '930790',\n", " '930791',\n", " '930792',\n", " '930794',\n", " '930820',\n", " '950096',\n", " '930836',\n", " '930838',\n", " '930839',\n", " '930846',\n", " '930865',\n", " '930851',\n", " '930874',\n", " '930875',\n", " '930902',\n", " '950105',\n", " '950109',\n", " '930914',\n", " '930916',\n", " '930917',\n", " '000171',\n", " '950113',\n", " '930949',\n", " '930954',\n", " '930955',\n", " '930997',\n", " '930999',\n", " '931000',\n", " '931018',\n", " '931024',\n", " '931033',\n", " '931052',\n", " '931062',\n", " '931066',\n", " '931069',\n", " '931067',\n", " '000860',\n", " '930738',\n", " '931071',\n", " '930939',\n", " '931068',\n", " '930758',\n", " '930740',\n", " '931127',\n", " '931136',\n", " '931078',\n", " '950045',\n", " '931134',\n", " '931142',\n", " '931087',\n", " '931139',\n", " '931140',\n", " '931141',\n", " '931151',\n", " '931152',\n", " '950041',\n", " '950047',\n", " '931161',\n", " '931162',\n", " '931079',\n", " '931157',\n", " '931165',\n", " '931166',\n", " '931167',\n", " '931163',\n", " '000859',\n", " '000861',\n", " '931159',\n", " '931186',\n", " '931144',\n", " '931187',\n", " '931175',\n", " '931172',\n", " '931268',\n", " '931373',\n", " '931357',\n", " '931306',\n", " '931381',\n", " '931380',\n", " '931372',\n", " '931406',\n", " '000688']" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "code_list" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "etf_doc = mongo_db['fund']['etf_quanzhong']" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "etf_list=[]\n", "for item in etf_doc.find({},{'_id':0}):\n", " if item['ETF代码'] in code_list:\n", " etf_list.append(item)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "248" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(etf_list)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'ETF代码': '000012',\n", " 'ETF名称': '国债指数',\n", " '权重': [{'代码': '019639', '名称': '20特国04', '行业': None, '权重': 2.39},\n", " {'代码': '019637', '名称': '20特国03', '行业': None, '权重': 2.36},\n", " {'代码': '019632', '名称': '20国债06', '行业': None, '权重': 2.29},\n", " {'代码': '019634', '名称': '20国债08', '行业': None, '权重': 2.27},\n", " {'代码': '019631', '名称': '20国债05', '行业': None, '权重': 2.16},\n", " {'代码': '019641', '名称': '20国债11', '行业': None, '权重': 2.0},\n", " {'代码': '019614', '名称': '19国债04', '行业': None, '权重': 1.97},\n", " {'代码': '019643', '名称': '20国债13', '行业': None, '权重': 1.97},\n", " {'代码': '019617', '名称': '19国债07', '行业': None, '权重': 1.93},\n", " {'代码': '019616', '名称': '19国债06', '行业': None, '权重': 1.89}]}" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "etf_list[0]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "'权重'\n", "{'ETF代码': 'H30359', 'ETF名称': '转型成长', '权重': []}\n", "'权重'\n", "{'ETF代码': 'H30373', 'ETF名称': '百发100', '权重': []}\n", "'权重'\n", "{'ETF代码': 'H30537', 'ETF名称': '淘金100', '权重': []}\n", "'权重'\n", "{'ETF代码': '930734', 'ETF名称': '360互联+', '权重': []}\n", "'权重'\n", "{'ETF代码': '930729', 'ETF名称': '银智100', '权重': []}\n" ] } ], "source": [ "reach_15percent=[]\n", "for item in etf_list:\n", " qz=item['权重']\n", " df =pd.DataFrame(qz)\n", " try:\n", " df=df.sort_values(by='权重',ascending=False)\n", " if df.iloc[0]['权重']>=14:\n", " reach_15percent.append(item)\n", "# print(item['ETF名称'],item['ETF代码'])\n", "# print('#'*20)\n", " except Exception as e:\n", " print(e)\n", " print(item)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "reach_15percent_ =[]\n", "for item in reach_15percent:\n", " item['最大的个股']=item['权重'][0]['名称']\n", " item['最大的个股权重']=item['权重'][0]['权重']\n", " reach_15percent_.append(item)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(reach_15percent_,index=None)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "df.to_excel('more_than_15percent.xls',encoding='utf8',index=None)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5年国债 H00140\n", "10年国债 H11077\n", "'权重'\n", "{'ETF代码': 'H30359', 'ETF名称': '转型成长', '权重': []}\n", "'权重'\n", "{'ETF代码': 'H30373', 'ETF名称': '百发100', '权重': []}\n", "中国互联网50 H30533\n", "中证白酒 399997\n", "'权重'\n", "{'ETF代码': 'H30537', 'ETF名称': '淘金100', '权重': []}\n", "上证消费 000036\n", "中证能源 000928\n", "细分食品 000815\n", "300非银 H30035\n", "汽车指数 931008\n", "中证酒 399987\n", "高铁产业 399807\n", "保险主题 399809\n", "'权重'\n", "{'ETF代码': '930734', 'ETF名称': '360互联+', '权重': []}\n", "'权重'\n", "{'ETF代码': '930729', 'ETF名称': '银智100', '权重': []}\n", "HK银行 930792\n", "中证10年国债 930916\n", "中证5-10年国债活跃券 931018\n", "HKC非银 931024\n", "消费龙头 931068\n", "CS消费50 931139\n" ] } ], "source": [ "reach_60percent=[]\n", "for item in etf_list:\n", " qz=item['权重']\n", " df =pd.DataFrame(qz)\n", " try:\n", " df=df.sort_values(by='权重',ascending=False)\n", " total=df.iloc[0:5]['权重'].sum()\n", " if total>=59:\n", " item['total']=total\n", " reach_60percent.append(item)\n", " print(item['ETF名称'],item['ETF代码'])\n", " except Exception as e:\n", " print(e)\n", " print(item)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "reach_60percent_ =[]\n", "for item in reach_60percent:\n", " reach_60percent_.append(item)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "df=pd.DataFrame(reach_60percent_,index=None)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "df.to_excel('more_than_60percent.xls',encoding='utf8',index=None)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
代码名称权重行业
0000100TCL科技2.02可选消费
1300014亿纬锂能1.81工业
2600438通威股份1.75主要消费
3002460赣锋锂业1.55原材料
4300124汇川技术1.48工业
\n", "
" ], "text/plain": [ " 代码 名称 权重 行业\n", "0 000100 TCL科技 2.02 可选消费\n", "1 300014 亿纬锂能 1.81 工业\n", "2 600438 通威股份 1.75 主要消费\n", "3 002460 赣锋锂业 1.55 原材料\n", "4 300124 汇川技术 1.48 工业" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(etf_list[1]['权重'])[0:5]" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ETF代码': 'H00140',\n", " 'ETF名称': '5年国债',\n", " '权重': [{'代码': '019631', '名称': '20国债05', '行业': None, '权重': 25.19},\n", " {'代码': '019643', '名称': '20国债13', '行业': None, '权重': 22.9},\n", " {'代码': '019610', '名称': '18国债28', '行业': None, '权重': 16.46},\n", " {'代码': '019635', '名称': '20特国01', '行业': None, '权重': 15.49},\n", " {'代码': '019595', '名称': '18国债13', '行业': None, '权重': 10.15},\n", " {'代码': '019602', '名称': '18国债20', '行业': None, '权重': 9.83}],\n", " '最大的个股': '20国债05',\n", " '最大的个股权重': 25.19,\n", " 'total': 90.19000000000001}" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reach_60percent_[0]" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "result=[]\n", "for target in reach_15percent_:\n", " code = target.get('ETF代码')\n", " for p in product_list:\n", " if p.get('etf_code')==code:\n", " p_list = p.get('etf_product')\n", " result.append({'code':code,'name':target.get('ETF名称'),'基金列表':p_list})\n", " break" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'code': '000914', 'name': '300金融', '基金列表': ['国投金融地产ETF联接基金', '国投瑞银金融地产ETF']},\n", " {'code': '000037', 'name': '上证医药', '基金列表': ['华夏医药ETF']},\n", " {'code': '000038', 'name': '上证金融', '基金列表': ['华夏金融ETF']},\n", " {'code': '000063', 'name': '上证周期', '基金列表': ['海富通上证周期ETF', '海富通上证周期ETF联接']},\n", " {'code': '000814',\n", " 'name': '细分医药',\n", " '基金列表': ['华安中证医药ETF', '华安中证细分医药交易A', '华安中证细分医药交易C']},\n", " {'code': 'H00140', 'name': '5年国债', '基金列表': ['国泰上证5年期国债ETF']},\n", " {'code': '000841', 'name': '800医药', '基金列表': ['中信保诚中证800医药指数(LOF)']},\n", " {'code': '399966', 'name': '800证保', '基金列表': ['鹏华中证800证券保险指数(LOF)']},\n", " {'code': 'H30031', 'name': '800有色', '基金列表': ['中信保诚中证800有色指数(LOF)']},\n", " {'code': 'H11077', 'name': '10年国债', '基金列表': ['上证10年期国债ETF']},\n", " {'code': 'H30372', 'name': '中证安全', '基金列表': ['东海中证社会发展安全产业主题']},\n", " {'code': 'H30533',\n", " 'name': '中国互联网50',\n", " '基金列表': ['易方达中证海外中国互联网50ETF',\n", " '易方达中证海外联接人民币A',\n", " '易方达中证海外联接美元A',\n", " '易方达中证海外联接人民币C',\n", " '易方达中证海外联接美元C']},\n", " {'code': '399997', 'name': '中证白酒', '基金列表': ['招商中证白酒指数']},\n", " {'code': 'H30588', 'name': '中证证保', '基金列表': ['天弘中证证券保险指数A', '天弘中证证券保险指数C']},\n", " {'code': 'H50069', 'name': '港股通', '基金列表': ['招商上证港股通ETF']},\n", " {'code': '399707',\n", " 'name': 'CSSW证券',\n", " '基金列表': ['国泰中证申万证券行业指数(LOF)', '申万菱信中证申万证券行业指数']},\n", " {'code': '930651',\n", " 'name': 'CS计算机',\n", " '基金列表': ['国泰中证计算机主题ETF',\n", " '天弘中证计算机主题ETF',\n", " '天弘中证计算机主题ETF联接A',\n", " '天弘中证计算机主题ETF联接C',\n", " '国泰中证计算机主题ETF联接A']},\n", " {'code': '000913',\n", " 'name': '300医药',\n", " '基金列表': ['易方达沪深300医药ETF', '易方达沪深300医药卫生ETF联接A', '易方达沪深300医药卫生ETF联接C']},\n", " {'code': '000018',\n", " 'name': '180金融',\n", " '基金列表': ['国泰上证180金融ETF', '国泰上证180金融ETF联接', '兴业上证180金融ETF']},\n", " {'code': '000036', 'name': '上证消费', '基金列表': ['华夏消费ETF']},\n", " {'code': '000042', 'name': '上证央企', '基金列表': ['工银上证央企50ETF']},\n", " {'code': '000928', 'name': '中证能源', '基金列表': ['汇添富中证能源ETF']},\n", " {'code': '000934',\n", " 'name': '中证金融',\n", " '基金列表': ['汇添富中证金融地产ETF',\n", " '嘉实中证金融地产ETF',\n", " '嘉实中证金融地产ETF联接A',\n", " '嘉实中证金融地产ETF联接C',\n", " '长盛中证金融地产指数(LOF)']},\n", " {'code': '000048', 'name': '责任指数', '基金列表': ['建信上证社会责任ETF', '建信上证社会责任ETF联接']},\n", " {'code': '000944', 'name': '内地资源', '基金列表': ['民生加银中证内地资源主题指数']},\n", " {'code': '000064', 'name': '非周期', '基金列表': ['海富通上证非周期ETF', '海富通上证非周期ETF联接']},\n", " {'code': '000815',\n", " 'name': '细分食品',\n", " '基金列表': ['华宝中证细分食品饮料产业主题ETF', '华夏中证细分食品饮料产业主题ETF']},\n", " {'code': '399965', 'name': '800地产', '基金列表': ['鹏华中证800地产指数(LOF)']},\n", " {'code': 'H30035',\n", " 'name': '300非银',\n", " '基金列表': ['易方达沪深300非银ETF', '易方达沪深300非银行金融交易A', '易方达沪深300非银行金融交易C']},\n", " {'code': '399975',\n", " 'name': '证券公司',\n", " '基金列表': ['国泰中证全指证券公司ETF',\n", " '华宝中证全指证券公司ETF',\n", " '南方全指证券联接A',\n", " '南方全指证券联接C',\n", " '南方中证全指证券公司ETF']},\n", " {'code': '399986',\n", " 'name': '中证银行',\n", " '基金列表': ['富国中证银行指数', '南方中证银行ETF', '南方银行联接A', '南方银行联接C', '华宝中证银行ETF']},\n", " {'code': '931009',\n", " 'name': '建筑材料',\n", " '基金列表': ['广发中证全指建筑材料指数A', '广发中证全指建筑材料指数C']},\n", " {'code': '931008', 'name': '汽车指数', '基金列表': ['广发中证全指汽车指数A', '广发中证全指汽车指数C']},\n", " {'code': '399987', 'name': '中证酒', '基金列表': ['鹏华中证酒ETF', '鹏华中证酒指数(LOF)']},\n", " {'code': '399807',\n", " 'name': '高铁产业',\n", " '基金列表': ['南方中证高铁产业指数(LOF)', '鹏华中证高铁产业指数(LOF)']},\n", " {'code': '399809', 'name': '保险主题', '基金列表': ['方正富邦中证保险主题指数']},\n", " {'code': '930697',\n", " 'name': '家用电器',\n", " '基金列表': ['广发中证全指家用电器指数A',\n", " '广发中证全指家用电器指数C',\n", " '国泰中证全指家用电器ETF',\n", " '国泰中证全指家用电器ETF联接A',\n", " '国泰中证全指家用电器ETF联接C']},\n", " {'code': '950090',\n", " 'name': '上证50优选',\n", " '基金列表': ['华夏上证50AH优选指数(LOF)A', '华夏上证50AH优选指数(LOF)C']},\n", " {'code': '930792', 'name': 'HK银行', '基金列表': ['泰康香港银行指数A', '泰康香港银行指数C']},\n", " {'code': '950105', 'name': '上证证券', '基金列表': ['汇安上证证券ETF']},\n", " {'code': '930916', 'name': '中证10年国债', '基金列表': ['富国中证10年期国债ETF']},\n", " {'code': '931018', 'name': '中证5-10年国债活跃券', '基金列表': ['平安中证5-10年期国债活跃券ETF']},\n", " {'code': '931024', 'name': 'HKC非银', '基金列表': ['泰康中证港股通非银指数A', '泰康中证港股通非银指数C']},\n", " {'code': '930738',\n", " 'name': '四川国改',\n", " '基金列表': ['华夏中证四川国改ETF', '华夏中证四川国改发起式ETF联接A', '华夏中证四川国改发起式ETF联接C']},\n", " {'code': '931068',\n", " 'name': '消费龙头',\n", " '基金列表': ['华宝中证消费龙头指数(LOF)A', '华宝中证消费龙头指数(LOF)C']},\n", " {'code': '931139',\n", " 'name': 'CS消费50',\n", " '基金列表': ['富国中证消费50ETF',\n", " '富国中证消费50ETF联接A',\n", " '富国中证消费50ETF联接C',\n", " '东兴中证消费50指数A',\n", " '东兴中证消费50指数C']},\n", " {'code': '931372',\n", " 'name': '浙江国资',\n", " '基金列表': ['华夏中证浙江国资创新发展ETF', '华夏中证浙江国资创新发展ETF联接A', '华夏中证浙江国资创新发展ETF联接C']}]" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "df.to_excel('fund_list_15percent.xls',encoding='utf8',index=None)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "result_60percent=[]\n", "for target in reach_60percent_:\n", " code = target.get('ETF代码')\n", " for p in product_list:\n", " if p.get('etf_code')==code:\n", " p_list = p.get('etf_product')\n", " result_60percent.append({'code':code,'name':target.get('ETF名称'),'基金列表':p_list})\n", " break" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result_60percent)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "df.to_excel('fund_list_60percent.xls',encoding='utf8',index=None)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/ipospeed.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' # 查看ipo速度 和指数的关系 import tushare as ts import pandas as pd import numpy as np from pandas import Series import pyecharts.options as opts from pyecharts.charts import Line pd.set_option('display.max_rows', None) class IPOSpeed(): def __init__(self): self.ipo = ts.new_stocks() # 日期转化 self.ipo['ipo_date'] = self.ipo['ipo_date'].astype('datetime64') self.start = self.ipo['ipo_date'].iloc[-1] self.end = self.ipo['ipo_date'].values[0] # 转化类型 def comparation(self): delta = 30 count_list = [] profit_list = [] date_list =[] self.period = self.end + np.timedelta64(delta, 'D') start_date = self.start while start_date < self.end: first_date = start_date start_date = start_date + np.timedelta64(delta, 'D') result = self.ipo[(self.ipo['ipo_date'] >= first_date) & (self.ipo['ipo_date'] < start_date)] count = len(result) start_date_str = pd.to_datetime(str(first_date)).strftime('%Y-%m-%d') end_date_str = pd.to_datetime(str(start_date)).strftime('%Y-%m-%d') #index_data = ts.get_k_data('399001', index=True, start=start_date_str, end=end_date_str) index_data = ts.get_k_data('000001', index=True, start=start_date_str, end=end_date_str) # 大盘(深圳,考虑到国家队在上证的操作) 在30天内的收益 index_data = index_data start_v = index_data['close'].values[0] end_v = index_data['close'].values[-1] p = round((end_v - start_v) / start_v * 100, 2) count_list.append(count) profit_list.append(p) date_list.append(end_date_str) return count_list, profit_list,date_list def draw(self): count_list, profit_list,date_list = self.comparation() title1='IPO数量' title2='指数走势' title='相关性走势' c = ( Line() .add_xaxis(date_list) .add_yaxis(title1, count_list, is_smooth=True, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2, color='rgb(255, 0, 0)'), ).add_yaxis(title2, profit_list, is_smooth=True, linestyle_opts=opts.LineStyleOpts(width=2, color='rgb(0, 0, 255)'), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( title_opts=opts.TitleOpts(title=title), xaxis_opts=opts.AxisOpts( name='日期', min_interval=1, splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(rotate=55), ), yaxis_opts=opts.AxisOpts(name='收益率%', interval=3, # min_=_ymin - 2, # max_=_ymax + 2, splitline_opts=opts.SplitLineOpts(is_show=True), ) ) .set_colors(['red', 'blue']) # 点的颜色 .render(f"../data/IPO与指数走势相关性.html") ) count_s1 = Series(count_list, index=date_list) profit_s1 = Series(profit_list, index=date_list) relation_ratio = count_s1.corr(profit_s1) # 相关系数 print('IPO发行数据与沪深300的相关系数 ',relation_ratio) def main(): obj = IPOSpeed() obj.draw() if __name__=='__main__': main() ================================================ FILE: analysis/jucao_annnounce_parse.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/4/21 19:01 # @File : jucao_annnounce_parse.py # @Author : Rocky C@www.30daydo.com import datetime import os import sys import time sys.path.append('..') from common.BaseService import BaseService from configure.settings import DBSelector from threading import Thread from queue import Queue from pathlib import PurePath BASE = PurePath(__file__).parent class PDFParseproducer(Thread): def __init__(self, q,date=None): super(PDFParseproducer, self).__init__() if date is None: self.date = datetime.datetime.now().strftime('%Y-%m-%d') else: self.date=date self.doc = DBSelector().mongo('qq')['db_stock']['jucao_announcement'] self.q = q print('Producer start') def gen_date_list(self): current = datetime.datetime.now() + datetime.timedelta(days=1) last_day_count = 20 date_list=[] for i in range(last_day_count): slide_day = (current+datetime.timedelta(days=-1*i)).strftime('%Y-%m-%d') date_list.append(slide_day) return date_list def run(self): for d in self.gen_date_list(): print(d) # pending_data = self.doc.find({'analysis': {'$exists': False},'announcementTime':self.date}) pending_data = self.doc.find({'analysis': {'$exists': False},'announcementTime':d}) pending_data_list = list(pending_data) if len(pending_data_list) == 0: # 数据已为空了 continue for item in pending_data_list: code=item['code'] code_list=code.split(',') if any(map(lambda x:x.startswith(('16','501','502')),code_list)): task_data = { 'url': item['url'], 'announcementId': item['announcementId'], 'title': item['title'], 'secName': item['secName'], 'date':item['announcementTime'], 'code':code[:6], } print('pushing data',code,item['secName']) self.q.put(task_data) class JuCaoParser(BaseService, Thread): def __init__(self, q): BaseService.__init__(self, '../log/jucao_parser.log') Thread.__init__(self) self.q = q self.params = None self.db = DBSelector().mongo('qq') self.doc = self.db['db_stock']['jucao_announcement'] print('download thread start!') def run(self): print('running....... in thread') while not self.q.empty(): data = self.q.get() # print(data) url = data['url'] secName = data['secName'] title = data['title'] announcementId = data['announcementId'] date=data['date'] code=data['code'] PARENT_FOLDER=os.path.join(BASE,date) self.check_path(PARENT_FOLDER) try: content = self.get( url=url, _json=False, binary=True ) except Exception as e: self.logger.error(e) else: filename = f'{code}_{announcementId}_{secName[:50]}_{title[:50]}.pdf' full_path = os.path.join(PARENT_FOLDER, filename) with open(full_path, 'wb') as fp: fp.write(content) self.doc.update_one({'announcementId': announcementId}, {'$set': {'analysis': True}}) @property def headers(self): return { 'Referer': 'http://www.cninfo.com.cn/new/commonUrl/pageOfSearch?url=disclosure/list/search&lastPage=index', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36' } def main(): q = Queue() producer = PDFParseproducer(q) producer.start() time.sleep(5) thread_num = 4 thread_list=[] for i in range(thread_num): app = JuCaoParser(q) thread_list.append(app) for t in thread_list: t.start() for t in thread_list: t.join() if __name__ == '__main__': main() ================================================ FILE: analysis/last_year_price.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "filename = '../data/leavemarket.xlsx'" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "df = pd.read_excel(filename)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenamepricezgcodezgissuescalerecallscaleremainissustopendstayyearresult
0123081精研转债149.00300709精研科技5.7000.00.3842020-12-032021-12-172026-12-021.0强赎
1110051中天转债178.19600522中天科技39.6510.00.0522019-02-282021-12-162025-02-282.8强赎
2123074隆利转债162.20300752隆利科技3.2450.00.5922020-10-292021-12-152026-10-281.1强赎
3113614健20转债142.12603707健友股份7.8000.00.0112020-12-172021-12-142026-12-161.0强赎
4113603东缆转债239.44603606东方电缆8.0000.00.0502020-09-242021-11-292026-09-231.2强赎
\n", "
" ], "text/plain": [ " code name price zgcode zg issuescale recallscale remain \\\n", "0 123081 精研转债 149.00 300709 精研科技 5.700 0.0 0.384 \n", "1 110051 中天转债 178.19 600522 中天科技 39.651 0.0 0.052 \n", "2 123074 隆利转债 162.20 300752 隆利科技 3.245 0.0 0.592 \n", "3 113614 健20转债 142.12 603707 健友股份 7.800 0.0 0.011 \n", "4 113603 东缆转债 239.44 603606 东方电缆 8.000 0.0 0.050 \n", "\n", " issu stop end stayyear result \n", "0 2020-12-03 2021-12-17 2026-12-02 1.0 强赎 \n", "1 2019-02-28 2021-12-16 2025-02-28 2.8 强赎 \n", "2 2020-10-29 2021-12-15 2026-10-28 1.1 强赎 \n", "3 2020-12-17 2021-12-14 2026-12-16 1.0 强赎 \n", "4 2020-09-24 2021-11-29 2026-09-23 1.2 强赎 " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 218 entries, 0 to 217\n", "Data columns (total 13 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 code 218 non-null int64 \n", " 1 name 218 non-null object \n", " 2 price 218 non-null float64 \n", " 3 zgcode 218 non-null int64 \n", " 4 zg 218 non-null object \n", " 5 issuescale 218 non-null float64 \n", " 6 recallscale 218 non-null float64 \n", " 7 remain 218 non-null float64 \n", " 8 issu 218 non-null datetime64[ns]\n", " 9 stop 217 non-null datetime64[ns]\n", " 10 end 218 non-null datetime64[ns]\n", " 11 stayyear 217 non-null float64 \n", " 12 result 218 non-null object \n", "dtypes: datetime64[ns](3), float64(5), int64(2), object(3)\n", "memory usage: 22.3+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import datetime" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def get_remain_year(x):\n", " years = (x['end']-x['stop']).days/365\n", " return years" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df['more_year']=df.apply(get_remain_year,axis=1)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenamepricezgcodezgissuescalerecallscaleremainissustopendstayyearresultmore_year
0123081精研转债149.00300709精研科技5.7000.00.3842020-12-032021-12-172026-12-021.0强赎4.961644
1110051中天转债178.19600522中天科技39.6510.00.0522019-02-282021-12-162025-02-282.8强赎3.205479
2123074隆利转债162.20300752隆利科技3.2450.00.5922020-10-292021-12-152026-10-281.1强赎4.871233
3113614健20转债142.12603707健友股份7.8000.00.0112020-12-172021-12-142026-12-161.0强赎5.008219
4113603东缆转债239.44603606东方电缆8.0000.00.0502020-09-242021-11-292026-09-231.2强赎4.819178
\n", "
" ], "text/plain": [ " code name price zgcode zg issuescale recallscale remain \\\n", "0 123081 精研转债 149.00 300709 精研科技 5.700 0.0 0.384 \n", "1 110051 中天转债 178.19 600522 中天科技 39.651 0.0 0.052 \n", "2 123074 隆利转债 162.20 300752 隆利科技 3.245 0.0 0.592 \n", "3 113614 健20转债 142.12 603707 健友股份 7.800 0.0 0.011 \n", "4 113603 东缆转债 239.44 603606 东方电缆 8.000 0.0 0.050 \n", "\n", " issu stop end stayyear result more_year \n", "0 2020-12-03 2021-12-17 2026-12-02 1.0 强赎 4.961644 \n", "1 2019-02-28 2021-12-16 2025-02-28 2.8 强赎 3.205479 \n", "2 2020-10-29 2021-12-15 2026-10-28 1.1 强赎 4.871233 \n", "3 2020-12-17 2021-12-14 2026-12-16 1.0 强赎 5.008219 \n", "4 2020-09-24 2021-11-29 2026-09-23 1.2 强赎 4.819178 " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenamepricezgcodezgissuescalerecallscaleremainissustopendstayyearresultmore_year
12110033国贸转债101.640600755厦门国贸28.000.0000.3362016-01-052021-11-042022-01-055.8强赎0.169863
45110031航信转债106.700600271航天信息24.000.00023.9832015-06-122021-05-282021-06-126.0到期0.041096
60128010蔚蓝转债108.7902245蔚蓝锂芯5.100.0000.3852016-01-222021-02-262022-01-225.1强赎0.904110
69113008电气转债106.480601727上海电气60.000.00013.4222015-02-022021-01-182021-02-026.0到期0.041096
149110030格力转债105.690600185格力地产9.800.0004.2512014-12-252019-12-102019-12-255.0到期0.041096
183126729燕京转债149.979729燕京啤酒11.302.6230.0252010-10-152015-05-282015-10-144.6强赎0.380822
188110012海运转债206.460600798宁波海运7.200.0000.0132011-01-072015-05-112016-01-074.3强赎0.660274
210110007博汇转债108.610600966博汇纸业9.750.0000.1452009-09-232014-09-052014-09-235.0到期0.049315
213110003新钢转债106.550600782新钢股份27.600.02427.5762008-08-212013-08-062013-08-205.0到期0.038356
\n", "
" ], "text/plain": [ " code name price zgcode zg issuescale recallscale remain \\\n", "12 110033 国贸转债 101.640 600755 厦门国贸 28.00 0.000 0.336 \n", "45 110031 航信转债 106.700 600271 航天信息 24.00 0.000 23.983 \n", "60 128010 蔚蓝转债 108.790 2245 蔚蓝锂芯 5.10 0.000 0.385 \n", "69 113008 电气转债 106.480 601727 上海电气 60.00 0.000 13.422 \n", "149 110030 格力转债 105.690 600185 格力地产 9.80 0.000 4.251 \n", "183 126729 燕京转债 149.979 729 燕京啤酒 11.30 2.623 0.025 \n", "188 110012 海运转债 206.460 600798 宁波海运 7.20 0.000 0.013 \n", "210 110007 博汇转债 108.610 600966 博汇纸业 9.75 0.000 0.145 \n", "213 110003 新钢转债 106.550 600782 新钢股份 27.60 0.024 27.576 \n", "\n", " issu stop end stayyear result more_year \n", "12 2016-01-05 2021-11-04 2022-01-05 5.8 强赎 0.169863 \n", "45 2015-06-12 2021-05-28 2021-06-12 6.0 到期 0.041096 \n", "60 2016-01-22 2021-02-26 2022-01-22 5.1 强赎 0.904110 \n", "69 2015-02-02 2021-01-18 2021-02-02 6.0 到期 0.041096 \n", "149 2014-12-25 2019-12-10 2019-12-25 5.0 到期 0.041096 \n", "183 2010-10-15 2015-05-28 2015-10-14 4.6 强赎 0.380822 \n", "188 2011-01-07 2015-05-11 2016-01-07 4.3 强赎 0.660274 \n", "210 2009-09-23 2014-09-05 2014-09-23 5.0 到期 0.049315 \n", "213 2008-08-21 2013-08-06 2013-08-20 5.0 到期 0.038356 " ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cb_df[cb_df['more_year']<=1.2]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "cb_df=df[~df['name'].str.endswith('EB')]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "19" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(cb_df[cb_df['more_year']<=2.1])" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(cb_df[cb_df['more_year']<=1.1])" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "强赎 193\n", "到期 5\n", "不足3000万 4\n", "低于3千万 2\n", "撤销发行 1\n", "Name: result, dtype: int64" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cb_df['result'].value_counts()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
转债名称发行时间退市时间条款到期时间存续年限结果剩余多少年
代码
110031航信转债2015-06-122021-05-282021-06-126.0到期0.041096
113008电气转债2015-02-022021-01-182021-02-026.0到期0.041096
110030格力转债2014-12-252019-12-102019-12-255.0到期0.041096
110007博汇转债2009-09-232014-09-052014-09-235.0到期0.049315
110003新钢转债2008-08-212013-08-062013-08-205.0到期0.038356
\n", "
" ], "text/plain": [ " 转债名称 发行时间 退市时间 条款到期时间 存续年限 结果 剩余多少年\n", "代码 \n", "110031 航信转债 2015-06-12 2021-05-28 2021-06-12 6.0 到期 0.041096\n", "113008 电气转债 2015-02-02 2021-01-18 2021-02-02 6.0 到期 0.041096\n", "110030 格力转债 2014-12-25 2019-12-10 2019-12-25 5.0 到期 0.041096\n", "110007 博汇转债 2009-09-23 2014-09-05 2014-09-23 5.0 到期 0.049315\n", "110003 新钢转债 2008-08-21 2013-08-06 2013-08-20 5.0 到期 0.038356" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cc_df_[cc_df_['结果']=='到期']" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
转债名称发行时间退市时间条款到期时间存续年限结果剩余多少年
代码
128060中装转债2019-03-262020-02-122025-03-260.9不足3000万5.120548
113507天马转债2018-04-172019-11-042024-04-171.6不足3000万4.454795
113010江南转债2016-03-182019-01-292022-03-182.9不足3000万3.134247
110009双良转债2010-05-042011-12-142015-05-041.6不足3000万3.389041
\n", "
" ], "text/plain": [ " 转债名称 发行时间 退市时间 条款到期时间 存续年限 结果 剩余多少年\n", "代码 \n", "128060 中装转债 2019-03-26 2020-02-12 2025-03-26 0.9 不足3000万 5.120548\n", "113507 天马转债 2018-04-17 2019-11-04 2024-04-17 1.6 不足3000万 4.454795\n", "113010 江南转债 2016-03-18 2019-01-29 2022-03-18 2.9 不足3000万 3.134247\n", "110009 双良转债 2010-05-04 2011-12-14 2015-05-04 1.6 不足3000万 3.389041" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cc_df_[cc_df_['结果']=='不足3000万']" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
转债名称发行时间退市时间条款到期时间存续年限结果剩余多少年
代码
123029英科转债2019-08-162021-06-282025-08-151.9低于3千万4.134247
128012辉丰转债2016-04-212020-05-252022-04-214.1低于3千万1.906849
\n", "
" ], "text/plain": [ " 转债名称 发行时间 退市时间 条款到期时间 存续年限 结果 剩余多少年\n", "代码 \n", "123029 英科转债 2019-08-16 2021-06-28 2025-08-15 1.9 低于3千万 4.134247\n", "128012 辉丰转债 2016-04-21 2020-05-25 2022-04-21 4.1 低于3千万 1.906849" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cc_df_[cc_df_['结果']=='低于3千万']" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "205" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(cb_df)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.024390243902439025" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "5/205" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "cc_df_=cb_df.rename(columns={'code':'代码','name':'转债名称','price':'最后价格','zgcode':'正股代码',\n", "'zg':'正股名','issuescale':'发行规模','recallscale':'回售规模','remain':'剩余规模',\n", "'issu':'发行时间','stop':'退市时间','end':'条款到期时间','stayyear':'存续年限','result':'结果','more_year':'剩余多少年'\n", "})" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "cc_df_=cc_df_[['代码',\t'转债名称',\t\t'发行时间',\t'退市时间',\t'条款到期时间',\t'存续年限',\t'结果'\t,'剩余多少年']]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
转债名称发行时间退市时间条款到期时间存续年限结果剩余多少年
代码
110033国贸转债2016-01-052021-11-042022-01-055.8强赎0.169863
110031航信转债2015-06-122021-05-282021-06-126.0到期0.041096
128010蔚蓝转债2016-01-222021-02-262022-01-225.1强赎0.904110
113008电气转债2015-02-022021-01-182021-02-026.0到期0.041096
110030格力转债2014-12-252019-12-102019-12-255.0到期0.041096
126729燕京转债2010-10-152015-05-282015-10-144.6强赎0.380822
110012海运转债2011-01-072015-05-112016-01-074.3强赎0.660274
110007博汇转债2009-09-232014-09-052014-09-235.0到期0.049315
110003新钢转债2008-08-212013-08-062013-08-205.0到期0.038356
\n", "
" ], "text/plain": [ " 转债名称 发行时间 退市时间 条款到期时间 存续年限 结果 剩余多少年\n", "代码 \n", "110033 国贸转债 2016-01-05 2021-11-04 2022-01-05 5.8 强赎 0.169863\n", "110031 航信转债 2015-06-12 2021-05-28 2021-06-12 6.0 到期 0.041096\n", "128010 蔚蓝转债 2016-01-22 2021-02-26 2022-01-22 5.1 强赎 0.904110\n", "113008 电气转债 2015-02-02 2021-01-18 2021-02-02 6.0 到期 0.041096\n", "110030 格力转债 2014-12-25 2019-12-10 2019-12-25 5.0 到期 0.041096\n", "126729 燕京转债 2010-10-15 2015-05-28 2015-10-14 4.6 强赎 0.380822\n", "110012 海运转债 2011-01-07 2015-05-11 2016-01-07 4.3 强赎 0.660274\n", "110007 博汇转债 2009-09-23 2014-09-05 2014-09-23 5.0 到期 0.049315\n", "110003 新钢转债 2008-08-21 2013-08-06 2013-08-20 5.0 到期 0.038356" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cc_df_[cc_df_['剩余多少年']<=1.0]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "cc_df_=cc_df_.set_index('代码',drop=True)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5555555555555556" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "5/9" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
转债名称发行时间退市时间条款到期时间存续年限结果剩余多少年
代码
110031航信转债2015-06-122021-05-282021-06-126.0到期0.041096
113008电气转债2015-02-022021-01-182021-02-026.0到期0.041096
110030格力转债2014-12-252019-12-102019-12-255.0到期0.041096
110007博汇转债2009-09-232014-09-052014-09-235.0到期0.049315
110003新钢转债2008-08-212013-08-062013-08-205.0到期0.038356
\n", "
" ], "text/plain": [ " 转债名称 发行时间 退市时间 条款到期时间 存续年限 结果 剩余多少年\n", "代码 \n", "110031 航信转债 2015-06-12 2021-05-28 2021-06-12 6.0 到期 0.041096\n", "113008 电气转债 2015-02-02 2021-01-18 2021-02-02 6.0 到期 0.041096\n", "110030 格力转债 2014-12-25 2019-12-10 2019-12-25 5.0 到期 0.041096\n", "110007 博汇转债 2009-09-23 2014-09-05 2014-09-23 5.0 到期 0.049315\n", "110003 新钢转债 2008-08-21 2013-08-06 2013-08-20 5.0 到期 0.038356" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cc_df_[(cc_df_['剩余多少年']<=1.0)&(cc_df_['结果']=='到期')]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "28d2dd8735d5b963e054e321a2b13f416b1a0f524027151d22c8eb8270a4fd3f" }, "kernelspec": { "display_name": "Python 3.9.5 64-bit ('3.9': conda)", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/levt_notebook.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Getting data:]#############总成交股数\n", "大于100手的总和 2150\n", "大单占比 0.326648435126\n" ] } ], "source": [ "import tushare as ts\n", "import os\n", "df = ts.get_today_ticks('300104')\n", "total_vol=df['volume'].sum()*100\n", "print(u'总成交股数'\n",) "big_deal=df[df['volume']>=100]['volume'].sum()\n", "print(u'大于100手的总和',big_deal\n",) "percent=float(big_deal)/total_vol*100\n", "print(u'大单占比',percent") ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "大于100手的总和 215000\n" ] } ], "source": [ "big_deal=df[df['volume']>=100]['volume'].sum()*100\n", "print(u'大于100手的总和',big_deal") ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "32.6648435126\n" ] } ], "source": [ "percent=float(big_deal)/total_vol*100\n", "print(percent") ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timepricepchangechangevolumeamounttype
75809:25:0310.06-10.0209379426220
75609:30:0610.06-10.020217218302买盘
67509:37:4510.06-10.020206207236买盘
56309:50:2110.06-10.020200201200买盘
33810:47:0010.06-10.020146146876买盘
2614:50:2710.06-10.020125125750买盘
75709:30:0310.06-10.020118118708买盘
5114:38:1210.06-10.020101101606买盘
13613:59:0610.06-10.020100100600买盘
74709:30:4210.06-10.0209898588买盘
015:00:0310.06-10.0209696576买盘
17713:40:0610.06-10.0209191546买盘
75509:30:0910.06-10.0208989534买盘
35710:40:0610.06-10.0208181486买盘
35610:40:0610.06-10.0208181486中性盘
74309:31:0310.06-10.0206868408买盘
63609:40:3610.06-10.0205757342买盘
62209:42:2710.06-10.0205454324买盘
37210:34:3910.06-10.0205050300买盘
75409:30:1210.06-10.0204848288买盘
71009:34:3310.06-10.0204848288买盘
66609:38:1510.06-10.0204141246买盘
25413:00:0610.06-10.0204141246买盘
67309:37:5410.06-10.0203838228买盘
66209:38:3910.06-10.0203535210买盘
69409:36:1210.06-10.0203434204买盘
36210:38:4810.06-10.0203434204买盘
61909:43:1810.06-10.0203232192买盘
7514:27:0310.06-10.0203232192买盘
68409:37:0010.06-10.0203131186买盘
........................
44810:14:3010.06-10.02011006买盘
44610:14:5710.06-10.02011006买盘
44410:15:3910.06-10.02011006买盘
44310:15:5410.06-10.02011006买盘
44210:16:0010.06-10.02011006买盘
43810:16:2710.06-10.02011006买盘
46610:10:2410.06-10.02011006买盘
25013:01:4810.06-10.02011006买盘
47210:09:0310.06-10.02011006买盘
48710:04:4810.06-10.02011006买盘
23713:06:0310.06-10.02011006买盘
23913:04:5110.06-10.02011006买盘
49410:02:5110.06-10.02011006买盘
24113:04:2710.06-10.02011006买盘
24213:04:2110.06-10.02011006买盘
49010:03:4510.06-10.02011006买盘
24313:04:0010.06-10.02011006买盘
47410:08:0010.06-10.02011006买盘
24413:03:5410.06-10.02011006买盘
24513:03:4810.06-10.02011006买盘
48310:06:1810.06-10.02011006买盘
9114:18:3010.06-10.02011006买盘
48110:06:5710.06-10.02011006买盘
48010:07:0910.06-10.02011006买盘
9214:18:0910.06-10.02011006买盘
47810:07:1810.06-10.02011006买盘
24813:03:2710.06-10.02011006买盘
1114:54:5110.06-10.02011006买盘
114:57:0310.06-10.02000买盘
25611:30:0310.06-10.02000买盘
\n", "

759 rows × 7 columns

\n", "
" ], "text/plain": [ " time price pchange change volume amount type\n", "758 09:25:03 10.06 -10.02 0 937 942622 0\n", "756 09:30:06 10.06 -10.02 0 217 218302 买盘\n", "675 09:37:45 10.06 -10.02 0 206 207236 买盘\n", "563 09:50:21 10.06 -10.02 0 200 201200 买盘\n", "338 10:47:00 10.06 -10.02 0 146 146876 买盘\n", "26 14:50:27 10.06 -10.02 0 125 125750 买盘\n", "757 09:30:03 10.06 -10.02 0 118 118708 买盘\n", "51 14:38:12 10.06 -10.02 0 101 101606 买盘\n", "136 13:59:06 10.06 -10.02 0 100 100600 买盘\n", "747 09:30:42 10.06 -10.02 0 98 98588 买盘\n", "0 15:00:03 10.06 -10.02 0 96 96576 买盘\n", "177 13:40:06 10.06 -10.02 0 91 91546 买盘\n", "755 09:30:09 10.06 -10.02 0 89 89534 买盘\n", "357 10:40:06 10.06 -10.02 0 81 81486 买盘\n", "356 10:40:06 10.06 -10.02 0 81 81486 中性盘\n", "743 09:31:03 10.06 -10.02 0 68 68408 买盘\n", "636 09:40:36 10.06 -10.02 0 57 57342 买盘\n", "622 09:42:27 10.06 -10.02 0 54 54324 买盘\n", "372 10:34:39 10.06 -10.02 0 50 50300 买盘\n", "754 09:30:12 10.06 -10.02 0 48 48288 买盘\n", "710 09:34:33 10.06 -10.02 0 48 48288 买盘\n", "666 09:38:15 10.06 -10.02 0 41 41246 买盘\n", "254 13:00:06 10.06 -10.02 0 41 41246 买盘\n", "673 09:37:54 10.06 -10.02 0 38 38228 买盘\n", "662 09:38:39 10.06 -10.02 0 35 35210 买盘\n", "694 09:36:12 10.06 -10.02 0 34 34204 买盘\n", "362 10:38:48 10.06 -10.02 0 34 34204 买盘\n", "619 09:43:18 10.06 -10.02 0 32 32192 买盘\n", "75 14:27:03 10.06 -10.02 0 32 32192 买盘\n", "684 09:37:00 10.06 -10.02 0 31 31186 买盘\n", ".. ... ... ... ... ... ... ...\n", "448 10:14:30 10.06 -10.02 0 1 1006 买盘\n", "446 10:14:57 10.06 -10.02 0 1 1006 买盘\n", "444 10:15:39 10.06 -10.02 0 1 1006 买盘\n", "443 10:15:54 10.06 -10.02 0 1 1006 买盘\n", "442 10:16:00 10.06 -10.02 0 1 1006 买盘\n", "438 10:16:27 10.06 -10.02 0 1 1006 买盘\n", "466 10:10:24 10.06 -10.02 0 1 1006 买盘\n", "250 13:01:48 10.06 -10.02 0 1 1006 买盘\n", "472 10:09:03 10.06 -10.02 0 1 1006 买盘\n", "487 10:04:48 10.06 -10.02 0 1 1006 买盘\n", "237 13:06:03 10.06 -10.02 0 1 1006 买盘\n", "239 13:04:51 10.06 -10.02 0 1 1006 买盘\n", "494 10:02:51 10.06 -10.02 0 1 1006 买盘\n", "241 13:04:27 10.06 -10.02 0 1 1006 买盘\n", "242 13:04:21 10.06 -10.02 0 1 1006 买盘\n", "490 10:03:45 10.06 -10.02 0 1 1006 买盘\n", "243 13:04:00 10.06 -10.02 0 1 1006 买盘\n", "474 10:08:00 10.06 -10.02 0 1 1006 买盘\n", "244 13:03:54 10.06 -10.02 0 1 1006 买盘\n", "245 13:03:48 10.06 -10.02 0 1 1006 买盘\n", "483 10:06:18 10.06 -10.02 0 1 1006 买盘\n", "91 14:18:30 10.06 -10.02 0 1 1006 买盘\n", "481 10:06:57 10.06 -10.02 0 1 1006 买盘\n", "480 10:07:09 10.06 -10.02 0 1 1006 买盘\n", "92 14:18:09 10.06 -10.02 0 1 1006 买盘\n", "478 10:07:18 10.06 -10.02 0 1 1006 买盘\n", "248 13:03:27 10.06 -10.02 0 1 1006 买盘\n", "11 14:54:51 10.06 -10.02 0 1 1006 买盘\n", "1 14:57:03 10.06 -10.02 0 0 0 买盘\n", "256 11:30:03 10.06 -10.02 0 0 0 买盘\n", "\n", "[759 rows x 7 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values('volume',ascending=False)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timepricepchangechangevolumeamounttype
4514:41:0910.06-10.0201212072中性盘
8514:20:1510.06-10.02099054中性盘
12414:03:1510.06-10.02033018中性盘
16713:44:2410.06-10.02011006中性盘
20113:24:0610.06-10.02011006中性盘
23313:06:5710.06-10.02011006中性盘
27111:17:5110.06-10.02011006中性盘
30810:58:2110.06-10.02022012中性盘
35610:40:0610.06-10.0208181486中性盘
42210:21:1210.06-10.02011006中性盘
49510:02:3910.06-10.02066036中性盘
61309:43:3910.06-10.02088048中性盘
\n", "
" ], "text/plain": [ " time price pchange change volume amount type\n", "45 14:41:09 10.06 -10.02 0 12 12072 中性盘\n", "85 14:20:15 10.06 -10.02 0 9 9054 中性盘\n", "124 14:03:15 10.06 -10.02 0 3 3018 中性盘\n", "167 13:44:24 10.06 -10.02 0 1 1006 中性盘\n", "201 13:24:06 10.06 -10.02 0 1 1006 中性盘\n", "233 13:06:57 10.06 -10.02 0 1 1006 中性盘\n", "271 11:17:51 10.06 -10.02 0 1 1006 中性盘\n", "308 10:58:21 10.06 -10.02 0 2 2012 中性盘\n", "356 10:40:06 10.06 -10.02 0 81 81486 中性盘\n", "422 10:21:12 10.06 -10.02 0 1 1006 中性盘\n", "495 10:02:39 10.06 -10.02 0 6 6036 中性盘\n", "613 09:43:39 10.06 -10.02 0 8 8048 中性盘" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['type']==u'中性盘']" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 299\n", "2 98\n", "10 71\n", "3 64\n", "5 47\n", "4 30\n", "6 20\n", "8 17\n", "9 13\n", "11 11\n", "20 9\n", "7 6\n", "12 6\n", "14 5\n", "30 5\n", "13 4\n", "15 4\n", "18 3\n", "21 3\n", "16 2\n", "17 2\n", "32 2\n", "28 2\n", "0 2\n", "81 2\n", "41 2\n", "48 2\n", "34 2\n", "31 1\n", "206 1\n", "200 1\n", "146 1\n", "125 1\n", "118 1\n", "101 1\n", "100 1\n", "98 1\n", "96 1\n", "91 1\n", "89 1\n", "57 1\n", "68 1\n", "54 1\n", "50 1\n", "19 1\n", "38 1\n", "35 1\n", "22 1\n", "23 1\n", "24 1\n", "25 1\n", "217 1\n", "29 1\n", "937 1\n", "Name: volume, dtype: int64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['volume'].value_counts()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "small_deal=df[df['volume']<10]['volume'].sum()*100" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "145700" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "small_deal" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.0" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['volume'].median()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1., 2., 8., 937.])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy import stats\n", "stats.scoreatpercentile(df['volume'],[25,50,75,100])" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 -3.257\n", "1 -0.802\n", "2 -1.224\n", "3 0.000\n", "4 0.514\n", "5 -1.086\n", "6 -2.472\n", "7 0.405\n", "8 -1.762\n", "9 -1.067\n", "10 0.000\n", "11 -3.340\n", "12 -2.318\n", "13 0.838\n", "14 1.137\n", "15 -1.505\n", "16 -1.403\n", "17 1.354\n", "18 -2.817\n", "19 -1.615\n", "20 -2.445\n", "21 -1.766\n", "22 0.288\n", "23 -0.834\n", "24 -1.614\n", "25 -1.638\n", "26 -4.480\n", "27 -2.630\n", "28 1.794\n", "29 1.090\n", " ... \n", "3457 0.000\n", "3458 -0.334\n", "3459 0.000\n", "3460 -2.094\n", "3461 -0.579\n", "3462 -2.408\n", "3463 -2.244\n", "3464 0.862\n", "3465 -0.926\n", "3466 -1.141\n", "3467 -1.535\n", "3468 -4.762\n", "3469 1.089\n", "3470 -2.813\n", "3471 2.628\n", "3472 0.000\n", "3473 5.011\n", "3474 -2.474\n", "3475 -1.004\n", "3476 -0.773\n", "3477 0.228\n", "3478 -1.667\n", "3479 0.000\n", "3480 1.080\n", "3481 0.000\n", "3482 -2.874\n", "3483 0.000\n", "3484 -5.108\n", "3485 1.111\n", "3486 -0.478\n", "Name: changepercent, Length: 3487, dtype: float64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['changepercent']" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.261" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['changepercent'].median()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenamechangepercenttradeopenhighlowsettlementvolumeturnoverratioamountperpbmktcapnmc
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [code, name, changepercent, trade, open, high, low, settlement, volume, turnoverratio, amount, per, pb, mktcap, nmc]\n", "Index: []" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "df[df['changepercent']==np.nan]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/location.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import tushare as ts\n", "\n", "df=ts.get_area_classified()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "浙江 417\n", "江苏 384\n", "北京 308\n", "广东 302\n", "上海 278\n", "深圳 270\n", "山东 195\n", "福建 132\n", "四川 118\n", "安徽 103\n", "湖南 103\n", "湖北 96\n", "河南 78\n", "辽宁 74\n", "河北 56\n", "新疆 52\n", "天津 49\n", "重庆 49\n", "陕西 47\n", "吉林 42\n", "山西 38\n", "江西 38\n", "黑龙江 36\n", "广西 36\n", "云南 34\n", "甘肃 33\n", "海南 30\n", "贵州 27\n", "内蒙 25\n", "西藏 16\n", "宁夏 13\n", "青海 12\n", "Name: area, dtype: int64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['area'].value_counts()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "df1=df[(df['area']=='辽宁') | (df['area']=='吉林') | (df['area']=='黑龙江') ]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def save_to_excel(df,filename,encoding='gbk'):\n", " try:\n", " df.to_csv('temp.csv',encoding=encoding,index=False)\n", " df=pd.read_csv('temp.csv',encoding=encoding,dtype={'code':str})\n", " df.to_excel(filename,encoding=encoding)\n", " return True\n", " except Exception as e:\n", " print(\"Save to excel faile\"\n",) " print(e)\n", " return None" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "save_to_excel(df1,'dongbei.xls')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/longhuban.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "#-*-coding=utf-8-*-\n", "# 龙虎榜\n", "import tushare as ts\n", "import datetime" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# current = datetime.datetime.now().strftime('%Y-%m-%d')\n", "current='2018-04-23'\n", "df = ts.top_list(current)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenamepchangeamountbuysellreasonbratiosratiodate
0000070特发信息-9.97015879.182801.933077.24日跌幅偏离值达到7%的前五只证券0.170.192018-04-23
1000407胜利股份8.28633825.352398.341427.00日涨幅偏离值达到7%的前五只证券0.240.152018-04-23
2000605渤海股份-9.98494613.54913.243700.30日跌幅偏离值达到7%的前五只证券0.050.212018-04-23
3000638万方发展-9.9598889.49484.16405.32日跌幅偏离值达到7%的前五只证券0.140.122018-04-23
4000816智慧农业-9.79235115.011846.123268.88日跌幅偏离值达到7%的前五只证券0.050.092018-04-23
\n", "
" ], "text/plain": [ " code name pchange amount buy sell reason bratio \\\n", "0 000070 特发信息 -9.9701 5879.18 2801.93 3077.24 日跌幅偏离值达到7%的前五只证券 0.17 \n", "1 000407 胜利股份 8.2863 3825.35 2398.34 1427.00 日涨幅偏离值达到7%的前五只证券 0.24 \n", "2 000605 渤海股份 -9.9849 4613.54 913.24 3700.30 日跌幅偏离值达到7%的前五只证券 0.05 \n", "3 000638 万方发展 -9.9598 889.49 484.16 405.32 日跌幅偏离值达到7%的前五只证券 0.14 \n", "4 000816 智慧农业 -9.7923 5115.01 1846.12 3268.88 日跌幅偏离值达到7%的前五只证券 0.05 \n", "\n", " sratio date \n", "0 0.19 2018-04-23 \n", "1 0.15 2018-04-23 \n", "2 0.21 2018-04-23 \n", "3 0.12 2018-04-23 \n", "4 0.09 2018-04-23 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenamepchangeamountbuysellreasonbratiosratiodate
24002930宏川智慧4.86479892.494999.104893.40日换手率达到20%的前五只证券0.080.072018-04-23
\n", "
" ], "text/plain": [ " code name pchange amount buy sell reason bratio \\\n", "24 002930 宏川智慧 4.8647 9892.49 4999.10 4893.40 日换手率达到20%的前五只证券 0.08 \n", "\n", " sratio date \n", "24 0.07 2018-04-23 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['code']=='002930']" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from longhuban import get_result\n", "dt=get_result()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%',\n", " [[u'2018-04-24',\n", " u'300333',\n", " u'995.8324',\n", " u'0.0',\n", " u'995.8324',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'201977686',\n", " u'\\u5149\\u5927\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6e29\\u5dde\\u5e02\\u5e9c\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'1.12',\n", " u'0.0',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'967.4355',\n", " u'0.0',\n", " u'967.4355',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'200248692',\n", " u'\\u5b89\\u4fe1\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u4f5b\\u5c71\\u5357\\u6d77\\u7f57\\u6751\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'1.08',\n", " u'0.0',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'855.2275',\n", " u'4.5445',\n", " u'850.683',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'201350205',\n", " u'\\u5174\\u4e1a\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u53a6\\u95e8\\u7a46\\u539d\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.96',\n", " u'0.01',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'693.521963',\n", " u'699.081236',\n", " u'-5.559273',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'201350206',\n", " u'\\u5f00\\u6e90\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u897f\\u5b89\\u51e4\\u57ce\\u4e00\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.78',\n", " u'0.78',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'668.214121',\n", " u'245.2738',\n", " u'422.940321',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'201752186',\n", " u'\\u8d22\\u901a\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6e29\\u5cad\\u4e2d\\u534e\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.75',\n", " u'0.27',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'174.591067',\n", " u'1318.5458',\n", " u'-1143.954733',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200059745',\n", " u'\\u534e\\u6cf0\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6df1\\u5733\\u76ca\\u7530\\u8def\\u8363\\u8d85\\u5546\\u52a1\\u4e2d\\u5fc3\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.2',\n", " u'1.48',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'139.9885',\n", " u'1410.800565',\n", " u'-1270.812065',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200071132',\n", " u'\\u4e2d\\u4fe1\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u4e0a\\u6d77\\u6052\\u4e30\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.16',\n", " u'1.58',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'57.9168',\n", " u'1020.971303',\n", " u'-963.054503',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200848687',\n", " u'\\u4e07\\u548c\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6210\\u90fd\\u901a\\u76c8\\u8857\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.06',\n", " u'1.14',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'2.6314',\n", " u'1696.454661',\n", " u'-1693.823261',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200060397',\n", " u'\\u4e07\\u548c\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6210\\u90fd\\u8700\\u6c49\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.0',\n", " u'1.9',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'0.0',\n", " u'1208.7428',\n", " u'-1208.7428',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u6da8\\u5e45\\u504f\\u79bb\\u503c\\u8fbe7%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200904983',\n", " u'\\u65b9\\u6b63\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u4e0a\\u6d77\\u897f\\u85cf\\u5357\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.0',\n", " u'1.35',\n", " u'89214.0']]],\n", " [u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%',\n", " [[u'2018-04-24',\n", " u'300333',\n", " u'995.8324',\n", " u'0.0',\n", " u'995.8324',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'201977686',\n", " u'\\u5149\\u5927\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6e29\\u5dde\\u5e02\\u5e9c\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'1.12',\n", " u'0.0',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'967.4355',\n", " u'0.0',\n", " u'967.4355',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'200248692',\n", " u'\\u5b89\\u4fe1\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u4f5b\\u5c71\\u5357\\u6d77\\u7f57\\u6751\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'1.08',\n", " u'0.0',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'855.2275',\n", " u'4.5445',\n", " u'850.683',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'201350205',\n", " u'\\u5174\\u4e1a\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u53a6\\u95e8\\u7a46\\u539d\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.96',\n", " u'0.01',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'693.521963',\n", " u'699.081236',\n", " u'-5.559273',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'201350206',\n", " u'\\u5f00\\u6e90\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u897f\\u5b89\\u51e4\\u57ce\\u4e00\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.78',\n", " u'0.78',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'668.214121',\n", " u'245.2738',\n", " u'422.940321',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'1',\n", " u'201752186',\n", " u'\\u8d22\\u901a\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6e29\\u5cad\\u4e2d\\u534e\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.75',\n", " u'0.27',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'174.591067',\n", " u'1318.5458',\n", " u'-1143.954733',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200059745',\n", " u'\\u534e\\u6cf0\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6df1\\u5733\\u76ca\\u7530\\u8def\\u8363\\u8d85\\u5546\\u52a1\\u4e2d\\u5fc3\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.2',\n", " u'1.48',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'139.9885',\n", " u'1410.800565',\n", " u'-1270.812065',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200071132',\n", " u'\\u4e2d\\u4fe1\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u4e0a\\u6d77\\u6052\\u4e30\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.16',\n", " u'1.58',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'57.9168',\n", " u'1020.971303',\n", " u'-963.054503',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200848687',\n", " u'\\u4e07\\u548c\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6210\\u90fd\\u901a\\u76c8\\u8857\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.06',\n", " u'1.14',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'2.6314',\n", " u'1696.454661',\n", " u'-1693.823261',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200060397',\n", " u'\\u4e07\\u548c\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6210\\u90fd\\u8700\\u6c49\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.0',\n", " u'1.9',\n", " u'89214.0'],\n", " [u'2018-04-24',\n", " u'300333',\n", " u'0.0',\n", " u'1208.7428',\n", " u'-1208.7428',\n", " u'0.0',\n", " u'0.0',\n", " u'\\u65e5\\u632f\\u5e45\\u503c\\u8fbe15%\\u7684\\u524d\\u4e09\\u53ea\\u8bc1\\u5238|\\u524d\\u4e94\\u53ea\\u8bc1\\u5238',\n", " u'2',\n", " u'200904983',\n", " u'\\u65b9\\u6b63\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u4e0a\\u6d77\\u897f\\u85cf\\u5357\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8',\n", " u'0.0',\n", " u'1.35',\n", " u'89214.0']]]]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(dt)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "buy\n", "OrderedDict([(u'\\u5149\\u5927\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6e29\\u5dde\\u5e02\\u5e9c\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'995.8324'), (u'\\u5b89\\u4fe1\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u4f5b\\u5c71\\u5357\\u6d77\\u7f57\\u6751\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'967.4355'), (u'\\u5174\\u4e1a\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u53a6\\u95e8\\u7a46\\u539d\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'850.683'), (u'\\u5f00\\u6e90\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u897f\\u5b89\\u51e4\\u57ce\\u4e00\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'-5.559273'), (u'\\u8d22\\u901a\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6e29\\u5cad\\u4e2d\\u534e\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'422.940321')])\n", "\n", "sell\n", "OrderedDict([(u'\\u534e\\u6cf0\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6df1\\u5733\\u76ca\\u7530\\u8def\\u8363\\u8d85\\u5546\\u52a1\\u4e2d\\u5fc3\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'-1143.954733'), (u'\\u4e2d\\u4fe1\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u4e0a\\u6d77\\u6052\\u4e30\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'-1270.812065'), (u'\\u4e07\\u548c\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6210\\u90fd\\u901a\\u76c8\\u8857\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'-963.054503'), (u'\\u4e07\\u548c\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u6210\\u90fd\\u8700\\u6c49\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'-1693.823261'), (u'\\u65b9\\u6b63\\u8bc1\\u5238\\u80a1\\u4efd\\u6709\\u9650\\u516c\\u53f8\\u4e0a\\u6d77\\u897f\\u85cf\\u5357\\u8def\\u8bc1\\u5238\\u8425\\u4e1a\\u90e8', u'-1208.7428')])\n", "光大证券股份有限公司温州市府路证券营业部\n", "安信证券股份有限公司佛山南海罗村证券营业部\n", "兴业证券股份有限公司厦门穆厝路证券营业部\n", "开源证券股份有限公司西安凤城一路证券营业部\n", "财通证券股份有限公司温岭中华路证券营业部\n" ] } ], "source": [ "from collections import OrderedDict\n", "# print(len(dt[0][1])\n",) "print('buy'\n",) "buy_dict=OrderedDict()\n", "lhb_data = dt[0][1]\n", "for i in range(5):\n", "# print(lhb_data[i][10]\n",) "# print(lhb_data[i][4]\n",) " buy_dict[lhb_data[i][10]]=lhb_data[i][4]\n", "# for j in i:\n", "# print(j\n",) "print(buy_dict\n",) "print('\\nsell'\n",) "sell_dict=OrderedDict()\n", "for i in range(5,10):\n", "# print(lhb_data[i][10]\n",) "# print(lhb_data[i][4]\n",) " sell_dict[lhb_data[i][10]]=lhb_data[i][4]\n", " \n", "print(sell_dict\n",) "\n", "for i in buy_dict.keys():\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/plot_test.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import tushare as ts" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "api = ts.get_apis()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "df = ts.bar('300141',conn=api, start_date='2017-10-01')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codeopenclosehighlowvolamount
datetime
2018-03-3030014110.1510.1410.199.9634764.035027460.0
2018-03-293001419.909.9810.139.8529239.029113140.0
2018-03-283001419.709.8910.209.5144331.043827744.0
2018-03-273001419.509.9310.339.5069079.068634952.0
2018-03-263001419.129.399.448.8040667.037239732.0
\n", "
" ], "text/plain": [ " code open close high low vol amount\n", "datetime \n", "2018-03-30 300141 10.15 10.14 10.19 9.96 34764.0 35027460.0\n", "2018-03-29 300141 9.90 9.98 10.13 9.85 29239.0 29113140.0\n", "2018-03-28 300141 9.70 9.89 10.20 9.51 44331.0 43827744.0\n", "2018-03-27 300141 9.50 9.93 10.33 9.50 69079.0 68634952.0\n", "2018-03-26 300141 9.12 9.39 9.44 8.80 40667.0 37239732.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%pylab inline\n", "df['close'].plot(kind='line',figsize=(20,10))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "df['ma5']=df['close'].rolling(window=5).mean()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codeopenclosehighlowvolamountma7ma5
datetime
2018-03-3030014110.1510.1410.199.9634764.035027460.0NaNNaN
2018-03-293001419.909.9810.139.8529239.029113140.0NaNNaN
2018-03-283001419.709.8910.209.5144331.043827744.0NaNNaN
2018-03-273001419.509.9310.339.5069079.068634952.0NaNNaN
2018-03-263001419.129.399.448.8040667.037239732.09.8669.866
2018-03-233001419.689.229.879.1461307.057824768.09.6829.682
2018-03-2230014110.1510.1510.3510.1532268.033018564.09.7169.716
2018-03-2130014110.6310.2110.7210.2147883.050289320.09.7809.780
2018-03-2030014110.7410.6410.9010.4043233.045964320.09.9229.922
2018-03-1930014110.9510.9210.9610.7025934.028226514.010.22810.228
2018-03-1630014110.9810.8711.0510.7933378.036369588.010.55810.558
2018-03-1530014110.8511.0211.1310.7359590.064983176.010.73210.732
2018-03-1430014111.1811.1711.8811.0589165.0102243320.010.92410.924
2018-03-1330014111.3011.1511.3611.0978987.088493496.011.02611.026
2018-03-1230014110.7111.4911.4910.71127937.0142668640.011.14011.140
2018-03-0930014110.5810.9211.3110.58115800.0127802904.011.15011.150
2018-03-0830014110.5010.4010.5010.2545453.047126892.011.02611.026
2018-03-0730014110.5310.5010.7610.4346574.049132932.010.89210.892
2018-03-0630014110.5510.6711.1210.4274390.079646896.010.79610.796
2018-03-0530014110.5810.6610.7510.3762001.065438264.010.63010.630
\n", "
" ], "text/plain": [ " code open close high low vol amount ma7 \\\n", "datetime \n", "2018-03-30 300141 10.15 10.14 10.19 9.96 34764.0 35027460.0 NaN \n", "2018-03-29 300141 9.90 9.98 10.13 9.85 29239.0 29113140.0 NaN \n", "2018-03-28 300141 9.70 9.89 10.20 9.51 44331.0 43827744.0 NaN \n", "2018-03-27 300141 9.50 9.93 10.33 9.50 69079.0 68634952.0 NaN \n", "2018-03-26 300141 9.12 9.39 9.44 8.80 40667.0 37239732.0 9.866 \n", "2018-03-23 300141 9.68 9.22 9.87 9.14 61307.0 57824768.0 9.682 \n", "2018-03-22 300141 10.15 10.15 10.35 10.15 32268.0 33018564.0 9.716 \n", "2018-03-21 300141 10.63 10.21 10.72 10.21 47883.0 50289320.0 9.780 \n", "2018-03-20 300141 10.74 10.64 10.90 10.40 43233.0 45964320.0 9.922 \n", "2018-03-19 300141 10.95 10.92 10.96 10.70 25934.0 28226514.0 10.228 \n", "2018-03-16 300141 10.98 10.87 11.05 10.79 33378.0 36369588.0 10.558 \n", "2018-03-15 300141 10.85 11.02 11.13 10.73 59590.0 64983176.0 10.732 \n", "2018-03-14 300141 11.18 11.17 11.88 11.05 89165.0 102243320.0 10.924 \n", "2018-03-13 300141 11.30 11.15 11.36 11.09 78987.0 88493496.0 11.026 \n", "2018-03-12 300141 10.71 11.49 11.49 10.71 127937.0 142668640.0 11.140 \n", "2018-03-09 300141 10.58 10.92 11.31 10.58 115800.0 127802904.0 11.150 \n", "2018-03-08 300141 10.50 10.40 10.50 10.25 45453.0 47126892.0 11.026 \n", "2018-03-07 300141 10.53 10.50 10.76 10.43 46574.0 49132932.0 10.892 \n", "2018-03-06 300141 10.55 10.67 11.12 10.42 74390.0 79646896.0 10.796 \n", "2018-03-05 300141 10.58 10.66 10.75 10.37 62001.0 65438264.0 10.630 \n", "\n", " ma5 \n", "datetime \n", "2018-03-30 NaN \n", "2018-03-29 NaN \n", "2018-03-28 NaN \n", "2018-03-27 NaN \n", "2018-03-26 9.866 \n", "2018-03-23 9.682 \n", "2018-03-22 9.716 \n", "2018-03-21 9.780 \n", "2018-03-20 9.922 \n", "2018-03-19 10.228 \n", "2018-03-16 10.558 \n", "2018-03-15 10.732 \n", "2018-03-14 10.924 \n", "2018-03-13 11.026 \n", "2018-03-12 11.140 \n", "2018-03-09 11.150 \n", "2018-03-08 11.026 \n", "2018-03-07 10.892 \n", "2018-03-06 10.796 \n", "2018-03-05 10.630 " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(20)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABJMAAAMiCAYAAADaQoLaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xl4nXWZ//H3c3KSk+Zka5p0ydKm\naemalhZKWQVZFBSRRXBXROfn4KijzqjjDOM+zrjguOHIOMqiA+ICCMiogCi7LKUF0gUo3fekS9ok\nzf78/jg0tDQtSXOS86R5v66r1yHP8j13EPvH5/re9zcIwxBJkiRJkiSpL2KZLkCSJEmSJEnDh2GS\nJEmSJEmS+swwSZIkSZIkSX1mmCRJkiRJkqQ+M0ySJEmSJElSnxkmSZIkSZIkqc8MkyRJkiRJktRn\nhkmSJEmSJEnqM8MkSZIkSZIk9Vk80wUcidLS0rC6ujrTZUiSJEmSJB01Fi1a1BCGYdlrPTcsw6Tq\n6mqeeuqpTJchSZIkSZJ01AiCYG1fnrPNTZIkSZIkSX1mmCRJkiRJkqQ+M0ySJEmSJElSnw3LmUmS\nJEmSJEnp0NHRwYYNG2htbc10KUMmNzeXyspKsrOzj+h9wyRJkiRJkjRibdiwgYKCAqqrqwmCINPl\nDLowDNm+fTsbNmxg8uTJR7SGbW6SJEmSJGnEam1tZcyYMSMiSAIIgoAxY8YMaCeWYZIkSZIkSRrR\nRkqQtM9Af1/DJEmSJEmSJPWZYZIkSZIkSVKEfOlLX+Lqq6/OdBmHZJgkSZIkSZKkPvM0N0mSJEmS\nJODLdy1l2abdaV1zVnkhX7xg9mGf+dnPfsbVV19NEATMnTuXKVOm9NxbsmQJV155JS0tLUyZMoXr\nrruO0aNH8/3vf59rr72WeDzOrFmzuOWWW2hububjH/84zz33HJ2dnXzpS1/iwgsvTOvvA+5MkiRJ\nkiRJypilS5fyta99jfvvv59nnnmG733vewfcf//73883vvENnn32WebMmcOXv/xlAL7+9a+zePFi\nnn32Wa699loAvva1r3HWWWfx5JNP8uc//5nPfOYzNDc3p71mdyZJkiRJkiTBa+4gGgz3338/l156\nKaWlpQCUlJT03GtsbGTXrl2cccYZAFx++eVcdtllAMydO5f3vOc9XHTRRVx00UUA3HPPPdx55509\n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\n94SMuvVN+i1MqnLmqkRERERERFo9S1MvQESkziIGQcZGsNkcvtVf29xERERERETqRGGSiLRcEQOh\nPB9y9jh8q4+7C1aLoTBJRERERETEQQqTRKTlOr4Jt4MMw8DPw0VhkoiIiIiIiIMUJolIyxXaDdx8\n6hQmgbnVTWGSiIiIiIiIYxQmiUjLZbFCh/71asKtMElERERERMQxCpNEpGWLGAgHtkFlmcO3+ilM\nEhERERERcZjCJBFp2SIGgq0SDmx1+FY/T1cKFCaJiIiIiIg4RGGSiLRskYPM1zr0TdI2NxERERER\nEccpTBKRls2vA/i2r1PfpKNhkt1ub4CFiYiIiIiItE4Kk0Sk5YsYWOfKpCqbnZKK6gZYlIiIiIiI\nSOukMElEWr6IgZC7F0pyHbrN39MVQFvdREREREREHKAwSURavoiB5mtGgkO3KUwSERERERFxnMIk\nEWn5OvQHDEhf59BtCpNEREREREQcpzBJRFo+Dz9o1xtSVjh0m8IkERERERERxylMEpHWIWa0WZlU\nWVbrWxQmiYiIiIiIOE5hkoi0DjGjoKrMoVPd/I6ESQUKk0RERERERGpNYZKItA7RwwEDkn+p9S2+\n7i4YhiqTREREREREHKEwSURaB68gs29S8vJa32KxGPh5uKoySURERERExAEKk0Sk9ahj3yRVJomI\niIiIiNSewiQRaT3q0DdJYZKIiIiIiIhjFCaJSOtRh75JCpNEREREREQcozBJRFqPOvRNUpgkIiIi\nIiLiGIVJItK6ONg3yc/TlfzSqgZelIiIiIiISOuhMElEWhcH+yb5ebpQUFqJ3W5v4IWJiIiIiIi0\nDgqTRKR16TgCR/om+Xu6UlFto6zS1rDrEhERERERaSUUJolI6+IZCO361Lpvkr+nK4D6JomIiIiI\niNSSwiQRaX0c6JukMElERERERMQxCpNEpPVxoG+SwiQRERERERHHKEwSkdan43Bq2zdJYZKIiIiI\niIhjFCaJSOvjQN8khUkiIiIiIiKOUZgkIq1TLfsmKUwSERERERFxjMIkEWmdatk3yddDYZKIiIiI\niIgjFCaJSOtUy75JVouBr4cLBQqTREREREREakVhkoi0Tg72TVJlkoiIiIiISO0oTBKR1suBvkmq\nTBIREREREakdhUki0nrVsm+SKpNERERERERqT2GSiLReHUeAxQV+/fa0wxQmiYiIiIiI1J7CJBFp\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df[['close','ma5']].plot(kind='line',figsize=(20,15))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "df['ma21']=df['close'].rolling(window = 21).mean()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df[['close','ma5','ma21']].plot(kind='line',figsize=(20,15))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/query.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r" ] } ], "source": [ "#-*-coding=utf-8-*-\n", "'''\n", "每天复盘\n", "'''\n", "from setting import get_engine\n", "import datetime\n", "import pandas as pd\n", "import tushare as ts\n", "today= datetime.datetime.now().strftime('%Y-%m-%d')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "engine = get_engine('db_daily')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "df = pd.read_sql('tb_basic_info',engine,index_col='index')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "hainan_code = df[df['area']==u'海南']['code'].values" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "api=ts.get_apis()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Getting data:]############################################################" ] } ], "source": [ "today_market =ts.get_today_all()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenamechangepercenttradeopenhighlowsettlementvolumeturnoverratioamountperpbmktcapnmc
0603999读者传媒-2.6855.805.945.955.775.963403320.01.4771419956189.044.2751.9723.340800e+051.336320e+05
1603998方盛制药-1.7548.408.658.658.338.551614356.00.3796713724010.060.0003.5913.619866e+053.571652e+05
2603997继峰股份0.00010.870.000.000.0010.870.00.000000.023.6303.8376.932008e+056.848100e+05
3603996中新科技9.99010.689.5710.689.519.7124678982.023.89638252657161.021.7962.1233.205602e+051.102977e+05
4603993洛阳钼业-2.3856.146.266.276.086.2969942520.00.53994430950440.043.8573.4081.326193e+077.953591e+06
\n", "
" ], "text/plain": [ " code name changepercent trade open high low settlement \\\n", "0 603999 读者传媒 -2.685 5.80 5.94 5.95 5.77 5.96 \n", "1 603998 方盛制药 -1.754 8.40 8.65 8.65 8.33 8.55 \n", "2 603997 继峰股份 0.000 10.87 0.00 0.00 0.00 10.87 \n", "3 603996 中新科技 9.990 10.68 9.57 10.68 9.51 9.71 \n", "4 603993 洛阳钼业 -2.385 6.14 6.26 6.27 6.08 6.29 \n", "\n", " volume turnoverratio amount per pb mktcap \\\n", "0 3403320.0 1.47714 19956189.0 44.275 1.972 3.340800e+05 \n", "1 1614356.0 0.37967 13724010.0 60.000 3.591 3.619866e+05 \n", "2 0.0 0.00000 0.0 23.630 3.837 6.932008e+05 \n", "3 24678982.0 23.89638 252657161.0 21.796 2.123 3.205602e+05 \n", "4 69942520.0 0.53994 430950440.0 43.857 3.408 1.326193e+07 \n", "\n", " nmc \n", "0 1.336320e+05 \n", "1 3.571652e+05 \n", "2 6.848100e+05 \n", "3 1.102977e+05 \n", "4 7.953591e+06 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "today_market.head()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\python3\\lib\\site-packages\\pymysql\\cursors.py:170: Warning: (1366, \"Incorrect string value: '\\\\xD6\\\\xD0\\\\xB9\\\\xFA\\\\xB1\\\\xEA...' for column 'VARIABLE_VALUE' at row 480\")\n", " result = self._query(query)\n" ] } ], "source": [ "today_market.to_sql('tb_temp',engine)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namechangepercent
375海汽集团9.991
433海南矿业10.013
558海南橡胶10.032
640览海投资9.960
755洲际油气0.000
927海航创新9.978
959海航基础0.000
1146广晟有色6.871
1161海南椰岛9.973
1174海航控股0.000
1184罗顿发展9.977
1454普利制药3.554
1886神农基因10.074
1988康芝药业0.000
2134钧达股份9.982
2293双成药业9.986
2390海南瑞泽10.008
2665海峡股份9.988
3024欣龙控股10.030
3075海南高速9.957
3134华闻传媒0.000
3168罗 牛 山10.010
3230中钨高新10.035
3257大东海A10.034
3287海马汽车10.072
3288新大洲A10.078
3291海德股份10.000
3292海南海药0.000
3343京粮控股10.011
3345海虹控股5.735
\n", "
" ], "text/plain": [ " name changepercent\n", "375 海汽集团 9.991\n", "433 海南矿业 10.013\n", "558 海南橡胶 10.032\n", "640 览海投资 9.960\n", "755 洲际油气 0.000\n", "927 海航创新 9.978\n", "959 海航基础 0.000\n", "1146 广晟有色 6.871\n", "1161 海南椰岛 9.973\n", "1174 海航控股 0.000\n", "1184 罗顿发展 9.977\n", "1454 普利制药 3.554\n", "1886 神农基因 10.074\n", "1988 康芝药业 0.000\n", "2134 钧达股份 9.982\n", "2293 双成药业 9.986\n", "2390 海南瑞泽 10.008\n", "2665 海峡股份 9.988\n", "3024 欣龙控股 10.030\n", "3075 海南高速 9.957\n", "3134 华闻传媒 0.000\n", "3168 罗 牛 山 10.010\n", "3230 中钨高新 10.035\n", "3257 大东海A 10.034\n", "3287 海马汽车 10.072\n", "3288 新大洲A 10.078\n", "3291 海德股份 10.000\n", "3292 海南海药 0.000\n", "3343 京粮控股 10.011\n", "3345 海虹控股 5.735" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "today_market[today_market['code'].isin(hainan_code)][['name','changepercent']]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "engine = get_engine('db_daily')\n", "\n", "df = pd.read_sql(today,engine,index_col='index')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenamechangepercenttradeopenhighlowsettlementvolumeturnoverratioamountperpbmktcapnmc
index
1569300504N天邑44.02818.8115.6718.8115.6713.06353090.0565660424.114.735.029944e+051.257486e+05
309603214N爱婴室44.01028.7323.9428.7323.9419.95195040.0855987122.985.762.873000e+057.182500e+04
1807300263隆华节能10.0906.115.576.115.565.55473924129.20284534948353.182.205.389505e+053.147325e+05
1729300341麦迪电气10.0787.107.107.107.106.452276000.06161596031.683.453.622500e+052.633130e+05
2025300043星辉娱乐10.0755.905.525.905.425.36408825844.9623566165815.952.877.340771e+054.860831e+05
3214000670盈方微10.0736.015.516.015.455.466945244511.57403229320203.047.204.907930e+053.607005e+05
881600602云赛智联10.0567.887.197.887.167.16241208792.7418334254838.072.821.077727e+066.931032e+05
374603067振华股份10.03814.4713.1514.4712.8213.152655860723.8936786866831.462.853.183400e+051.608333e+05
2933002045国光电器10.03512.7211.6612.7211.6611.56242843625.8430212234190.863.785.303019e+055.287523e+05
1239600136当代明诚10.03416.3414.8016.3414.6614.85149710714.8623393889662.853.157.960557e+055.028541e+05
2227002758华通医药10.03010.8610.0010.869.919.8788148607.109172969537.453.982.280600e+051.347870e+05
94603803瑞斯康达10.02819.6419.6419.6419.6417.8515385152.713021643528.063.438.269531e+051.115552e+05
1660300412迦南科技10.02712.0711.6012.0710.9310.97128843525.8414967215825.154.163.140505e+052.664553e+05
1580300493润欣科技10.02413.8312.7113.8312.5912.5783674755.4211144887133.738.444.149000e+052.136942e+05
1772300298三诺生物10.01824.1622.0524.1622.0021.9689817172.9121175828166.917.381.138167e+067.458906e+05
1908300161华中数控10.01818.5617.5618.5617.2716.872408381714.5642826011797.582.803.207004e+053.069941e+05
2765002213特 尔 佳10.01613.6213.3313.6213.1212.3822421201.1930429125340.507.642.805720e+052.558114e+05
1573300500启迪设计10.01635.0432.4035.0432.0031.85799616418.4427759808532.755.834.705155e+051.519475e+05
2147002845同兴达10.01423.1821.0723.1821.0721.0746901087.5210475708230.104.694.667246e+051.446432e+05
120603722阿科力10.01237.2537.2537.2537.2533.8613096836.044878569252.478.153.229575e+058.083250e+04
2106002888惠威科技10.01228.3528.2628.3528.2625.7720685709.955860019060.325.582.356384e+055.891130e+04
2032300036超图软件10.01120.7719.0820.7718.8218.884789312414.5195439589047.205.179.336891e+056.855244e+05
1183600206有研新材10.01010.669.8010.669.779.69670769928.00698661541213.203.139.029855e+058.941377e+05
1670300402宝色股份10.00912.0911.1612.0911.0110.9950083495.8058679861-24.674.132.442180e+051.043367e+05
16603976正川股份10.00826.6024.2926.6024.2924.18442595016.3911298428730.573.062.872800e+057.182000e+04
2081002916深南电路10.00778.2772.1078.2772.1071.151551565622.17118430882436.756.922.191560e+065.478900e+05
1566300507苏奥传感10.00731.0028.4031.0028.2628.1837575196.5511166123136.914.283.720186e+051.779627e+05
1359300726宏达电子10.00638.1533.6638.1533.3334.681871611746.6766522891169.8315.081.526382e+061.529815e+05
1968300101振芯科技10.00617.3715.8517.3715.8515.79462665918.42782158650316.3911.169.657720e+059.544134e+05
1511300565科信技术10.00520.6718.9020.6718.9018.7951030939.3510242072741.344.543.307200e+051.128417e+05
................................................
1186600201生物股份-2.59727.3828.2228.2226.6428.11211481712.4657167880524.674.192.461882e+062.350336e+06
810600689上海三毛-2.67114.2113.7615.4313.5714.603315272421.7846941336430.895.992.856087e+052.162821e+05
2655002324普利特-2.70022.7022.9123.3822.6923.336676080.421534400522.042.756.148295e+053.614192e+05
3164000732泰禾集团-2.70727.6828.7428.7427.3728.45420906253.39117543895820.182.253.444640e+063.440789e+06
255603355莱克电气-2.71932.2033.3933.3931.7533.1024619163.697922199325.764.101.291220e+062.147418e+05
1041600383金地集团-2.75211.6611.8611.8911.6011.99325491590.723819416368.331.435.264004e+065.264004e+06
2734002244滨江集团-2.7637.397.547.617.387.60533845041.9839759352713.441.612.299357e+061.997446e+06
1551300522世名科技-2.77121.0520.9921.3720.6321.65624030711.9813072936518.964.332.526126e+051.096224e+05
2254002729好利来-2.83035.7135.3036.0035.0036.7536951995.54131135510105.035.692.381143e+052.381143e+05
2778002200云投生态-2.88710.0910.1510.3010.0010.3943924073.124456126755.562.291.857901e+051.421428e+05
1042600382广东明珠-2.93012.2612.4112.4412.1312.6374515892.189133753117.271.145.723271e+054.189813e+05
1893300176鸿特精密-3.008140.93145.55146.78140.61145.3018936991.77270303298301.7116.861.511897e+061.507651e+06
2280002700新疆浩源-3.0378.308.588.588.238.5638694321.243223472246.113.743.506143e+052.598675e+05
2133002860星帅尔-3.09141.7041.1042.3040.7043.03395231326.0016405219833.094.983.168311e+056.338400e+04
2917002061浙江交科-3.17512.8113.2013.2112.6313.2375644201.6797160875106.752.971.672008e+065.806002e+05
3328000517荣安地产-3.2114.224.354.354.204.36680447282.2428915163924.793.191.343615e+061.281030e+06
3223000659*ST中富-3.3683.733.853.933.683.86197203661.537437982453.297.294.795670e+054.795670e+05
495601601中国太保-3.49833.9334.8434.9933.6835.16447483410.71152633574320.942.243.074737e+072.133077e+07
2250002733雄韬股份-3.69913.8014.3314.6213.7314.3370495892.269891286637.302.184.831562e+054.300215e+05
1106600306商业城-4.01510.0410.2110.469.6810.46116987286.5911779644021.7011.981.788515e+051.781153e+05
1954300115长盈精密-4.08118.5718.7118.8617.6719.36526090475.8196089909929.483.831.688448e+061.681130e+06
403603021山东华鹏-4.5458.828.908.948.689.24148167717.13130493072110.252.092.821942e+051.833077e+05
3452600871*ST油服-4.6952.032.022.082.022.13681011070.57138518864-2.71-13.653.853821e+062.444660e+06
2657002322理工环科-4.76216.0015.6516.2115.3816.80139778454.8822110344442.102.116.368550e+054.579319e+05
3461600767*ST运盛-4.9856.486.486.626.486.8292028582.705987112751.029.712.209746e+052.209098e+05
2552002427ST尤夫-4.98620.5820.5820.5820.5821.66625000.02128625049.003.408.194023e+058.193923e+05
3195000693*ST华泽-5.0348.308.308.308.308.741066000.04884780-12.266.134.510983e+052.302048e+05
1502300575中旗股份-5.31341.7039.7042.7439.6644.04355555710.3414499008826.063.153.058695e+051.434106e+05
2073002925盈趣科技-6.40984.7081.4585.5081.4590.501898062925.31157281659032.7022.523.855205e+066.352500e+05
393603032德新交运-10.00748.8352.0055.0048.8354.26756946811.5837663693195.7515.186.510992e+053.190552e+05
\n", "

3509 rows × 15 columns

\n", "
" ], "text/plain": [ " code name changepercent trade open high low \\\n", "index \n", "1569 300504 N天邑 44.028 18.81 15.67 18.81 15.67 \n", "309 603214 N爱婴室 44.010 28.73 23.94 28.73 23.94 \n", "1807 300263 隆华节能 10.090 6.11 5.57 6.11 5.56 \n", "1729 300341 麦迪电气 10.078 7.10 7.10 7.10 7.10 \n", "2025 300043 星辉娱乐 10.075 5.90 5.52 5.90 5.42 \n", "3214 000670 盈方微 10.073 6.01 5.51 6.01 5.45 \n", "881 600602 云赛智联 10.056 7.88 7.19 7.88 7.16 \n", "374 603067 振华股份 10.038 14.47 13.15 14.47 12.82 \n", "2933 002045 国光电器 10.035 12.72 11.66 12.72 11.66 \n", "1239 600136 当代明诚 10.034 16.34 14.80 16.34 14.66 \n", "2227 002758 华通医药 10.030 10.86 10.00 10.86 9.91 \n", "94 603803 瑞斯康达 10.028 19.64 19.64 19.64 19.64 \n", "1660 300412 迦南科技 10.027 12.07 11.60 12.07 10.93 \n", "1580 300493 润欣科技 10.024 13.83 12.71 13.83 12.59 \n", "1772 300298 三诺生物 10.018 24.16 22.05 24.16 22.00 \n", "1908 300161 华中数控 10.018 18.56 17.56 18.56 17.27 \n", "2765 002213 特 尔 佳 10.016 13.62 13.33 13.62 13.12 \n", "1573 300500 启迪设计 10.016 35.04 32.40 35.04 32.00 \n", "2147 002845 同兴达 10.014 23.18 21.07 23.18 21.07 \n", "120 603722 阿科力 10.012 37.25 37.25 37.25 37.25 \n", "2106 002888 惠威科技 10.012 28.35 28.26 28.35 28.26 \n", "2032 300036 超图软件 10.011 20.77 19.08 20.77 18.82 \n", "1183 600206 有研新材 10.010 10.66 9.80 10.66 9.77 \n", "1670 300402 宝色股份 10.009 12.09 11.16 12.09 11.01 \n", "16 603976 正川股份 10.008 26.60 24.29 26.60 24.29 \n", "2081 002916 深南电路 10.007 78.27 72.10 78.27 72.10 \n", "1566 300507 苏奥传感 10.007 31.00 28.40 31.00 28.26 \n", "1359 300726 宏达电子 10.006 38.15 33.66 38.15 33.33 \n", "1968 300101 振芯科技 10.006 17.37 15.85 17.37 15.85 \n", "1511 300565 科信技术 10.005 20.67 18.90 20.67 18.90 \n", "... ... ... ... ... ... ... ... \n", "1186 600201 生物股份 -2.597 27.38 28.22 28.22 26.64 \n", "810 600689 上海三毛 -2.671 14.21 13.76 15.43 13.57 \n", "2655 002324 普利特 -2.700 22.70 22.91 23.38 22.69 \n", "3164 000732 泰禾集团 -2.707 27.68 28.74 28.74 27.37 \n", "255 603355 莱克电气 -2.719 32.20 33.39 33.39 31.75 \n", "1041 600383 金地集团 -2.752 11.66 11.86 11.89 11.60 \n", "2734 002244 滨江集团 -2.763 7.39 7.54 7.61 7.38 \n", "1551 300522 世名科技 -2.771 21.05 20.99 21.37 20.63 \n", "2254 002729 好利来 -2.830 35.71 35.30 36.00 35.00 \n", "2778 002200 云投生态 -2.887 10.09 10.15 10.30 10.00 \n", "1042 600382 广东明珠 -2.930 12.26 12.41 12.44 12.13 \n", "1893 300176 鸿特精密 -3.008 140.93 145.55 146.78 140.61 \n", "2280 002700 新疆浩源 -3.037 8.30 8.58 8.58 8.23 \n", "2133 002860 星帅尔 -3.091 41.70 41.10 42.30 40.70 \n", "2917 002061 浙江交科 -3.175 12.81 13.20 13.21 12.63 \n", "3328 000517 荣安地产 -3.211 4.22 4.35 4.35 4.20 \n", "3223 000659 *ST中富 -3.368 3.73 3.85 3.93 3.68 \n", "495 601601 中国太保 -3.498 33.93 34.84 34.99 33.68 \n", "2250 002733 雄韬股份 -3.699 13.80 14.33 14.62 13.73 \n", "1106 600306 商业城 -4.015 10.04 10.21 10.46 9.68 \n", "1954 300115 长盈精密 -4.081 18.57 18.71 18.86 17.67 \n", "403 603021 山东华鹏 -4.545 8.82 8.90 8.94 8.68 \n", "3452 600871 *ST油服 -4.695 2.03 2.02 2.08 2.02 \n", "2657 002322 理工环科 -4.762 16.00 15.65 16.21 15.38 \n", "3461 600767 *ST运盛 -4.985 6.48 6.48 6.62 6.48 \n", "2552 002427 ST尤夫 -4.986 20.58 20.58 20.58 20.58 \n", "3195 000693 *ST华泽 -5.034 8.30 8.30 8.30 8.30 \n", "1502 300575 中旗股份 -5.313 41.70 39.70 42.74 39.66 \n", "2073 002925 盈趣科技 -6.409 84.70 81.45 85.50 81.45 \n", "393 603032 德新交运 -10.007 48.83 52.00 55.00 48.83 \n", "\n", " settlement volume turnoverratio amount per pb \\\n", "index \n", "1569 13.06 35309 0.05 656604 24.11 4.73 \n", "309 19.95 19504 0.08 559871 22.98 5.76 \n", "1807 5.55 47392412 9.20 284534948 353.18 2.20 \n", "1729 6.45 227600 0.06 1615960 31.68 3.45 \n", "2025 5.36 40882584 4.96 235661658 15.95 2.87 \n", "3214 5.46 69452445 11.57 403229320 203.04 7.20 \n", "881 7.16 24120879 2.74 183342548 38.07 2.82 \n", "374 13.15 26558607 23.89 367868668 31.46 2.85 \n", "2933 11.56 24284362 5.84 302122341 90.86 3.78 \n", "1239 14.85 14971071 4.86 233938896 62.85 3.15 \n", "2227 9.87 8814860 7.10 91729695 37.45 3.98 \n", "94 17.85 1538515 2.71 30216435 28.06 3.43 \n", "1660 10.97 12884352 5.84 149672158 25.15 4.16 \n", "1580 12.57 8367475 5.42 111448871 33.73 8.44 \n", "1772 21.96 8981717 2.91 211758281 66.91 7.38 \n", "1908 16.87 24083817 14.56 428260117 97.58 2.80 \n", "2765 12.38 2242120 1.19 30429125 340.50 7.64 \n", "1573 31.85 7996164 18.44 277598085 32.75 5.83 \n", "2147 21.07 4690108 7.52 104757082 30.10 4.69 \n", "120 33.86 1309683 6.04 48785692 52.47 8.15 \n", "2106 25.77 2068570 9.95 58600190 60.32 5.58 \n", "2032 18.88 47893124 14.51 954395890 47.20 5.17 \n", "1183 9.69 67076992 8.00 698661541 213.20 3.13 \n", "1670 10.99 5008349 5.80 58679861 -24.67 4.13 \n", "16 24.18 4425950 16.39 112984287 30.57 3.06 \n", "2081 71.15 15515656 22.17 1184308824 36.75 6.92 \n", "1566 28.18 3757519 6.55 111661231 36.91 4.28 \n", "1359 34.68 18716117 46.67 665228911 69.83 15.08 \n", "1968 15.79 46266591 8.42 782158650 316.39 11.16 \n", "1511 18.79 5103093 9.35 102420727 41.34 4.54 \n", "... ... ... ... ... ... ... \n", "1186 28.11 21148171 2.46 571678805 24.67 4.19 \n", "810 14.60 33152724 21.78 469413364 30.89 5.99 \n", "2655 23.33 667608 0.42 15344005 22.04 2.75 \n", "3164 28.45 42090625 3.39 1175438958 20.18 2.25 \n", "255 33.10 2461916 3.69 79221993 25.76 4.10 \n", "1041 11.99 32549159 0.72 381941636 8.33 1.43 \n", "2734 7.60 53384504 1.98 397593527 13.44 1.61 \n", "1551 21.65 6240307 11.98 130729365 18.96 4.33 \n", "2254 36.75 3695199 5.54 131135510 105.03 5.69 \n", "2778 10.39 4392407 3.12 44561267 55.56 2.29 \n", "1042 12.63 7451589 2.18 91337531 17.27 1.14 \n", "1893 145.30 1893699 1.77 270303298 301.71 16.86 \n", "2280 8.56 3869432 1.24 32234722 46.11 3.74 \n", "2133 43.03 3952313 26.00 164052198 33.09 4.98 \n", "2917 13.23 7564420 1.67 97160875 106.75 2.97 \n", "3328 4.36 68044728 2.24 289151639 24.79 3.19 \n", "3223 3.86 19720366 1.53 74379824 53.29 7.29 \n", "495 35.16 44748341 0.71 1526335743 20.94 2.24 \n", "2250 14.33 7049589 2.26 98912866 37.30 2.18 \n", "1106 10.46 11698728 6.59 117796440 21.70 11.98 \n", "1954 19.36 52609047 5.81 960899099 29.48 3.83 \n", "403 9.24 14816771 7.13 130493072 110.25 2.09 \n", "3452 2.13 68101107 0.57 138518864 -2.71 -13.65 \n", "2657 16.80 13977845 4.88 221103444 42.10 2.11 \n", "3461 6.82 9202858 2.70 59871127 51.02 9.71 \n", "2552 21.66 62500 0.02 1286250 49.00 3.40 \n", "3195 8.74 106600 0.04 884780 -12.26 6.13 \n", "1502 44.04 3555557 10.34 144990088 26.06 3.15 \n", "2073 90.50 18980629 25.31 1572816590 32.70 22.52 \n", "393 54.26 7569468 11.58 376636931 95.75 15.18 \n", "\n", " mktcap nmc \n", "index \n", "1569 5.029944e+05 1.257486e+05 \n", "309 2.873000e+05 7.182500e+04 \n", "1807 5.389505e+05 3.147325e+05 \n", "1729 3.622500e+05 2.633130e+05 \n", "2025 7.340771e+05 4.860831e+05 \n", "3214 4.907930e+05 3.607005e+05 \n", "881 1.077727e+06 6.931032e+05 \n", "374 3.183400e+05 1.608333e+05 \n", "2933 5.303019e+05 5.287523e+05 \n", "1239 7.960557e+05 5.028541e+05 \n", "2227 2.280600e+05 1.347870e+05 \n", "94 8.269531e+05 1.115552e+05 \n", "1660 3.140505e+05 2.664553e+05 \n", "1580 4.149000e+05 2.136942e+05 \n", "1772 1.138167e+06 7.458906e+05 \n", "1908 3.207004e+05 3.069941e+05 \n", "2765 2.805720e+05 2.558114e+05 \n", "1573 4.705155e+05 1.519475e+05 \n", "2147 4.667246e+05 1.446432e+05 \n", "120 3.229575e+05 8.083250e+04 \n", "2106 2.356384e+05 5.891130e+04 \n", "2032 9.336891e+05 6.855244e+05 \n", "1183 9.029855e+05 8.941377e+05 \n", "1670 2.442180e+05 1.043367e+05 \n", "16 2.872800e+05 7.182000e+04 \n", "2081 2.191560e+06 5.478900e+05 \n", "1566 3.720186e+05 1.779627e+05 \n", "1359 1.526382e+06 1.529815e+05 \n", "1968 9.657720e+05 9.544134e+05 \n", "1511 3.307200e+05 1.128417e+05 \n", "... ... ... \n", "1186 2.461882e+06 2.350336e+06 \n", "810 2.856087e+05 2.162821e+05 \n", "2655 6.148295e+05 3.614192e+05 \n", "3164 3.444640e+06 3.440789e+06 \n", "255 1.291220e+06 2.147418e+05 \n", "1041 5.264004e+06 5.264004e+06 \n", "2734 2.299357e+06 1.997446e+06 \n", "1551 2.526126e+05 1.096224e+05 \n", "2254 2.381143e+05 2.381143e+05 \n", "2778 1.857901e+05 1.421428e+05 \n", "1042 5.723271e+05 4.189813e+05 \n", "1893 1.511897e+06 1.507651e+06 \n", "2280 3.506143e+05 2.598675e+05 \n", "2133 3.168311e+05 6.338400e+04 \n", "2917 1.672008e+06 5.806002e+05 \n", "3328 1.343615e+06 1.281030e+06 \n", "3223 4.795670e+05 4.795670e+05 \n", "495 3.074737e+07 2.133077e+07 \n", "2250 4.831562e+05 4.300215e+05 \n", "1106 1.788515e+05 1.781153e+05 \n", "1954 1.688448e+06 1.681130e+06 \n", "403 2.821942e+05 1.833077e+05 \n", "3452 3.853821e+06 2.444660e+06 \n", "2657 6.368550e+05 4.579319e+05 \n", "3461 2.209746e+05 2.209098e+05 \n", "2552 8.194023e+05 8.193923e+05 \n", "3195 4.510983e+05 2.302048e+05 \n", "1502 3.058695e+05 1.434106e+05 \n", "2073 3.855205e+06 6.352500e+05 \n", "393 6.510992e+05 3.190552e+05 \n", "\n", "[3509 rows x 15 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by='changepercent',ascending=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#查看黑名单个股的涨跌幅\n", "engine=get_engine('db_stock')\n", "black_list_df = pd.read_sql('tb_blacklist',engine,index_col='DATE')\n", "black_list_df\n", "df['changepercent']=map(lambda x:round(x,2),df['changepercent'])\n", "df['turnoverratio']=map(lambda x:round(x,0),df['turnoverratio'])\n", "#black_list_df['changepercent']=map(lambda x:round(x,2),black_list_df['changepercent'])\n", "#black_list_df['changepercent']=map(lambda x:round(x,2),black_list_df['changepercent'])\n", "code_list = black_list_df['CODE'].values\n", "black_list_percent = df[df['code'].isin(code_list)].sort_values(by='changepercent',ascending=False)\n", "black_list_percent" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8.739999999999998" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p=9.2\n", "sell=p*0.95\n", "sell" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "api=ts.get_apis()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#追踪昨日涨停的今日情况\n", "engine_zdt = get_engine('db_zdt')\n", "# zdt_today_format=datetime.datetime.now().strftime(\"%Y%m%d\")\n", "zdt_today_format='20180328zdt'\n", "zdt_df = pd.read_sql(zdt_today_format,engine_zdt,index_col='index')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "宏川智慧\n", "10.02\n", "彩讯股份\n", "9.97\n", "湖南盐业\n", "10.06\n", "振华股份\n", "10.04\n", "蓝晓科技\n", "9.99\n", "万集科技\n", "1.91\n", "新雷能\n", "0.9\n", "广生堂\n", "10.0\n", "新天药业\n", "7.95\n", "共进股份\n", "4.31\n", "必创科技\n", "6.95\n", "佳沃股份\n", "-0.51\n", "天喻信息\n", "-2.08\n", "宏达电子\n", "0.48\n", "美格智能\n", "0.52\n", "建新股份\n", "0.32\n", "步森股份\n", "-2.7\n", "天润乳业\n", "2.71\n", "迦南科技\n", "10.03\n", "盘龙药业\n", "-100.0\n", "好利来\n", "4.46\n", "博思软件\n", "10.01\n", "渤海股份\n", "1.21\n", "达安基因\n", "2.54\n", "创新医疗\n", "3.63\n", "赛隆药业\n", "-4.07\n", "姚记扑克\n", "0.35\n", "世名科技\n", "9.95\n", "*ST昌鱼\n", "-0.63\n", "建科院\n", "2.11\n", "鹏鹞环保\n", "2.39\n", "*ST弘高\n", "0.0\n", "新天科技\n", "4.64\n", "博济医药\n", "10.01\n", "天桥起重\n", "-6.79\n", "春风动力\n", "7.6\n", "初灵信息\n", "0.13\n", "美力科技\n", "-0.71\n", "科华生物\n", "-0.49\n", "北信源\n", "3.74\n", "通用股份\n", "-3.55\n", "广和通\n", "3.6\n", "津膜科技\n", "-3.28\n", "达志科技\n", "-3.06\n", "创业环保\n", "-1.6\n", "大东海A\n", "1.83\n", "天鹅股份\n", "9.98\n", "智能自控\n", "-2.47\n", "科创信息\n", "-4.32\n", "移为通信\n", "1.86\n", "泰永长征\n", "-1.24\n", "依米康\n", "6.29\n", "神农基因\n", "-2.74\n" ] } ], "source": [ "percent_list = []\n", "for code in zdt_df[u'代码'].values:\n", " last_price= zdt_df[zdt_df[u'代码']==code][u'最新价格'].values[0]\n", " print(zdt_df[zdt_df[u'代码']==code][u'名称'].values[0]\n",) " try:\n", " current_price= ts.quotes(code,conn=api)['price'].values[0]\n", " except:\n", " continue\n", " \n", " percent = float(current_price-last_price)/last_price*100\n", " print(round(percent,2)\n",) " " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codepricelast_closeopenhighlowvolcur_volamounts_vol...bid_vol3ask_vol3bid4ask4bid_vol4ask_vol4bid5ask5bid_vol5ask_vol5
030014110.099.899.910.19.98895138867134.03639...100910.0410.1360139.9910.1465
\n", "

1 rows × 31 columns

\n", "
" ], "text/plain": [ " code price last_close open high low vol cur_vol amount \\\n", "0 300141 10.09 9.89 9.9 10.1 9.9 8895 13 8867134.0 \n", "\n", " s_vol ... bid_vol3 ask_vol3 bid4 ask4 bid_vol4 ask_vol4 \\\n", "0 3639 ... 100 9 10.04 10.13 60 13 \n", "\n", " bid5 ask5 bid_vol5 ask_vol5 \n", "0 9.99 10.14 6 5 \n", "\n", "[1 rows x 31 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.quotes('300141',conn=api)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/realtime_monitor.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import tushare as ts\n", "import time" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "conn = ts.get_apis()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mon Sep 3 09:36:59 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:04 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:09 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:14 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:19 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:24 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:29 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:35 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:40 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:45 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:50 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:37:55 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:00 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:05 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:10 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:15 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:20 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:25 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:30 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:35 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:40 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:45 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:50 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:38:55 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:39:00 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:39:05 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:39:10 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:39:15 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:39:20 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:39:25 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:39:30 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:39:35 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:39:41 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:39:46 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:39:51 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:39:56 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:40:01 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:40:06 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:40:11 2018\n", "zz ask 915.1\n", "zz bid 915.0\n", "Mon Sep 3 09:40:16 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:40:21 2018\n", "zz ask 915.2\n", "zz bid 915.0\n", "Mon Sep 3 09:40:26 2018\n", "zz ask 915.0\n", "zz bid 913.01\n", "Mon Sep 3 09:40:31 2018\n", "zz ask 915.0\n", "zz bid 913.01\n", "Mon Sep 3 09:40:36 2018\n", "zz ask 915.0\n", "zz bid 913.01\n", "Mon Sep 3 09:40:41 2018\n", "zz ask 915.0\n", "zz bid 913.01\n", "Mon Sep 3 09:40:46 2018\n", "zz ask 915.0\n", "zz bid 913.01\n", "Mon Sep 3 09:40:51 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:40:56 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:41:01 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:41:06 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:41:11 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:41:16 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:41:21 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:41:26 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:41:31 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:41:36 2018\n", "zz ask 913.01\n", "zz bid 913.0\n", "Mon Sep 3 09:41:42 2018\n", "zz ask 913.0\n", "zz bid 910.3\n", "Mon Sep 3 09:41:47 2018\n", "zz ask 913.0\n", "zz bid 910.3\n", "Mon Sep 3 09:41:52 2018\n", "zz ask 913.0\n", "zz bid 910.3\n", "Mon Sep 3 09:41:57 2018\n", "zz ask 913.0\n", "zz bid 910.3\n", "Mon Sep 3 09:42:02 2018\n", "zz ask 913.0\n", "zz bid 910.3\n", "Mon Sep 3 09:42:07 2018\n", "zz ask 913.0\n", "zz bid 910.3\n", "Mon Sep 3 09:42:12 2018\n", "zz ask 913.0\n", "zz bid 910.31\n", "Mon Sep 3 09:42:17 2018\n", "zz ask 913.0\n", "zz bid 910.31\n", "Mon Sep 3 09:42:22 2018\n", "zz ask 910.3\n", "zz bid 910.01\n", "Mon Sep 3 09:42:27 2018\n", "zz ask 910.3\n", "zz bid 910.01\n", "Mon Sep 3 09:42:32 2018\n", "zz ask 910.3\n", "zz bid 910.01\n", "Mon Sep 3 09:42:37 2018\n", "zz ask 912.99\n", "zz bid 910.3\n", "Mon Sep 3 09:42:42 2018\n", "zz ask 912.99\n", "zz bid 910.3\n", "Mon Sep 3 09:42:47 2018\n", "zz ask 913.0\n", "zz bid 910.3\n", "Mon Sep 3 09:42:52 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:42:57 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:43:02 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:43:07 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:43:12 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:43:17 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:43:22 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:43:27 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:43:32 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:43:37 2018\n", "zz ask 912.94\n", "zz bid 910.6\n", "Mon Sep 3 09:43:42 2018\n", "zz ask 912.94\n", "zz bid 910.61\n", "Mon Sep 3 09:43:48 2018\n", "zz ask 912.94\n", "zz bid 910.61\n", "Mon Sep 3 09:43:53 2018\n", "zz ask 912.94\n", "zz bid 910.61\n", "Mon Sep 3 09:43:58 2018\n", "zz ask 912.94\n", "zz bid 910.61\n", "Mon Sep 3 09:44:03 2018\n", "zz ask 912.94\n", "zz bid 910.62\n", "Mon Sep 3 09:44:08 2018\n", "zz ask 912.94\n", "zz bid 910.62\n", "Mon Sep 3 09:44:13 2018\n", "zz ask 910.62\n", "zz bid 910.61\n", "Mon Sep 3 09:44:18 2018\n", "zz ask 910.62\n", "zz bid 910.61\n", "Mon Sep 3 09:44:23 2018\n", "zz ask 910.62\n", "zz bid 910.61\n", "Mon Sep 3 09:44:28 2018\n", "zz ask 910.62\n", "zz bid 910.61\n", "Mon Sep 3 09:44:33 2018\n", "zz ask 910.62\n", "zz bid 910.61\n", "Mon Sep 3 09:44:38 2018\n", "zz ask 910.62\n", "zz bid 910.61\n", "Mon Sep 3 09:44:43 2018\n", "zz ask 912.93\n", "zz bid 910.61\n", "Mon Sep 3 09:44:48 2018\n", "zz ask 912.93\n", "zz bid 910.62\n", "Mon Sep 3 09:44:53 2018\n", "zz ask 912.93\n", "zz bid 910.61\n", "Mon Sep 3 09:44:58 2018\n", "zz ask 912.94\n", "zz bid 910.61\n", "Mon Sep 3 09:45:03 2018\n", "zz ask 912.94\n", "zz bid 910.62\n", "Mon Sep 3 09:45:08 2018\n", "zz ask 912.94\n", "zz bid 910.62\n", "Mon Sep 3 09:45:13 2018\n", "zz ask 912.94\n", "zz bid 910.66\n", "Mon Sep 3 09:45:18 2018\n", "zz ask 912.94\n", "zz bid 910.66\n" ] } ], "source": [ "for i in range(100):\n", " zz_df = ts.quotes('123014',conn)\n", "# zg_df = ts.quotes('300568',conn)\n", " print(time.ctime())\n", " print('zz ask',zz_df['ask1'].values[0])\n", " print('zz bid',zz_df['bid1'].values[0])\n", "# print('zg bid',zg_df['bid1'].values[0])\n", "# print('zg bid',zg_df['bid1'].values[0])\n", " time.sleep(5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "ts.close_apis(conn)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 9.29\n", "Name: bid1, dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# 使用另外一个接口\n", "import easyquotation" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "easyquotation.update_stock_codes()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "q=easyquotation.use('qq')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'113504': {'name': '艾华转债',\n", " 'code': '113504',\n", " 'now': 113.5,\n", " 'close': 113.42,\n", " 'open': 114.38,\n", " 'volume': 8900.0,\n", " 'bid_volume': 6100,\n", " 'ask_volume': 2800.0,\n", " 'bid1': 113.5,\n", " 'bid1_volume': 1300,\n", " 'bid2': 113.35,\n", " 'bid2_volume': 7200,\n", " 'bid3': 113.32,\n", " 'bid3_volume': 1000,\n", " 'bid4': 113.3,\n", " 'bid4_volume': 100000,\n", " 'bid5': 113.11,\n", " 'bid5_volume': 2000,\n", " 'ask1': 113.77,\n", " 'ask1_volume': 100,\n", " 'ask2': 113.78,\n", " 'ask2_volume': 700,\n", " 'ask3': 113.83,\n", " 'ask3_volume': 1000,\n", " 'ask4': 114.42,\n", " 'ask4_volume': 200,\n", " 'ask5': 114.43,\n", " 'ask5_volume': 600,\n", " '最近逐笔成交': '10:42:55/113.500/1/S/1135/15311|10:41:04/113.500/1/S/1135/15055|10:40:16/113.500/1/S/1135/14945|10:28:38/113.500/1/S/1135/12759|10:25:53/113.500/1/S/1135/12144|10:08:38/113.500/2/S/2270/8258',\n", " 'datetime': datetime.datetime(2019, 3, 20, 10, 44, 49),\n", " '涨跌': 0.08,\n", " '涨跌(%)': 0.07,\n", " 'high': 115.5,\n", " 'low': 113.35,\n", " '价格/成交量(手)/成交额': '113.500/89/101457',\n", " '成交量(手)': 8900,\n", " '成交额(万)': 100000.0,\n", " 'turnover': None,\n", " 'PE': None,\n", " 'unknown': '',\n", " 'high_2': 115.5,\n", " 'low_2': 113.35,\n", " '振幅': 1.9,\n", " '流通市值': None,\n", " '总市值': None,\n", " 'PB': 0.0,\n", " '涨停价': 124.762,\n", " '跌停价': 102.078}}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q.real('113504')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'300333': {'name': '兆日科技',\n", " 'code': '300333',\n", " 'now': 10.67,\n", " 'close': 10.52,\n", " 'open': 10.52,\n", " 'volume': 27112500.0,\n", " 'bid_volume': 13986300,\n", " 'ask_volume': 13122400.0,\n", " 'bid1': 10.67,\n", " 'bid1_volume': 1800,\n", " 'bid2': 10.65,\n", " 'bid2_volume': 8900,\n", " 'bid3': 10.64,\n", " 'bid3_volume': 7800,\n", " 'bid4': 10.63,\n", " 'bid4_volume': 23500,\n", " 'bid5': 10.62,\n", " 'bid5_volume': 14800,\n", " 'ask1': 10.69,\n", " 'ask1_volume': 7600,\n", " 'ask2': 10.7,\n", " 'ask2_volume': 17200,\n", " 'ask3': 10.72,\n", " 'ask3_volume': 3000,\n", " 'ask4': 10.73,\n", " 'ask4_volume': 1500,\n", " 'ask5': 10.74,\n", " 'ask5_volume': 5700,\n", " '最近逐笔成交': '14:30:28/10.67/37/S/39486/8926|14:30:24/10.68/88/B/93978/8924|14:30:21/10.67/35/M/37277/8922|14:30:19/10.65/500/S/532787/8920|14:30:16/10.67/31/B/33077/8918|14:30:13/10.66/62/S/66187/8916',\n", " 'datetime': datetime.datetime(2019, 3, 22, 14, 30, 28),\n", " '涨跌': 0.15,\n", " '涨跌(%)': 1.43,\n", " 'high': 10.86,\n", " 'low': 10.3,\n", " '价格/成交量(手)/成交额': '10.69/270341/285642910',\n", " '成交量(手)': 27112500,\n", " '成交额(万)': 286480000.0,\n", " 'turnover': 8.19,\n", " 'PE': 359.24,\n", " 'unknown': '',\n", " 'high_2': 10.86,\n", " 'low_2': 10.3,\n", " '振幅': 5.32,\n", " '流通市值': 35.31,\n", " '总市值': 35.85,\n", " 'PB': 4.31,\n", " '涨停价': 11.57,\n", " '跌停价': 9.47}}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "code='300333'\n", "q.stocks(code)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/recall_bond.py ================================================ import pandas import pandas as pd df = pd.read_excel('../回售.xlsx') # print(df) hit_recall_df = df[df['最新转股价']\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iddatevolumeopenhighlowclosechgpercentturnoverrateamountcode
01.02022-10-10329445452.8472.8472.8472.8470.65730.000.093793119.0SZ180102
12.02022-10-11465908652.9022.9022.6562.665-0.182-6.390.0127474999.0SZ180102
23.02022-10-12189223792.6652.7352.6132.7190.0542.030.050817384.0SZ180102
37.02022-10-1381983372.7042.7292.6802.710-0.009-0.330.022163622.0SZ180102
48.02022-10-14100378752.7032.7132.6612.673-0.037-1.370.027018560.0SZ180102
\n", "" ], "text/plain": [ " id date volume open high low close chg percent \\\n", "0 1.0 2022-10-10 32944545 2.847 2.847 2.847 2.847 0.657 30.00 \n", "1 2.0 2022-10-11 46590865 2.902 2.902 2.656 2.665 -0.182 -6.39 \n", "2 3.0 2022-10-12 18922379 2.665 2.735 2.613 2.719 0.054 2.03 \n", "3 7.0 2022-10-13 8198337 2.704 2.729 2.680 2.710 -0.009 -0.33 \n", "4 8.0 2022-10-14 10037875 2.703 2.713 2.661 2.673 -0.037 -1.37 \n", "\n", " turnoverrate amount code \n", "0 0.0 93793119.0 SZ180102 \n", "1 0.0 127474999.0 SZ180102 \n", "2 0.0 50817384.0 SZ180102 \n", "3 0.0 22163622.0 SZ180102 \n", "4 0.0 27018560.0 SZ180102 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "name_df = pd.read_sql('reits_name_mapper',con=db)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "all_df = pd.merge(df,name_df,on='code',how='left')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iddatevolumeopenhighlowclosechgpercentturnoverrateamountcodeindexname
01.02022-10-10329445452.8472.8472.8472.8470.65730.000.093793119.0SZ18010219华夏合肥高新REIT
12.02022-10-11465908652.9022.9022.6562.665-0.182-6.390.0127474999.0SZ18010219华夏合肥高新REIT
23.02022-10-12189223792.6652.7352.6132.7190.0542.030.050817384.0SZ18010219华夏合肥高新REIT
37.02022-10-1381983372.7042.7292.6802.710-0.009-0.330.022163622.0SZ18010219华夏合肥高新REIT
48.02022-10-14100378752.7032.7132.6612.673-0.037-1.370.027018560.0SZ18010219华夏合肥高新REIT
\n", "
" ], "text/plain": [ " id date volume open high low close chg percent \\\n", "0 1.0 2022-10-10 32944545 2.847 2.847 2.847 2.847 0.657 30.00 \n", "1 2.0 2022-10-11 46590865 2.902 2.902 2.656 2.665 -0.182 -6.39 \n", "2 3.0 2022-10-12 18922379 2.665 2.735 2.613 2.719 0.054 2.03 \n", "3 7.0 2022-10-13 8198337 2.704 2.729 2.680 2.710 -0.009 -0.33 \n", "4 8.0 2022-10-14 10037875 2.703 2.713 2.661 2.673 -0.037 -1.37 \n", "\n", " turnoverrate amount code index name \n", "0 0.0 93793119.0 SZ180102 19 华夏合肥高新REIT \n", "1 0.0 127474999.0 SZ180102 19 华夏合肥高新REIT \n", "2 0.0 50817384.0 SZ180102 19 华夏合肥高新REIT \n", "3 0.0 22163622.0 SZ180102 19 华夏合肥高新REIT \n", "4 0.0 27018560.0 SZ180102 19 华夏合肥高新REIT " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_df.head()" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "result=[]\n", "for code,sub_df in all_df.groupby('code'):\n", " sub_df['date']=pd.to_datetime(sub_df['date'],format='%Y-%m-%d')\n", " sub_df = sub_df.set_index('date',drop=True)\n", " # print(code,sub_df.index[0])\n", " tmp_dict = {}\n", " p = (sub_df['close'].iloc[-1] - sub_df['close'].iloc[0])/sub_df['close'].iloc[0]*100\n", " tmp_dict['code']=code\n", " tmp_dict['percent']=p\n", " tmp_dict['first_percent']=round(sub_df['percent'].iloc[0],2)\n", " tmp_dict['start']=sub_df.index[0]\n", " result.append(tmp_dict)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "df=df.sort_values('percent',ascending=False)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "total_df = pd.merge(df,name_df,on='code',how='left')" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "total_df.to_excel('reits.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ " " ] } ], "metadata": { "interpreter": { "hash": "906064a35c7980fda78a8b97014bc5560dca56efd2e047844bdf4fb8a9b9c8a3" }, "kernelspec": { "display_name": "Python 3.9.7 ('cpy')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/stock_analysis.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import pandas as pd\n", "import numpy as np\n", "import tushare as ts\n", "import matplotlib.pyplot as plt\n", "from setting import get_engine" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "api = ts.get_apis()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "df = ts.bar('300144',conn=api,start_date='2018-01-01')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codeopenclosehighlowvolamount
datetime
2018-03-2930014419.8820.1620.1919.8815050.030236284.0
2018-03-2830014420.2619.8620.6319.85142126.0286976928.0
2018-03-2730014419.9520.4020.5019.84125721.0254512320.0
2018-03-2630014419.2219.6919.7919.0595743.0186872368.0
2018-03-2330014419.1119.2019.8019.06112123.0216926128.0
\n", "
" ], "text/plain": [ " code open close high low vol amount\n", "datetime \n", "2018-03-29 300144 19.88 20.16 20.19 19.88 15050.0 30236284.0\n", "2018-03-28 300144 20.26 19.86 20.63 19.85 142126.0 286976928.0\n", "2018-03-27 300144 19.95 20.40 20.50 19.84 125721.0 254512320.0\n", "2018-03-26 300144 19.22 19.69 19.79 19.05 95743.0 186872368.0\n", "2018-03-23 300144 19.11 19.20 19.80 19.06 112123.0 216926128.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime\n", "2018-03-29 20.16\n", "2018-03-28 19.86\n", "2018-03-27 20.40\n", "2018-03-26 19.69\n", "2018-03-23 19.20\n", "2018-03-22 19.68\n", "2018-03-21 19.81\n", "2018-03-20 20.45\n", "2018-03-19 20.09\n", "2018-03-16 19.90\n", "2018-03-15 20.29\n", "2018-03-14 20.25\n", "2018-03-13 20.64\n", "2018-03-12 20.50\n", "2018-03-09 20.59\n", "2018-03-08 19.61\n", "2018-03-07 19.75\n", "2018-03-06 19.55\n", "2018-03-05 19.39\n", "2018-03-02 19.16\n", "2018-03-01 19.63\n", "2018-02-28 19.66\n", "2018-02-27 19.46\n", "2018-02-26 19.31\n", "2018-02-23 19.12\n", "2018-02-22 19.06\n", "2018-02-14 18.50\n", "2018-02-13 18.57\n", "2018-02-12 18.72\n", "2018-02-09 17.98\n", "2018-02-08 18.69\n", "2018-02-07 18.37\n", "2018-02-06 17.67\n", "2018-02-05 18.78\n", "2018-02-02 18.87\n", "2018-02-01 18.38\n", "2018-01-31 18.45\n", "2018-01-30 19.19\n", "2018-01-29 19.24\n", "2018-01-26 19.50\n", "2018-01-25 19.41\n", "2018-01-24 19.54\n", "2018-01-23 18.44\n", "2018-01-22 18.64\n", "2018-01-19 18.05\n", "2018-01-18 18.13\n", "2018-01-17 18.30\n", "2018-01-16 17.98\n", "2018-01-15 17.82\n", "2018-01-12 18.18\n", "2018-01-11 18.27\n", "2018-01-10 18.30\n", "2018-01-09 18.50\n", "2018-01-08 18.68\n", "2018-01-05 18.82\n", "2018-01-04 18.87\n", "2018-01-03 18.78\n", "2018-01-02 18.56\n", "Name: close, dtype: float64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "closed = df['close']\n", "closed" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\python27\\lib\\site-packages\\ipykernel_launcher.py:1: FutureWarning: how in .resample() is deprecated\n", "the new syntax is .resample(...).ohlc()\n", " \"\"\"Entry point for launching an IPython kernel.\n" ] } ], "source": [ "year_closed = closed.resample('w',how='ohlc')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
openhighlowclose
datetime
2018-01-0718.5618.8718.5618.82
2018-01-1418.6818.6818.1818.18
2018-01-2117.8218.3017.8218.05
2018-01-2818.6419.5418.4419.50
2018-02-0419.2419.2418.3818.87
2018-02-1118.7818.7817.6717.98
2018-02-1818.7218.7218.5018.50
2018-02-2519.0619.1219.0619.12
2018-03-0419.3119.6619.1619.16
2018-03-1119.3920.5919.3920.59
2018-03-1820.5020.6419.9019.90
2018-03-2520.0920.4519.2019.20
2018-04-0119.6920.4019.6920.16
\n", "
" ], "text/plain": [ " open high low close\n", "datetime \n", "2018-01-07 18.56 18.87 18.56 18.82\n", "2018-01-14 18.68 18.68 18.18 18.18\n", "2018-01-21 17.82 18.30 17.82 18.05\n", "2018-01-28 18.64 19.54 18.44 19.50\n", "2018-02-04 19.24 19.24 18.38 18.87\n", "2018-02-11 18.78 18.78 17.67 17.98\n", "2018-02-18 18.72 18.72 18.50 18.50\n", "2018-02-25 19.06 19.12 19.06 19.12\n", "2018-03-04 19.31 19.66 19.16 19.16\n", "2018-03-11 19.39 20.59 19.39 20.59\n", "2018-03-18 20.50 20.64 19.90 19.90\n", "2018-03-25 20.09 20.45 19.20 19.20\n", "2018-04-01 19.69 20.40 19.69 20.16" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "year_closed" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "apt = (year_closed.high-year_closed.low)/year_closed.low*100" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime\n", "2018-01-07 1.670259\n", "2018-01-14 2.750275\n", "2018-01-21 2.693603\n", "2018-01-28 5.965293\n", "2018-02-04 4.678999\n", "2018-02-11 6.281834\n", "2018-02-18 1.189189\n", "2018-02-25 0.314795\n", "2018-03-04 2.609603\n", "2018-03-11 6.188757\n", "2018-03-18 3.718593\n", "2018-03-25 6.510417\n", "Freq: W-SUN, dtype: float64" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "apt" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime\n", "2018-03-29 20.16\n", "2018-03-28 19.86\n", "2018-03-27 20.40\n", "2018-03-26 19.69\n", "2018-03-23 19.20\n", "2018-03-22 19.68\n", "2018-03-21 19.81\n", "2018-03-20 20.45\n", "2018-03-19 20.09\n", "2018-03-16 19.90\n", "2018-03-15 20.29\n", "2018-03-14 20.25\n", "2018-03-13 20.64\n", "2018-03-12 20.50\n", "2018-03-09 20.59\n", "2018-03-08 19.61\n", "2018-03-07 19.75\n", "2018-03-06 19.55\n", "2018-03-05 19.39\n", "2018-03-02 19.16\n", "2018-03-01 19.63\n", "2018-02-28 19.66\n", "2018-02-27 19.46\n", "2018-02-26 19.31\n", "2018-02-23 19.12\n", "2018-02-22 19.06\n", "2018-02-14 18.50\n", "2018-02-13 18.57\n", "2018-02-12 18.72\n", "2018-02-09 17.98\n", "2018-02-08 18.69\n", "2018-02-07 18.37\n", "2018-02-06 17.67\n", "2018-02-05 18.78\n", "2018-02-02 18.87\n", "2018-02-01 18.38\n", "2018-01-31 18.45\n", "2018-01-30 19.19\n", "2018-01-29 19.24\n", "2018-01-26 19.50\n", "2018-01-25 19.41\n", "2018-01-24 19.54\n", "2018-01-23 18.44\n", "2018-01-22 18.64\n", "2018-01-19 18.05\n", "2018-01-18 18.13\n", "2018-01-17 18.30\n", "2018-01-16 17.98\n", "2018-01-15 17.82\n", "2018-01-12 18.18\n", "2018-01-11 18.27\n", "2018-01-10 18.30\n", "2018-01-09 18.50\n", "2018-01-08 18.68\n", "2018-01-05 18.82\n", "2018-01-04 18.87\n", "2018-01-03 18.78\n", "2018-01-02 18.56\n", "Name: close, dtype: float64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df=df.dropna(axis=0)\n", "df['close']" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df['close'].plot()" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "global name '_converter' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0myear_closed\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/plotting/_core.pyc\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, x, y, kind, ax, subplots, sharex, sharey, layout, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, secondary_y, sort_columns, **kwds)\u001b[0m\n\u001b[1;32m 2675\u001b[0m \u001b[0mfontsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfontsize\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolormap\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcolormap\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtable\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtable\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2676\u001b[0m \u001b[0myerr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0myerr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxerr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mxerr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecondary_y\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msecondary_y\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2677\u001b[0;31m sort_columns=sort_columns, **kwds)\n\u001b[0m\u001b[1;32m 2678\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplot_frame\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2679\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/plotting/_core.pyc\u001b[0m in \u001b[0;36mplot_frame\u001b[0;34m(data, x, y, kind, ax, subplots, sharex, sharey, layout, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, secondary_y, sort_columns, **kwds)\u001b[0m\n\u001b[1;32m 1900\u001b[0m \u001b[0myerr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0myerr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxerr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mxerr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1901\u001b[0m \u001b[0msecondary_y\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msecondary_y\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msort_columns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msort_columns\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1902\u001b[0;31m **kwds)\n\u001b[0m\u001b[1;32m 1903\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1904\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/plotting/_core.pyc\u001b[0m in \u001b[0;36m_plot\u001b[0;34m(data, x, y, subplots, ax, kind, **kwds)\u001b[0m\n\u001b[1;32m 1725\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1726\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mseries\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1727\u001b[0;31m \u001b[0mplot_obj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mklass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubplots\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msubplots\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkind\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1728\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1729\u001b[0m \u001b[0mplot_obj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgenerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/plotting/_core.pyc\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, **kwargs)\u001b[0m\n\u001b[1;32m 929\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 930\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 931\u001b[0;31m \u001b[0mMPLPlot\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 932\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstacked\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 933\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfillna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/plotting/_core.pyc\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, kind, by, subplots, sharex, sharey, use_index, figsize, grid, legend, rot, ax, fig, title, xlim, ylim, xticks, yticks, sort_columns, fontsize, secondary_y, colormap, table, layout, **kwds)\u001b[0m\n\u001b[1;32m 98\u001b[0m table=False, layout=None, **kwds):\n\u001b[1;32m 99\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 100\u001b[0;31m \u001b[0m_converter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_WARN\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 101\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mby\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mby\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: global name '_converter' is not defined" ] } ], "source": [ "engine =get_engine('db_zdt')\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "█\r" ] } ], "source": [ "from filter_stock import Filter_Stock" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "obj = Filter_Stock()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "df = obj.get_new_stock('2015','2015')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...bvpspbundpperundprevprofitgprnprholders更新日期
timeToMarket
2018-05-25300746N汉嘉建筑施工浙江36.000.532.1084655.7562115.2315889.55...3.872.0929412.241.400.000.0018.706.51100201.02018-05-25
2017-05-05300643万通智控汽车配件浙江1991.420.712.0048480.4635851.019471.17...2.078.776885.060.34-4.54-94.6526.560.7417863.02018-05-25
2018-05-23300745欣锐科技汽车配件深圳20.660.291.15112515.4598528.068233.80...8.482.4028390.362.480.000.0029.7718.9756498.02018-05-25
2017-01-11300580贝斯特汽车配件江苏33.830.662.00153087.3079671.8151525.51...6.433.3235882.651.7922.172.2937.9317.8221940.02018-05-25
2017-11-06300720海川智能电器仪表广东114.290.180.7246308.1832482.159548.55...5.946.2314848.822.060.000.0055.9122.2812821.02018-05-25
\n", "

5 rows × 23 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals \\\n", "timeToMarket \n", "2018-05-25 300746 N汉嘉 建筑施工 浙江 36.00 0.53 2.10 \n", "2017-05-05 300643 万通智控 汽车配件 浙江 1991.42 0.71 2.00 \n", "2018-05-23 300745 欣锐科技 汽车配件 深圳 20.66 0.29 1.15 \n", "2017-01-11 300580 贝斯特 汽车配件 江苏 33.83 0.66 2.00 \n", "2017-11-06 300720 海川智能 电器仪表 广东 114.29 0.18 0.72 \n", "\n", " totalAssets liquidAssets fixedAssets ... bvps pb \\\n", "timeToMarket ... \n", "2018-05-25 84655.75 62115.23 15889.55 ... 3.87 2.09 \n", "2017-05-05 48480.46 35851.01 9471.17 ... 2.07 8.77 \n", "2018-05-23 112515.45 98528.06 8233.80 ... 8.48 2.40 \n", "2017-01-11 153087.30 79671.81 51525.51 ... 6.43 3.32 \n", "2017-11-06 46308.18 32482.15 9548.55 ... 5.94 6.23 \n", "\n", " undp perundp rev profit gpr npr holders \\\n", "timeToMarket \n", "2018-05-25 29412.24 1.40 0.00 0.00 18.70 6.51 100201.0 \n", "2017-05-05 6885.06 0.34 -4.54 -94.65 26.56 0.74 17863.0 \n", "2018-05-23 28390.36 2.48 0.00 0.00 29.77 18.97 56498.0 \n", "2017-01-11 35882.65 1.79 22.17 2.29 37.93 17.82 21940.0 \n", "2017-11-06 14848.82 2.06 0.00 0.00 55.91 22.28 12821.0 \n", "\n", " 更新日期 \n", "timeToMarket \n", "2018-05-25 2018-05-25 \n", "2017-05-05 2018-05-25 \n", "2018-05-23 2018-05-25 \n", "2017-01-11 2018-05-25 \n", "2017-11-06 2018-05-25 \n", "\n", "[5 rows x 23 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "ret_df = df[(df['pe']< 50) & (df['pe']>0)].sort_values(by='pe',ascending=True)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "f = open('new_stock.txt','w')\n", "for i in df['code'].values:\n", " f.write(i)\n", " f.write('\\n')\n", "f.close()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/topTenHolder.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import sys\n", "from configure.settings import get_tushare_pro,DBSelector\n", "pro =get_tushare_pro()" ] }, { "cell_type": "code", "execution_count": 15, "outputs": [], "source": [ "df = pro.top10_holders(ts_code='600000.SH', start_date='20220930', end_date='20221231')" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 16, "outputs": [ { "data": { "text/plain": " ts_code ann_date end_date holder_name hold_amount hold_ratio\n0 600000.SH 20221029 20220930 上海国际集团有限公司 6.331323e+09 21.57\n1 600000.SH 20221029 20220930 中国移动通信集团广东有限公司 5.334893e+09 18.18\n2 600000.SH 20221029 20220930 富德生命人寿保险股份有限公司-传统 2.779437e+09 9.47\n3 600000.SH 20221029 20220930 富德生命人寿保险股份有限公司-资本金 1.763232e+09 6.01\n4 600000.SH 20221029 20220930 上海上国投资产管理有限公司 1.395571e+09 4.75\n5 600000.SH 20221029 20220930 富德生命人寿保险股份有限公司-万能H 1.270429e+09 4.33\n6 600000.SH 20221029 20220930 中国证券金融股份有限公司 1.179109e+09 4.02\n7 600000.SH 20221029 20220930 上海国鑫投资发展有限公司 9.455690e+08 3.22\n8 600000.SH 20221029 20220930 香港中央结算有限公司(陆股通) 5.720716e+08 1.95\n9 600000.SH 20221029 20220930 中央汇金资产管理有限责任公司 3.871747e+08 1.32", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ts_codeann_dateend_dateholder_namehold_amounthold_ratio
0600000.SH2022102920220930上海国际集团有限公司6.331323e+0921.57
1600000.SH2022102920220930中国移动通信集团广东有限公司5.334893e+0918.18
2600000.SH2022102920220930富德生命人寿保险股份有限公司-传统2.779437e+099.47
3600000.SH2022102920220930富德生命人寿保险股份有限公司-资本金1.763232e+096.01
4600000.SH2022102920220930上海上国投资产管理有限公司1.395571e+094.75
5600000.SH2022102920220930富德生命人寿保险股份有限公司-万能H1.270429e+094.33
6600000.SH2022102920220930中国证券金融股份有限公司1.179109e+094.02
7600000.SH2022102920220930上海国鑫投资发展有限公司9.455690e+083.22
8600000.SH2022102920220930香港中央结算有限公司(陆股通)5.720716e+081.95
9600000.SH2022102920220930中央汇金资产管理有限责任公司3.871747e+081.32
\n
" }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 19, "outputs": [], "source": [ "def get_AStock_code():\n", " conn = DBSelector().get_mysql_conn('db_daily','tencent-1c')\n", " cursor = conn.cursor()\n", " sql_str = 'select code from `2023-03-17`'\n", " cursor.execute(sql_str)\n", " ret = cursor.fetchall()\n", " result = []\n", " for item in ret:\n", " code = item[0]\n", " if code.startswith('8'):\n", " continue\n", " if code.startswith('6'):\n", " code = code+'.SH'\n", " else:\n", " code = code+'.SZ'\n", " result.append(code)\n", " return result\n", "\n", "result = get_AStock_code()\n", "# result\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 18, "outputs": [ { "data": { "text/plain": "5033" }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(result)\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 20, "outputs": [], "source": [ "import time\n", "def get_top_holder(code):\n", " df = pro.top10_floatholders(ts_code=code, start_date='20220930', end_date='20221231')\n", " time.sleep(0.1)\n", " return df\n", "all_stock_top_hold = []\n", "\n", "for code in result:\n", " df = get_top_holder(code)\n", " all_stock_top_hold.append(df)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 21, "outputs": [ { "data": { "text/plain": "5033" }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(all_stock_top_hold)\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 22, "outputs": [ { "data": { "text/plain": " ts_code ann_date end_date holder_name \\\n0 688981.SH 20221111 20220930 国家集成电路产业投资基金二期股份有限公司 \n1 688981.SH 20221111 20220930 中国信息通信科技集团有限公司 \n2 688981.SH 20221111 20220930 招商银行股份有限公司-华夏上证科创板50成份交易型开放式指数证券投资基金 \n3 688981.SH 20221111 20220930 国新投资有限公司 \n4 688981.SH 20221111 20220930 招商银行股份有限公司-银河创新成长混合型证券投资基金 \n5 688981.SH 20221111 20220930 中国建设银行股份有限公司-华夏国证半导体芯片交易型开放式指数证券投资基金 \n6 688981.SH 20221111 20220930 青岛聚源芯星股权投资合伙企业(有限合伙) \n\n hold_amount \n0 127458120.0 \n1 72470855.0 \n2 56553626.0 \n3 36416605.0 \n4 30500000.0 \n5 28657990.0 \n6 26599833.0 ", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ts_codeann_dateend_dateholder_namehold_amount
0688981.SH2022111120220930国家集成电路产业投资基金二期股份有限公司127458120.0
1688981.SH2022111120220930中国信息通信科技集团有限公司72470855.0
2688981.SH2022111120220930招商银行股份有限公司-华夏上证科创板50成份交易型开放式指数证券投资基金56553626.0
3688981.SH2022111120220930国新投资有限公司36416605.0
4688981.SH2022111120220930招商银行股份有限公司-银河创新成长混合型证券投资基金30500000.0
5688981.SH2022111120220930中国建设银行股份有限公司-华夏国证半导体芯片交易型开放式指数证券投资基金28657990.0
6688981.SH2022111120220930青岛聚源芯星股权投资合伙企业(有限合伙)26599833.0
\n
" }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_stock_top_hold[0]\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 23, "outputs": [], "source": [ "import pandas as pd" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 24, "outputs": [], "source": [ "all_stock_holder_df = pd.concat(all_stock_top_hold)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 25, "outputs": [ { "data": { "text/plain": " ts_code ann_date end_date holder_name \\\n0 688981.SH 20221111 20220930 国家集成电路产业投资基金二期股份有限公司 \n1 688981.SH 20221111 20220930 中国信息通信科技集团有限公司 \n2 688981.SH 20221111 20220930 招商银行股份有限公司-华夏上证科创板50成份交易型开放式指数证券投资基金 \n3 688981.SH 20221111 20220930 国新投资有限公司 \n4 688981.SH 20221111 20220930 招商银行股份有限公司-银河创新成长混合型证券投资基金 \n\n hold_amount \n0 127458120.0 \n1 72470855.0 \n2 56553626.0 \n3 36416605.0 \n4 30500000.0 ", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ts_codeann_dateend_dateholder_namehold_amount
0688981.SH2022111120220930国家集成电路产业投资基金二期股份有限公司127458120.0
1688981.SH2022111120220930中国信息通信科技集团有限公司72470855.0
2688981.SH2022111120220930招商银行股份有限公司-华夏上证科创板50成份交易型开放式指数证券投资基金56553626.0
3688981.SH2022111120220930国新投资有限公司36416605.0
4688981.SH2022111120220930招商银行股份有限公司-银河创新成长混合型证券投资基金30500000.0
\n
" }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_stock_holder_df.head()" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 26, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "688786.SH\n", "688621.SH\n", "688597.SH\n", "688586.SH\n", "688569.SH\n", "688555.SH\n", "688508.SH\n", "688323.SH\n", "688309.SH\n", "688303.SH\n", "688301.SH\n", "688233.SH\n", "688203.SH\n", "688195.SH\n", "688162.SH\n", "688100.SH\n", "688093.SH\n", "688091.SH\n", "688086.SH\n", "688082.SH\n", "688019.SH\n", "605377.SH\n", "605366.SH\n", "605339.SH\n", "605299.SH\n", "605189.SH\n", "605178.SH\n", "605090.SH\n", "603993.SH\n", "603956.SH\n", "603929.SH\n", "603881.SH\n", "603860.SH\n", "603856.SH\n", "603813.SH\n", "603758.SH\n", "603682.SH\n", "603615.SH\n", "603606.SH\n", "603603.SH\n", "603595.SH\n", "603557.SH\n", "603501.SH\n", "603456.SH\n", "603393.SH\n", "603348.SH\n", "603335.SH\n", "603330.SH\n", "603319.SH\n", "603317.SH\n", "603305.SH\n", "603303.SH\n", "603301.SH\n", "603267.SH\n", "603200.SH\n", "603186.SH\n", "603185.SH\n", "603169.SH\n", "603166.SH\n", "603133.SH\n", "603117.SH\n", "603105.SH\n", "603103.SH\n", "603093.SH\n", "603077.SH\n", "603039.SH\n", "603031.SH\n", "603021.SH\n", "603007.SH\n", "601996.SH\n", "601901.SH\n", "601788.SH\n", "601766.SH\n", "601698.SH\n", "601669.SH\n", "601633.SH\n", "601618.SH\n", "601608.SH\n", "601390.SH\n", "601318.SH\n", "601186.SH\n", "601138.SH\n", "601068.SH\n", "601021.SH\n", "601006.SH\n", "600989.SH\n", "600984.SH\n", "600976.SH\n", "600973.SH\n", "600963.SH\n", "600962.SH\n", "600955.SH\n", "600887.SH\n", "600873.SH\n", "600865.SH\n", "600862.SH\n", "600861.SH\n", "600839.SH\n", "600820.SH\n", "600817.SH\n", "600816.SH\n", "600805.SH\n", "600804.SH\n", "600800.SH\n", "600795.SH\n", "600793.SH\n", "600781.SH\n", "600779.SH\n", "600767.SH\n", "600765.SH\n", "600759.SH\n", "600742.SH\n", "600734.SH\n", "600732.SH\n", "600726.SH\n", "600722.SH\n", "600719.SH\n", "600715.SH\n", "600710.SH\n", "600705.SH\n", "600698.SH\n", "600691.SH\n", "600681.SH\n", "600671.SH\n", "600666.SH\n", "600665.SH\n", "600660.SH\n", "600654.SH\n", "600644.SH\n", "600608.SH\n", "600605.SH\n", "600601.SH\n", "600599.SH\n", "600589.SH\n", "600583.SH\n", "600577.SH\n", "600568.SH\n", "600557.SH\n", "600539.SH\n", "600532.SH\n", "600528.SH\n", "600523.SH\n", "600518.SH\n", "600513.SH\n", "600507.SH\n", "600488.SH\n", "600470.SH\n", "600462.SH\n", "600444.SH\n", "600433.SH\n", "600423.SH\n", "600408.SH\n", "600388.SH\n", "600382.SH\n", "600380.SH\n", "600372.SH\n", "600365.SH\n", "600356.SH\n", "600332.SH\n", "600328.SH\n", "600321.SH\n", "600316.SH\n", "600311.SH\n", "600306.SH\n", "600305.SH\n", "600303.SH\n", "600301.SH\n", "600290.SH\n", "600289.SH\n", "600265.SH\n", "600256.SH\n", "600255.SH\n", "600252.SH\n", "600242.SH\n", "600241.SH\n", "600239.SH\n", "600237.SH\n", "600226.SH\n", "600217.SH\n", "600211.SH\n", "600182.SH\n", "600168.SH\n", "600163.SH\n", "600139.SH\n", "600136.SH\n", "600122.SH\n", "600113.SH\n", "600112.SH\n", "600089.SH\n", "600078.SH\n", "600071.SH\n", "600063.SH\n", "600050.SH\n", "600039.SH\n", "600038.SH\n", "600021.SH\n", "600015.SH\n", "301256.SZ\n", "301192.SZ\n", "301179.SZ\n", "301171.SZ\n", "301127.SZ\n", "301076.SZ\n", "301071.SZ\n", "301066.SZ\n", "301059.SZ\n", "301046.SZ\n", "300896.SZ\n", "300890.SZ\n", "300818.SZ\n", "300796.SZ\n", "300765.SZ\n", "300750.SZ\n", "300721.SZ\n", "300708.SZ\n", "300700.SZ\n", "300674.SZ\n", "300654.SZ\n", "300578.SZ\n", "300496.SZ\n", "300422.SZ\n", "300401.SZ\n", "300354.SZ\n", "300349.SZ\n", "300346.SZ\n", "300286.SZ\n", "300281.SZ\n", "300211.SZ\n", "300146.SZ\n", "300139.SZ\n", "300120.SZ\n", "300087.SZ\n", "300059.SZ\n", "300033.SZ\n", "300006.SZ\n", "003816.SZ\n", "003037.SZ\n", "003011.SZ\n", "002984.SZ\n", "002972.SZ\n", "002966.SZ\n", "002947.SZ\n", "002916.SZ\n", "002912.SZ\n", "002881.SZ\n", "002879.SZ\n", "002865.SZ\n", "002846.SZ\n", "002812.SZ\n", "002805.SZ\n", "002782.SZ\n", "002777.SZ\n", "002759.SZ\n", "002741.SZ\n", "002682.SZ\n", "002668.SZ\n", "002667.SZ\n", "002616.SZ\n", "002579.SZ\n", "002566.SZ\n", "002560.SZ\n", "002556.SZ\n", "002532.SZ\n", "002514.SZ\n", "002419.SZ\n", "002379.SZ\n", "002315.SZ\n", "002285.SZ\n", "002258.SZ\n", "002240.SZ\n", "002233.SZ\n", "002190.SZ\n", "002188.SZ\n", "002179.SZ\n", "002162.SZ\n", "002138.SZ\n", "002134.SZ\n", "002105.SZ\n", "002080.SZ\n", "002072.SZ\n", "002056.SZ\n", "002014.SZ\n", "001979.SZ\n", "001914.SZ\n", "001207.SZ\n", "001205.SZ\n", "000988.SZ\n", "000975.SZ\n", "000972.SZ\n", "000915.SZ\n", "000815.SZ\n", "000798.SZ\n", "000795.SZ\n", "000783.SZ\n", "000739.SZ\n", "000708.SZ\n", "000702.SZ\n", "000690.SZ\n", "000665.SZ\n", "000663.SZ\n", "000608.SZ\n", "000534.SZ\n", "000503.SZ\n", "000408.SZ\n", "000407.SZ\n", "000063.SZ\n", "000062.SZ\n", "000061.SZ\n", "000055.SZ\n", "000050.SZ\n", "000048.SZ\n", "000029.SZ\n", "000026.SZ\n", "000001.SZ\n", "688555.SH\n", "688309.SH\n", "688086.SH\n", "603603.SH\n", "603557.SH\n", "603117.SH\n", "603039.SH\n", "603007.SH\n", "600984.SH\n", "600962.SH\n", "600817.SH\n", "600816.SH\n", "600804.SH\n", "600793.SH\n", "600781.SH\n", "600779.SH\n", "600767.SH\n", "600759.SH\n", "600734.SH\n", "600732.SH\n", "600726.SH\n", "600722.SH\n", "600719.SH\n", "600715.SH\n", "600710.SH\n", "600691.SH\n", "600671.SH\n", "600666.SH\n", "600654.SH\n", "600644.SH\n", "600608.SH\n", "600601.SH\n", "600599.SH\n", "600589.SH\n", "600568.SH\n", "600539.SH\n", "600532.SH\n", "600518.SH\n", "600462.SH\n", "600444.SH\n", "600408.SH\n", "600388.SH\n", "600382.SH\n", "600365.SH\n", "600311.SH\n", "600306.SH\n", "600303.SH\n", "600301.SH\n", "600290.SH\n", "600289.SH\n", "600265.SH\n", "600242.SH\n", "600241.SH\n", "600239.SH\n", "600226.SH\n", "600217.SH\n", "600182.SH\n", "600163.SH\n", "600139.SH\n", "600136.SH\n", "600122.SH\n", "600112.SH\n", "600078.SH\n", "600071.SH\n" ] } ], "source": [ "for code in result:\n", " tmp_df = all_stock_holder_df[all_stock_holder_df['ts_code']==code]\n", " if len(tmp_df)>10:\n", " print(code)\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 27, "outputs": [ { "data": { "text/plain": " ts_code ann_date end_date holder_name hold_amount\n0 600071.SH 20221029 20220930 北京世纪鼎晟咨询服务有限公司 949600.0\n1 600071.SH 20221029 20220930 北京润博翔科技发展中心(有限合伙) 827900.0\n2 600071.SH 20221029 20220930 南方基金稳健增值混合型养老金产品-招商银行股份有限公司 814900.0\n3 600071.SH 20221029 20220930 牟其波 796000.0\n4 600071.SH 20221029 20220930 中电海康集团有限公司 132790648.0\n5 600071.SH 20221029 20220930 中电科投资控股有限公司 6012480.0\n6 600071.SH 20221029 20220930 北京鼎泽迅捷科技有限公司 1177000.0\n7 600071.SH 20221029 20220930 浮石(北京)投资有限公司-浮石麒麟1号私募证券投资基金 1173100.0\n8 600071.SH 20221029 20220930 北京九鼎房地产开发有限责任公司 1106700.0\n9 600071.SH 20221029 20220930 河北皓佳商务服务中心(有限合伙) 953500.0\n0 600071.SH 20221029 20220930 北京世纪鼎晟咨询服务有限公司 949600.0\n1 600071.SH 20221029 20220930 北京润博翔科技发展中心(有限合伙) 827900.0\n2 600071.SH 20221029 20220930 南方基金稳健增值混合型养老金产品-招商银行股份有限公司 814900.0\n3 600071.SH 20221029 20220930 牟其波 796000.0\n4 600071.SH 20221029 20220930 中电海康集团有限公司 132790648.0\n5 600071.SH 20221029 20220930 中电科投资控股有限公司 6012480.0\n6 600071.SH 20221029 20220930 北京鼎泽迅捷科技有限公司 1177000.0\n7 600071.SH 20221029 20220930 浮石(北京)投资有限公司-浮石麒麟1号私募证券投资基金 1173100.0\n8 600071.SH 20221029 20220930 北京九鼎房地产开发有限责任公司 1106700.0\n9 600071.SH 20221029 20220930 河北皓佳商务服务中心(有限合伙) 953500.0", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ts_codeann_dateend_dateholder_namehold_amount
0600071.SH2022102920220930北京世纪鼎晟咨询服务有限公司949600.0
1600071.SH2022102920220930北京润博翔科技发展中心(有限合伙)827900.0
2600071.SH2022102920220930南方基金稳健增值混合型养老金产品-招商银行股份有限公司814900.0
3600071.SH2022102920220930牟其波796000.0
4600071.SH2022102920220930中电海康集团有限公司132790648.0
5600071.SH2022102920220930中电科投资控股有限公司6012480.0
6600071.SH2022102920220930北京鼎泽迅捷科技有限公司1177000.0
7600071.SH2022102920220930浮石(北京)投资有限公司-浮石麒麟1号私募证券投资基金1173100.0
8600071.SH2022102920220930北京九鼎房地产开发有限责任公司1106700.0
9600071.SH2022102920220930河北皓佳商务服务中心(有限合伙)953500.0
0600071.SH2022102920220930北京世纪鼎晟咨询服务有限公司949600.0
1600071.SH2022102920220930北京润博翔科技发展中心(有限合伙)827900.0
2600071.SH2022102920220930南方基金稳健增值混合型养老金产品-招商银行股份有限公司814900.0
3600071.SH2022102920220930牟其波796000.0
4600071.SH2022102920220930中电海康集团有限公司132790648.0
5600071.SH2022102920220930中电科投资控股有限公司6012480.0
6600071.SH2022102920220930北京鼎泽迅捷科技有限公司1177000.0
7600071.SH2022102920220930浮石(北京)投资有限公司-浮石麒麟1号私募证券投资基金1173100.0
8600071.SH2022102920220930北京九鼎房地产开发有限责任公司1106700.0
9600071.SH2022102920220930河北皓佳商务服务中心(有限合伙)953500.0
\n
" }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_stock_holder_df[all_stock_holder_df['ts_code']=='600071.SH']" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 28, "outputs": [], "source": [ "drop_dup = all_stock_holder_df.drop_duplicates(['ts_code','ann_date','holder_name'])\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 29, "outputs": [ { "data": { "text/plain": "50088" }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(drop_dup)\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 30, "outputs": [ { "data": { "text/plain": "50777" }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(all_stock_holder_df)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 31, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "688786.SH\n", "688621.SH\n", "688597.SH\n", "688586.SH\n", "688569.SH\n", "688508.SH\n", "688323.SH\n", "688303.SH\n", "688301.SH\n", "688233.SH\n", "688203.SH\n", "688195.SH\n", "688162.SH\n", "688100.SH\n", "688093.SH\n", "688091.SH\n", "688082.SH\n", "688019.SH\n", "605377.SH\n", "605366.SH\n", "605339.SH\n", "605299.SH\n", "605189.SH\n", "605178.SH\n", "605090.SH\n", "603993.SH\n", "603956.SH\n", "603929.SH\n", "603881.SH\n", "603860.SH\n", "603856.SH\n", "603813.SH\n", "603758.SH\n", "603682.SH\n", "603615.SH\n", "603606.SH\n", "603595.SH\n", "603501.SH\n", "603456.SH\n", "603393.SH\n", "603348.SH\n", "603335.SH\n", "603330.SH\n", "603319.SH\n", "603317.SH\n", "603305.SH\n", "603303.SH\n", "603301.SH\n", "603267.SH\n", "603200.SH\n", "603186.SH\n", "603185.SH\n", "603169.SH\n", "603166.SH\n", "603133.SH\n", "603105.SH\n", "603103.SH\n", "603093.SH\n", "603077.SH\n", "603031.SH\n", "603021.SH\n", "601996.SH\n", "601901.SH\n", "601788.SH\n", "601766.SH\n", "601698.SH\n", "601669.SH\n", "601633.SH\n", "601618.SH\n", "601608.SH\n", "601390.SH\n", "601318.SH\n", "601186.SH\n", "601138.SH\n", "601068.SH\n", "601021.SH\n", "601006.SH\n", "600989.SH\n", "600976.SH\n", "600973.SH\n", "600963.SH\n", "600955.SH\n", "600887.SH\n", "600873.SH\n", "600865.SH\n", "600862.SH\n", "600861.SH\n", "600839.SH\n", "600820.SH\n", "600805.SH\n", "600800.SH\n", "600795.SH\n", "600765.SH\n", "600732.SH\n", "600719.SH\n", "600710.SH\n", "600705.SH\n", "600698.SH\n", "600681.SH\n", "600665.SH\n", "600660.SH\n", "600605.SH\n", "600583.SH\n", "600577.SH\n", "600557.SH\n", "600528.SH\n", "600523.SH\n", "600513.SH\n", "600507.SH\n", "600488.SH\n", "600470.SH\n", "600433.SH\n", "600423.SH\n", "600408.SH\n", "600388.SH\n", "600380.SH\n", "600372.SH\n", "600356.SH\n", "600332.SH\n", "600321.SH\n", "600316.SH\n", "600305.SH\n", "600256.SH\n", "600255.SH\n", "600252.SH\n", "600237.SH\n", "600211.SH\n", "600168.SH\n", "600113.SH\n", "600089.SH\n", "600063.SH\n", "600050.SH\n", "600039.SH\n", "600038.SH\n", "600021.SH\n", "600015.SH\n", "301256.SZ\n", "301192.SZ\n", "301179.SZ\n", "301171.SZ\n", "301127.SZ\n", "301076.SZ\n", "301071.SZ\n", "301066.SZ\n", "301059.SZ\n", "301046.SZ\n", "300896.SZ\n", "300890.SZ\n", "300818.SZ\n", "300796.SZ\n", "300765.SZ\n", "300750.SZ\n", "300721.SZ\n", "300708.SZ\n", "300700.SZ\n", "300674.SZ\n", "300654.SZ\n", "300496.SZ\n", "300422.SZ\n", "300401.SZ\n", "300354.SZ\n", "300349.SZ\n", "300346.SZ\n", "300286.SZ\n", "300281.SZ\n", "300211.SZ\n", "300146.SZ\n", "300139.SZ\n", "300120.SZ\n", "300087.SZ\n", "300059.SZ\n", "300033.SZ\n", "300006.SZ\n", "003816.SZ\n", "003037.SZ\n", "003011.SZ\n", "002984.SZ\n", "002972.SZ\n", "002966.SZ\n", "002947.SZ\n", "002916.SZ\n", "002912.SZ\n", "002881.SZ\n", "002879.SZ\n", "002865.SZ\n", "002846.SZ\n", "002812.SZ\n", "002805.SZ\n", "002782.SZ\n", "002777.SZ\n", "002759.SZ\n", "002741.SZ\n", "002682.SZ\n", "002668.SZ\n", "002667.SZ\n", "002616.SZ\n", "002579.SZ\n", "002566.SZ\n", "002560.SZ\n", "002556.SZ\n", "002532.SZ\n", "002514.SZ\n", "002419.SZ\n", "002379.SZ\n", "002315.SZ\n", "002285.SZ\n", "002258.SZ\n", "002240.SZ\n", "002233.SZ\n", "002190.SZ\n", "002188.SZ\n", "002179.SZ\n", "002162.SZ\n", "002138.SZ\n", "002134.SZ\n", "002105.SZ\n", "002080.SZ\n", "002072.SZ\n", "002056.SZ\n", "002014.SZ\n", "001979.SZ\n", "001914.SZ\n", "001207.SZ\n", "001205.SZ\n", "000988.SZ\n", "000975.SZ\n", "000972.SZ\n", "000915.SZ\n", "000815.SZ\n", "000798.SZ\n", "000795.SZ\n", "000783.SZ\n", "000739.SZ\n", "000708.SZ\n", "000702.SZ\n", "000690.SZ\n", "000665.SZ\n", "000663.SZ\n", "000608.SZ\n", "000534.SZ\n", "000503.SZ\n", "000408.SZ\n", "000407.SZ\n", "000063.SZ\n", "000062.SZ\n", "000061.SZ\n", "000055.SZ\n", "000050.SZ\n", "000048.SZ\n", "000029.SZ\n", "000026.SZ\n", "000001.SZ\n", "600732.SH\n", "600719.SH\n", "600710.SH\n", "600408.SH\n", "600388.SH\n" ] } ], "source": [ "for code in result:\n", " tmp_df = drop_dup[drop_dup['ts_code']==code]\n", " if len(tmp_df)>10:\n", " print(code)\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 32, "outputs": [ { "data": { "text/plain": " ts_code ann_date end_date holder_name \\\n0 600388.SH 20230318 20221231 福建龙净环保股份有限公司-第七期员工持股计划 \n1 600388.SH 20230318 20221231 李亚洲 \n2 600388.SH 20230318 20221231 深圳市云古投资有限公司-云古湛卢1号私募证券投资基金 \n3 600388.SH 20230318 20221231 紫金矿业集团股份有限公司 \n4 600388.SH 20230318 20221231 龙岩市国有资产投资经营有限公司 \n5 600388.SH 20230318 20221231 龙净实业投资集团有限公司 \n6 600388.SH 20230318 20221231 西藏阳光泓瑞工贸有限公司 \n7 600388.SH 20230318 20221231 深圳永冠基金管理有限公司-永冠新瑞1号私募证券投资基金 \n8 600388.SH 20230318 20221231 深圳市恒泰融安投资管理有限公司-恒泰融安瑞狮1号私募证券投资基金 \n9 600388.SH 20230318 20221231 平潭润垚实业有限公司 \n10 600388.SH 20221018 20220930 紫金矿业集团股份有限公司 \n11 600388.SH 20221018 20220930 龙岩市国有资产投资经营有限公司 \n12 600388.SH 20221018 20220930 龙净实业投资集团有限公司 \n13 600388.SH 20221018 20220930 西藏阳光泓瑞工贸有限公司 \n14 600388.SH 20221018 20220930 深圳永冠基金管理有限公司-永冠新瑞1号私募证券投资基金 \n15 600388.SH 20221018 20220930 深圳市恒泰融安投资管理有限公司-恒泰融安瑞狮1号私募证券投资基金 \n16 600388.SH 20221018 20220930 平潭润垚实业有限公司 \n17 600388.SH 20221018 20220930 福建龙净环保股份有限公司-第七期员工持股计划 \n18 600388.SH 20221018 20220930 深圳市云古投资有限公司-云古湛卢1号私募证券投资基金 \n19 600388.SH 20221018 20220930 龙岩市电力建设发展有限公司 \n\n hold_amount \n0 9759390.0 \n1 8960604.0 \n2 8685250.0 \n3 160586231.0 \n4 100371338.0 \n5 84310926.0 \n6 22807835.0 \n7 15600000.0 \n8 11349914.0 \n9 10040000.0 \n10 160586231.0 \n11 100371338.0 \n12 84310926.0 \n13 22807835.0 \n14 13999000.0 \n15 11345206.0 \n16 10040000.0 \n17 9759390.0 \n18 8685250.0 \n19 8632545.0 ", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ts_codeann_dateend_dateholder_namehold_amount
0600388.SH2023031820221231福建龙净环保股份有限公司-第七期员工持股计划9759390.0
1600388.SH2023031820221231李亚洲8960604.0
2600388.SH2023031820221231深圳市云古投资有限公司-云古湛卢1号私募证券投资基金8685250.0
3600388.SH2023031820221231紫金矿业集团股份有限公司160586231.0
4600388.SH2023031820221231龙岩市国有资产投资经营有限公司100371338.0
5600388.SH2023031820221231龙净实业投资集团有限公司84310926.0
6600388.SH2023031820221231西藏阳光泓瑞工贸有限公司22807835.0
7600388.SH2023031820221231深圳永冠基金管理有限公司-永冠新瑞1号私募证券投资基金15600000.0
8600388.SH2023031820221231深圳市恒泰融安投资管理有限公司-恒泰融安瑞狮1号私募证券投资基金11349914.0
9600388.SH2023031820221231平潭润垚实业有限公司10040000.0
10600388.SH2022101820220930紫金矿业集团股份有限公司160586231.0
11600388.SH2022101820220930龙岩市国有资产投资经营有限公司100371338.0
12600388.SH2022101820220930龙净实业投资集团有限公司84310926.0
13600388.SH2022101820220930西藏阳光泓瑞工贸有限公司22807835.0
14600388.SH2022101820220930深圳永冠基金管理有限公司-永冠新瑞1号私募证券投资基金13999000.0
15600388.SH2022101820220930深圳市恒泰融安投资管理有限公司-恒泰融安瑞狮1号私募证券投资基金11345206.0
16600388.SH2022101820220930平潭润垚实业有限公司10040000.0
17600388.SH2022101820220930福建龙净环保股份有限公司-第七期员工持股计划9759390.0
18600388.SH2022101820220930深圳市云古投资有限公司-云古湛卢1号私募证券投资基金8685250.0
19600388.SH2022101820220930龙岩市电力建设发展有限公司8632545.0
\n
" }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "drop_dup[drop_dup['ts_code']=='600388.SH']" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 33, "outputs": [], "source": [ "last_year_df = drop_dup[drop_dup['end_date']=='20220930']" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 34, "outputs": [ { "data": { "text/plain": "47999" }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(last_year_df)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 52, "outputs": [ { "data": { "text/plain": " ts_code ann_date end_date holder_name \\\n8 688668.SH 20221019 20220930 中国农业银行股份有限公司-工银瑞信战略转型主题股票型证券投资基金 \n0 688382.SH 20221027 20220930 中国建设银行股份有限公司-工银瑞信前沿医疗股票型证券投资基金 \n5 688381.SH 20221029 20220930 平安银行股份有限公司-招商瑞信稳健配置混合型证券投资基金 \n17 688301.SH 20221031 20220930 中国建设银行股份有限公司-工银瑞信前沿医疗股票型证券投资基金 \n1 688293.SH 20221027 20220930 中国建设银行股份有限公司-工银瑞信前沿医疗股票型证券投资基金 \n.. ... ... ... ... \n9 000400.SZ 20221028 20220930 工银瑞信基金-农业银行-工银瑞信中证金融资产管理计划 \n7 000100.SZ 20221025 20220930 工银瑞信基金-农业银行-工银瑞信中证金融资产管理计划 \n6 000099.SZ 20221028 20220930 中国农业银行股份有限公司-工银瑞信创新动力股票型证券投资基金 \n9 000088.SZ 20221028 20220930 工银瑞信基金-农业银行-工银瑞信中证金融资产管理计划 \n7 000031.SZ 20221031 20220930 工银瑞信投资-工商银行-中国工商银行股份有限公司 \n\n hold_amount \n8 528214.0 \n0 2000008.0 \n5 576795.0 \n17 1006266.0 \n1 700018.0 \n.. ... \n9 6674795.0 \n7 74761500.0 \n6 3300000.0 \n9 17266196.0 \n7 38512834.0 \n\n[136 rows x 5 columns]", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ts_codeann_dateend_dateholder_namehold_amount
8688668.SH2022101920220930中国农业银行股份有限公司-工银瑞信战略转型主题股票型证券投资基金528214.0
0688382.SH2022102720220930中国建设银行股份有限公司-工银瑞信前沿医疗股票型证券投资基金2000008.0
5688381.SH2022102920220930平安银行股份有限公司-招商瑞信稳健配置混合型证券投资基金576795.0
17688301.SH2022103120220930中国建设银行股份有限公司-工银瑞信前沿医疗股票型证券投资基金1006266.0
1688293.SH2022102720220930中国建设银行股份有限公司-工银瑞信前沿医疗股票型证券投资基金700018.0
..................
9000400.SZ2022102820220930工银瑞信基金-农业银行-工银瑞信中证金融资产管理计划6674795.0
7000100.SZ2022102520220930工银瑞信基金-农业银行-工银瑞信中证金融资产管理计划74761500.0
6000099.SZ2022102820220930中国农业银行股份有限公司-工银瑞信创新动力股票型证券投资基金3300000.0
9000088.SZ2022102820220930工银瑞信基金-农业银行-工银瑞信中证金融资产管理计划17266196.0
7000031.SZ2022103120220930工银瑞信投资-工商银行-中国工商银行股份有限公司38512834.0
\n

136 rows × 5 columns

\n
" }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tmp_result = last_year_df[last_year_df['holder_name'].str.contains('瑞信')]\n", "tmp_result" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 47, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ts_code 600151.SH\n", "ann_date 20221029\n", "end_date 20220930\n", "holder_name 瑞士信贷(香港)有限公司\n", "hold_amount 12483068.0\n", "Name: 6, dtype: object\n", "ts_code 300554.SZ\n", "ann_date 20221028\n", "end_date 20220930\n", "holder_name 瑞士信贷(香港)有限公司\n", "hold_amount 428693.0\n", "Name: 8, dtype: object\n" ] } ], "source": [ "for index,row in tmp_result.iterrows():\n", " if '工银' in row['holder_name'] or '嘉盛' in row['holder_name']:\n", " continue\n", " print(row)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 48, "outputs": [ { "data": { "text/plain": " ts_code ann_date end_date holder_name hold_amount\n6 600151.SH 20221029 20220930 瑞士信贷(香港)有限公司 12483068.0\n8 600151.SH 20221029 20220930 瑞士嘉盛银行有限公司-自有资金 11199911.0\n8 300554.SZ 20221028 20220930 瑞士信贷(香港)有限公司 428693.0", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ts_codeann_dateend_dateholder_namehold_amount
6600151.SH2022102920220930瑞士信贷(香港)有限公司12483068.0
8600151.SH2022102920220930瑞士嘉盛银行有限公司-自有资金11199911.0
8300554.SZ2022102820220930瑞士信贷(香港)有限公司428693.0
\n
" }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tmp_result\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: analysis/trade_frequency.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 交易频率分析" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "from pyecharts.commons.utils import JsCode\n", "import sys\n", "sys.path.append('..')\n", "from settings import DBSelector\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "DB=DBSelector()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "engine = DB.get_engine('db_stock','qq')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "table = 'tb_delivery'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.read_sql(table,con=engine)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "len(df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.set_index('成交日期',inplace=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# GJ\n", "df=df[(df['操作']=='证券卖出')| (df['操作']=='证券卖出')]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df=df[(df['委托类别']=='卖出')| (df['委托类别']=='买入')]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "result = df.resample('W').count()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "result=result.reset_index()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result=result.reset_index()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result.info()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "np_dt =np.datetime64('2018-09-01T00:00:00.000000')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(np_dt)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dir(np_dt)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def convertor(x):\n", " print(x.year" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result['成交日期']=result.map(lambda x:x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result=result['证券代码']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "result" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xticklabels=list(result.index)[::5]\n", "xticks=range(0,len(xticklabels),5)\n", "result.plot.bar(xticks=xticks,xticklabels=xticklabels)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig,ax = plt.subplots()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig = plt.figure(figsize=(10,8))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ax = plt.gca()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=list(result.index)\n", "y=list(result.values)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "y" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "plt.bar(x,y,width=0.6)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ax.set_xticks(xticks)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ax.set_xticklabels(xticklabels,rotation=45)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.plot(x,y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "fig,ax=plt.subplots()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "ax.set_xticks(xticks)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "ax.set_xticklabels(xticklabels,rotation=45)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.bar(x,y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.grid" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xticks" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xticklabels=list(result.index)[::5]\n", "xticks=range(0,len(result),5)\n", "# result.plot.bar(xticks=xticks,xticklabels=xticklabels)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "xticklabels" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig = plt.figure(figsize=(20,10))\n", "result.plot.bar(width=0.8)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result.index" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from pyecharts import Bar" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=result.index.values" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x_py_dt=[i.to_pydatetime() for i in x]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=result['成交日期'].dt.to_pydatetime()\n", "x_py_dt=[i.strftime('%Y-%m-%d') for i in x]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x_py_dt=[i.strftime('%Y-%m-%d') for i in x]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "x_py_dt" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=x_py_dt" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "len(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "len(y_)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "y=result['成交数量'].values" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "y" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Bar.add" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "bar = Bar('交易频率柱状图')\n", "bar.add('交易频率',x_py_dt,y,mark_line=['average'])\n", "bar.render()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "bar" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "from pyecharts import options as opts\n", "from pyecharts.charts import Bar\n", "\n", "bar=(\n", " Bar()\n", " .add_xaxis(x_py_dt)\n", " .add_yaxis('A',y)\n", " .set_global_opts(title_opts=opts.TitleOpts(title=\"Bar-MarkPoint(指定类型)\")).set_series_opts(\n", " label_opts=opts.LabelOpts(is_show=True),\n", " markpoint_opts=opts.MarkPointOpts(\n", " data=[\n", " opts.MarkPointItem(type_=\"max\", name=\"最大值\"),\n", " opts.MarkPointItem(type_=\"min\", name=\"最小值\"),\n", " opts.MarkPointItem(type_=\"average\", name=\"平均值\"),\n", " ]\n", " ),\n", " )\n", " )\n", "\n", "bar.render()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from example import Faker\n", "from pyecharts import options as opts\n", "from pyecharts.charts import Bar\n", "x=[1,2,3,4,5,6,7,8,9]\n", "y=[1,2,3,4,5,6,7,8,9]\n", "bar=(\n", " Bar()\n", " .add_xaxis(Faker.choose())\n", " .add_yaxis(\"商家A\", x)\n", " .add_yaxis(\"商家B\", y))\n", " .set_global_opts(title_opts=opts.TitleOpts(title=\"Bar-MarkPoint(指定类型)\"))\n", " .set_series_opts(\n", " label_opts=opts.LabelOpts(is_show=False),\n", " markpoint_opts=opts.MarkPointOpts(\n", " data=[\n", " opts.MarkPointItem(type_=\"max\", name=\"最大值\"),\n", " opts.MarkPointItem(type_=\"min\", name=\"最小值\"),\n", " opts.MarkPointItem(type_=\"average\", name=\"平均值\"),\n", " ]\n", " ),\n", " )\n", " )\n", "\n", "bar.render()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=result['成交日期'].dt.to_pydatetime()\n", "x_py_dt=[i.strftime('%Y-%m-%d') for i in x]\n", "y=result['成交数量'].values\n", "y = list(map(lambda x:int(x),y))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "len(x_py_dt)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "len(y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "from pyecharts import options as opts\n", "from pyecharts.charts import Bar\n", "\n", "bar=(\n", " Bar()\n", " .add_xaxis(x_py_dt)\n", " .add_yaxis(\"交易频率\",y,itemstyle_opts=opts.ItemStyleOpts(\n", " color=JsCode(color_function)),)\n", " .set_global_opts(title_opts=opts.TitleOpts(title=\"交易频率 券商B\"),\n", " xaxis_opts=opts.AxisOpts(axislabel_opts={\"rotate\":45}))\n", " .set_series_opts(\n", " label_opts=opts.LabelOpts(is_show=True),\n", " datazoom_opts=opts.DataZoomOpts(),\n", " markline_opts=opts.MarkLineOpts(\n", " data=[\n", " opts.MarkLineItem(type_=\"average\", name=\"平均值\"),\n", " ]\n", " ),\n", "\n", " ).render('B.html')\n", " )\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "color_function = \"\"\"\n", " function (params) {\n", " if (params.value > 0 && params.value <= 30) {\n", " return '#1a7f0f';\n", " } else if (params.value > 30 && params.value <=60) {\n", " return '#e8e855';\n", " } else if (params.value > 60)\n", " { return '#C1232B';}\n", " return 'green';\n", " }\n", " \"\"\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ " .set_global_opts(title_opts=opts.TitleOpts(title=title, subtitle=subtitle),xaxis_opts=opts.AxisOpts(name_rotate=60,name=\"123456\",axislabel_opts={\"rotate\":45}))\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.6" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/xueqiu_private.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "import pandas as pd\n", "sys.path.append('..')\n", "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "db = DBSelector().mongo('qq')['db_stock']\n", "old_doc = db['xueqiu_private']\n", "new_doc =db['xueqiu_private_2021-12-28_brute_force']" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "only_part_doc =db['xueqiu_private_2021-12-29']" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "def mongoToDataframe(doc):\n", " result_list=[]\n", " for i in doc.find({},{'_id':0}):\n", " result_list.append(i)\n", "\n", " return pd.DataFrame(result_list)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "only_part_df = mongoToDataframe(only_part_doc)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "new_df = mongoToDataframe(new_doc)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "old_df.head()" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolnameprofit_rateannual_return_this_yearmanager_nick_namenetvalue_datecreate_dateclose_statuscrwaltime
0P000048NoneNaNNaNNoneNoneNoneFalse2021-12-28 22:33:53.371
1P000049NoneNaNNaNNoneNoneNoneFalse2021-12-28 22:33:53.710
2P000051私募工场(裕泉二期)-14.18NaNNone2015-10-272014-04-30True2021-12-28 22:33:54.102
3P000057iMeigu Fund132.34-19.24梁剑2021-09-302013-10-10True2021-12-28 22:33:54.689
4P000090私募工场(兴富进取1期)81.63NaN广东兴富投资2015-11-062014-07-08True2021-12-28 22:33:55.562
\n", "
" ], "text/plain": [ " symbol name profit_rate annual_return_this_year \\\n", "0 P000048 None NaN NaN \n", "1 P000049 None NaN NaN \n", "2 P000051 私募工场(裕泉二期) -14.18 NaN \n", "3 P000057 iMeigu Fund 132.34 -19.24 \n", "4 P000090 私募工场(兴富进取1期) 81.63 NaN \n", "\n", " manager_nick_name netvalue_date create_date close_status \\\n", "0 None None None False \n", "1 None None None False \n", "2 None 2015-10-27 2014-04-30 True \n", "3 梁剑 2021-09-30 2013-10-10 True \n", "4 广东兴富投资 2015-11-06 2014-07-08 True \n", "\n", " crwaltime \n", "0 2021-12-28 22:33:53.371 \n", "1 2021-12-28 22:33:53.710 \n", "2 2021-12-28 22:33:54.102 \n", "3 2021-12-28 22:33:54.689 \n", "4 2021-12-28 22:33:55.562 " ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_df.head()" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "for index,row in new_df.iterrows():\n", " symbol = row['symbol']\n", " if any(only_part_df['symbol']==symbol):\n", " \n", " max_drawdown_rate=only_part_df[only_part_df['symbol']==symbol]['max_drawdown_rate'].iloc[0]\n", " annual_return_year=only_part_df[only_part_df['symbol']==symbol]['annual_return_year'].iloc[0]\n", " # row['max_drawdown_rate']=max_drawdown_rate\n", " # row['annual_return_year']=annual_return_year\n", " new_df.loc[index,'max_drawdown_rate']=max_drawdown_rate\n", " new_df.loc[index,'annual_return_year']=annual_return_year\n", "\n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 770 entries, 0 to 769\n", "Data columns (total 11 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 symbol 770 non-null object \n", " 1 name 716 non-null object \n", " 2 profit_rate 677 non-null float64 \n", " 3 annual_return_this_year 529 non-null float64 \n", " 4 manager_nick_name 454 non-null object \n", " 5 netvalue_date 716 non-null object \n", " 6 create_date 716 non-null object \n", " 7 close_status 770 non-null bool \n", " 8 crwaltime 770 non-null datetime64[ns]\n", " 9 max_drawdown_rate 397 non-null float64 \n", " 10 annual_return_year 397 non-null float64 \n", "dtypes: bool(1), datetime64[ns](1), float64(4), object(5)\n", "memory usage: 61.0+ KB\n" ] } ], "source": [ "new_df.info()" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "def convertor(df):\n", " # df['annual_return_this_year']=df['annual_return_this_year']*100\n", " df['annual_return_year']=df['annual_return_year']*100\n", " df['max_drawdown_rate']=df['max_drawdown_rate']*100\n", " # df['profit_rate']=df['profit_rate']*100\n", " return df" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "new_df = convertor(new_df)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "process_df = new_df[~new_df['profit_rate'].isnull()]" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "process_df = process_df[~process_df['name'].isnull()]" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "677" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(process_df)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolnameprofit_rateannual_return_this_yearmanager_nick_namenetvalue_datecreate_dateclose_statuscrwaltimemax_drawdown_rateannual_return_year
515P000777大禾投资-掘金5号1217.20-6.37大禾投资2021-12-242016-10-12False2021-12-28 22:40:03.48539.31-0.30
767P001029仙人掌盈沣远航一号1085.6098.43上海仙人掌2021-12-242017-04-12False2021-12-28 22:42:14.39527.9797.76
684P000946正圆壹号984.00164.31正圆投资2021-12-242016-07-14False2021-12-28 22:41:37.62236.38143.14
691P000953涌津涌赢1号854.7045.40涌津投资2021-12-242016-04-28False2021-12-28 22:41:43.72825.2140.52
603P000865达理1号799.5217.94成于思2021-12-242016-07-28False2021-12-28 22:40:52.15234.0422.67
475P000736巨石鑫鼎一号631.22175.99梁雄登2021-12-242020-06-17False2021-12-28 22:39:39.80730.99184.67
284P000531希瓦小牛1号629.601.54梁宏2021-12-242015-04-21False2021-12-28 22:37:01.54929.795.65
690P000952龙航一期611.6016.29龙航资产2021-12-242018-12-28False2021-12-28 22:41:43.27326.6816.29
619P000881山楂树一期基金A526.0031.40山楂树甄琢资产2021-12-242014-08-26False2021-12-28 22:41:04.14741.6033.33
689P000951健顺云2号472.0524.70健顺投资2021-12-102015-06-09False2021-12-28 22:41:42.82026.8240.70
\n", "
" ], "text/plain": [ " symbol name profit_rate annual_return_this_year \\\n", "515 P000777 大禾投资-掘金5号 1217.20 -6.37 \n", "767 P001029 仙人掌盈沣远航一号 1085.60 98.43 \n", "684 P000946 正圆壹号 984.00 164.31 \n", "691 P000953 涌津涌赢1号 854.70 45.40 \n", "603 P000865 达理1号 799.52 17.94 \n", "475 P000736 巨石鑫鼎一号 631.22 175.99 \n", "284 P000531 希瓦小牛1号 629.60 1.54 \n", "690 P000952 龙航一期 611.60 16.29 \n", "619 P000881 山楂树一期基金A 526.00 31.40 \n", "689 P000951 健顺云2号 472.05 24.70 \n", "\n", " manager_nick_name netvalue_date create_date close_status \\\n", "515 大禾投资 2021-12-24 2016-10-12 False \n", "767 上海仙人掌 2021-12-24 2017-04-12 False \n", "684 正圆投资 2021-12-24 2016-07-14 False \n", "691 涌津投资 2021-12-24 2016-04-28 False \n", "603 成于思 2021-12-24 2016-07-28 False \n", "475 梁雄登 2021-12-24 2020-06-17 False \n", "284 梁宏 2021-12-24 2015-04-21 False \n", "690 龙航资产 2021-12-24 2018-12-28 False \n", "619 山楂树甄琢资产 2021-12-24 2014-08-26 False \n", "689 健顺投资 2021-12-10 2015-06-09 False \n", "\n", " crwaltime max_drawdown_rate annual_return_year \n", "515 2021-12-28 22:40:03.485 39.31 -0.30 \n", "767 2021-12-28 22:42:14.395 27.97 97.76 \n", "684 2021-12-28 22:41:37.622 36.38 143.14 \n", "691 2021-12-28 22:41:43.728 25.21 40.52 \n", "603 2021-12-28 22:40:52.152 34.04 22.67 \n", "475 2021-12-28 22:39:39.807 30.99 184.67 \n", "284 2021-12-28 22:37:01.549 29.79 5.65 \n", "690 2021-12-28 22:41:43.273 26.68 16.29 \n", "619 2021-12-28 22:41:04.147 41.60 33.33 \n", "689 2021-12-28 22:41:42.820 26.82 40.70 " ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_df.sort_values(by='profit_rate',ascending=False).head(10)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolnameprofit_rateannual_return_this_yearmanager_nick_namenetvalue_datecreate_dateclose_statuscrwaltime
0P000048NoneNaNNaNNoneNoneNoneFalse2021-12-28 22:33:53.371
1P000049NoneNaNNaNNoneNoneNoneFalse2021-12-28 22:33:53.710
2P000051私募工场(裕泉二期)-14.18NaNNone2015-10-272014-04-30True2021-12-28 22:33:54.102
3P000057iMeigu Fund132.34-19.24梁剑2021-09-302013-10-10True2021-12-28 22:33:54.689
4P000090私募工场(兴富进取1期)81.63NaN广东兴富投资2015-11-062014-07-08True2021-12-28 22:33:55.562
\n", "
" ], "text/plain": [ " symbol name profit_rate annual_return_this_year \\\n", "0 P000048 None NaN NaN \n", "1 P000049 None NaN NaN \n", "2 P000051 私募工场(裕泉二期) -14.18 NaN \n", "3 P000057 iMeigu Fund 132.34 -19.24 \n", "4 P000090 私募工场(兴富进取1期) 81.63 NaN \n", "\n", " manager_nick_name netvalue_date create_date close_status \\\n", "0 None None None False \n", "1 None None None False \n", "2 None 2015-10-27 2014-04-30 True \n", "3 梁剑 2021-09-30 2013-10-10 True \n", "4 广东兴富投资 2015-11-06 2014-07-08 True \n", "\n", " crwaltime \n", "0 2021-12-28 22:33:53.371 \n", "1 2021-12-28 22:33:53.710 \n", "2 2021-12-28 22:33:54.102 \n", "3 2021-12-28 22:33:54.689 \n", "4 2021-12-28 22:33:55.562 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_df.head()" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "dead_private_fund = new_df[new_df['netvalue_date']<'2021-11-15']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dead_private_fund" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "old_df = convertor(old_df)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "old_symbol_list = old_df['symbol'].values" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "311" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(old_symbol_list)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "new_symbol_list = new_df['symbol'].values" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "420" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(new_symbol_list)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "dead_list = []\n", "for i in old_symbol_list:\n", " if i not in new_symbol_list:\n", " dead_list.append(i)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "64" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(dead_list)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dead_list" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "new_df.sort_values(by='symbol',ascending=False)['symbol'][:50]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(new_df)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "new_df=new_df[new_df['name'].notnull()]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "716" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(new_df)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "78" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(new_df[new_df['close_status']==True]) # 关停" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "495" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(new_df[(new_df['profit_rate']>=0)&(new_df['close_status']==False)])" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "677" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(process_df)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "75" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(process_df['close_status']==True)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [], "source": [ "closed=process_df[process_df['close_status']==True]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "process_df[process_df['close_status']==True]['profit_rate']" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "process_df.to_excel(\"snoball_private_fund.xlsx\",encoding=\"utf8\")" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.11078286558345643" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "75/677" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "closed['profit_rate'].argmin()" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "symbol P000211\n", "name 赤升\n", "profit_rate -97.49\n", "annual_return_this_year NaN\n", "manager_nick_name None\n", "netvalue_date 2018-05-21\n", "create_date 2015-12-02\n", "close_status True\n", "crwaltime 2021-12-28 22:34:23.791000\n", "max_drawdown_rate NaN\n", "annual_return_year NaN\n", "Name: 15, dtype: object" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "closed.iloc[6]" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 677 entries, 2 to 769\n", "Data columns (total 11 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 symbol 677 non-null object \n", " 1 name 677 non-null object \n", " 2 profit_rate 677 non-null float64 \n", " 3 annual_return_this_year 529 non-null float64 \n", " 4 manager_nick_name 448 non-null object \n", " 5 netvalue_date 677 non-null object \n", " 6 create_date 677 non-null object \n", " 7 close_status 677 non-null bool \n", " 8 crwaltime 677 non-null datetime64[ns]\n", " 9 max_drawdown_rate 397 non-null float64 \n", " 10 annual_return_year 397 non-null float64 \n", "dtypes: bool(1), datetime64[ns](1), float64(4), object(5)\n", "memory usage: 58.8+ KB\n" ] } ], "source": [ "process_df.info()" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "def convert_year(x):\n", " try:\n", " year= (datetime.datetime.strptime(x['netvalue_date'],'%Y-%m-%d') - datetime.datetime.strptime(x['create_date'],'%Y-%m-%d')).days/365\n", " except:\n", " year=None\n", " return year" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "process_df['duration']=process_df.apply(convert_year,axis=1)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "449" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "process_df['duration'].argmax()" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "symbol P000793\n", "name 中信信托•神农1期证券投资集合资金信托计划\n", "profit_rate 329.26\n", "annual_return_this_year NaN\n", "manager_nick_name 陈营长极品投资\n", "netvalue_date 2020-10-30\n", "create_date 2010-07-28\n", "close_status False\n", "crwaltime 2021-12-28 22:40:14.451000\n", "max_drawdown_rate NaN\n", "annual_return_year NaN\n", "duration 10.265753\n", "Name: 531, dtype: object" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "process_df.iloc[449]" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "process_df['year_rate'] = process_df['profit_rate']/process_df['duration']" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "256" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "process_df['year_rate'].argmin()" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolnameprofit_rateannual_return_this_yearmanager_nick_namenetvalue_datecreate_dateclose_statuscrwaltimemax_drawdown_rateannual_return_yeardurationyear_rate
316P000564彼岸成长-31.30NaNNone2018-12-072018-08-23True2021-12-28 22:38:16.364NaNNaN0.290411-107.778302
189P000418泽道复合策略一期-42.50NaNNone2018-06-222017-09-19True2021-12-28 22:36:04.322NaNNaN0.756164-56.204710
249P000495南山稳健一号-33.23NaNNone2018-10-192018-01-26True2021-12-28 22:36:42.378NaNNaN0.728767-45.597556
394P000652测试母基金-66.33NaNNone2019-11-222018-05-02False2021-12-28 22:38:59.189NaNNaN1.558904-42.549121
224P000463瞭望塔成长-35.20NaNNone2018-10-122017-12-04True2021-12-28 22:36:25.204NaNNaN0.854795-41.179487
730P000992上海斯诺波嘉源成长-4.37-4.37一手大股东_成嘉源2021-12-242021-11-15False2021-12-28 22:41:58.9865.4410000.000.106849-40.898718
570P000832上海斯诺波领军1号A-32.10-32.10None2021-12-242021-03-09True2021-12-28 22:40:32.849NaNNaN0.794521-40.401724
701P000963上海斯诺波领军1号B-31.40-31.40None2021-12-242021-03-09True2021-12-28 22:41:47.407NaNNaN0.794521-39.520690
15P000211赤升-97.49NaNNone2018-05-212015-12-02True2021-12-28 22:34:23.791NaNNaN2.468493-39.493729
227P000467夏雨-25.50NaNNone2018-11-022018-02-27True2021-12-28 22:36:26.996NaNNaN0.679452-37.530242
655P000917博普价值远卓1号1期-12.17-12.17马老师真帅2021-12-242021-08-26False2021-12-28 22:41:24.65916.3710000.000.328767-37.017083
162P000388武汉长江一期-93.40NaN用户21092709192020-01-102017-05-30False2021-12-28 22:35:46.68694.42-63.132.616438-35.697382
434P000692中泰碧月1月集合资管计划-40.967.68中泰资管2021-12-242020-10-01False2021-12-28 22:39:18.523NaNNaN1.230137-33.297105
72P000288晨星创富-67.90NaNNone2018-06-222016-05-13True2021-12-28 22:35:03.749NaNNaN2.109589-32.186364
57P000270清沐众成-84.00NaNNone2018-12-212016-04-21True2021-12-28 22:34:56.258NaNNaN2.668493-31.478439
342P000600万象机遇-100.00-100.00None2021-12-102018-09-27False2021-12-28 22:38:33.134NaNNaN3.205479-31.196581
96P000316私募工场(小兵突围一号)-22.20NaNNone2017-04-262016-07-11True2021-12-28 22:35:15.924NaNNaN0.791781-28.038062
630P000892上海斯诺波东盛长安A-10.40-10.40东盛长安海明2021-12-242021-08-09False2021-12-28 22:41:12.20612.3310000.000.375342-27.708029
76P000293宫奇锐进-72.60NaNNone2019-02-012016-05-24True2021-12-28 22:35:05.916NaNNaN2.693151-26.957274
237P000482银证玄武一期-88.70-13.74玄武道士2021-03-192017-11-17False2021-12-28 22:36:36.65190.255.613.336986-26.580870
\n", "
" ], "text/plain": [ " symbol name profit_rate annual_return_this_year \\\n", "316 P000564 彼岸成长 -31.30 NaN \n", "189 P000418 泽道复合策略一期 -42.50 NaN \n", "249 P000495 南山稳健一号 -33.23 NaN \n", "394 P000652 测试母基金 -66.33 NaN \n", "224 P000463 瞭望塔成长 -35.20 NaN \n", "730 P000992 上海斯诺波嘉源成长 -4.37 -4.37 \n", "570 P000832 上海斯诺波领军1号A -32.10 -32.10 \n", "701 P000963 上海斯诺波领军1号B -31.40 -31.40 \n", "15 P000211 赤升 -97.49 NaN \n", "227 P000467 夏雨 -25.50 NaN \n", "655 P000917 博普价值远卓1号1期 -12.17 -12.17 \n", "162 P000388 武汉长江一期 -93.40 NaN \n", "434 P000692 中泰碧月1月集合资管计划 -40.96 7.68 \n", "72 P000288 晨星创富 -67.90 NaN \n", "57 P000270 清沐众成 -84.00 NaN \n", "342 P000600 万象机遇 -100.00 -100.00 \n", "96 P000316 私募工场(小兵突围一号) -22.20 NaN \n", "630 P000892 上海斯诺波东盛长安A -10.40 -10.40 \n", "76 P000293 宫奇锐进 -72.60 NaN \n", "237 P000482 银证玄武一期 -88.70 -13.74 \n", "\n", " manager_nick_name netvalue_date create_date close_status \\\n", "316 None 2018-12-07 2018-08-23 True \n", "189 None 2018-06-22 2017-09-19 True \n", "249 None 2018-10-19 2018-01-26 True \n", "394 None 2019-11-22 2018-05-02 False \n", "224 None 2018-10-12 2017-12-04 True \n", "730 一手大股东_成嘉源 2021-12-24 2021-11-15 False \n", "570 None 2021-12-24 2021-03-09 True \n", "701 None 2021-12-24 2021-03-09 True \n", "15 None 2018-05-21 2015-12-02 True \n", "227 None 2018-11-02 2018-02-27 True \n", "655 马老师真帅 2021-12-24 2021-08-26 False \n", "162 用户2109270919 2020-01-10 2017-05-30 False \n", "434 中泰资管 2021-12-24 2020-10-01 False \n", "72 None 2018-06-22 2016-05-13 True \n", "57 None 2018-12-21 2016-04-21 True \n", "342 None 2021-12-10 2018-09-27 False \n", "96 None 2017-04-26 2016-07-11 True \n", "630 东盛长安海明 2021-12-24 2021-08-09 False \n", "76 None 2019-02-01 2016-05-24 True \n", "237 玄武道士 2021-03-19 2017-11-17 False \n", "\n", " crwaltime max_drawdown_rate annual_return_year duration \\\n", "316 2021-12-28 22:38:16.364 NaN NaN 0.290411 \n", "189 2021-12-28 22:36:04.322 NaN NaN 0.756164 \n", "249 2021-12-28 22:36:42.378 NaN NaN 0.728767 \n", "394 2021-12-28 22:38:59.189 NaN NaN 1.558904 \n", "224 2021-12-28 22:36:25.204 NaN NaN 0.854795 \n", "730 2021-12-28 22:41:58.986 5.44 10000.00 0.106849 \n", "570 2021-12-28 22:40:32.849 NaN NaN 0.794521 \n", "701 2021-12-28 22:41:47.407 NaN NaN 0.794521 \n", "15 2021-12-28 22:34:23.791 NaN NaN 2.468493 \n", "227 2021-12-28 22:36:26.996 NaN NaN 0.679452 \n", "655 2021-12-28 22:41:24.659 16.37 10000.00 0.328767 \n", "162 2021-12-28 22:35:46.686 94.42 -63.13 2.616438 \n", "434 2021-12-28 22:39:18.523 NaN NaN 1.230137 \n", "72 2021-12-28 22:35:03.749 NaN NaN 2.109589 \n", "57 2021-12-28 22:34:56.258 NaN NaN 2.668493 \n", "342 2021-12-28 22:38:33.134 NaN NaN 3.205479 \n", "96 2021-12-28 22:35:15.924 NaN NaN 0.791781 \n", "630 2021-12-28 22:41:12.206 12.33 10000.00 0.375342 \n", "76 2021-12-28 22:35:05.916 NaN NaN 2.693151 \n", "237 2021-12-28 22:36:36.651 90.25 5.61 3.336986 \n", "\n", " year_rate \n", "316 -107.778302 \n", "189 -56.204710 \n", "249 -45.597556 \n", "394 -42.549121 \n", "224 -41.179487 \n", "730 -40.898718 \n", "570 -40.401724 \n", "701 -39.520690 \n", "15 -39.493729 \n", "227 -37.530242 \n", "655 -37.017083 \n", "162 -35.697382 \n", "434 -33.297105 \n", "72 -32.186364 \n", "57 -31.478439 \n", "342 -31.196581 \n", "96 -28.038062 \n", "630 -27.708029 \n", "76 -26.957274 \n", "237 -26.580870 " ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "process_df.sort_values('year_rate',ascending=True).head(20)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "interpreter": { "hash": "9aa71a1095d6a6dd446f2b486146a60837bd82849c2fc6b4bf786ffe99bd2ba1" }, "kernelspec": { "display_name": "Python 3.9.5 64-bit ('3.9': conda)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/东北债.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "█\r" ] } ], "source": [ "import sys\n", "sys.path.append('..')\n", "from settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "DB = DBSelector()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "engine = DB.get_engine('db_stock','qq')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "kzz_df = pd.read_sql('tb_bond_jisilu',engine)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
可转债代码可转债名称可转债价格正股名称正股代码正股现价正股涨跌幅最新转股价溢价率可转债涨幅...评级下修提示下调次数转债剩余占总市值比剩余规模发行规模股东配售率强赎标志强赎日期更新日期
0113035福莱转债244.00福莱特60186537.20-0.2113.48-11.58-0.10...AA02.014.50014.50092.910XNone2020-11-11 15:03
1113585寿仙转债150.39寿仙谷60389645.730.2228.68-5.680.18...AA-05.53.6003.60082.309XNone2020-11-11 15:03
2113586上机转债215.20上机数控60318574.58-1.2833.30-3.91-1.45...AA-03.86.6506.65085.553XNone2020-11-11 15:03
3128115巨星转债206.80巨星科技00244426.370.4212.28-3.703.34...AA03.49.7309.73074.920XNone2020-11-11 15:03
4123052飞鹿转债137.80飞鹿股份30066514.10-4.289.90-3.24-3.70...A+010.31.7701.77075.366XNone2020-11-11 15:03
\n", "

5 rows × 27 columns

\n", "
" ], "text/plain": [ " 可转债代码 可转债名称 可转债价格 正股名称 正股代码 正股现价 正股涨跌幅 最新转股价 溢价率 可转债涨幅 ... \\\n", "0 113035 福莱转债 244.00 福莱特 601865 37.20 -0.21 13.48 -11.58 -0.10 ... \n", "1 113585 寿仙转债 150.39 寿仙谷 603896 45.73 0.22 28.68 -5.68 0.18 ... \n", "2 113586 上机转债 215.20 上机数控 603185 74.58 -1.28 33.30 -3.91 -1.45 ... \n", "3 128115 巨星转债 206.80 巨星科技 002444 26.37 0.42 12.28 -3.70 3.34 ... \n", "4 123052 飞鹿转债 137.80 飞鹿股份 300665 14.10 -4.28 9.90 -3.24 -3.70 ... \n", "\n", " 评级 下修提示 下调次数 转债剩余占总市值比 剩余规模 发行规模 股东配售率 强赎标志 强赎日期 \\\n", "0 AA 0 2.0 14.500 14.500 92.910 X None \n", "1 AA- 0 5.5 3.600 3.600 82.309 X None \n", "2 AA- 0 3.8 6.650 6.650 85.553 X None \n", "3 AA 0 3.4 9.730 9.730 74.920 X None \n", "4 A+ 0 10.3 1.770 1.770 75.366 X None \n", "\n", " 更新日期 \n", "0 2020-11-11 15:03 \n", "1 2020-11-11 15:03 \n", "2 2020-11-11 15:03 \n", "3 2020-11-11 15:03 \n", "4 2020-11-11 15:03 \n", "\n", "[5 rows x 27 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kzz_df.head()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "basic_info_df = pd.read_sql('tb_basic_info',engine)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
indexcodenameindustryareapeoutstandingtotalstotalAssetsliquidAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
00300903N科翔元器件广东96.700.411.7215.6711.53...8.90202011052.191.270.000.0022.126.9647605.02020-11-06 18:10:03
11300906N日月明专用机械江西159.780.200.803.703.02...6.68202011051.311.630.000.0058.4038.8440039.02020-11-06 18:10:03
22300905N宝丽迪塑料江苏70.730.180.724.893.22...5.98202011052.673.710.000.0025.6116.1836007.02020-11-06 18:10:03
33300141和顺电气电气设备江苏0.001.662.5411.139.25...6.36201011121.930.76-48.86-629.4021.51-6.0215050.02020-11-06 18:10:03
44300807天迈科技软件服务河南0.000.170.687.134.97...6.18201912191.712.52-57.52-142.6750.68-13.1410574.02020-11-06 18:10:03
\n", "

5 rows × 25 columns

\n", "
" ], "text/plain": [ " index code name industry area pe outstanding totals \\\n", "0 0 300903 N科翔 元器件 广东 96.70 0.41 1.72 \n", "1 1 300906 N日月明 专用机械 江西 159.78 0.20 0.80 \n", "2 2 300905 N宝丽迪 塑料 江苏 70.73 0.18 0.72 \n", "3 3 300141 和顺电气 电气设备 江苏 0.00 1.66 2.54 \n", "4 4 300807 天迈科技 软件服务 河南 0.00 0.17 0.68 \n", "\n", " totalAssets liquidAssets ... pb timeToMarket undp perundp rev \\\n", "0 15.67 11.53 ... 8.90 20201105 2.19 1.27 0.00 \n", "1 3.70 3.02 ... 6.68 20201105 1.31 1.63 0.00 \n", "2 4.89 3.22 ... 5.98 20201105 2.67 3.71 0.00 \n", "3 11.13 9.25 ... 6.36 20101112 1.93 0.76 -48.86 \n", "4 7.13 4.97 ... 6.18 20191219 1.71 2.52 -57.52 \n", "\n", " profit gpr npr holders 更新日期 \n", "0 0.00 22.12 6.96 47605.0 2020-11-06 18:10:03 \n", "1 0.00 58.40 38.84 40039.0 2020-11-06 18:10:03 \n", "2 0.00 25.61 16.18 36007.0 2020-11-06 18:10:03 \n", "3 -629.40 21.51 -6.02 15050.0 2020-11-06 18:10:03 \n", "4 -142.67 50.68 -13.14 10574.0 2020-11-06 18:10:03 \n", "\n", "[5 rows x 25 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_info_df.head()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array(['广东', '江西', '江苏', '河南', '上海', '深圳', '浙江', '湖南', '吉林', '北京', '四川',\n", " '山东', '重庆', '海南', '云南', '湖北', '福建', '西藏', '河北', '陕西', '黑龙江', '新疆',\n", " '安徽', '贵州', '辽宁', '天津', '青海', '内蒙', '山西', '甘肃', '广西', '宁夏'],\n", " dtype=object)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_info_df['area'].unique()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(basic_info_df['area'].unique())" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "east_north = ['深圳']" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "kzz_df = kzz_df[['可转债名称','正股名称','正股代码']]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "basic_info_df = basic_info_df[['code','area','industry']]" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "outfile = pd.merge(kzz_df, basic_info_df, how='left', left_on='正股代码',right_on='code')" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
可转债名称正股名称正股代码codeareaindustry
0福莱转债福莱特601865601865浙江玻璃
1寿仙转债寿仙谷603896603896浙江中成药
2上机转债上机数控603185603185江苏机床制造
3巨星转债巨星科技002444002444浙江轻工机械
4飞鹿转债飞鹿股份300665300665湖南染料涂料
\n", "
" ], "text/plain": [ " 可转债名称 正股名称 正股代码 code area industry\n", "0 福莱转债 福莱特 601865 601865 浙江 玻璃\n", "1 寿仙转债 寿仙谷 603896 603896 浙江 中成药\n", "2 上机转债 上机数控 603185 603185 江苏 机床制造\n", "3 巨星转债 巨星科技 002444 002444 浙江 轻工机械\n", "4 飞鹿转债 飞鹿股份 300665 300665 湖南 染料涂料" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "outfile.head()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "outfile=outfile[outfile['area'].isin(east_north)]" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
可转债名称正股名称正股代码codeareaindustry
12今天转债今天国际300532300532深圳软件服务
33拓邦转债拓邦股份002139002139深圳元器件
65裕同转债裕同科技002831002831深圳广告包装
74聚飞转债聚飞光电300303300303深圳半导体
89亚泰转债郑中设计002811002811深圳装修装饰
91联得转债联得装备300545300545深圳专用机械
100文科转债文科园林002775002775深圳建筑工程
103尚荣转债尚荣医疗002551002551深圳医疗保健
107欣旺转债欣旺达300207300207深圳元器件
120洪涛转债洪涛股份002325002325深圳装修装饰
172中金转债中金岭南000060000060深圳铅锌
183凯中转债凯中精密002823002823深圳机械基件
190铁汉转债铁汉生态300197300197深圳环境保护
203华阳转债华阳国际002949002949深圳建筑工程
220金农转债金新农002548002548深圳饲料
226新星转债深圳新星603978603978深圳
244景20转债景旺电子603228603228深圳元器件
254特发转2特发信息000070000070深圳通信设备
257崇达转2崇达技术002815002815深圳元器件
258特发转债特发信息000070000070深圳通信设备
267兴森转债兴森科技002436002436深圳元器件
271大族转债大族激光002008002008深圳电器仪表
\n", "
" ], "text/plain": [ " 可转债名称 正股名称 正股代码 code area industry\n", "12 今天转债 今天国际 300532 300532 深圳 软件服务\n", "33 拓邦转债 拓邦股份 002139 002139 深圳 元器件\n", "65 裕同转债 裕同科技 002831 002831 深圳 广告包装\n", "74 聚飞转债 聚飞光电 300303 300303 深圳 半导体\n", "89 亚泰转债 郑中设计 002811 002811 深圳 装修装饰\n", "91 联得转债 联得装备 300545 300545 深圳 专用机械\n", "100 文科转债 文科园林 002775 002775 深圳 建筑工程\n", "103 尚荣转债 尚荣医疗 002551 002551 深圳 医疗保健\n", "107 欣旺转债 欣旺达 300207 300207 深圳 元器件\n", "120 洪涛转债 洪涛股份 002325 002325 深圳 装修装饰\n", "172 中金转债 中金岭南 000060 000060 深圳 铅锌\n", "183 凯中转债 凯中精密 002823 002823 深圳 机械基件\n", "190 铁汉转债 铁汉生态 300197 300197 深圳 环境保护\n", "203 华阳转债 华阳国际 002949 002949 深圳 建筑工程\n", "220 金农转债 金新农 002548 002548 深圳 饲料\n", "226 新星转债 深圳新星 603978 603978 深圳 铝\n", "244 景20转债 景旺电子 603228 603228 深圳 元器件\n", "254 特发转2 特发信息 000070 000070 深圳 通信设备\n", "257 崇达转2 崇达技术 002815 002815 深圳 元器件\n", "258 特发转债 特发信息 000070 000070 深圳 通信设备\n", "267 兴森转债 兴森科技 002436 002436 深圳 元器件\n", "271 大族转债 大族激光 002008 002008 深圳 电器仪表" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "outfile" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: analysis/乖离率计算.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "def bias(df,N):\n", " df[f'bias_{N}'] = (df['close'] - df['close'].rolling(N, min_periods=1).mean())/ df['close'].rolling(N, min_periods=1).mean()*100\n", " df[f'bias_{N}'] = round(df[f'bias_{N}'], 2)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "9aa71a1095d6a6dd446f2b486146a60837bd82849c2fc6b4bf786ffe99bd2ba1" }, "kernelspec": { "display_name": "Python 3.9.5 64-bit ('3.9': conda)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.5" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/公众号绘制收益率曲线.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')\n", "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "db = DBSelector()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "df = pd.read_excel('roe_pe.xlsx')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "ename": "KeyError", "evalue": "\"['Unnamed: 0'] not found in axis\"", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Unnamed: 0'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0minplace\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32mC:\\anaconda\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36mdrop\u001b[1;34m(self, labels, axis, index, columns, level, inplace, errors)\u001b[0m\n\u001b[0;32m 4160\u001b[0m \u001b[0mweight\u001b[0m \u001b[1;36m1.0\u001b[0m \u001b[1;36m0.8\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4161\u001b[0m \"\"\"\n\u001b[1;32m-> 4162\u001b[1;33m return super().drop(\n\u001b[0m\u001b[0;32m 4163\u001b[0m \u001b[0mlabels\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlabels\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4164\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\anaconda\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36mdrop\u001b[1;34m(self, labels, axis, index, columns, level, inplace, errors)\u001b[0m\n\u001b[0;32m 3882\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlabels\u001b[0m \u001b[1;32min\u001b[0m \u001b[0maxes\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3883\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlabels\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3884\u001b[1;33m \u001b[0mobj\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mobj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_drop_axis\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlevel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3885\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3886\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0minplace\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\anaconda\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m_drop_axis\u001b[1;34m(self, labels, axis, level, errors)\u001b[0m\n\u001b[0;32m 3916\u001b[0m \u001b[0mnew_axis\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlevel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3917\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3918\u001b[1;33m \u001b[0mnew_axis\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlabels\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3919\u001b[0m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreindex\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;33m{\u001b[0m\u001b[0maxis_name\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mnew_axis\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3920\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mC:\\anaconda\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mdrop\u001b[1;34m(self, labels, errors)\u001b[0m\n\u001b[0;32m 5276\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mmask\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0many\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5277\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0merrors\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[1;34m\"ignore\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 5278\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf\"{labels[mask]} not found in axis\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5279\u001b[0m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mindexer\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m~\u001b[0m\u001b[0mmask\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5280\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdelete\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mKeyError\u001b[0m: \"['Unnamed: 0'] not found in axis\"" ] } ], "source": [ "df.drop('Unnamed: 0',inplace=True)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 362 entries, 0 to 361\n", "Data columns (total 6 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Unnamed: 0 362 non-null int64 \n", " 1 bond 362 non-null int64 \n", " 2 name 362 non-null object \n", " 3 pe 362 non-null float64\n", " 4 roe 362 non-null float64\n", " 5 zg_code 362 non-null int64 \n", "dtypes: float64(2), int64(3), object(1)\n", "memory usage: 17.1+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "df=df[['bond','name','pe','roe','zg_code']]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
bondnameperoezg_code
0110031航信转债13.57307.503275600271
1110033国贸转债5.02216.168038600755
2110034九州转债9.75414.559387600998
3110038济川转债13.648719.987800600566
4110041蒙电转债18.42474.442312600863
\n", "
" ], "text/plain": [ " bond name pe roe zg_code\n", "0 110031 航信转债 13.5730 7.503275 600271\n", "1 110033 国贸转债 5.0221 6.168038 600755\n", "2 110034 九州转债 9.7541 4.559387 600998\n", "3 110038 济川转债 13.6487 19.987800 600566\n", "4 110041 蒙电转债 18.4247 4.442312 600863" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "engine = db.get_engine('db_stock','qq')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pd.read_sql('')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.4166666666666667" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "5/12" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "3.4" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "path=r'D:\\Temp\\100buy_130sell.txt'" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "with open(path,'r',encoding='utf8') as fp:\n", " content = fp.readlines()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "676" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(content)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "['2018-01-02 00:00:00 [INFO] 20180102 买入128013.XSHE, 洪涛转债, 价格92.74, 溢价率93.4015\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102 买入127003.XSHE, 海印转债, 价格93.1, 溢价率60.7812\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102 买入127004.XSHE, 模塑转债, 价格93.5, 溢价率30.541\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102 买入128023.XSHE, 亚太转债, 价格95.24, 溢价率10.6012\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102 买入128018.XSHE, 时达转债, 价格95.4, 溢价率11.8482\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102 买入128019.XSHE, 久立转2, 价格95.5, 溢价率10.8647\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102 买入128012.XSHE, 辉丰转债, 价格95.602, 溢价率32.372\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102 买入128015.XSHE, 久其转债, 价格96.2, 溢价率19.5549\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102 买入113502.XSHG, 嘉澳转债, 价格96.29, 溢价率24.5171\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102 买入113012.XSHG, 骆驼转债, 价格96.46, 溢价率21.264\\n',\n", " '2018-01-02 00:00:00 [INFO] 20180102: 最高市值 1000000 , 当前市值 1000000收益率 : 0% , 最大回撤 0.0%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-01-09 00:00:00 [INFO] 20180109: 最高市值 1019485.8 , 当前市值 1019485.8收益率 : 1.94858% , 最大回撤 0.0%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-01-16 00:00:00 [INFO] 20180116: 最高市值 1019485.8 , 当前市值 1006855.67收益率 : 0.685567% , 最大回撤 1.24%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-01-23 00:00:00 [INFO] 20180123: 最高市值 1019485.8 , 当前市值 1016548.52收益率 : 1.654852% , 最大回撤 1.24%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-01-30 00:00:00 [INFO] 20180130: 最高市值 1023342.65 , 当前市值 1023342.65收益率 : 2.334265% , 最大回撤 1.24%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-02-06 00:00:00 [INFO] 20180206: 最高市值 1023342.65 , 当前市值 1004610.09收益率 : 0.461009% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-02-13 00:00:00 [INFO] 20180213: 最高市值 1023342.65 , 当前市值 1005110.85收益率 : 0.511085% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-02-27 00:00:00 [INFO] 20180227: 最高市值 1023342.65 , 当前市值 1014736.64收益率 : 1.473664% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-03-06 00:00:00 [INFO] 20180306: 最高市值 1023342.65 , 当前市值 1018164.08收益率 : 1.816408% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-03-13 00:00:00 [INFO] 20180313: 最高市值 1034313.13 , 当前市值 1034313.13收益率 : 3.431313% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-03-20 00:00:00 [INFO] 20180320: 最高市值 1034313.13 , 当前市值 1029096.43收益率 : 2.909643% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-03-27 00:00:00 [INFO] 20180327: 最高市值 1034313.13 , 当前市值 1024827.5收益率 : 2.48275% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-04-03 00:00:00 [INFO] 20180403: 最高市值 1034313.13 , 当前市值 1029394.53收益率 : 2.939453% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-04-12 00:00:00 [INFO] 20180412: 最高市值 1034313.13 , 当前市值 1030253.87收益率 : 3.025387% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-04-19 00:00:00 [INFO] 20180419: 最高市值 1034313.13 , 当前市值 1028159.44收益率 : 2.815944% , 最大回撤 1.83%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-04-26 00:00:00 [INFO] 20180426: 最高市值 1034313.13 , 当前市值 1008386.97收益率 : 0.838697% , 最大回撤 2.51%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-05-07 00:00:00 [INFO] 20180507: 最高市值 1034313.13 , 当前市值 1013075.85收益率 : 1.307585% , 最大回撤 2.51%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-05-14 00:00:00 [INFO] 20180514: 最高市值 1034313.13 , 当前市值 1001511.62收益率 : 0.151162% , 最大回撤 3.17%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-05-21 00:00:00 [INFO] 20180521: 最高市值 1034313.13 , 当前市值 1003478.14收益率 : 0.347814% , 最大回撤 3.17%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-05-28 00:00:00 [INFO] 20180528: 最高市值 1034313.13 , 当前市值 982021.71收益率 : -1.797829% , 最大回撤 5.06%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-06-04 00:00:00 [INFO] 20180604: 最高市值 1034313.13 , 当前市值 953676.72收益率 : -4.632328% , 最大回撤 7.8%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-06-11 00:00:00 [INFO] 20180611: 最高市值 1034313.13 , 当前市值 959140.2收益率 : -4.08598% , 最大回撤 7.8%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-06-19 00:00:00 [INFO] 20180619: 最高市值 1034313.13 , 当前市值 912373.4收益率 : -8.76266% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-06-26 00:00:00 [INFO] 20180626: 最高市值 1034313.13 , 当前市值 926585.01收益率 : -7.341499% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-07-03 00:00:00 [INFO] 20180703: 最高市值 1034313.13 , 当前市值 925741.66收益率 : -7.425834% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-07-10 00:00:00 [INFO] 20180710: 最高市值 1034313.13 , 当前市值 926568.12收益率 : -7.343188% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-07-17 00:00:00 [INFO] 20180717: 最高市值 1034313.13 , 当前市值 935145.46收益率 : -6.485454% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-07-24 00:00:00 [INFO] 20180724: 最高市值 1034313.13 , 当前市值 961669.37收益率 : -3.833063% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-07-31 00:00:00 [INFO] 20180731: 最高市值 1034313.13 , 当前市值 949295.29收益率 : -5.070471% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-08-07 00:00:00 [INFO] 20180807: 最高市值 1034313.13 , 当前市值 937448.8收益率 : -6.25512% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-08-14 00:00:00 [INFO] 20180814: 最高市值 1034313.13 , 当前市值 935961.28收益率 : -6.403872% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-08-21 00:00:00 [INFO] 20180821: 最高市值 1034313.13 , 当前市值 931240.41收益率 : -6.875959% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-08-28 00:00:00 [INFO] 20180828: 最高市值 1034313.13 , 当前市值 934905.2收益率 : -6.50948% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-09-04 00:00:00 [INFO] 20180904: 最高市值 1034313.13 , 当前市值 937971.97收益率 : -6.202803% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-09-11 00:00:00 [INFO] 20180911: 最高市值 1034313.13 , 当前市值 935027.05收益率 : -6.497295% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-09-18 00:00:00 [INFO] 20180918: 最高市值 1034313.13 , 当前市值 935762.18收益率 : -6.423782% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-09-26 00:00:00 [INFO] 20180926: 最高市值 1034313.13 , 当前市值 937160.64收益率 : -6.283936% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-10-10 00:00:00 [INFO] 20181010: 最高市值 1034313.13 , 当前市值 930320.99收益率 : -6.967901% , 最大回撤 11.79%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-10-17 00:00:00 [INFO] 20181017: 最高市值 1034313.13 , 当前市值 911561.35收益率 : -8.843865% , 最大回撤 11.87%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-10-24 00:00:00 [INFO] 20181024: 最高市值 1034313.13 , 当前市值 910911.25收益率 : -8.908875% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-10-31 00:00:00 [INFO] 20181031: 最高市值 1034313.13 , 当前市值 924176.77收益率 : -7.582323% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-11-07 00:00:00 [INFO] 20181107: 最高市值 1034313.13 , 当前市值 938910.86收益率 : -6.108914% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-11-14 00:00:00 [INFO] 20181114: 最高市值 1034313.13 , 当前市值 947895.92收益率 : -5.210408% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-11-21 00:00:00 [INFO] 20181121: 最高市值 1034313.13 , 当前市值 952941.92收益率 : -4.705808% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-11-28 00:00:00 [INFO] 20181128: 最高市值 1034313.13 , 当前市值 953171.0收益率 : -4.6829% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-12-05 00:00:00 [INFO] 20181205: 最高市值 1034313.13 , 当前市值 959722.28收益率 : -4.027772% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-12-12 00:00:00 [INFO] 20181212: 最高市值 1034313.13 , 当前市值 959904.76收益率 : -4.009524% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-12-19 00:00:00 [INFO] 20181219: 最高市值 1034313.13 , 当前市值 949243.34收益率 : -5.075666% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2018-12-26 00:00:00 [INFO] 20181226: 最高市值 1034313.13 , 当前市值 939107.11收益率 : -6.089289% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-01-04 00:00:00 [INFO] 20190104: 最高市值 1034313.13 , 当前市值 949904.48收益率 : -5.009552% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-01-11 00:00:00 [INFO] 20190111: 最高市值 1034313.13 , 当前市值 972877.59收益率 : -2.712241% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-01-18 00:00:00 [INFO] 20190118: 最高市值 1034313.13 , 当前市值 972218.32收益率 : -2.778168% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-01-25 00:00:00 [INFO] 20190125: 最高市值 1034313.13 , 当前市值 972496.46收益率 : -2.750354% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-02-01 00:00:00 [INFO] 20190201: 最高市值 1034313.13 , 当前市值 974285.03收益率 : -2.571497% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-02-15 00:00:00 [INFO] 20190215: 最高市值 1034313.13 , 当前市值 996362.21收益率 : -0.363779% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-02-22 00:00:00 [INFO] 20190222: 最高市值 1034313.13 , 当前市值 1009926.39收益率 : 0.992639% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-03-01 00:00:00 [INFO] 20190301: 最高市值 1034313.13 , 当前市值 1024587.71收益率 : 2.458771% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-03-08 00:00:00 [INFO] 20190308: 最高市值 1066158.37 , 当前市值 1066158.37收益率 : 6.615837% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-03-15 00:00:00 [INFO] 20190315: 最高市值 1074351.72 , 当前市值 1074351.72收益率 : 7.435172% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-03-22 00:00:00 [INFO] 20190322: 最高市值 1110313.2 , 当前市值 1110313.2收益率 : 11.03132% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-03-29 00:00:00 [INFO] 20190329: 最高市值 1110313.2 , 当前市值 1100386.27收益率 : 10.038627% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-04-08 00:00:00 [INFO] 20190408: 最高市值 1142570.65 , 当前市值 1142570.65收益率 : 14.257065% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-04-15 00:00:00 [INFO] 20190415: 最高市值 1142570.65 , 当前市值 1103360.15收益率 : 10.336015% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-04-22 00:00:00 [INFO] 20190422: 最高市值 1142570.65 , 当前市值 1096712.0收益率 : 9.6712% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-04-29 00:00:00 [INFO] 20190429: 最高市值 1142570.65 , 当前市值 1044416.13收益率 : 4.441613% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-05-09 00:00:00 [INFO] 20190509: 最高市值 1142570.65 , 当前市值 1032354.7收益率 : 3.23547% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-05-16 00:00:00 [INFO] 20190516: 最高市值 1142570.65 , 当前市值 1053131.4收益率 : 5.31314% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-05-23 00:00:00 [INFO] 20190523: 最高市值 1142570.65 , 当前市值 1035776.63收益率 : 3.577663% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-05-30 00:00:00 [INFO] 20190530: 最高市值 1142570.65 , 当前市值 1031358.79收益率 : 3.135879% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-06-06 00:00:00 [INFO] 20190606: 最高市值 1142570.65 , 当前市值 1010570.67收益率 : 1.057067% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-06-14 00:00:00 [INFO] 20190614: 最高市值 1142570.65 , 当前市值 1016367.93收益率 : 1.636793% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-06-21 00:00:00 [INFO] 20190621: 最高市值 1142570.65 , 当前市值 1035052.16收益率 : 3.505216% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-06-28 00:00:00 [INFO] 20190628: 最高市值 1142570.65 , 当前市值 1025246.55收益率 : 2.524655% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-07-05 00:00:00 [INFO] 20190705: 最高市值 1142570.65 , 当前市值 1033585.21收益率 : 3.358521% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-07-12 00:00:00 [INFO] 20190712: 最高市值 1142570.65 , 当前市值 1025945.07收益率 : 2.594507% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-07-19 00:00:00 [INFO] 20190719: 最高市值 1142570.65 , 当前市值 1028036.12收益率 : 2.803612% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-07-26 00:00:00 [INFO] 20190726: 最高市值 1142570.65 , 当前市值 1029270.62收益率 : 2.927062% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-08-02 00:00:00 [INFO] 20190802: 最高市值 1142570.65 , 当前市值 1023517.01收益率 : 2.351701% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-08-09 00:00:00 [INFO] 20190809: 最高市值 1142570.65 , 当前市值 1020980.32收益率 : 2.098032% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-08-16 00:00:00 [INFO] 20190816: 最高市值 1142570.65 , 当前市值 1023731.84收益率 : 2.373184% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-08-23 00:00:00 [INFO] 20190823: 最高市值 1142570.65 , 当前市值 1030555.62收益率 : 3.055562% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-08-30 00:00:00 [INFO] 20190830: 最高市值 1142570.65 , 当前市值 1036604.5收益率 : 3.66045% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-09-06 00:00:00 [INFO] 20190906: 最高市值 1142570.65 , 当前市值 1047378.92收益率 : 4.737892% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-09-16 00:00:00 [INFO] 20190916: 最高市值 1142570.65 , 当前市值 1060725.38收益率 : 6.072538% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-09-23 00:00:00 [INFO] 20190923: 最高市值 1142570.65 , 当前市值 1055619.11收益率 : 5.561911% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-09-30 00:00:00 [INFO] 20190930: 最高市值 1142570.65 , 当前市值 1055244.47收益率 : 5.524447% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-10-14 00:00:00 [INFO] 20191014: 最高市值 1142570.65 , 当前市值 1065143.45收益率 : 6.514345% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-10-21 00:00:00 [INFO] 20191021: 最高市值 1142570.65 , 当前市值 1053393.98收益率 : 5.339398% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-10-28 00:00:00 [INFO] 20191028: 最高市值 1142570.65 , 当前市值 1060076.3收益率 : 6.00763% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-11-04 00:00:00 [INFO] 20191104: 最高市值 1142570.65 , 当前市值 1056978.01收益率 : 5.697801% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-11-11 00:00:00 [INFO] 20191111: 最高市值 1142570.65 , 当前市值 1057162.32收益率 : 5.716232% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-11-18 00:00:00 [INFO] 20191118: 最高市值 1142570.65 , 当前市值 1057912.73收益率 : 5.791273% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-11-25 00:00:00 [INFO] 20191125: 最高市值 1142570.65 , 当前市值 1054589.9收益率 : 5.45899% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-12-02 00:00:00 [INFO] 20191202: 最高市值 1142570.65 , 当前市值 1049703.13收益率 : 4.970313% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-12-09 00:00:00 [INFO] 20191209: 最高市值 1142570.65 , 当前市值 1051727.53收益率 : 5.172753% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-12-16 00:00:00 [INFO] 20191216: 最高市值 1142570.65 , 当前市值 1059400.45收益率 : 5.940045% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-12-23 00:00:00 [INFO] 20191223: 最高市值 1142570.65 , 当前市值 1058768.8收益率 : 5.87688% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2019-12-30 00:00:00 [INFO] 20191230: 最高市值 1142570.65 , 当前市值 1071569.01收益率 : 7.156901% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-01-07 00:00:00 [INFO] 20200107: 最高市值 1142570.65 , 当前市值 1093977.27收益率 : 9.397727% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-01-14 00:00:00 [INFO] 20200114: 最高市值 1142570.65 , 当前市值 1106116.71收益率 : 10.611671% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-01-21 00:00:00 [INFO] 20200121 卖出127004.XSHE,模塑转债,价格:133.12\\n',\n", " '2020-01-21 00:00:00 [INFO] 20200121 买入128062.XSHE, 亚药转债, 价格90.421, 溢价率109.9058\\n',\n", " '2020-01-21 00:00:00 [INFO] 20200121: 最高市值 1142570.65 , 当前市值 1135617.53收益率 : 13.561753% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-02-05 00:00:00 [INFO] 20200205: 最高市值 1142570.65 , 当前市值 1118438.94收益率 : 11.843894% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-02-12 00:00:00 [INFO] 20200212: 最高市值 1142845.52 , 当前市值 1142845.52收益率 : 14.284552% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-02-19 00:00:00 [INFO] 20200219: 最高市值 1164168.45 , 当前市值 1164168.45收益率 : 16.416845% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-02-26 00:00:00 [INFO] 20200226: 最高市值 1172744.24 , 当前市值 1172744.24收益率 : 17.274424% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-03-04 00:00:00 [INFO] 20200304: 最高市值 1172744.24 , 当前市值 1170302.44收益率 : 17.030244% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-03-11 00:00:00 [INFO] 20200311: 最高市值 1172744.24 , 当前市值 1168426.84收益率 : 16.842684% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-03-18 00:00:00 [INFO] 20200318: 最高市值 1172744.24 , 当前市值 1155576.38收益率 : 15.557638% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-03-25 00:00:00 [INFO] 20200325: 最高市值 1175343.21 , 当前市值 1175343.21收益率 : 17.534321% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-04-01 00:00:00 [INFO] 20200401: 最高市值 1175343.21 , 当前市值 1158367.54收益率 : 15.836754% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-04-09 00:00:00 [INFO] 20200409: 最高市值 1175343.21 , 当前市值 1152448.53收益率 : 15.244853% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-04-16 00:00:00 [INFO] 20200416: 最高市值 1175343.21 , 当前市值 1149661.6收益率 : 14.96616% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-04-23 00:00:00 [INFO] 20200423: 最高市值 1175343.21 , 当前市值 1154226.99收益率 : 15.422699% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-04-30 00:00:00 [INFO] 20200430: 最高市值 1175343.21 , 当前市值 1149661.97收益率 : 14.966197% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-05-12 00:00:00 [INFO] 20200512: 最高市值 1175343.21 , 当前市值 1144152.85收益率 : 14.415285% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-05-19 00:00:00 [INFO] 20200519: 最高市值 1175343.21 , 当前市值 1108768.65收益率 : 10.876865% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-05-26 00:00:00 [INFO] 20200526: 最高市值 1175343.21 , 当前市值 1097396.08收益率 : 9.739608% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-06-02 00:00:00 [INFO] 20200602: 最高市值 1175343.21 , 当前市值 1113865.56收益率 : 11.386556% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-06-09 00:00:00 [INFO] 20200609: 最高市值 1175343.21 , 当前市值 1109978.3收益率 : 10.99783% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-06-16 00:00:00 [INFO] 20200616: 最高市值 1175343.21 , 当前市值 1109230.7收益率 : 10.92307% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-06-23 00:00:00 [INFO] 20200623: 最高市值 1175343.21 , 当前市值 1105081.11收益率 : 10.508111% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-07-02 00:00:00 [INFO] 20200702: 最高市值 1175343.21 , 当前市值 1101981.57收益率 : 10.198157% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-07-09 00:00:00 [INFO] 20200709: 最高市值 1175343.21 , 当前市值 1155403.53收益率 : 15.540353% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-07-16 00:00:00 [INFO] 20200716: 最高市值 1175343.21 , 当前市值 1120031.12收益率 : 12.003112% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-07-23 00:00:00 [INFO] 20200723: 最高市值 1175343.21 , 当前市值 1150020.95收益率 : 15.002095% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-07-30 00:00:00 [INFO] 20200730: 最高市值 1175343.21 , 当前市值 1158344.49收益率 : 15.834449% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-08-06 00:00:00 [INFO] 20200806: 最高市值 1175343.21 , 当前市值 1165282.57收益率 : 16.528257% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-08-13 00:00:00 [INFO] 20200813: 最高市值 1175343.21 , 当前市值 1157341.18收益率 : 15.734118% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-08-20 00:00:00 [INFO] 20200820: 最高市值 1175343.21 , 当前市值 1155369.4收益率 : 15.53694% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-08-27 00:00:00 [INFO] 20200827: 最高市值 1175343.21 , 当前市值 1153798.43收益率 : 15.379843% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-09-03 00:00:00 [INFO] 20200903 卖出128019.XSHE,久立转2,价格:130.22\\n',\n", " '2020-09-03 00:00:00 [INFO] 20200903 买入113527.XSHG, 维格转债, 价格94.04, 溢价率33.2797\\n',\n", " '2020-09-03 00:00:00 [INFO] 20200903: 最高市值 1175343.21 , 当前市值 1167333.11收益率 : 16.733311% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-09-10 00:00:00 [INFO] 20200910: 最高市值 1175343.21 , 当前市值 1151287.88收益率 : 15.128788% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-09-17 00:00:00 [INFO] 20200917: 最高市值 1175343.21 , 当前市值 1150909.54收益率 : 15.090954% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-09-24 00:00:00 [INFO] 20200924: 最高市值 1175343.21 , 当前市值 1133619.52收益率 : 13.361952% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-10-09 00:00:00 [INFO] 20201009: 最高市值 1175343.21 , 当前市值 1130395.17收益率 : 13.039517% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-10-16 00:00:00 [INFO] 20201016: 最高市值 1175343.21 , 当前市值 1135831.21收益率 : 13.583121% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-10-23 00:00:00 [INFO] 20201023: 最高市值 1175343.21 , 当前市值 1156312.48收益率 : 15.631248% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-10-30 00:00:00 [INFO] 20201030: 最高市值 1175343.21 , 当前市值 1126505.89收益率 : 12.650589% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-11-06 00:00:00 [INFO] 20201106: 最高市值 1175343.21 , 当前市值 1132095.43收益率 : 13.209543% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-11-13 00:00:00 [INFO] 20201113: 最高市值 1175343.21 , 当前市值 1131853.84收益率 : 13.185384% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-11-20 00:00:00 [INFO] 20201120: 最高市值 1175343.21 , 当前市值 1121621.53收益率 : 12.162153% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-11-27 00:00:00 [INFO] 20201127: 最高市值 1175343.21 , 当前市值 1128931.7收益率 : 12.89317% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-12-04 00:00:00 [INFO] 20201204: 最高市值 1175343.21 , 当前市值 1125559.12收益率 : 12.555912% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-12-11 00:00:00 [INFO] 20201211: 最高市值 1175343.21 , 当前市值 1109316.81收益率 : 10.931681% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-12-18 00:00:00 [INFO] 20201218: 最高市值 1175343.21 , 当前市值 1091760.07收益率 : 9.176007% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2020-12-25 00:00:00 [INFO] 20201225: 最高市值 1175343.21 , 当前市值 1069978.12收益率 : 6.997812% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-01-04 00:00:00 [INFO] 20210104: 最高市值 1175343.21 , 当前市值 1084869.86收益率 : 8.486986% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-01-11 00:00:00 [INFO] 20210111: 最高市值 1175343.21 , 当前市值 1072493.4收益率 : 7.24934% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-01-18 00:00:00 [INFO] 20210118: 最高市值 1175343.21 , 当前市值 1081348.52收益率 : 8.134852% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-01-25 00:00:00 [INFO] 20210125: 最高市值 1175343.21 , 当前市值 1071431.59收益率 : 7.143159% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-02-01 00:00:00 [INFO] 20210201: 最高市值 1175343.21 , 当前市值 1051394.98收益率 : 5.139498% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-02-08 00:00:00 [INFO] 20210208: 最高市值 1175343.21 , 当前市值 1049346.61收益率 : 4.934661% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-02-22 00:00:00 [INFO] 20210222: 最高市值 1175343.21 , 当前市值 1080455.78收益率 : 8.045578% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-03-01 00:00:00 [INFO] 20210301: 最高市值 1175343.21 , 当前市值 1088693.53收益率 : 8.869353% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-03-08 00:00:00 [INFO] 20210308: 最高市值 1175343.21 , 当前市值 1090203.88收益率 : 9.020388% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-03-15 00:00:00 [INFO] 20210315 卖出113502.XSHG,嘉澳转债,价格:133.72\\n',\n", " '2021-03-15 00:00:00 [INFO] 20210315 买入128100.XSHE, 搜特转债, 价格80.78, 溢价率32.3514\\n',\n", " '2021-03-15 00:00:00 [INFO] 20210315: 最高市值 1175343.21 , 当前市值 1130165.04收益率 : 13.016504% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-03-22 00:00:00 [INFO] 20210322: 最高市值 1175343.21 , 当前市值 1157240.58收益率 : 15.724058% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-03-29 00:00:00 [INFO] 20210329: 最高市值 1175343.21 , 当前市值 1153544.89收益率 : 15.354489% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-04-06 00:00:00 [INFO] 20210406: 最高市值 1175343.21 , 当前市值 1152595.41收益率 : 15.259541% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-04-13 00:00:00 [INFO] 20210413: 最高市值 1175343.21 , 当前市值 1167145.27收益率 : 16.714527% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-04-20 00:00:00 [INFO] 20210420: 最高市值 1199423.08 , 当前市值 1199423.08收益率 : 19.942308% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-04-27 00:00:00 [INFO] 20210427 卖出113527.XSHG,维格转债,价格:152.49\\n',\n", " '2021-04-27 00:00:00 [INFO] 20210427 买入110072.XSHG, 广汇转债, 价格88.17, 溢价率21.6866\\n',\n", " '2021-04-27 00:00:00 [INFO] 20210427: 最高市值 1275089.27 , 当前市值 1275089.27收益率 : 27.508927% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-05-07 00:00:00 [INFO] 20210507: 最高市值 1284866.8 , 当前市值 1284866.8收益率 : 28.48668% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-05-14 00:00:00 [INFO] 20210514: 最高市值 1301801.35 , 当前市值 1301801.35收益率 : 30.180135% , 最大回撤 11.93%\\n',\n", " '====================\\n',\n", " '\\n',\n", " '\\n',\n", " '2021-05-21 00:00:00 [INFO] 20210521: 最高市值 1305663.34 , 当前市值 1305663.34收益率 : 30.566334% , 最大回撤 11.93%\\n',\n", " '====================']" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "content" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "import re\n", "\n", "result=[]\n", "for line in content:\n", " line=line.strip()\n", " if line:\n", "# print(line)\n", " m=re.search('(.*?) 00:00:00 .*?收益率 : (.*?)% ',line)\n", " if m:\n", " date=m.group(1)\n", " profit=m.group(2)\n", " result.append({'date':date,'profit':profit})\n", " " ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'date': '2018-01-02', 'profit': '0'},\n", " {'date': '2018-01-09', 'profit': '1.94858'},\n", " {'date': '2018-01-16', 'profit': '0.685567'},\n", " {'date': '2018-01-23', 'profit': '1.654852'},\n", " {'date': '2018-01-30', 'profit': '2.334265'},\n", " {'date': '2018-02-06', 'profit': '0.461009'},\n", " {'date': '2018-02-13', 'profit': '0.511085'},\n", " {'date': '2018-02-27', 'profit': '1.473664'},\n", " {'date': '2018-03-06', 'profit': '1.816408'},\n", " {'date': '2018-03-13', 'profit': '3.431313'},\n", " {'date': '2018-03-20', 'profit': '2.909643'},\n", " {'date': '2018-03-27', 'profit': '2.48275'},\n", " {'date': '2018-04-03', 'profit': '2.939453'},\n", " {'date': '2018-04-12', 'profit': '3.025387'},\n", " {'date': '2018-04-19', 'profit': '2.815944'},\n", " {'date': '2018-04-26', 'profit': '0.838697'},\n", " {'date': '2018-05-07', 'profit': '1.307585'},\n", " {'date': '2018-05-14', 'profit': '0.151162'},\n", " {'date': '2018-05-21', 'profit': '0.347814'},\n", " {'date': '2018-05-28', 'profit': '-1.797829'},\n", " {'date': '2018-06-04', 'profit': '-4.632328'},\n", " {'date': '2018-06-11', 'profit': '-4.08598'},\n", " {'date': '2018-06-19', 'profit': '-8.76266'},\n", " {'date': '2018-06-26', 'profit': '-7.341499'},\n", " {'date': '2018-07-03', 'profit': '-7.425834'},\n", " {'date': '2018-07-10', 'profit': '-7.343188'},\n", " {'date': '2018-07-17', 'profit': '-6.485454'},\n", " {'date': '2018-07-24', 'profit': '-3.833063'},\n", " {'date': '2018-07-31', 'profit': '-5.070471'},\n", " {'date': '2018-08-07', 'profit': '-6.25512'},\n", " {'date': '2018-08-14', 'profit': '-6.403872'},\n", " {'date': '2018-08-21', 'profit': '-6.875959'},\n", " {'date': '2018-08-28', 'profit': '-6.50948'},\n", " {'date': '2018-09-04', 'profit': '-6.202803'},\n", " {'date': '2018-09-11', 'profit': '-6.497295'},\n", " {'date': '2018-09-18', 'profit': '-6.423782'},\n", " {'date': '2018-09-26', 'profit': '-6.283936'},\n", " {'date': '2018-10-10', 'profit': '-6.967901'},\n", " {'date': '2018-10-17', 'profit': '-8.843865'},\n", " {'date': '2018-10-24', 'profit': '-8.908875'},\n", " {'date': '2018-10-31', 'profit': '-7.582323'},\n", " {'date': '2018-11-07', 'profit': '-6.108914'},\n", " {'date': '2018-11-14', 'profit': '-5.210408'},\n", " {'date': '2018-11-21', 'profit': '-4.705808'},\n", " {'date': '2018-11-28', 'profit': '-4.6829'},\n", " {'date': '2018-12-05', 'profit': '-4.027772'},\n", " {'date': '2018-12-12', 'profit': '-4.009524'},\n", " {'date': '2018-12-19', 'profit': '-5.075666'},\n", " {'date': '2018-12-26', 'profit': '-6.089289'},\n", " {'date': '2019-01-04', 'profit': '-5.009552'},\n", " {'date': '2019-01-11', 'profit': '-2.712241'},\n", " {'date': '2019-01-18', 'profit': '-2.778168'},\n", " {'date': '2019-01-25', 'profit': '-2.750354'},\n", " {'date': '2019-02-01', 'profit': '-2.571497'},\n", " {'date': '2019-02-15', 'profit': '-0.363779'},\n", " {'date': '2019-02-22', 'profit': '0.992639'},\n", " {'date': '2019-03-01', 'profit': '2.458771'},\n", " {'date': '2019-03-08', 'profit': '6.615837'},\n", " {'date': '2019-03-15', 'profit': '7.435172'},\n", " {'date': '2019-03-22', 'profit': '11.03132'},\n", " {'date': '2019-03-29', 'profit': '10.038627'},\n", " {'date': '2019-04-08', 'profit': '14.257065'},\n", " {'date': '2019-04-15', 'profit': '10.336015'},\n", " {'date': '2019-04-22', 'profit': '9.6712'},\n", " {'date': '2019-04-29', 'profit': '4.441613'},\n", " {'date': '2019-05-09', 'profit': '3.23547'},\n", " {'date': '2019-05-16', 'profit': '5.31314'},\n", " {'date': '2019-05-23', 'profit': '3.577663'},\n", " {'date': '2019-05-30', 'profit': '3.135879'},\n", " {'date': '2019-06-06', 'profit': '1.057067'},\n", " {'date': '2019-06-14', 'profit': '1.636793'},\n", " {'date': '2019-06-21', 'profit': '3.505216'},\n", " {'date': '2019-06-28', 'profit': '2.524655'},\n", " {'date': '2019-07-05', 'profit': '3.358521'},\n", " {'date': '2019-07-12', 'profit': '2.594507'},\n", " {'date': '2019-07-19', 'profit': '2.803612'},\n", " {'date': '2019-07-26', 'profit': '2.927062'},\n", " {'date': '2019-08-02', 'profit': '2.351701'},\n", " {'date': '2019-08-09', 'profit': '2.098032'},\n", " {'date': '2019-08-16', 'profit': '2.373184'},\n", " {'date': '2019-08-23', 'profit': '3.055562'},\n", " {'date': '2019-08-30', 'profit': '3.66045'},\n", " {'date': '2019-09-06', 'profit': '4.737892'},\n", " {'date': '2019-09-16', 'profit': '6.072538'},\n", " {'date': '2019-09-23', 'profit': '5.561911'},\n", " {'date': '2019-09-30', 'profit': '5.524447'},\n", " {'date': '2019-10-14', 'profit': '6.514345'},\n", " {'date': '2019-10-21', 'profit': '5.339398'},\n", " {'date': '2019-10-28', 'profit': '6.00763'},\n", " {'date': '2019-11-04', 'profit': '5.697801'},\n", " {'date': '2019-11-11', 'profit': '5.716232'},\n", " {'date': '2019-11-18', 'profit': '5.791273'},\n", " {'date': '2019-11-25', 'profit': '5.45899'},\n", " {'date': '2019-12-02', 'profit': '4.970313'},\n", " {'date': '2019-12-09', 'profit': '5.172753'},\n", " {'date': '2019-12-16', 'profit': '5.940045'},\n", " {'date': '2019-12-23', 'profit': '5.87688'},\n", " {'date': '2019-12-30', 'profit': '7.156901'},\n", " {'date': '2020-01-07', 'profit': '9.397727'},\n", " {'date': '2020-01-14', 'profit': '10.611671'},\n", " {'date': '2020-01-21', 'profit': '13.561753'},\n", " {'date': '2020-02-05', 'profit': '11.843894'},\n", " {'date': '2020-02-12', 'profit': '14.284552'},\n", " {'date': '2020-02-19', 'profit': '16.416845'},\n", " {'date': '2020-02-26', 'profit': '17.274424'},\n", " {'date': '2020-03-04', 'profit': '17.030244'},\n", " {'date': '2020-03-11', 'profit': '16.842684'},\n", " {'date': '2020-03-18', 'profit': '15.557638'},\n", " {'date': '2020-03-25', 'profit': '17.534321'},\n", " {'date': '2020-04-01', 'profit': '15.836754'},\n", " {'date': '2020-04-09', 'profit': '15.244853'},\n", " {'date': '2020-04-16', 'profit': '14.96616'},\n", " {'date': '2020-04-23', 'profit': '15.422699'},\n", " {'date': '2020-04-30', 'profit': '14.966197'},\n", " {'date': '2020-05-12', 'profit': '14.415285'},\n", " {'date': '2020-05-19', 'profit': '10.876865'},\n", " {'date': '2020-05-26', 'profit': '9.739608'},\n", " {'date': '2020-06-02', 'profit': '11.386556'},\n", " {'date': '2020-06-09', 'profit': '10.99783'},\n", " {'date': '2020-06-16', 'profit': '10.92307'},\n", " {'date': '2020-06-23', 'profit': '10.508111'},\n", " {'date': '2020-07-02', 'profit': '10.198157'},\n", " {'date': '2020-07-09', 'profit': '15.540353'},\n", " {'date': '2020-07-16', 'profit': '12.003112'},\n", " {'date': '2020-07-23', 'profit': '15.002095'},\n", " {'date': '2020-07-30', 'profit': '15.834449'},\n", " {'date': '2020-08-06', 'profit': '16.528257'},\n", " {'date': '2020-08-13', 'profit': '15.734118'},\n", " {'date': '2020-08-20', 'profit': '15.53694'},\n", " {'date': '2020-08-27', 'profit': '15.379843'},\n", " {'date': '2020-09-03', 'profit': '16.733311'},\n", " {'date': '2020-09-10', 'profit': '15.128788'},\n", " {'date': '2020-09-17', 'profit': '15.090954'},\n", " {'date': '2020-09-24', 'profit': '13.361952'},\n", " {'date': '2020-10-09', 'profit': '13.039517'},\n", " {'date': '2020-10-16', 'profit': '13.583121'},\n", " {'date': '2020-10-23', 'profit': '15.631248'},\n", " {'date': '2020-10-30', 'profit': '12.650589'},\n", " {'date': '2020-11-06', 'profit': '13.209543'},\n", " {'date': '2020-11-13', 'profit': '13.185384'},\n", " {'date': '2020-11-20', 'profit': '12.162153'},\n", " {'date': '2020-11-27', 'profit': '12.89317'},\n", " {'date': '2020-12-04', 'profit': '12.555912'},\n", " {'date': '2020-12-11', 'profit': '10.931681'},\n", " {'date': '2020-12-18', 'profit': '9.176007'},\n", " {'date': '2020-12-25', 'profit': '6.997812'},\n", " {'date': '2021-01-04', 'profit': '8.486986'},\n", " {'date': '2021-01-11', 'profit': '7.24934'},\n", " {'date': '2021-01-18', 'profit': '8.134852'},\n", " {'date': '2021-01-25', 'profit': '7.143159'},\n", " {'date': '2021-02-01', 'profit': '5.139498'},\n", " {'date': '2021-02-08', 'profit': '4.934661'},\n", " {'date': '2021-02-22', 'profit': '8.045578'},\n", " {'date': '2021-03-01', 'profit': '8.869353'},\n", " {'date': '2021-03-08', 'profit': '9.020388'},\n", " {'date': '2021-03-15', 'profit': '13.016504'},\n", " {'date': '2021-03-22', 'profit': '15.724058'},\n", " {'date': '2021-03-29', 'profit': '15.354489'},\n", " {'date': '2021-04-06', 'profit': '15.259541'},\n", " {'date': '2021-04-13', 'profit': '16.714527'},\n", " {'date': '2021-04-20', 'profit': '19.942308'},\n", " {'date': '2021-04-27', 'profit': '27.508927'},\n", " {'date': '2021-05-07', 'profit': '28.48668'},\n", " {'date': '2021-05-14', 'profit': '30.180135'},\n", " {'date': '2021-05-21', 'profit': '30.566334'}]" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "s='2018-01-02 00:00:00 [INFO] 20180102: 最高市值 1000000 , 当前市值 1000000收益率 : 2.815944% , 最大回撤 0.0%'" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2018-01-02'" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m=re.search('(.*?) .*?收益率 : (.*?)%',s)\n", "m.group(1)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.815944'" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m.group(2)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "df=pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dateprofit
02018-01-020
12018-01-091.94858
22018-01-160.685567
32018-01-231.654852
42018-01-302.334265
\n", "
" ], "text/plain": [ " date profit\n", "0 2018-01-02 0\n", "1 2018-01-09 1.94858\n", "2 2018-01-16 0.685567\n", "3 2018-01-23 1.654852\n", "4 2018-01-30 2.334265" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 165 entries, 0 to 164\n", "Data columns (total 2 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 date 165 non-null object\n", " 1 profit 165 non-null object\n", "dtypes: object(2)\n", "memory usage: 2.7+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "df['profit']=df['profit'].astype(float)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "df=df.set_index('date')" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
profit
date
2018-01-020.000000
2018-01-091.948580
2018-01-160.685567
2018-01-231.654852
2018-01-302.334265
......
2021-04-2019.942308
2021-04-2727.508927
2021-05-0728.486680
2021-05-1430.180135
2021-05-2130.566334
\n", "

165 rows × 1 columns

\n", "
" ], "text/plain": [ " profit\n", "date \n", "2018-01-02 0.000000\n", "2018-01-09 1.948580\n", "2018-01-16 0.685567\n", "2018-01-23 1.654852\n", "2018-01-30 2.334265\n", "... ...\n", "2021-04-20 19.942308\n", "2021-04-27 27.508927\n", "2021-05-07 28.486680\n", "2021-05-14 30.180135\n", "2021-05-21 30.566334\n", "\n", "[165 rows x 1 columns]" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 165 entries, 0 to 164\n", "Data columns (total 2 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 date 165 non-null object \n", " 1 profit 165 non-null float64\n", "dtypes: float64(1), object(1)\n", "memory usage: 2.7+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(16,10))\n", "plt.grid=True\n", "df['profit'].plot()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(16,10))\n", "test_plot =sns.lineplot(x='date',y='profit',data=df1)\n", "test_plot.set_xticks(df1['date'][::20])\n", "test_plot.grid()" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "df1=df.reset_index()" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dateprofit
02018-01-020.000000
12018-01-091.948580
22018-01-160.685567
32018-01-231.654852
42018-01-302.334265
\n", "
" ], "text/plain": [ " date profit\n", "0 2018-01-02 0.000000\n", "1 2018-01-09 1.948580\n", "2 2018-01-16 0.685567\n", "3 2018-01-23 1.654852\n", "4 2018-01-30 2.334265" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: analysis/基金分析.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# 基金经理名单" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "db = DBSelector()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['__class__',\n", " '__delattr__',\n", " '__dict__',\n", " '__dir__',\n", " '__doc__',\n", " '__eq__',\n", " '__format__',\n", " '__ge__',\n", " '__getattribute__',\n", " '__gt__',\n", " '__hash__',\n", " '__init__',\n", " '__init_subclass__',\n", " '__le__',\n", " '__lt__',\n", " '__module__',\n", " '__ne__',\n", " '__new__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__setattr__',\n", " '__sizeof__',\n", " '__str__',\n", " '__subclasshook__',\n", " '__weakref__',\n", " 'config',\n", " 'get_engine',\n", " 'get_mysql_conn',\n", " 'json_data']" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(db)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "engine = db.get_engine('db_fund','qq')" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "df = pd.read_sql('2020-09-04morning',engine)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "query = 'select `基金简称`,`最新规模-万`,`累计净值`,`管理人名称` from `2020-09-04morning`'\n", "cursor.execute(query)\n", "ret = cursor.fetchall()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
基金代码基金简称最新规模-万实时价格涨跌幅成交额-万净值日期单位净值累计净值折溢价率申购状态申赎状态基金经理成立日期管理人名称实时估值更新时间实时净值溢价率
0160105南方积极配置混合(LOF)82110.41.3541.2012.02020-09-031.30933.45093.414040开放开放张原、张延闽2004-10-14南方基金管理股份有限公司12020-09-04 08:35:261.31103.180
1160106南方高增长混合(LOF)221113.01.830-0.9252.02020-09-031.82964.37560.021863开放开放张原2005-07-13南方基金管理股份有限公司12020-09-04 08:35:491.8490-1.040
2160119南方中证500ETF联接(LOF)A1019760.01.715-0.52205.02020-09-031.72191.8219-0.400720开放开放罗文杰2009-09-25南方基金管理股份有限公司12020-09-04 08:35:401.7216-0.380
3160125南方香港优选股票(QDII-LOF)44264.81.3880.143.02020-09-021.37271.46271.114590开放开放毕凯2011-09-26南方基金管理股份有限公司02020-09-04 08:35:311.37301.115
4160128南方金利A23537.91.001-0.201.02020-09-031.01201.5530-1.086960暂停暂停李璇2012-05-17南方基金管理股份有限公司12020-09-04 08:35:371.0119-1.090
\n", "
" ], "text/plain": [ " 基金代码 基金简称 最新规模-万 实时价格 涨跌幅 ... 管理人名称 实时估值 更新时间 实时净值 溢价率\n", "0 160105 南方积极配置混合(LOF) 82110.4 1.354 1.20 ... 南方基金管理股份有限公司 1 2020-09-04 08:35:26 1.3110 3.180\n", "1 160106 南方高增长混合(LOF) 221113.0 1.830 -0.92 ... 南方基金管理股份有限公司 1 2020-09-04 08:35:49 1.8490 -1.040\n", "2 160119 南方中证500ETF联接(LOF)A 1019760.0 1.715 -0.52 ... 南方基金管理股份有限公司 1 2020-09-04 08:35:40 1.7216 -0.380\n", "3 160125 南方香港优选股票(QDII-LOF) 44264.8 1.388 0.14 ... 南方基金管理股份有限公司 0 2020-09-04 08:35:31 1.3730 1.115\n", "4 160128 南方金利A 23537.9 1.001 -0.20 ... 南方基金管理股份有限公司 1 2020-09-04 08:35:37 1.0119 -1.090\n", "\n", "[5 rows x 19 columns]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "sort_df = df.sort_values('累计净值',ascending=False)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
基金代码基金简称最新规模-万实时价格涨跌幅成交额-万净值日期单位净值累计净值折溢价率申购状态申赎状态基金经理成立日期管理人名称实时估值更新时间实时净值溢价率
160163402兴全趋势投资混合(LOF)2415290.00.940-1.056801.02020-09-030.936710.96060.352301开放开放董承非、童兰2005-11-03兴证全球基金管理有限公司12020-09-04 08:35:490.93650.37
18160314华夏行业混合(LOF)321265.01.626-1.4559.02020-09-031.63108.3750-0.306560开放开放王劲松2007-11-22华夏基金管理有限公司12020-09-04 08:35:511.6325-0.40
60160918大成中小盘混合(LOF)118532.03.536-0.9553.02020-09-033.51906.68400.483092开放开放魏庆国2014-04-10大成基金管理有限公司12020-09-04 08:35:493.51510.59
17160311华夏蓝筹混合(LOF)436404.02.144-0.3750.02020-09-032.14606.5080-0.093197开放开放王怡欢2007-04-24华夏基金管理有限公司12020-09-04 08:35:392.1557-0.55
67161005富国天惠成长混合(LOF)A1582680.03.391-0.626161.02020-09-033.37326.27120.527689开放开放朱少醒2005-11-16富国基金管理有限公司12020-09-04 08:35:433.37960.34
24160505博时主题行业混合(LOF)1073540.01.895-0.63321.02020-09-031.91206.0050-0.889121开放开放王俊、金晟哲2005-01-06博时基金管理有限公司12020-09-04 08:35:441.9094-0.76
163163412兴全轻资产混合(LOF)837628.03.269-0.46289.02020-09-033.28605.8500-0.517346开放开放董理2012-04-05兴证全球基金管理有限公司12020-09-04 08:35:403.2790-0.31
33160607鹏华价值优势混合(LOF)297224.01.276-0.5582.02020-09-031.26605.72500.789889开放开放谢书英2006-07-18鹏华基金管理有限公司12020-09-04 08:35:431.26380.96
56160812长盛同益成长回报(LOF)28314.52.3700.0461.02020-09-032.37105.6860-0.042176开放开放张谊然(休产假)、乔培涛(代理)2014-04-04长盛基金管理有限公司12020-09-04 08:35:312.3713-0.05
143162605景顺长城鼎益混合(LOF)756521.02.8630.634093.02020-09-032.85005.64100.456140开放开放刘彦春2005-03-16景顺长城基金管理有限公司12020-09-04 08:35:272.84720.55
\n", "
" ], "text/plain": [ " 基金代码 基金简称 最新规模-万 实时价格 涨跌幅 ... 管理人名称 实时估值 更新时间 实时净值 溢价率\n", "160 163402 兴全趋势投资混合(LOF) 2415290.0 0.940 -1.05 ... 兴证全球基金管理有限公司 1 2020-09-04 08:35:49 0.9365 0.37\n", "18 160314 华夏行业混合(LOF) 321265.0 1.626 -1.45 ... 华夏基金管理有限公司 1 2020-09-04 08:35:51 1.6325 -0.40\n", "60 160918 大成中小盘混合(LOF) 118532.0 3.536 -0.95 ... 大成基金管理有限公司 1 2020-09-04 08:35:49 3.5151 0.59\n", "17 160311 华夏蓝筹混合(LOF) 436404.0 2.144 -0.37 ... 华夏基金管理有限公司 1 2020-09-04 08:35:39 2.1557 -0.55\n", "67 161005 富国天惠成长混合(LOF)A 1582680.0 3.391 -0.62 ... 富国基金管理有限公司 1 2020-09-04 08:35:43 3.3796 0.34\n", "24 160505 博时主题行业混合(LOF) 1073540.0 1.895 -0.63 ... 博时基金管理有限公司 1 2020-09-04 08:35:44 1.9094 -0.76\n", "163 163412 兴全轻资产混合(LOF) 837628.0 3.269 -0.46 ... 兴证全球基金管理有限公司 1 2020-09-04 08:35:40 3.2790 -0.31\n", "33 160607 鹏华价值优势混合(LOF) 297224.0 1.276 -0.55 ... 鹏华基金管理有限公司 1 2020-09-04 08:35:43 1.2638 0.96\n", "56 160812 长盛同益成长回报(LOF) 28314.5 2.370 0.04 ... 长盛基金管理有限公司 1 2020-09-04 08:35:31 2.3713 -0.05\n", "143 162605 景顺长城鼎益混合(LOF) 756521.0 2.863 0.63 ... 景顺长城基金管理有限公司 1 2020-09-04 08:35:27 2.8472 0.55\n", "\n", "[10 rows x 19 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sort_df.head(10)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
基金代码基金简称最新规模-万实时价格涨跌幅成交额-万净值日期单位净值累计净值折溢价率申购状态申赎状态基金经理成立日期管理人名称实时估值更新时间实时净值溢价率
117161728招商3年封闭运作战略配售混合(LOF)2762300.01.0660.00786.02020-09-031.11761.1176-4.617040暂停--姚飞军、尹晓红、马龙、吴亮谷2018-07-05招商基金管理有限公司12020-09-04 08:35:331.1180-4.88
91161131易方达3年封闭战略配售混合(LOF)2725360.01.0590.282972.02020-09-031.11431.1143-4.962760开放暂停胡剑、纪玲云、付浩2018-07-05易方达基金管理有限公司12020-09-04 08:35:301.1143-5.22
160163402兴全趋势投资混合(LOF)2415290.00.940-1.056801.02020-09-030.936710.96060.352301开放开放董承非、童兰2005-11-03兴证全球基金管理有限公司12020-09-04 08:35:490.93650.37
165163417兴全合宜混合(LOF)A2074530.01.727-1.4313411.02020-09-031.72681.72680.011582开放开放谢治宇2018-01-23兴证全球基金管理有限公司12020-09-04 08:35:511.7325-0.32
9160142南方3年封闭运作战略配售混合(LOF)2024200.01.0650.091437.02020-09-031.11761.1176-4.706510暂停--李璇、茅炜2018-07-05南方基金管理股份有限公司12020-09-04 08:35:311.1176-4.94
47160706嘉实沪深300ETF联接(LOF)A1902520.01.351-0.59322.02020-09-031.35883.2801-0.574036开放开放何如、陈正宪2005-08-29嘉实基金管理有限公司12020-09-04 08:35:431.3584-0.55
293501188汇添富3年封闭运作战略配售混合(LOF)1715490.01.1290.181370.02020-09-031.18171.1817-4.459680暂停--刘伟林、何旻、杨瑨、刘江2018-07-05汇添富基金管理股份有限公司12020-09-04 08:35:311.1811-4.61
145162703广发小盘成长混合(LOF)A1639330.03.244-0.802232.02020-09-033.25865.5966-0.448045开放开放刘格菘2005-02-02广发基金管理有限公司12020-09-04 08:35:453.2649-0.64
67161005富国天惠成长混合(LOF)A1582680.03.391-0.626161.02020-09-033.37326.27120.527689开放开放朱少醒2005-11-16富国基金管理有限公司12020-09-04 08:35:433.37960.34
125161903万家行业优选混合(LOF)1349920.01.912-0.572890.02020-09-031.92694.9327-0.773263开放开放黄兴亮2005-07-15万家基金管理有限公司12020-09-04 08:35:431.9305-0.97
\n", "
" ], "text/plain": [ " 基金代码 基金简称 最新规模-万 实时价格 涨跌幅 ... 管理人名称 实时估值 更新时间 实时净值 溢价率\n", "117 161728 招商3年封闭运作战略配售混合(LOF) 2762300.0 1.066 0.00 ... 招商基金管理有限公司 1 2020-09-04 08:35:33 1.1180 -4.88\n", "91 161131 易方达3年封闭战略配售混合(LOF) 2725360.0 1.059 0.28 ... 易方达基金管理有限公司 1 2020-09-04 08:35:30 1.1143 -5.22\n", "160 163402 兴全趋势投资混合(LOF) 2415290.0 0.940 -1.05 ... 兴证全球基金管理有限公司 1 2020-09-04 08:35:49 0.9365 0.37\n", "165 163417 兴全合宜混合(LOF)A 2074530.0 1.727 -1.43 ... 兴证全球基金管理有限公司 1 2020-09-04 08:35:51 1.7325 -0.32\n", "9 160142 南方3年封闭运作战略配售混合(LOF) 2024200.0 1.065 0.09 ... 南方基金管理股份有限公司 1 2020-09-04 08:35:31 1.1176 -4.94\n", "47 160706 嘉实沪深300ETF联接(LOF)A 1902520.0 1.351 -0.59 ... 嘉实基金管理有限公司 1 2020-09-04 08:35:43 1.3584 -0.55\n", "293 501188 汇添富3年封闭运作战略配售混合(LOF) 1715490.0 1.129 0.18 ... 汇添富基金管理股份有限公司 1 2020-09-04 08:35:31 1.1811 -4.61\n", "145 162703 广发小盘成长混合(LOF)A 1639330.0 3.244 -0.80 ... 广发基金管理有限公司 1 2020-09-04 08:35:45 3.2649 -0.64\n", "67 161005 富国天惠成长混合(LOF)A 1582680.0 3.391 -0.62 ... 富国基金管理有限公司 1 2020-09-04 08:35:43 3.3796 0.34\n", "125 161903 万家行业优选混合(LOF) 1349920.0 1.912 -0.57 ... 万家基金管理有限公司 1 2020-09-04 08:35:43 1.9305 -0.97\n", "\n", "[10 rows x 19 columns]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values('最新规模-万',ascending=False).head(10)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "manager = df['基金经理'].tolist()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "317" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(manager)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "name_list =[]\n", "for i in manager:\n", " name_list.extend(i.strip().split('、'))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "401" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(name_list)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "count_dict ={}\n", "for i in name_list:\n", " count_dict.setdefault(i,0)\n", " count_dict[i]+=1" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'张原': 2,\n", " '张延闽': 1,\n", " '罗文杰': 2,\n", " '毕凯': 1,\n", " '李璇': 2,\n", " '刘文良': 1,\n", " '李慧鹏': 1,\n", " '蒋秋洁': 1,\n", " '黄亮': 2,\n", " '茅炜': 1,\n", " '杨飞': 2,\n", " '徐治彪': 1,\n", " '吴向军': 2,\n", " '樊利安': 2,\n", " '徐成城': 1,\n", " '谢东旭': 1,\n", " '王怡欢': 1,\n", " '王劲松': 1,\n", " '李湘杰': 1,\n", " '黄芳': 1,\n", " '张城源': 2,\n", " '董阳阳': 1,\n", " '孙晨进': 1,\n", " '马丁': 1,\n", " '倪斌': 1,\n", " '王俊': 2,\n", " '金晟哲': 2,\n", " '王增财': 1,\n", " '邓欣雨': 1,\n", " '程卓': 1,\n", " '赵云阳': 1,\n", " '陈伟': 1,\n", " '张锦': 1,\n", " '李洋': 1,\n", " '谢书英': 2,\n", " '张航': 1,\n", " '陈璇淼': 1,\n", " '伍旋': 1,\n", " '张羽翔': 5,\n", " '刘太阳': 1,\n", " '祝松': 1,\n", " '戴钢': 1,\n", " '王石千': 1,\n", " '罗捷': 1,\n", " '陈龙': 1,\n", " '尤柏年': 2,\n", " '顾柔刚': 1,\n", " '何如': 3,\n", " '陈正宪': 4,\n", " '高峰': 2,\n", " '方晗': 1,\n", " '王汉博': 1,\n", " '蒋一茜': 1,\n", " '刘志刚': 1,\n", " '乔培涛': 1,\n", " '朱律': 1,\n", " '陈亘斯': 5,\n", " '张谊然(休产假)': 1,\n", " '乔培涛(代理)': 1,\n", " '郭堃': 1,\n", " '刘旭': 1,\n", " '侯春燕': 1,\n", " '戴军': 2,\n", " '魏庆国': 1,\n", " '李林益': 1,\n", " '冉凌浩': 3,\n", " '王阡': 1,\n", " '朱少醒': 1,\n", " '武磊': 2,\n", " '张明凯': 1,\n", " '俞晓斌': 1,\n", " '李笑薇': 1,\n", " '徐幼华': 2,\n", " '方旻': 3,\n", " '王保合': 1,\n", " '张圣贤': 2,\n", " '牛志冬': 3,\n", " '蔡卡尔': 2,\n", " '胡剑': 2,\n", " '周宇': 1,\n", " '刘树荣': 4,\n", " '王晓晨(休产假)': 1,\n", " '纪玲云(代理)': 1,\n", " '范冰': 6,\n", " '成曦': 1,\n", " '纪玲云': 1,\n", " '付浩': 1,\n", " '赵建': 3,\n", " '徐栋': 1,\n", " '殷瑞飞': 1,\n", " '孙文龙': 1,\n", " '綦缚鹏': 1,\n", " '王鹏': 1,\n", " '吴潇': 3,\n", " '邹立虎': 1,\n", " '汤海波': 1,\n", " '何晶': 1,\n", " '蔡志伟': 1,\n", " '邹曦': 1,\n", " '何龙': 1,\n", " '王超': 1,\n", " '余志勇': 1,\n", " '朱浩然': 1,\n", " '何天翔': 1,\n", " '贾成东': 1,\n", " '向霈': 1,\n", " '白海峰': 1,\n", " '侯昊': 1,\n", " '刘万锋': 1,\n", " '张西林': 1,\n", " '姚飞军': 3,\n", " '尹晓红': 1,\n", " '马龙': 1,\n", " '吴亮谷': 1,\n", " '刘辉': 1,\n", " '张凯': 1,\n", " '马君': 1,\n", " '李宜璇': 2,\n", " '邹维娜': 1,\n", " '瞿灿': 1,\n", " '乐育涛': 1,\n", " '王海峰': 2,\n", " '黄兴亮': 1,\n", " '杨坤': 1,\n", " '陈佳昀': 1,\n", " '莫海波': 1,\n", " '陈良栋': 1,\n", " '林龙军': 1,\n", " '乔春': 1,\n", " '戴骏': 1,\n", " '吴华': 1,\n", " '杜磊': 1,\n", " '刘洋': 2,\n", " '刘欣': 1,\n", " '江勇': 1,\n", " '周晶': 6,\n", " '林昊': 1,\n", " '黄欣': 1,\n", " '沈丹': 1,\n", " '刘彦春': 1,\n", " '韩文强': 1,\n", " '刘格菘': 1,\n", " '刘杰': 3,\n", " '代宇': 1,\n", " '罗国庆': 2,\n", " '谢军': 1,\n", " '田文舟': 1,\n", " '左金保': 1,\n", " '宋海岸': 1,\n", " '张文琍': 1,\n", " '倪伟': 1,\n", " '刘婧': 1,\n", " '俞诚': 1,\n", " '王赟杰': 1,\n", " '宋青': 1,\n", " '梅律吾': 1,\n", " '徐达': 1,\n", " '董承非': 1,\n", " '童兰': 1,\n", " '申庆': 1,\n", " '邹欣': 1,\n", " '董理': 1,\n", " '乔迁': 1,\n", " '谢治宇': 1,\n", " '许家涵': 1,\n", " '王帅': 1,\n", " '奚鹏洲': 1,\n", " '周毅': 1,\n", " '赵建忠': 1,\n", " '陈玮': 1,\n", " '范锐': 1,\n", " '邵强': 1,\n", " '尹培俊': 1,\n", " '杜广': 1,\n", " '姜晓丽': 1,\n", " '吴国清': 1,\n", " '石峰': 1,\n", " '张志强': 1,\n", " '刘怡敏': 1,\n", " '陈东(休假)': 1,\n", " '朱向临': 1,\n", " '赖中立': 6,\n", " '陆文磊': 1,\n", " '徐光': 1,\n", " '胡娜': 1,\n", " '何秀红(休产假)': 1,\n", " '欧阳凯(代理)': 1,\n", " '郭雪松(代理)': 1,\n", " '刘伟琳': 2,\n", " '张洋': 1,\n", " '李昱': 1,\n", " '唐赟': 1,\n", " '蔡铮': 2,\n", " '梁洪昀': 2,\n", " '李峰': 1,\n", " '姜锋': 1,\n", " '吴尚伟': 1,\n", " '夏明月': 1,\n", " '宋海娟': 1,\n", " '顾凡丁': 2,\n", " '吴昊': 4,\n", " '张弘': 1,\n", " '杨立春': 2,\n", " '韩海平': 1,\n", " '黄稚(休假)': 1,\n", " 'HANYILING(代理)': 1,\n", " '提云涛': 1,\n", " '郑伟': 1,\n", " '江峰': 1,\n", " '周蔚文': 2,\n", " '王培': 1,\n", " '洪慧梅': 2,\n", " '张明': 3,\n", " '王健': 1,\n", " '许文星': 1,\n", " '魏博': 1,\n", " '华李成': 1,\n", " '尹华龙': 1,\n", " '王咏辉': 2,\n", " '章潇枫': 1,\n", " '陈士俊': 1,\n", " '王剑': 1,\n", " '胡振仓': 1,\n", " '刘俊廷': 3,\n", " '张俊生': 2,\n", " '苏宁': 1,\n", " '庄园': 1,\n", " '张翼飞': 1,\n", " '李君': 1,\n", " '徐黄玮': 1,\n", " '施荣盛': 1,\n", " '陈一峰': 1,\n", " '王本昌': 2,\n", " '吴坚': 1,\n", " '刘开运': 3,\n", " '张鹏程': 1,\n", " '林柏川': 1,\n", " '胡德军': 1,\n", " '朱然': 1,\n", " '盖俊龙': 1,\n", " '潘天奇': 1,\n", " '韩冬': 1,\n", " '孙伟': 1,\n", " '李响': 1,\n", " '周杨': 1,\n", " '张伟锋': 1,\n", " '马斌博': 1,\n", " '宫雪': 3,\n", " '梁辰': 1,\n", " '吴振翔': 5,\n", " '过蓓蓓': 6,\n", " '谈洁颖': 1,\n", " '艾小军': 2,\n", " '聂毅翔': 1,\n", " '夏钦': 3,\n", " '戴计辉': 1,\n", " '胡洁': 4,\n", " '刘伟林': 3,\n", " '曾刚': 2,\n", " '胡奕': 2,\n", " '董瑾': 4,\n", " '荣膺': 1,\n", " '李明阳': 1,\n", " '邹维': 1,\n", " '盛丰衍': 2,\n", " '魏孛': 2,\n", " '史博': 1,\n", " '苏燕青(休产假)': 2,\n", " '刘重杰(代理)': 2,\n", " '刘明宇': 1,\n", " '何旻': 1,\n", " '杨瑨': 1,\n", " '刘江': 1,\n", " '刘宁': 1,\n", " '王鑫晨': 1,\n", " '谭丽': 1,\n", " '陆丛凡': 1,\n", " '楼华锋': 1,\n", " '陈伯祯': 1,\n", " '刘珈吟': 1,\n", " '余海燕': 4,\n", " '苏秉毅': 1,\n", " '夏高': 1}" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "count_dict" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "sort_name = list(sorted(count_dict.items(),key=lambda x:x[1],reverse=True))" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "[('范冰', 6),\n", " ('周晶', 6),\n", " ('赖中立', 6),\n", " ('过蓓蓓', 6),\n", " ('张羽翔', 5),\n", " ('陈亘斯', 5),\n", " ('吴振翔', 5),\n", " ('陈正宪', 4),\n", " ('刘树荣', 4),\n", " ('吴昊', 4),\n", " ('胡洁', 4),\n", " ('董瑾', 4),\n", " ('余海燕', 4),\n", " ('何如', 3),\n", " ('冉凌浩', 3),\n", " ('方旻', 3),\n", " ('牛志冬', 3),\n", " ('赵建', 3),\n", " ('吴潇', 3),\n", " ('姚飞军', 3),\n", " ('刘杰', 3),\n", " ('张明', 3),\n", " ('刘俊廷', 3),\n", " ('刘开运', 3),\n", " ('宫雪', 3),\n", " ('夏钦', 3),\n", " ('刘伟林', 3),\n", " ('张原', 2),\n", " ('罗文杰', 2),\n", " ('李璇', 2),\n", " ('黄亮', 2),\n", " ('杨飞', 2),\n", " ('吴向军', 2),\n", " ('樊利安', 2),\n", " ('张城源', 2),\n", " ('王俊', 2),\n", " ('金晟哲', 2),\n", " ('谢书英', 2),\n", " ('尤柏年', 2),\n", " ('高峰', 2),\n", " ('戴军', 2),\n", " ('武磊', 2),\n", " ('徐幼华', 2),\n", " ('张圣贤', 2),\n", " ('蔡卡尔', 2),\n", " ('胡剑', 2),\n", " ('李宜璇', 2),\n", " ('王海峰', 2),\n", " ('刘洋', 2),\n", " ('罗国庆', 2),\n", " ('刘伟琳', 2),\n", " ('蔡铮', 2),\n", " ('梁洪昀', 2),\n", " ('顾凡丁', 2),\n", " ('杨立春', 2),\n", " ('周蔚文', 2),\n", " ('洪慧梅', 2),\n", " ('王咏辉', 2),\n", " ('张俊生', 2),\n", " ('王本昌', 2),\n", " ('艾小军', 2),\n", " ('曾刚', 2),\n", " ('胡奕', 2),\n", " ('盛丰衍', 2),\n", " ('魏孛', 2),\n", " ('苏燕青(休产假)', 2),\n", " ('刘重杰(代理)', 2),\n", " ('张延闽', 1),\n", " ('毕凯', 1),\n", " ('刘文良', 1),\n", " ('李慧鹏', 1),\n", " ('蒋秋洁', 1),\n", " ('茅炜', 1),\n", " ('徐治彪', 1),\n", " ('徐成城', 1),\n", " ('谢东旭', 1),\n", " ('王怡欢', 1),\n", " ('王劲松', 1),\n", " ('李湘杰', 1),\n", " ('黄芳', 1),\n", " ('董阳阳', 1),\n", " ('孙晨进', 1),\n", " ('马丁', 1),\n", " ('倪斌', 1),\n", " ('王增财', 1),\n", " ('邓欣雨', 1),\n", " ('程卓', 1),\n", " ('赵云阳', 1),\n", " ('陈伟', 1),\n", " ('张锦', 1),\n", " ('李洋', 1),\n", " ('张航', 1),\n", " ('陈璇淼', 1),\n", " ('伍旋', 1),\n", " ('刘太阳', 1),\n", " ('祝松', 1),\n", " ('戴钢', 1),\n", " ('王石千', 1),\n", " ('罗捷', 1),\n", " ('陈龙', 1),\n", " ('顾柔刚', 1),\n", " ('方晗', 1),\n", " ('王汉博', 1),\n", " ('蒋一茜', 1),\n", " ('刘志刚', 1),\n", " ('乔培涛', 1),\n", " ('朱律', 1),\n", " ('张谊然(休产假)', 1),\n", " ('乔培涛(代理)', 1),\n", " ('郭堃', 1),\n", " ('刘旭', 1),\n", " ('侯春燕', 1),\n", " ('魏庆国', 1),\n", " ('李林益', 1),\n", " ('王阡', 1),\n", " ('朱少醒', 1),\n", " ('张明凯', 1),\n", " ('俞晓斌', 1),\n", " ('李笑薇', 1),\n", " ('王保合', 1),\n", " ('周宇', 1),\n", " ('王晓晨(休产假)', 1),\n", " ('纪玲云(代理)', 1),\n", " ('成曦', 1),\n", " ('纪玲云', 1),\n", " ('付浩', 1),\n", " ('徐栋', 1),\n", " ('殷瑞飞', 1),\n", " ('孙文龙', 1),\n", " ('綦缚鹏', 1),\n", " ('王鹏', 1),\n", " ('邹立虎', 1),\n", " ('汤海波', 1),\n", " ('何晶', 1),\n", " ('蔡志伟', 1),\n", " ('邹曦', 1),\n", " ('何龙', 1),\n", " ('王超', 1),\n", " ('余志勇', 1),\n", " ('朱浩然', 1),\n", " ('何天翔', 1),\n", " ('贾成东', 1),\n", " ('向霈', 1),\n", " ('白海峰', 1),\n", " ('侯昊', 1),\n", " ('刘万锋', 1),\n", " ('张西林', 1),\n", " ('尹晓红', 1),\n", " ('马龙', 1),\n", " ('吴亮谷', 1),\n", " ('刘辉', 1),\n", " ('张凯', 1),\n", " ('马君', 1),\n", " ('邹维娜', 1),\n", " ('瞿灿', 1),\n", " ('乐育涛', 1),\n", " ('黄兴亮', 1),\n", " ('杨坤', 1),\n", " ('陈佳昀', 1),\n", " ('莫海波', 1),\n", " ('陈良栋', 1),\n", " ('林龙军', 1),\n", " ('乔春', 1),\n", " ('戴骏', 1),\n", " ('吴华', 1),\n", " ('杜磊', 1),\n", " ('刘欣', 1),\n", " ('江勇', 1),\n", " ('林昊', 1),\n", " ('黄欣', 1),\n", " ('沈丹', 1),\n", " ('刘彦春', 1),\n", " ('韩文强', 1),\n", " ('刘格菘', 1),\n", " ('代宇', 1),\n", " ('谢军', 1),\n", " ('田文舟', 1),\n", " ('左金保', 1),\n", " ('宋海岸', 1),\n", " ('张文琍', 1),\n", " ('倪伟', 1),\n", " ('刘婧', 1),\n", " ('俞诚', 1),\n", " ('王赟杰', 1),\n", " ('宋青', 1),\n", " ('梅律吾', 1),\n", " ('徐达', 1),\n", " ('董承非', 1),\n", " ('童兰', 1),\n", " ('申庆', 1),\n", " ('邹欣', 1),\n", " ('董理', 1),\n", " ('乔迁', 1),\n", " ('谢治宇', 1),\n", " ('许家涵', 1),\n", " ('王帅', 1),\n", " ('奚鹏洲', 1),\n", " ('周毅', 1),\n", " ('赵建忠', 1),\n", " ('陈玮', 1),\n", " ('范锐', 1),\n", " ('邵强', 1),\n", " ('尹培俊', 1),\n", " ('杜广', 1),\n", " ('姜晓丽', 1),\n", " ('吴国清', 1),\n", " ('石峰', 1),\n", " ('张志强', 1),\n", " ('刘怡敏', 1),\n", " ('陈东(休假)', 1),\n", " ('朱向临', 1),\n", " ('陆文磊', 1),\n", " ('徐光', 1),\n", " ('胡娜', 1),\n", " ('何秀红(休产假)', 1),\n", " ('欧阳凯(代理)', 1),\n", " ('郭雪松(代理)', 1),\n", " ('张洋', 1),\n", " ('李昱', 1),\n", " ('唐赟', 1),\n", " ('李峰', 1),\n", " ('姜锋', 1),\n", " ('吴尚伟', 1),\n", " ('夏明月', 1),\n", " ('宋海娟', 1),\n", " ('张弘', 1),\n", " ('韩海平', 1),\n", " ('黄稚(休假)', 1),\n", " ('HANYILING(代理)', 1),\n", " ('提云涛', 1),\n", " ('郑伟', 1),\n", " ('江峰', 1),\n", " ('王培', 1),\n", " ('王健', 1),\n", " ('许文星', 1),\n", " ('魏博', 1),\n", " ('华李成', 1),\n", " ('尹华龙', 1),\n", " ('章潇枫', 1),\n", " ('陈士俊', 1),\n", " ('王剑', 1),\n", " ('胡振仓', 1),\n", " ('苏宁', 1),\n", " ('庄园', 1),\n", " ('张翼飞', 1),\n", " ('李君', 1),\n", " ('徐黄玮', 1),\n", " ('施荣盛', 1),\n", " ('陈一峰', 1),\n", " ('吴坚', 1),\n", " ('张鹏程', 1),\n", " ('林柏川', 1),\n", " ('胡德军', 1),\n", " ('朱然', 1),\n", " ('盖俊龙', 1),\n", " ('潘天奇', 1),\n", " ('韩冬', 1),\n", " ('孙伟', 1),\n", " ('李响', 1),\n", " ('周杨', 1),\n", " ('张伟锋', 1),\n", " ('马斌博', 1),\n", " ('梁辰', 1),\n", " ('谈洁颖', 1),\n", " ('聂毅翔', 1),\n", " ('戴计辉', 1),\n", " ('荣膺', 1),\n", " ('李明阳', 1),\n", " ('邹维', 1),\n", " ('史博', 1),\n", " ('刘明宇', 1),\n", " ('何旻', 1),\n", " ('杨瑨', 1),\n", " ('刘江', 1),\n", " ('刘宁', 1),\n", " ('王鑫晨', 1),\n", " ('谭丽', 1),\n", " ('陆丛凡', 1),\n", " ('楼华锋', 1),\n", " ('陈伯祯', 1),\n", " ('刘珈吟', 1),\n", " ('苏秉毅', 1),\n", " ('夏高', 1)]" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sort_name" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
基金代码基金简称最新规模-万实时价格涨跌幅成交额-万净值日期单位净值累计净值折溢价率申购状态申赎状态基金经理成立日期管理人名称实时估值更新时间实时净值溢价率
85161125易标普500指数(QDII-LOF)43073.601.5813.40441.02020-09-021.52941.52943.373870开放开放范冰、刘树荣2016-12-02易方达基金管理有限公司02020-09-04 08:35:251.5293.374
86161126易标普医疗保健指数(QDII-LOF)6061.991.5261.5349.02020-09-021.52341.52340.170671开放开放范冰2016-11-28易方达基金管理有限公司02020-09-04 08:35:261.5230.171
87161127易标普生物科技指数(QDII-LOF)9883.411.590-0.3825.02020-09-021.57821.57820.747687开放开放范冰2016-12-13易方达基金管理有限公司02020-09-04 08:35:391.5780.748
88161128易标普信息科技指数(QDII-LOF)109853.002.5241.941674.02020-09-022.41482.41484.522110开放开放范冰2016-12-13易方达基金管理有限公司02020-09-04 08:35:262.4154.522
89161129易原油(QDII-LOF-FOF)A54247.500.605-0.66785.02020-09-020.54700.547010.603300暂停开放范冰、成曦2016-12-19易方达基金管理有限公司02020-09-04 08:35:440.54710.603
90161130易纳斯达克100指数(QDII-LOF)73146.102.1601.272656.02020-09-022.00012.00017.994600开放开放范冰2017-06-23易方达基金管理有限公司02020-09-04 08:35:262.0007.995
\n", "
" ], "text/plain": [ " 基金代码 基金简称 最新规模-万 实时价格 涨跌幅 ... 管理人名称 实时估值 更新时间 实时净值 溢价率\n", "85 161125 易标普500指数(QDII-LOF) 43073.60 1.581 3.40 ... 易方达基金管理有限公司 0 2020-09-04 08:35:25 1.529 3.374\n", "86 161126 易标普医疗保健指数(QDII-LOF) 6061.99 1.526 1.53 ... 易方达基金管理有限公司 0 2020-09-04 08:35:26 1.523 0.171\n", "87 161127 易标普生物科技指数(QDII-LOF) 9883.41 1.590 -0.38 ... 易方达基金管理有限公司 0 2020-09-04 08:35:39 1.578 0.748\n", "88 161128 易标普信息科技指数(QDII-LOF) 109853.00 2.524 1.94 ... 易方达基金管理有限公司 0 2020-09-04 08:35:26 2.415 4.522\n", "89 161129 易原油(QDII-LOF-FOF)A 54247.50 0.605 -0.66 ... 易方达基金管理有限公司 0 2020-09-04 08:35:44 0.547 10.603\n", "90 161130 易纳斯达克100指数(QDII-LOF) 73146.10 2.160 1.27 ... 易方达基金管理有限公司 0 2020-09-04 08:35:26 2.000 7.995\n", "\n", "[6 rows x 19 columns]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['基金经理'].str.contains('范冰')]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3-final" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/基金年度收益.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "import numpy as np\n", "import pandas as pd\n", "sys.path.append('..')\n", "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def convertor(x):\n", " try:\n", " x=float(x)\n", " except:\n", " x=-9999\n", " return x" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "\n", "df['今年来']=df['今年来'].map(convertor)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "del df['布吉岛2']\n", "del df['布吉岛3']\n", "del df['布吉岛4']" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [], "source": [ "turnover_db = DBSelector().mongo('qq')['db_stock']['turnover_2021_12_15']" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "doc_name = 'ttjj_rank_2024_01_19'\n", "rank_db = DBSelector().mongo('qq')['db_stock'][doc_name]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# rank\n", "result_list=[]\n", "for item in rank_db.find():\n", " del item['_id']\n", " result_list.append(item)\n", "rank_df = pd.DataFrame(result_list)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "14774" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_df)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
typecrawl_date基金代码基金简称缩写日期单位净值累计净值日增长率(%)近1周增幅...成立来成立日期购买手续费折扣自定义手续费原价?手续费折后?布吉岛1布吉岛2布吉岛3布吉岛4
0指数2024-01-19017116浦银安盛中证光伏产业ETF联接APYASZZGFCYETFLJA2024-01-180.61130.61133.050.89...-38.872023-01-041-38.97371.20%0.12%10.12%1
1指数2024-01-19017117浦银安盛中证光伏产业ETF联接CPYASZZGFCYETFLJC2024-01-180.60890.60893.050.89...-39.112023-01-041-39.20730.00%
2指数2024-01-19015299华夏纳斯达克100ETF发起式联接(QDII)AHXNSDK100ETFFQSLJQDIIA2024-01-181.3051.3051.391.33...30.52022-04-14154.05501.20%0.12%10.12%1
3指数2024-01-19015300华夏纳斯达克100ETF发起式联接(QDII)CHXNSDK100ETFFQSLJQDIIC2024-01-181.29821.29821.41.33...29.822022-04-14153.61500.00%
4指数2024-01-19017091景顺长城纳斯达克科技ETF联接(QDII)A人民币JSCCNSDKKJETFLJQDIIARMB2024-01-171.48791.4879-0.640.94...48.792022-12-0911.20%0.12%10.12%1
\n", "

5 rows × 27 columns

\n", "
" ], "text/plain": [ " type crawl_date 基金代码 基金简称 \\\n", "0 指数 2024-01-19 017116 浦银安盛中证光伏产业ETF联接A \n", "1 指数 2024-01-19 017117 浦银安盛中证光伏产业ETF联接C \n", "2 指数 2024-01-19 015299 华夏纳斯达克100ETF发起式联接(QDII)A \n", "3 指数 2024-01-19 015300 华夏纳斯达克100ETF发起式联接(QDII)C \n", "4 指数 2024-01-19 017091 景顺长城纳斯达克科技ETF联接(QDII)A人民币 \n", "\n", " 缩写 日期 单位净值 累计净值 日增长率(%) 近1周增幅 ... \\\n", "0 PYASZZGFCYETFLJA 2024-01-18 0.6113 0.6113 3.05 0.89 ... \n", "1 PYASZZGFCYETFLJC 2024-01-18 0.6089 0.6089 3.05 0.89 ... \n", "2 HXNSDK100ETFFQSLJQDIIA 2024-01-18 1.305 1.305 1.39 1.33 ... \n", "3 HXNSDK100ETFFQSLJQDIIC 2024-01-18 1.2982 1.2982 1.4 1.33 ... \n", "4 JSCCNSDKKJETFLJQDIIARMB 2024-01-17 1.4879 1.4879 -0.64 0.94 ... \n", "\n", " 成立来 成立日期 购买手续费折扣 自定义 手续费原价? 手续费折后? 布吉岛1 布吉岛2 布吉岛3 布吉岛4 \n", "0 -38.87 2023-01-04 1 -38.9737 1.20% 0.12% 1 0.12% 1 \n", "1 -39.11 2023-01-04 1 -39.2073 0.00% \n", "2 30.5 2022-04-14 1 54.0550 1.20% 0.12% 1 0.12% 1 \n", "3 29.82 2022-04-14 1 53.6150 0.00% \n", "4 48.79 2022-12-09 1 1.20% 0.12% 1 0.12% 1 \n", "\n", "[5 rows x 27 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_df.head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
typecrawl_date基金代码基金简称缩写日期单位净值累计净值日增长率(%)近1周增幅...成立来成立日期购买手续费折扣自定义手续费原价?手续费折后?布吉岛1布吉岛2布吉岛3布吉岛4
\n", "

0 rows × 27 columns

\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [type, crawl_date, 基金代码, 基金简称, 缩写, 日期, 单位净值, 累计净值, 日增长率(%), 近1周增幅, 近1月增幅, 近3月增幅, 近6月增幅, 近1年增幅, 近2年增幅, 近3年增幅, 今年来, 成立来, 成立日期, 购买手续费折扣, 自定义, 手续费原价?, 手续费折后?, 布吉岛1, 布吉岛2, 布吉岛3, 布吉岛4]\n", "Index: []\n", "\n", "[0 rows x 27 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_df[rank_df.duplicated(['基金代码'])] # 查重" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "rank_df = rank_df.sort_values(by='今年来',ascending=False)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "del rank_df['布吉岛1']\n", "del rank_df['布吉岛2']\n", "del rank_df['布吉岛3']\n", "del rank_df['布吉岛4']\n", "del rank_df['手续费原价?']\n", "del rank_df['手续费折后?']\n", "del rank_df['购买手续费折扣']\n", "del rank_df['自定义']\n", "del rank_df['缩写']" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "del rank_df['crawl_date']\n", "# del rank_df['crawl_date']\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称日期单位净值累计净值日增长率(%)近1周增幅近1月增幅近3月增幅近6月增幅近1年增幅近2年增幅近3年增幅今年来成立来成立日期
2368股票006692金信消费升级股票A2024-01-181.41832.1737-0.291.64.254.49-12.75-18.71-11.64-8.185.31121.632019-01-31
2369股票006693金信消费升级股票C2024-01-181.44222.18-0.291.584.184.28-13.1-19.36-13.04-10.355.27113.092019-01-31
3291混合011134广发价值优选混合A2024-01-180.84480.84480.152.184.850.68-10.9-14.32-23.214.58-15.522021-03-22
3292混合011135广发价值优选混合C2024-01-180.83530.83530.162.184.820.59-11.07-14.66-23.834.57-16.472021-03-22
3293混合008297广发价值优势混合2024-01-181.26131.26130.152.084.840.97-10.69-13.92-23-27.34.3526.132020-03-02
\n", "
" ], "text/plain": [ " type 基金代码 基金简称 日期 单位净值 累计净值 日增长率(%) 近1周增幅 近1月增幅 \\\n", "2368 股票 006692 金信消费升级股票A 2024-01-18 1.4183 2.1737 -0.29 1.6 4.25 \n", "2369 股票 006693 金信消费升级股票C 2024-01-18 1.4422 2.18 -0.29 1.58 4.18 \n", "3291 混合 011134 广发价值优选混合A 2024-01-18 0.8448 0.8448 0.15 2.18 4.85 \n", "3292 混合 011135 广发价值优选混合C 2024-01-18 0.8353 0.8353 0.16 2.18 4.82 \n", "3293 混合 008297 广发价值优势混合 2024-01-18 1.2613 1.2613 0.15 2.08 4.84 \n", "\n", " 近3月增幅 近6月增幅 近1年增幅 近2年增幅 近3年增幅 今年来 成立来 成立日期 \n", "2368 4.49 -12.75 -18.71 -11.64 -8.18 5.31 121.63 2019-01-31 \n", "2369 4.28 -13.1 -19.36 -13.04 -10.35 5.27 113.09 2019-01-31 \n", "3291 0.68 -10.9 -14.32 -23.21 4.58 -15.52 2021-03-22 \n", "3292 0.59 -11.07 -14.66 -23.83 4.57 -16.47 2021-03-22 \n", "3293 0.97 -10.69 -13.92 -23 -27.3 4.35 26.13 2020-03-02 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_df.head()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "14774" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_df)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "rank_df['今年来'] = rank_df['今年来'].map(convertor)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2837" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_df[rank_df['今年来']>0])" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "type\n", "fof 32\n", "qdii 42\n", "债券 2106\n", "指数 372\n", "混合 261\n", "股票 24\n", "Name: 基金代码, dtype: int64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "positive_fund = rank_df[rank_df['今年来']>0]\n", "positive_fund.groupby('type').count()['基金代码']" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "type\n", "fof 813\n", "qdii 185\n", "债券 3211\n", "指数 2345\n", "混合 7250\n", "股票 922\n", "Name: 基金代码, dtype: int64" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_df_no_dup.groupby('type').count()['基金代码']" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "48" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_df[rank_df['今年来']==-9999.0])" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "rank_df_no_dup = rank_df[~(rank_df['今年来']==-9999.0)]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fof -2.43\n", "qdii -1.99\n", "债券 0.11\n", "指数 -5.0\n", "混合 -5.66\n", "股票 -7.06\n" ] } ], "source": [ "for type,rows in rank_df_no_dup.groupby('type'):\n", " print(type,round(rows['今年来'].median(),2))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-9999.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_df[rank_df['type']=='qdii']['今年来'].min()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
typecrawl_date基金代码基金简称缩写日期单位净值累计净值日增长率(%)近1周增幅...成立来成立日期购买手续费折扣自定义手续费原价?手续费折后?布吉岛1布吉岛2布吉岛3布吉岛4
10543混合2024-01-19020361中海蓝筹混合CZHLCHHC2024-01-180.65470.65470.280.06...-1.772024-01-041-1.7704430.00%
2354指数2024-01-19019919招商中证2000指数增强CZSZZ2000ZSZQC2024-01-180.9750.975-0.86-3.55...-2.52024-01-021-2.50.00%
2353指数2024-01-19020104易方达中证石化产业ETF联接发起式AYFDZZSHCYETFLJFQSA2024-01-190.97320.9732-0.01-2.09...-2.682024-01-051-2.671.20%0.12%10.12%1
2352指数2024-01-19019409易方达中证港股通中国100ETF联接发起式CYFDZZGGTZG100ETFLJFQSC2024-01-190.94780.9478-0.84-5.02...-5.222024-01-041-4.420.00%
14773债券2024-01-19020605长城稳健增利债券ECCWJZLZQE2024-01-181.13281.1328...02024-01-18100.00%
\n", "

5 rows × 27 columns

\n", "
" ], "text/plain": [ " type crawl_date 基金代码 基金简称 \\\n", "10543 混合 2024-01-19 020361 中海蓝筹混合C \n", "2354 指数 2024-01-19 019919 招商中证2000指数增强C \n", "2353 指数 2024-01-19 020104 易方达中证石化产业ETF联接发起式A \n", "2352 指数 2024-01-19 019409 易方达中证港股通中国100ETF联接发起式C \n", "14773 债券 2024-01-19 020605 长城稳健增利债券E \n", "\n", " 缩写 日期 单位净值 累计净值 日增长率(%) 近1周增幅 ... \\\n", "10543 ZHLCHHC 2024-01-18 0.6547 0.6547 0.28 0.06 ... \n", "2354 ZSZZ2000ZSZQC 2024-01-18 0.975 0.975 -0.86 -3.55 ... \n", "2353 YFDZZSHCYETFLJFQSA 2024-01-19 0.9732 0.9732 -0.01 -2.09 ... \n", "2352 YFDZZGGTZG100ETFLJFQSC 2024-01-19 0.9478 0.9478 -0.84 -5.02 ... \n", "14773 CCWJZLZQE 2024-01-18 1.1328 1.1328 ... \n", "\n", " 成立来 成立日期 购买手续费折扣 自定义 手续费原价? 手续费折后? 布吉岛1 布吉岛2 布吉岛3 \\\n", "10543 -1.77 2024-01-04 1 -1.770443 0.00% \n", "2354 -2.5 2024-01-02 1 -2.5 0.00% \n", "2353 -2.68 2024-01-05 1 -2.67 1.20% 0.12% 1 0.12% 1 \n", "2352 -5.22 2024-01-04 1 -4.42 0.00% \n", "14773 0 2024-01-18 1 0 0.00% \n", "\n", " 布吉岛4 \n", "10543 \n", "2354 \n", "2353 \n", "2352 \n", "14773 \n", "\n", "[5 rows x 27 columns]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_df.tail()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "rank_df.to_excel('ttjj_rank_2024_01_19.xlsx',index=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 换手率" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\anaconda\\lib\\site-packages\\numpy\\core\\fromnumeric.py:3372: RuntimeWarning: Mean of empty slice.\n", " return _methods._mean(a, axis=axis, dtype=dtype,\n", "C:\\anaconda\\lib\\site-packages\\numpy\\core\\_methods.py:170: RuntimeWarning: invalid value encountered in double_scalars\n", " ret = ret.dtype.type(ret / rcount)\n" ] } ], "source": [ "result_list=[]\n", "for item in turnover_db.find():\n", " item_dict={}\n", " item_dict['code']=item['code']\n", " \n", " rate_list = item['turnover_rate']\n", " item_dict['kind']=item['kind']\n", " turnover_num=None\n", " sum_turnover=[]\n", " for r in rate_list:\n", " # r.get('REPORTDATE')=='2021-06-30':\n", " turnover_num=r.get('STOCKTURNOVER')\n", " sum_turnover.append(turnover_num)\n", "\n", " t_mean=np.mean(sum_turnover) \n", " item_dict['turnover']=t_mean\n", " result_list.append(item_dict)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "turnover_rate_df = pd.DataFrame(result_list)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9600" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(turnover_rate_df)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "turnover_rate_df=turnover_rate_df[turnover_rate_df['turnover'].notnull()]" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "set()" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "set(index_code)&set(stock_code)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [], "source": [ "rank_list=[]\n", "for item in rank_db.find({},{'_id':0}):\n", " rank_list.append(item)" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [], "source": [ "rank_df = pd.DataFrame(rank_list)" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11575" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_df)" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "rank_df_new=rank_df[(rank_df['type']=='股票')|(rank_df['type']=='混合')]" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7181" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_df_new)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
typecrawl_date基金代码基金简称缩写日期单位净值累计净值日增长率(%)近1周增幅...成立来成立日期购买手续费折扣自定义手续费原价?手续费折后?布吉岛1布吉岛2布吉岛3布吉岛4
\n", "

0 rows × 27 columns

\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [type, crawl_date, 基金代码, 基金简称, 缩写, 日期, 单位净值, 累计净值, 日增长率(%), 近1周增幅, 近1月增幅, 近3月增幅, 近6月增幅, 近1年增幅, 近2年增幅, 近3年增幅, 今年来, 成立来, 成立日期, 购买手续费折扣, 自定义, 手续费原价?, 手续费折后?, 布吉岛1, 布吉岛2, 布吉岛3, 布吉岛4]\n", "Index: []\n", "\n", "[0 rows x 27 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_df_new[rank_df_new.duplicated(['基金代码'])]" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover = pd.merge(rank_df_new,turnover_rate_df,how='inner',left_on='基金代码',right_on='code')" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7181" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_df_new)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4933" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(turnover_rate_df['code'].values)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4933" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(set(turnover_rate_df['code'].values))" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7181" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_fund_turnover_simple)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover.head()" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover_simple=rank_fund_turnover[['type','基金代码','基金简称','今年来','成立来','turnover','累计净值','成立日期']]" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期
0股票005669前海开源公用事业股票122.24269.2399.3028573.69232018-03-23
1股票004784招商稳健优选股票69.90270.29347.7987503.70292017-09-20
2股票000729建信中小盘先锋股票A67.22322.40534.2464294.22402014-08-20
3股票001245工银生态环境股票66.24197.40254.5000002.97402015-06-02
4股票009147建信新能源行业股票65.94186.84178.6550002.86842020-06-17
\n", "
" ], "text/plain": [ " type 基金代码 基金简称 今年来 成立来 turnover 累计净值 成立日期\n", "0 股票 005669 前海开源公用事业股票 122.24 269.23 99.302857 3.6923 2018-03-23\n", "1 股票 004784 招商稳健优选股票 69.90 270.29 347.798750 3.7029 2017-09-20\n", "2 股票 000729 建信中小盘先锋股票A 67.22 322.40 534.246429 4.2240 2014-08-20\n", "3 股票 001245 工银生态环境股票 66.24 197.40 254.500000 2.9740 2015-06-02\n", "4 股票 009147 建信新能源行业股票 65.94 186.84 178.655000 2.8684 2020-06-17" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple.head()" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 7181 entries, 0 to 7180\n", "Data columns (total 8 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 type 7181 non-null object \n", " 1 基金代码 7181 non-null object \n", " 2 基金简称 7181 non-null object \n", " 3 今年来 5381 non-null float64\n", " 4 成立来 7181 non-null float64\n", " 5 turnover 5587 non-null float64\n", " 6 累计净值 7181 non-null object \n", " 7 成立日期 7181 non-null object \n", "dtypes: float64(3), object(5)\n", "memory usage: 504.9+ KB\n" ] } ], "source": [ "rank_fund_turnover_simple.info()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " rank_fund_turnover_simple['今年来']=rank_fund_turnover_simple['今年来'].map(convertor)\n", ":2: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " rank_fund_turnover_simple['成立来']=rank_fund_turnover_simple['成立来'].map(convertor)\n" ] } ], "source": [ "rank_fund_turnover_simple['今年来']=rank_fund_turnover_simple['今年来'].map(convertor)\n", "rank_fund_turnover_simple['成立来']=rank_fund_turnover_simple['成立来'].map(convertor)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 5587 entries, 0 to 5586\n", "Data columns (total 7 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 type 5587 non-null object \n", " 1 基金代码 5587 non-null object \n", " 2 基金简称 5587 non-null object \n", " 3 今年来 5587 non-null float64\n", " 4 成立来 5587 non-null float64\n", " 5 turnover 5587 non-null float64\n", " 6 累计净值 5587 non-null object \n", "dtypes: float64(3), object(4)\n", "memory usage: 349.2+ KB\n" ] } ], "source": [ "rank_fund_turnover_simple.info()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "pd.set_option('display.max_rows',None)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover_simple.sort_values(by='成立来',ascending=False).head(50).to_excel('1110.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 50.000000\n", "mean 190.172400\n", "std 192.410815\n", "min 17.960000\n", "25% 79.732500\n", "50% 117.380000\n", "75% 243.692500\n", "max 1202.400000\n", "Name: turnover, dtype: float64" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple.sort_values(by='成立来',ascending=False).head(50)['turnover'].describe()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover_simple.sort_values(by='成立来',ascending=True).head(40)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover_simple.sort_values(by='成立来',ascending=True).head(50).to_excel('2220.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 50.000000\n", "mean 232.557079\n", "std 84.453710\n", "min 106.232941\n", "25% 179.503714\n", "50% 220.323833\n", "75% 273.613534\n", "max 477.521562\n", "Name: turnover, dtype: float64" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple.sort_values(by='成立来',ascending=False).head(50)['turnover'].describe()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover_simple_new=rank_fund_turnover_simple[rank_fund_turnover_simple['今年来']!=-9999]" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 50.000000\n", "mean 138.607154\n", "std 113.426761\n", "min 9.865000\n", "25% 68.684148\n", "50% 112.135000\n", "75% 161.401111\n", "max 530.025833\n", "Name: turnover, dtype: float64" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple_new.sort_values(by='成立来',ascending=True).head(50)['turnover'].describe()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover_simple_new.sort_values(by='成立来',ascending=True).head(50).to_excel(\"3330.xlsx\",encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import os\n" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([882., 926., 762., 598., 490., 368., 272., 215., 129., 84., 68.,\n", " 53., 52., 18., 30., 16., 17., 10., 5., 5., 2., 6.,\n", " 2., 0., 1., 0., 2., 1., 0., 0., 0., 0., 2.,\n", " 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 2.]),\n", " array([2.65000000e-01, 6.16151944e+01, 1.22965389e+02, 1.84315583e+02,\n", " 2.45665778e+02, 3.07015972e+02, 3.68366167e+02, 4.29716361e+02,\n", " 4.91066556e+02, 5.52416750e+02, 6.13766944e+02, 6.75117139e+02,\n", " 7.36467333e+02, 7.97817528e+02, 8.59167722e+02, 9.20517917e+02,\n", " 9.81868111e+02, 1.04321831e+03, 1.10456850e+03, 1.16591869e+03,\n", " 1.22726889e+03, 1.28861908e+03, 1.34996928e+03, 1.41131947e+03,\n", " 1.47266967e+03, 1.53401986e+03, 1.59537006e+03, 1.65672025e+03,\n", " 1.71807044e+03, 1.77942064e+03, 1.84077083e+03, 1.90212103e+03,\n", " 1.96347122e+03, 2.02482142e+03, 2.08617161e+03, 2.14752181e+03,\n", " 2.20887200e+03, 2.27022219e+03, 2.33157239e+03, 2.39292258e+03,\n", " 2.45427278e+03, 2.51562297e+03, 2.57697317e+03, 2.63832336e+03,\n", " 2.69967356e+03, 2.76102375e+03, 2.82237394e+03, 2.88372414e+03,\n", " 2.94507433e+03, 3.00642453e+03, 3.06777472e+03, 3.12912492e+03,\n", " 3.19047511e+03, 3.25182531e+03, 3.31317550e+03, 3.37452569e+03,\n", " 3.43587589e+03, 3.49722608e+03, 3.55857628e+03, 3.61992647e+03,\n", " 3.68127667e+03, 3.74262686e+03, 3.80397706e+03, 3.86532725e+03,\n", " 3.92667744e+03, 3.98802764e+03, 4.04937783e+03, 4.11072803e+03,\n", " 4.17207822e+03, 4.23342842e+03, 4.29477861e+03, 4.35612881e+03,\n", " 4.41747900e+03, 4.47882919e+03, 4.54017939e+03, 4.60152958e+03,\n", " 4.66287978e+03, 4.72422997e+03, 4.78558017e+03, 4.84693036e+03,\n", " 4.90828056e+03, 4.96963075e+03, 5.03098094e+03, 5.09233114e+03,\n", " 5.15368133e+03, 5.21503153e+03, 5.27638172e+03, 5.33773192e+03,\n", " 5.39908211e+03, 5.46043231e+03, 5.52178250e+03, 5.58313269e+03,\n", " 5.64448289e+03, 5.70583308e+03, 5.76718328e+03, 5.82853347e+03,\n", " 5.88988367e+03, 5.95123386e+03, 6.01258406e+03, 6.07393425e+03,\n", " 6.13528444e+03]),\n", " )" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(rank_fund_turnover_simple_new['turnover'],bins=100,color='red',alpha=0.75)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 5020.000000\n", "mean 238.652873\n", "std 244.260390\n", "min 0.265000\n", "25% 84.308583\n", "50% 178.617727\n", "75% 324.389722\n", "max 6135.284444\n", "Name: turnover, dtype: float64" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple_new['turnover'].describe()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3184" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple_new['turnover'].argmax()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "type 混合\n", "基金代码 003373\n", "基金简称 大成景禄灵活配置混合A\n", "今年来 6.74\n", "成立来 52.61\n", "turnover 6135.28\n", "累计净值 1.5261\n", "Name: 3293, dtype: object" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple_new.iloc[3184]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover_simple_new.sort_values('turnover',ascending=False)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "t=rank_fund_turnover[['基金代码','成立日期']]" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "merge_df = pd.merge(rank_fund_turnover_simple_new,t,how='inner',left_on='基金代码',right_on='基金代码')" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期
0股票005669前海开源公用事业股票122.24269.2399.3028573.69232018-03-23
1股票004784招商稳健优选股票69.90270.29347.7987503.70292017-09-20
2股票000729建信中小盘先锋股票A67.22322.40534.2464294.22402014-08-20
3股票001245工银生态环境股票66.24197.40254.5000002.97402015-06-02
4股票009147建信新能源行业股票65.94186.84178.6550002.86842020-06-17
\n", "
" ], "text/plain": [ " type 基金代码 基金简称 今年来 成立来 turnover 累计净值 成立日期\n", "0 股票 005669 前海开源公用事业股票 122.24 269.23 99.302857 3.6923 2018-03-23\n", "1 股票 004784 招商稳健优选股票 69.90 270.29 347.798750 3.7029 2017-09-20\n", "2 股票 000729 建信中小盘先锋股票A 67.22 322.40 534.246429 4.2240 2014-08-20\n", "3 股票 001245 工银生态环境股票 66.24 197.40 254.500000 2.9740 2015-06-02\n", "4 股票 009147 建信新能源行业股票 65.94 186.84 178.655000 2.8684 2020-06-17" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merge_df.head()" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "now = datetime.datetime.now()\n", "\n", "def calc_year(x):\n", " built_date = datetime.datetime.strptime(x,\"%Y-%m-%d\")\n", " day=(now-built_date).days/365\n", " return day\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rank_fund_turnover_simple_new" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.736986301369863" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "calc_year('2018-03-23')" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " rank_fund_turnover_simple['成立区间']=rank_fund_turnover_simple['成立日期'].map(calc_year)\n" ] } ], "source": [ "rank_fund_turnover_simple['成立区间']=rank_fund_turnover_simple['成立日期'].map(calc_year)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期成立区间
0股票005669前海开源公用事业股票122.24269.2399.3028573.69232018-03-233.739726
1股票004784招商稳健优选股票69.90270.29347.7987503.70292017-09-204.243836
2股票000729建信中小盘先锋股票A67.22322.40534.2464294.22402014-08-207.331507
3股票001245工银生态环境股票66.24197.40254.5000002.97402015-06-026.547945
4股票009147建信新能源行业股票65.94186.84178.6550002.86842020-06-171.501370
\n", "
" ], "text/plain": [ " type 基金代码 基金简称 今年来 成立来 turnover 累计净值 成立日期 \\\n", "0 股票 005669 前海开源公用事业股票 122.24 269.23 99.302857 3.6923 2018-03-23 \n", "1 股票 004784 招商稳健优选股票 69.90 270.29 347.798750 3.7029 2017-09-20 \n", "2 股票 000729 建信中小盘先锋股票A 67.22 322.40 534.246429 4.2240 2014-08-20 \n", "3 股票 001245 工银生态环境股票 66.24 197.40 254.500000 2.9740 2015-06-02 \n", "4 股票 009147 建信新能源行业股票 65.94 186.84 178.655000 2.8684 2020-06-17 \n", "\n", " 成立区间 \n", "0 3.739726 \n", "1 4.243836 \n", "2 7.331507 \n", "3 6.547945 \n", "4 1.501370 " ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple.head()" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "merge_df['累计净值']=merge_df['累计净值'].astype(float)\n" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期年化
0股票005669前海开源公用事业股票122.24269.2399.3028573.69232018-03-230.720447
1股票004784招商稳健优选股票69.90270.29347.7987503.70292017-09-200.637312
2股票000729建信中小盘先锋股票A67.22322.40534.2464294.22402014-08-200.439910
3股票001245工银生态环境股票66.24197.40254.5000002.97402015-06-020.301595
4股票009147建信新能源行业股票65.94186.84178.6550002.86842020-06-171.246739
\n", "
" ], "text/plain": [ " type 基金代码 基金简称 今年来 成立来 turnover 累计净值 成立日期 \\\n", "0 股票 005669 前海开源公用事业股票 122.24 269.23 99.302857 3.6923 2018-03-23 \n", "1 股票 004784 招商稳健优选股票 69.90 270.29 347.798750 3.7029 2017-09-20 \n", "2 股票 000729 建信中小盘先锋股票A 67.22 322.40 534.246429 4.2240 2014-08-20 \n", "3 股票 001245 工银生态环境股票 66.24 197.40 254.500000 2.9740 2015-06-02 \n", "4 股票 009147 建信新能源行业股票 65.94 186.84 178.655000 2.8684 2020-06-17 \n", "\n", " 年化 \n", "0 0.720447 \n", "1 0.637312 \n", "2 0.439910 \n", "3 0.301595 \n", "4 1.246739 " ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merge_df.head()" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "def profit(x):\n", " return (x['成立来']*0.01+1)**(1/x['成立区间'])-1" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.41421356237309515" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profit(2,2)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.9880999999999998" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(1+0.41)**2" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " rank_fund_turnover_simple['年化收益']=rank_fund_turnover_simple.apply(profit,axis=1)\n" ] } ], "source": [ "rank_fund_turnover_simple['年化收益']=rank_fund_turnover_simple.apply(profit,axis=1)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期成立区间年化收益
0股票005669前海开源公用事业股票122.24269.2399.3028573.69232018-03-233.7397260.418061
1股票004784招商稳健优选股票69.90270.29347.7987503.70292017-09-204.2438360.361347
2股票000729建信中小盘先锋股票A67.22322.40534.2464294.22402014-08-207.3315070.217159
3股票001245工银生态环境股票66.24197.40254.5000002.97402015-06-026.5479450.181105
4股票009147建信新能源行业股票65.94186.84178.6550002.86842020-06-171.5013701.017506
\n", "
" ], "text/plain": [ " type 基金代码 基金简称 今年来 成立来 turnover 累计净值 成立日期 \\\n", "0 股票 005669 前海开源公用事业股票 122.24 269.23 99.302857 3.6923 2018-03-23 \n", "1 股票 004784 招商稳健优选股票 69.90 270.29 347.798750 3.7029 2017-09-20 \n", "2 股票 000729 建信中小盘先锋股票A 67.22 322.40 534.246429 4.2240 2014-08-20 \n", "3 股票 001245 工银生态环境股票 66.24 197.40 254.500000 2.9740 2015-06-02 \n", "4 股票 009147 建信新能源行业股票 65.94 186.84 178.655000 2.8684 2020-06-17 \n", "\n", " 成立区间 年化收益 \n", "0 3.739726 0.418061 \n", "1 4.243836 0.361347 \n", "2 7.331507 0.217159 \n", "3 6.547945 0.181105 \n", "4 1.501370 1.017506 " ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "merge_df.sort_values('年化收益',ascending=False).head(50)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "merge_df.sort_values('turnover',ascending=False).head(50)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期成立区间年化收益
3293混合003373大成景禄灵活配置混合A6.7452.616135.2844441.52612016-09-295.2191780.084363
3318混合003374大成景禄灵活配置混合C6.6452.466135.2844441.52462016-09-295.2191780.084159
4984混合007875国融融兴混合A-11.3618.722415.2200001.18722019-11-052.1178080.084399
4996混合007876国融融兴混合C-11.5418.212415.2200001.18212019-11-052.1178080.082197
1555混合005856中科沃土沃瑞混合C49.86231.501995.4100003.31502019-01-142.9260270.506193
1554混合005855中科沃土沃瑞混合A50.29235.411995.4100003.35412019-01-142.9260270.512241
2974混合003238新华外延增长主题灵活配置混合8.45170.671666.8877782.70672017-03-024.7972600.230674
220股票003647创金合信中证1000指数增强C23.0971.821599.1922221.71822016-12-224.9890410.114597
215股票003646创金合信中证1000指数增强A23.3273.811599.1922221.73812016-12-224.9890410.117173
3747混合004557北信瑞丰鼎丰灵活配置混合4.7838.901491.3633331.38902019-11-132.0958900.169733
212股票003578中金中证500C23.4474.591403.0755561.88502016-11-285.0547950.116553
2139混合001897九泰久盛量化先锋混合A20.4690.831396.0545451.802015-11-106.1068490.111619
2185混合004510九泰久盛量化先锋混合C19.5475.461333.4957141.75302017-05-164.5917810.130257
204股票003016中金中证500A23.9289.681327.9060001.89682016-07-225.4082190.125660
4826混合519157新华行业灵活配置混合C-6.84109.421323.9650002.09422015-08-016.3835620.122763
657股票900029中信证券量化优选A6.4455.861304.9100002.34132020-05-221.5726030.326043
683股票900030中信证券量化优选C5.6253.941304.9100002.32472020-05-221.5726030.315633
3639混合005290诺德新盛灵活配置混合A5.3261.841301.2228571.61842017-12-203.9945210.128088
119股票005313万家中证1000指数增强A29.29129.911233.0620001.96962018-01-303.8821920.239174
126股票005314万家中证1000指数增强C28.80125.071233.0620001.94242018-01-303.8821920.232402
1900混合004890中邮健康文娱混合27.54176.581219.8642862.76582017-12-134.0136990.288482
1514混合001569泰信国策驱动灵活配置混合57.46148.001189.8908332.482015-10-276.1452050.159280
2433混合003516国泰融安多策略灵活配置混合14.83270.101178.4937503.70102017-07-034.4602740.340967
423股票002311创金合信中证500指数增强A15.0856.871175.4345451.55532015-12-315.9671230.078374
431股票002316创金合信中证500指数增强C14.9756.921175.4345451.55592015-12-315.9671230.078432
1693混合007469中信建投精选混合C36.85116.231159.1150002.16252019-11-292.0520550.456163
1682混合007468中信建投精选混合A37.39118.031159.1150002.18052019-11-292.0520550.462058
1472混合700003平安策略先锋混合77.61625.441125.0811116.732012-05-299.5589040.230358
1804混合008348中信建投甄选混合C30.83110.421118.5050002.10422019-12-231.9863010.454312
1794混合008347中信建投甄选混合A31.33112.101118.5050002.12102019-12-231.9863010.460146
334股票006347安信量化优选股票C17.46130.671091.6766672.30672018-09-033.2904110.289193
325股票006346安信量化优选股票A17.91133.371091.6766672.33372018-09-033.2904110.293760
1991混合001978泰信互联网+混合24.23130.701090.4430002.30702016-06-085.5287670.163229
1659混合002669华商万众创新混合38.90216.001086.6370003.162016-06-285.4739730.233912
1681混合002707大摩科技领先混合37.39120.411085.3900002.20412017-12-134.0136990.217629
4691混合000755富安达新兴成长混合-4.5883.051076.6571431.83052014-09-117.2712330.086703
1372股票010253兴银中证500指数增强ANaN16.291065.8000001.16292021-03-010.7972600.208397
1373股票011205兴银中证500指数增强CNaN16.051065.8000001.16052021-03-010.7972600.205269
2059混合001224中邮新思路灵活配置混合22.09276.901063.4081823.76902015-11-116.1041100.242796
2885混合519097新华中小市值优选混合9.14398.831054.0957144.25442011-01-2810.8931510.158971
4686混合006274圆信永丰医药健康-4.5048.501053.5840001.48502018-11-293.0520550.138324
2628混合002919东吴智慧医疗量化混合A11.8448.251044.6170001.48252016-08-115.3534250.076319
1910混合002564新沃通盈灵活配置混合26.91220.731040.8500002.72702016-09-225.2383560.249171
4981混合002598平安消费精选混合A-11.206.761037.0690001.06762016-06-085.5287670.011902
5005混合002599平安消费精选混合C-11.725.401037.0690001.05402016-06-085.5287670.009558
1583混合519115浦银安盛红利精选混合A46.97358.391036.3336364.58392009-12-0312.0465750.134723
1709混合003822中信建投轮换混合A36.05177.931035.3200002.77932019-01-172.9178080.419538
1712混合003823中信建投轮换混合C35.51174.701035.3200002.74702019-01-172.9178080.413862
1944混合004375华泰保兴吉年丰混合发起C25.90225.741034.8788893.09142017-03-244.7369860.283127
1932混合004374华泰保兴吉年丰混合发起A26.14229.351034.8788893.12512017-03-244.7369860.286115
\n", "
" ], "text/plain": [ " type 基金代码 基金简称 今年来 成立来 turnover 累计净值 \\\n", "3293 混合 003373 大成景禄灵活配置混合A 6.74 52.61 6135.284444 1.5261 \n", "3318 混合 003374 大成景禄灵活配置混合C 6.64 52.46 6135.284444 1.5246 \n", "4984 混合 007875 国融融兴混合A -11.36 18.72 2415.220000 1.1872 \n", "4996 混合 007876 国融融兴混合C -11.54 18.21 2415.220000 1.1821 \n", "1555 混合 005856 中科沃土沃瑞混合C 49.86 231.50 1995.410000 3.3150 \n", "1554 混合 005855 中科沃土沃瑞混合A 50.29 235.41 1995.410000 3.3541 \n", "2974 混合 003238 新华外延增长主题灵活配置混合 8.45 170.67 1666.887778 2.7067 \n", "220 股票 003647 创金合信中证1000指数增强C 23.09 71.82 1599.192222 1.7182 \n", "215 股票 003646 创金合信中证1000指数增强A 23.32 73.81 1599.192222 1.7381 \n", "3747 混合 004557 北信瑞丰鼎丰灵活配置混合 4.78 38.90 1491.363333 1.3890 \n", "212 股票 003578 中金中证500C 23.44 74.59 1403.075556 1.8850 \n", "2139 混合 001897 九泰久盛量化先锋混合A 20.46 90.83 1396.054545 1.80 \n", "2185 混合 004510 九泰久盛量化先锋混合C 19.54 75.46 1333.495714 1.7530 \n", "204 股票 003016 中金中证500A 23.92 89.68 1327.906000 1.8968 \n", "4826 混合 519157 新华行业灵活配置混合C -6.84 109.42 1323.965000 2.0942 \n", "657 股票 900029 中信证券量化优选A 6.44 55.86 1304.910000 2.3413 \n", "683 股票 900030 中信证券量化优选C 5.62 53.94 1304.910000 2.3247 \n", "3639 混合 005290 诺德新盛灵活配置混合A 5.32 61.84 1301.222857 1.6184 \n", "119 股票 005313 万家中证1000指数增强A 29.29 129.91 1233.062000 1.9696 \n", "126 股票 005314 万家中证1000指数增强C 28.80 125.07 1233.062000 1.9424 \n", "1900 混合 004890 中邮健康文娱混合 27.54 176.58 1219.864286 2.7658 \n", "1514 混合 001569 泰信国策驱动灵活配置混合 57.46 148.00 1189.890833 2.48 \n", "2433 混合 003516 国泰融安多策略灵活配置混合 14.83 270.10 1178.493750 3.7010 \n", "423 股票 002311 创金合信中证500指数增强A 15.08 56.87 1175.434545 1.5553 \n", "431 股票 002316 创金合信中证500指数增强C 14.97 56.92 1175.434545 1.5559 \n", "1693 混合 007469 中信建投精选混合C 36.85 116.23 1159.115000 2.1625 \n", "1682 混合 007468 中信建投精选混合A 37.39 118.03 1159.115000 2.1805 \n", "1472 混合 700003 平安策略先锋混合 77.61 625.44 1125.081111 6.73 \n", "1804 混合 008348 中信建投甄选混合C 30.83 110.42 1118.505000 2.1042 \n", "1794 混合 008347 中信建投甄选混合A 31.33 112.10 1118.505000 2.1210 \n", "334 股票 006347 安信量化优选股票C 17.46 130.67 1091.676667 2.3067 \n", "325 股票 006346 安信量化优选股票A 17.91 133.37 1091.676667 2.3337 \n", "1991 混合 001978 泰信互联网+混合 24.23 130.70 1090.443000 2.3070 \n", "1659 混合 002669 华商万众创新混合 38.90 216.00 1086.637000 3.16 \n", "1681 混合 002707 大摩科技领先混合 37.39 120.41 1085.390000 2.2041 \n", "4691 混合 000755 富安达新兴成长混合 -4.58 83.05 1076.657143 1.8305 \n", "1372 股票 010253 兴银中证500指数增强A NaN 16.29 1065.800000 1.1629 \n", "1373 股票 011205 兴银中证500指数增强C NaN 16.05 1065.800000 1.1605 \n", "2059 混合 001224 中邮新思路灵活配置混合 22.09 276.90 1063.408182 3.7690 \n", "2885 混合 519097 新华中小市值优选混合 9.14 398.83 1054.095714 4.2544 \n", "4686 混合 006274 圆信永丰医药健康 -4.50 48.50 1053.584000 1.4850 \n", "2628 混合 002919 东吴智慧医疗量化混合A 11.84 48.25 1044.617000 1.4825 \n", "1910 混合 002564 新沃通盈灵活配置混合 26.91 220.73 1040.850000 2.7270 \n", "4981 混合 002598 平安消费精选混合A -11.20 6.76 1037.069000 1.0676 \n", "5005 混合 002599 平安消费精选混合C -11.72 5.40 1037.069000 1.0540 \n", "1583 混合 519115 浦银安盛红利精选混合A 46.97 358.39 1036.333636 4.5839 \n", "1709 混合 003822 中信建投轮换混合A 36.05 177.93 1035.320000 2.7793 \n", "1712 混合 003823 中信建投轮换混合C 35.51 174.70 1035.320000 2.7470 \n", "1944 混合 004375 华泰保兴吉年丰混合发起C 25.90 225.74 1034.878889 3.0914 \n", "1932 混合 004374 华泰保兴吉年丰混合发起A 26.14 229.35 1034.878889 3.1251 \n", "\n", " 成立日期 成立区间 年化收益 \n", "3293 2016-09-29 5.219178 0.084363 \n", "3318 2016-09-29 5.219178 0.084159 \n", "4984 2019-11-05 2.117808 0.084399 \n", "4996 2019-11-05 2.117808 0.082197 \n", "1555 2019-01-14 2.926027 0.506193 \n", "1554 2019-01-14 2.926027 0.512241 \n", "2974 2017-03-02 4.797260 0.230674 \n", "220 2016-12-22 4.989041 0.114597 \n", "215 2016-12-22 4.989041 0.117173 \n", "3747 2019-11-13 2.095890 0.169733 \n", "212 2016-11-28 5.054795 0.116553 \n", "2139 2015-11-10 6.106849 0.111619 \n", "2185 2017-05-16 4.591781 0.130257 \n", "204 2016-07-22 5.408219 0.125660 \n", "4826 2015-08-01 6.383562 0.122763 \n", "657 2020-05-22 1.572603 0.326043 \n", "683 2020-05-22 1.572603 0.315633 \n", "3639 2017-12-20 3.994521 0.128088 \n", "119 2018-01-30 3.882192 0.239174 \n", "126 2018-01-30 3.882192 0.232402 \n", "1900 2017-12-13 4.013699 0.288482 \n", "1514 2015-10-27 6.145205 0.159280 \n", "2433 2017-07-03 4.460274 0.340967 \n", "423 2015-12-31 5.967123 0.078374 \n", "431 2015-12-31 5.967123 0.078432 \n", "1693 2019-11-29 2.052055 0.456163 \n", "1682 2019-11-29 2.052055 0.462058 \n", "1472 2012-05-29 9.558904 0.230358 \n", "1804 2019-12-23 1.986301 0.454312 \n", "1794 2019-12-23 1.986301 0.460146 \n", "334 2018-09-03 3.290411 0.289193 \n", "325 2018-09-03 3.290411 0.293760 \n", "1991 2016-06-08 5.528767 0.163229 \n", "1659 2016-06-28 5.473973 0.233912 \n", "1681 2017-12-13 4.013699 0.217629 \n", "4691 2014-09-11 7.271233 0.086703 \n", "1372 2021-03-01 0.797260 0.208397 \n", "1373 2021-03-01 0.797260 0.205269 \n", "2059 2015-11-11 6.104110 0.242796 \n", "2885 2011-01-28 10.893151 0.158971 \n", "4686 2018-11-29 3.052055 0.138324 \n", "2628 2016-08-11 5.353425 0.076319 \n", "1910 2016-09-22 5.238356 0.249171 \n", "4981 2016-06-08 5.528767 0.011902 \n", "5005 2016-06-08 5.528767 0.009558 \n", "1583 2009-12-03 12.046575 0.134723 \n", "1709 2019-01-17 2.917808 0.419538 \n", "1712 2019-01-17 2.917808 0.413862 \n", "1944 2017-03-24 4.736986 0.283127 \n", "1932 2017-03-24 4.736986 0.286115 " ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple_new.sort_values('turnover',ascending=False).head(50)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [], "source": [ "rank_remove_AC = rank_fund_turnover_simple.copy() # 移除了AC" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [], "source": [ "def split_AC(x):\n", " if x.endswith(('A','C')):\n", " x=x[:-1]\n", " return x\n", "\n", "rank_remove_AC['parent']=rank_remove_AC['基金简称'].map(split_AC)" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [], "source": [ "def split_C(x):\n", " if x.endswith('C'):\n", " return 'C'\n", " return None\n", "\n", "rank_remove_AC['isC']=rank_remove_AC['基金简称'].map(split_C)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rank_remove_AC.sort_values('turnover',ascending=False).head(50)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC = rank_remove_AC.copy()\n", " " ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [], "source": [ "for index,row in rank_remove_AC[rank_remove_AC['isC']=='C'].iterrows():\n", "\n", " parent = row['parent']\n", " if len(rank_remove_AC[rank_remove_AC['parent']==parent])>1:\n", "\n", " result_rank_remove_AC=result_rank_remove_AC.drop(index)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC.sort_values('turnover',ascending=False).head(50)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4708" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(result_rank_remove_AC)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "type 股票\n", "基金代码 005928\n", "基金简称 创金合信新能源汽车股票C\n", "今年来 61.3\n", "成立来 241.4\n", "turnover 543.763\n", "累计净值 3.4140\n", "成立日期 2018-05-08\n", "成立区间 3.6137\n", "年化收益 0.404647\n", "parent 创金合信新能源汽车股票\n", "isC C\n", "Name: 8, dtype: object" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_remove_AC.iloc[8]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC.sort_values('成立来',ascending=True).head(50)" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC_simple=result_rank_remove_AC[['type',\t'基金代码',\t'基金简称',\t'今年来',\t'成立来',\t'turnover',\t'累计净值',\t'成立日期',\t'年化收益']]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC_simple.sort_values('turnover',ascending=False).tail(50)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期成立区间年化收益parentisC
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [type, 基金代码, 基金简称, 今年来, 成立来, turnover, 累计净值, 成立日期, 成立区间, 年化收益, parent, isC]\n", "Index: []" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_rank_remove_AC[result_rank_remove_AC['基金简称']=='华安证券汇赢增利一年持有混合A']" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
今年来成立来turnover年化收益
count3607.0000003924.0000003924.0000003924.000000
mean10.315403148.231598240.0807240.145564
std16.027595278.785779227.7907550.144417
min-31.420000-72.2500000.750000-0.285147
25%0.23000030.75250088.5408330.072731
50%6.93000073.140000185.8385000.125865
75%17.400000161.292500326.6583890.197252
max122.2400009223.3800006135.2844444.742858
\n", "
" ], "text/plain": [ " 今年来 成立来 turnover 年化收益\n", "count 3607.000000 3924.000000 3924.000000 3924.000000\n", "mean 10.315403 148.231598 240.080724 0.145564\n", "std 16.027595 278.785779 227.790755 0.144417\n", "min -31.420000 -72.250000 0.750000 -0.285147\n", "25% 0.230000 30.752500 88.540833 0.072731\n", "50% 6.930000 73.140000 185.838500 0.125865\n", "75% 17.400000 161.292500 326.658389 0.197252\n", "max 122.240000 9223.380000 6135.284444 4.742858" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_rank_remove_AC_simple.describe()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3924" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_fund_turnover_simple)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5587" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(rank_remove_AC)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC_simple.sort_values('成立来',ascending=False).head(50).to_excel('4441.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " result_rank_remove_AC_simple['年化收益']=result_rank_remove_AC_simple['年化收益']*100\n" ] } ], "source": [ "result_rank_remove_AC_simple['年化收益']=result_rank_remove_AC_simple['年化收益']*100" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
今年来成立来turnover年化收益
count50.00000050.00000050.00000050.000000
mean10.5492001754.962000232.55707926.777715
std16.3013321200.01031184.45371064.611754
min-11.4300001140.290000106.23294114.492094
25%-0.7275001253.312500179.50371416.208983
50%7.2850001396.155000220.32383317.516235
75%16.1975001897.947500273.61353418.739220
max59.3000009223.380000477.521562474.285794
\n", "
" ], "text/plain": [ " 今年来 成立来 turnover 年化收益\n", "count 50.000000 50.000000 50.000000 50.000000\n", "mean 10.549200 1754.962000 232.557079 26.777715\n", "std 16.301332 1200.010311 84.453710 64.611754\n", "min -11.430000 1140.290000 106.232941 14.492094\n", "25% -0.727500 1253.312500 179.503714 16.208983\n", "50% 7.285000 1396.155000 220.323833 17.516235\n", "75% 16.197500 1897.947500 273.613534 18.739220\n", "max 59.300000 9223.380000 477.521562 474.285794" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_rank_remove_AC_simple.sort_values('成立来',ascending=False).head(50).describe()" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC_simple.sort_values('成立来',ascending=True).head(50).to_excel('4442.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4708" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(result_rank_remove_AC_simple)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [type, 基金代码, 基金简称, 今年来, 成立来, turnover, 累计净值, 成立日期]\n", "Index: []" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rank_fund_turnover_simple[rank_fund_turnover_simple['今年来']==-9999]" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期年化收益
1031股票164818工银中证传媒指数(LOF)A-2.01-72.25103.2850000.28982015-05-21-17.699954
720股票160639鹏华中证高铁产业指数(LOF)5.34-62.43210.7408330.382015-05-27-13.854522
744股票160135南方中证高铁产业指数(LOF)4.80-54.2267.6658331.01372015-06-10-11.283484
290股票162413华宝中证1000指数20.19-50.2262.9091670.48502015-06-04-10.113271
538股票161123易方达中证万得并购重组(LOF)11.27-45.25190.6000000.53582015-06-03-8.792745
47股票168203中融国证钢铁行业指数(LOF)45.16-42.13245.1941671.352015-06-19-8.068979
315股票164908交银中证环境治理(LOF)A18.90-41.6275.4000000.58382015-08-13-8.125463
934股票165523信诚中证信息安全指数(LOF)A-0.32-39.2160.8516670.61752015-06-26-7.391246
4839混合001239长盛国企改革混合1.56-35.10390.2841670.64902015-06-04-6.394351
715股票502013长盛中证申万一带一路指数(LOF)5.39-34.4966.9691671.49762015-05-29-6.245217
261股票501030汇添富中证环境治理指数A21.37-33.22161.4011110.66782016-12-29-7.803037
622股票165524信诚中证智能家居指数(LOF)A8.41-33.0475.3308330.65712015-06-26-5.999805
251股票160420华安创业板50指数21.89-31.02141.6050000.68982015-07-06-5.590779
698股票161030富国中证体育产业指数(LOF)A5.74-30.46104.7000000.68702015-06-25-5.447718
1009股票161027富国中证全指证券公司指数(LOF)A-1.67-29.3491.8353850.65802015-03-27-5.028354
1076股票001899东海社会安全-2.87-29.0071.7390910.712015-11-23-5.485033
1370股票162412华宝医疗ETF联接A-13.86-27.86104.1583330.69092015-05-21-4.841209
414股票001241国寿安保中证500ETF联接15.52-27.6830.6930000.72332015-05-29-4.820832
1134股票160629鹏华中证传媒指数(LOF)-4.37-27.65163.7592311.21402014-12-11-4.504597
1021股票160633鹏华券商A-1.89-27.46130.6083330.67902015-05-06-4.732382
1400股票006816泰康港股通地产指数A-20.16-26.95127.8340000.73052019-01-29-10.313545
1037股票161720招商中证全指证券公司指数(LOF)A-2.08-26.22162.5823080.77492014-11-13-4.193225
1315股票161036富国中证娱乐主题指数增强(LOF)A-10.57-25.88107.7700000.74122017-03-13-6.089028
606股票001409工银互联网加股票9.06-25.40156.9066670.74602015-06-05-4.381860
97股票167503安信中证一带一路主题指数34.13-24.94530.0258330.80602015-05-14-4.253588
5637混合519651银河转型混合-9.18-24.80359.3500000.75202015-05-12-4.223120
1454股票010592南方医药创新股票ANaN-23.4159.3500000.76592021-03-02-28.514729
1408股票008709银河龙头股票-22.86-21.71160.1250000.78292020-08-06-16.421616
3832混合001184易方达新常态灵活配置混合6.65-21.40102.3446150.78602015-04-30-3.562380
1396股票005554南方H股联接A-17.93-21.2527.1860000.78752018-02-12-6.021588
1410股票009898民生加银医药健康股票-23.54-21.24142.6050000.78762020-08-28-16.730392
5958混合011162博时港股通领先趋势混合ANaN-21.22187.5600000.78782021-02-09-24.415921
1446股票010204中银港股通优势成长股票NaN-21.00104.4400000.792021-02-09-24.168136
610股票001361景顺中证科技传媒通信150ETF联接8.97-21.009.8675000.792015-06-15-3.554907
6153混合011157弘毅远方港股通智选领航混合ANaN-20.47301.1900000.79532021-02-08-23.504832
1414股票007354创金合信港股通量化股票ANaN-20.41528.4000000.79592021-01-11-21.734802
5944混合010166招商兴和优选1年持有期混合NaN-20.29249.7200000.79712021-02-01-22.854447
5953混合010377广发价值核心混合ANaN-20.12121.3500000.79882021-01-22-22.059608
1405股票009733创金合信港股通大消费精选股票A-22.33-19.82181.7600000.80182020-08-27-15.551600
1269股票004642南方房地产ETF联接A-8.33-19.3890.2228570.80622017-08-24-4.866769
1172股票004752广发中证传媒ETF联接A-5.39-19.2030.9685710.80802018-01-02-5.242726
1562股票011601前海开源公共卫生股票ANaN-19.10183.2500000.80902021-03-25-25.155165
925股票160419华安中证全指证券公司指数-0.12-18.47118.4350000.81532015-06-09-3.079277
5832混合005477长安鑫禧灵活配置混合A-18.20-18.31433.2442860.81692018-02-07-5.104101
272股票165525信诚中证基建工程指数(LOF)A20.95-18.16148.1772730.81962015-08-06-3.097153
1457股票011220南方匠心优选股票ANaN-17.88178.6700000.82122021-02-02-20.236427
1344股票005659南方恒指ETF联接C-12.08-17.719.8650000.90972018-03-09-5.028417
410股票001052华夏中证500ETF联接A15.56-17.7017.1633330.82302015-05-05-2.897703
5324混合002182东兴蓝海财富混合-4.07-17.60378.2018180.82402015-12-23-3.180635
1030股票501305汇添富中证港股通(LOF)A-2.00-17.2889.6471430.82722017-11-24-4.558833
\n", "
" ], "text/plain": [ " type 基金代码 基金简称 今年来 成立来 turnover 累计净值 \\\n", "1031 股票 164818 工银中证传媒指数(LOF)A -2.01 -72.25 103.285000 0.2898 \n", "720 股票 160639 鹏华中证高铁产业指数(LOF) 5.34 -62.43 210.740833 0.38 \n", "744 股票 160135 南方中证高铁产业指数(LOF) 4.80 -54.22 67.665833 1.0137 \n", "290 股票 162413 华宝中证1000指数 20.19 -50.22 62.909167 0.4850 \n", "538 股票 161123 易方达中证万得并购重组(LOF) 11.27 -45.25 190.600000 0.5358 \n", "47 股票 168203 中融国证钢铁行业指数(LOF) 45.16 -42.13 245.194167 1.35 \n", "315 股票 164908 交银中证环境治理(LOF)A 18.90 -41.62 75.400000 0.5838 \n", "934 股票 165523 信诚中证信息安全指数(LOF)A -0.32 -39.21 60.851667 0.6175 \n", "4839 混合 001239 长盛国企改革混合 1.56 -35.10 390.284167 0.6490 \n", "715 股票 502013 长盛中证申万一带一路指数(LOF) 5.39 -34.49 66.969167 1.4976 \n", "261 股票 501030 汇添富中证环境治理指数A 21.37 -33.22 161.401111 0.6678 \n", "622 股票 165524 信诚中证智能家居指数(LOF)A 8.41 -33.04 75.330833 0.6571 \n", "251 股票 160420 华安创业板50指数 21.89 -31.02 141.605000 0.6898 \n", "698 股票 161030 富国中证体育产业指数(LOF)A 5.74 -30.46 104.700000 0.6870 \n", "1009 股票 161027 富国中证全指证券公司指数(LOF)A -1.67 -29.34 91.835385 0.6580 \n", "1076 股票 001899 东海社会安全 -2.87 -29.00 71.739091 0.71 \n", "1370 股票 162412 华宝医疗ETF联接A -13.86 -27.86 104.158333 0.6909 \n", "414 股票 001241 国寿安保中证500ETF联接 15.52 -27.68 30.693000 0.7233 \n", "1134 股票 160629 鹏华中证传媒指数(LOF) -4.37 -27.65 163.759231 1.2140 \n", "1021 股票 160633 鹏华券商A -1.89 -27.46 130.608333 0.6790 \n", "1400 股票 006816 泰康港股通地产指数A -20.16 -26.95 127.834000 0.7305 \n", "1037 股票 161720 招商中证全指证券公司指数(LOF)A -2.08 -26.22 162.582308 0.7749 \n", "1315 股票 161036 富国中证娱乐主题指数增强(LOF)A -10.57 -25.88 107.770000 0.7412 \n", "606 股票 001409 工银互联网加股票 9.06 -25.40 156.906667 0.7460 \n", "97 股票 167503 安信中证一带一路主题指数 34.13 -24.94 530.025833 0.8060 \n", "5637 混合 519651 银河转型混合 -9.18 -24.80 359.350000 0.7520 \n", "1454 股票 010592 南方医药创新股票A NaN -23.41 59.350000 0.7659 \n", "1408 股票 008709 银河龙头股票 -22.86 -21.71 160.125000 0.7829 \n", "3832 混合 001184 易方达新常态灵活配置混合 6.65 -21.40 102.344615 0.7860 \n", "1396 股票 005554 南方H股联接A -17.93 -21.25 27.186000 0.7875 \n", "1410 股票 009898 民生加银医药健康股票 -23.54 -21.24 142.605000 0.7876 \n", "5958 混合 011162 博时港股通领先趋势混合A NaN -21.22 187.560000 0.7878 \n", "1446 股票 010204 中银港股通优势成长股票 NaN -21.00 104.440000 0.79 \n", "610 股票 001361 景顺中证科技传媒通信150ETF联接 8.97 -21.00 9.867500 0.79 \n", "6153 混合 011157 弘毅远方港股通智选领航混合A NaN -20.47 301.190000 0.7953 \n", "1414 股票 007354 创金合信港股通量化股票A NaN -20.41 528.400000 0.7959 \n", "5944 混合 010166 招商兴和优选1年持有期混合 NaN -20.29 249.720000 0.7971 \n", "5953 混合 010377 广发价值核心混合A NaN -20.12 121.350000 0.7988 \n", "1405 股票 009733 创金合信港股通大消费精选股票A -22.33 -19.82 181.760000 0.8018 \n", "1269 股票 004642 南方房地产ETF联接A -8.33 -19.38 90.222857 0.8062 \n", "1172 股票 004752 广发中证传媒ETF联接A -5.39 -19.20 30.968571 0.8080 \n", "1562 股票 011601 前海开源公共卫生股票A NaN -19.10 183.250000 0.8090 \n", "925 股票 160419 华安中证全指证券公司指数 -0.12 -18.47 118.435000 0.8153 \n", "5832 混合 005477 长安鑫禧灵活配置混合A -18.20 -18.31 433.244286 0.8169 \n", "272 股票 165525 信诚中证基建工程指数(LOF)A 20.95 -18.16 148.177273 0.8196 \n", "1457 股票 011220 南方匠心优选股票A NaN -17.88 178.670000 0.8212 \n", "1344 股票 005659 南方恒指ETF联接C -12.08 -17.71 9.865000 0.9097 \n", "410 股票 001052 华夏中证500ETF联接A 15.56 -17.70 17.163333 0.8230 \n", "5324 混合 002182 东兴蓝海财富混合 -4.07 -17.60 378.201818 0.8240 \n", "1030 股票 501305 汇添富中证港股通(LOF)A -2.00 -17.28 89.647143 0.8272 \n", "\n", " 成立日期 年化收益 \n", "1031 2015-05-21 -17.699954 \n", "720 2015-05-27 -13.854522 \n", "744 2015-06-10 -11.283484 \n", "290 2015-06-04 -10.113271 \n", "538 2015-06-03 -8.792745 \n", "47 2015-06-19 -8.068979 \n", "315 2015-08-13 -8.125463 \n", "934 2015-06-26 -7.391246 \n", "4839 2015-06-04 -6.394351 \n", "715 2015-05-29 -6.245217 \n", "261 2016-12-29 -7.803037 \n", "622 2015-06-26 -5.999805 \n", "251 2015-07-06 -5.590779 \n", "698 2015-06-25 -5.447718 \n", "1009 2015-03-27 -5.028354 \n", "1076 2015-11-23 -5.485033 \n", "1370 2015-05-21 -4.841209 \n", "414 2015-05-29 -4.820832 \n", "1134 2014-12-11 -4.504597 \n", "1021 2015-05-06 -4.732382 \n", "1400 2019-01-29 -10.313545 \n", "1037 2014-11-13 -4.193225 \n", "1315 2017-03-13 -6.089028 \n", "606 2015-06-05 -4.381860 \n", "97 2015-05-14 -4.253588 \n", "5637 2015-05-12 -4.223120 \n", "1454 2021-03-02 -28.514729 \n", "1408 2020-08-06 -16.421616 \n", "3832 2015-04-30 -3.562380 \n", "1396 2018-02-12 -6.021588 \n", "1410 2020-08-28 -16.730392 \n", "5958 2021-02-09 -24.415921 \n", "1446 2021-02-09 -24.168136 \n", "610 2015-06-15 -3.554907 \n", "6153 2021-02-08 -23.504832 \n", "1414 2021-01-11 -21.734802 \n", "5944 2021-02-01 -22.854447 \n", "5953 2021-01-22 -22.059608 \n", "1405 2020-08-27 -15.551600 \n", "1269 2017-08-24 -4.866769 \n", "1172 2018-01-02 -5.242726 \n", "1562 2021-03-25 -25.155165 \n", "925 2015-06-09 -3.079277 \n", "5832 2018-02-07 -5.104101 \n", "272 2015-08-06 -3.097153 \n", "1457 2021-02-02 -20.236427 \n", "1344 2018-03-09 -5.028417 \n", "410 2015-05-05 -2.897703 \n", "5324 2015-12-23 -3.180635 \n", "1030 2017-11-24 -4.558833 " ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_rank_remove_AC_simple.sort_values('成立来',ascending=True).head(50)" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC_simple=result_rank_remove_AC_simple[~result_rank_remove_AC_simple['turnover'].isnull()]" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3923" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(result_rank_remove_AC_simple)" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 50.000000\n", "mean 156.958850\n", "std 123.899374\n", "min 9.865000\n", "25% 75.348125\n", "50% 124.592000\n", "75% 182.877500\n", "max 530.025833\n", "Name: turnover, dtype: float64" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_rank_remove_AC_simple.sort_values('成立来',ascending=True).head(50)['turnover'].describe()" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 3923.000000\n", "mean 239.939612\n", "std 227.648195\n", "min 0.750000\n", "25% 88.537222\n", "50% 185.725000\n", "75% 326.555500\n", "max 6135.284444\n", "Name: turnover, dtype: float64" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_rank_remove_AC_simple['turnover'].describe()" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([188., 293., 322., 302., 259., 236., 258., 223., 205., 179., 162.,\n", " 150., 142., 121., 111., 101., 86., 66., 63., 60., 45., 41.,\n", " 36., 24., 23., 28., 22., 24., 17., 14., 15., 19., 8.,\n", " 4., 4., 6., 13., 8., 3., 5., 0., 5., 6., 3.,\n", " 4., 2., 1., 2., 1., 2.]),\n", " array([1.10000000e+00, 2.57392400e+01, 5.03784800e+01, 7.50177200e+01,\n", " 9.96569600e+01, 1.24296200e+02, 1.48935440e+02, 1.73574680e+02,\n", " 1.98213920e+02, 2.22853160e+02, 2.47492400e+02, 2.72131640e+02,\n", " 2.96770880e+02, 3.21410120e+02, 3.46049360e+02, 3.70688600e+02,\n", " 3.95327840e+02, 4.19967080e+02, 4.44606320e+02, 4.69245560e+02,\n", " 4.93884800e+02, 5.18524040e+02, 5.43163280e+02, 5.67802520e+02,\n", " 5.92441760e+02, 6.17081000e+02, 6.41720240e+02, 6.66359480e+02,\n", " 6.90998720e+02, 7.15637960e+02, 7.40277200e+02, 7.64916440e+02,\n", " 7.89555680e+02, 8.14194920e+02, 8.38834160e+02, 8.63473400e+02,\n", " 8.88112640e+02, 9.12751880e+02, 9.37391120e+02, 9.62030360e+02,\n", " 9.86669600e+02, 1.01130884e+03, 1.03594808e+03, 1.06058732e+03,\n", " 1.08522656e+03, 1.10986580e+03, 1.13450504e+03, 1.15914428e+03,\n", " 1.18378352e+03, 1.20842276e+03, 1.23306200e+03]),\n", "
)" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.hist(Y1,bins=50,rwidth=0.8,color='red',alpha=0.75)" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [], "source": [ "Y = result_rank_remove_AC_simple['turnover'].values" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [], "source": [ "Y_=sorted(Y)" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [], "source": [ "Y1=Y_[1:-10]" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC_simple.sort_values('turnover',ascending=False).head(20).to_excel(\"turnvoer_max.xlsx\",encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
type基金代码基金简称今年来成立来turnover累计净值成立日期年化收益
3811混合003373大成景禄灵活配置混合A6.7452.616135.2844441.52612016-09-298.436301
5711混合007875国融融兴混合A-11.3618.722415.2200001.18722019-11-058.439912
1992混合005855中科沃土沃瑞混合A50.29235.411995.4100003.35412019-01-1451.224102
3471混合003238新华外延增长主题灵活配置混合8.45170.671666.8877782.70672017-03-0223.067434
224股票003646创金合信中证1000指数增强A23.3273.811599.1922221.73812016-12-2211.717297
4306混合004557北信瑞丰鼎丰灵活配置混合4.7838.901491.3633331.38902019-11-1316.973287
2589混合001897九泰久盛量化先锋混合A20.4690.831396.0545451.802015-11-1011.161922
212股票003016中金中证500A23.9289.681327.9060001.89682016-07-2212.565998
678股票900029中信证券量化优选A6.4455.861304.9100002.34132020-05-2232.604347
4187混合005290诺德新盛灵活配置混合A5.3261.841301.2228571.61842017-12-2012.808850
125股票005313万家中证1000指数增强A29.29129.911233.0620001.96962018-01-3023.917432
2345混合004890中邮健康文娱混合27.54176.581219.8642862.76582017-12-1328.848158
1952混合001569泰信国策驱动灵活配置混合57.46148.001189.8908332.482015-10-2715.928049
2892混合003516国泰融安多策略灵活配置混合14.83270.101178.4937503.70102017-07-0334.096665
434股票002311创金合信中证500指数增强A15.0856.871175.4345451.55532015-12-317.837433
2125混合007468中信建投精选混合A37.39118.031159.1150002.18052019-11-2946.205776
1909混合700003平安策略先锋混合77.61625.441125.0811116.732012-05-2923.035772
2239混合008347中信建投甄选混合A31.33112.101118.5050002.12102019-12-2346.014618
334股票006346安信量化优选股票A17.91133.371091.6766672.33372018-09-0329.376029
2437混合001978泰信互联网+混合24.23130.701090.4430002.30702016-06-0816.322894
2100混合002669华商万众创新混合38.90216.001086.6370003.162016-06-2823.391197
2124混合002707大摩科技领先混合37.39120.411085.3900002.20412017-12-1321.762895
5370混合000755富安达新兴成长混合-4.5883.051076.6571431.83052014-09-118.670273
1431股票010253兴银中证500指数增强ANaN16.291065.8000001.16292021-03-0120.839662
2506混合001224中邮新思路灵活配置混合22.09276.901063.4081823.76902015-11-1124.279559
3378混合519097新华中小市值优选混合9.14398.831054.0957144.25442011-01-2815.897110
5364混合006274圆信永丰医药健康-4.5048.501053.5840001.48502018-11-2913.832389
3097混合002919东吴智慧医疗量化混合A11.8448.251044.6170001.48252016-08-117.631943
2355混合002564新沃通盈灵活配置混合26.91220.731040.8500002.72702016-09-2224.917083
5707混合002598平安消费精选混合A-11.206.761037.0690001.06762016-06-081.190168
2021混合519115浦银安盛红利精选混合A46.97358.391036.3336364.58392009-12-0313.472307
2152混合003822中信建投轮换混合A36.05177.931035.3200002.77932019-01-1741.953755
2377混合004374华泰保兴吉年丰混合发起A26.14229.351034.8788893.12512017-03-2428.611546
2712混合003241创金合信量化发现混合A18.1662.761021.0090001.62762016-09-279.771664
173股票007831博道伍佰智航股票A26.6071.111017.2375001.71112019-09-2627.271169
3352混合007439东海科技动力A9.29109.891013.5775002.09892019-06-2634.854075
1421股票011229创金合信数字经济主题股票ANaN64.44985.2000001.64442021-01-2073.059541
1028股票003015中金沪深300A-1.9889.84975.1290001.89842016-07-2212.583549
515股票005328前海开源价值策略股票12.3069.98971.1942861.69982017-12-2214.224087
2935混合005443国金量化多策略混合14.2712.74967.2642861.12742018-02-013.141527
504股票000594大摩进取优选股票12.73229.50963.6464293.29502014-05-2917.087174
2714混合001839九泰久兴灵活配置混合18.1494.91956.5211111.83102017-01-2014.560340
379股票006195国金量化多因子16.2161.18951.0366671.61182018-10-3116.466688
100股票006593博道中证500增强A32.83144.05947.0820002.34192019-01-0335.230562
3703混合006157财通量化核心优选混合7.2083.11937.2833331.83112018-09-1720.443511
2132混合004895华商鑫安灵活混合37.05201.56933.1162502.80802017-09-0629.403458
4204混合690003民生加银精选混合5.248.40928.6108701.08402010-02-030.681438
4715混合009486光大瑞和混合A2.5415.73923.3050001.15732020-06-2910.459939
5026混合100060富国高新技术产业混合-0.28539.41922.7150005.23502012-06-2721.619368
5414混合001972前海开源沪港深智慧生活混合-5.1680.30921.0327271.80302016-01-2610.514522
\n", "
" ], "text/plain": [ " type 基金代码 基金简称 今年来 成立来 turnover 累计净值 \\\n", "3811 混合 003373 大成景禄灵活配置混合A 6.74 52.61 6135.284444 1.5261 \n", "5711 混合 007875 国融融兴混合A -11.36 18.72 2415.220000 1.1872 \n", "1992 混合 005855 中科沃土沃瑞混合A 50.29 235.41 1995.410000 3.3541 \n", "3471 混合 003238 新华外延增长主题灵活配置混合 8.45 170.67 1666.887778 2.7067 \n", "224 股票 003646 创金合信中证1000指数增强A 23.32 73.81 1599.192222 1.7381 \n", "4306 混合 004557 北信瑞丰鼎丰灵活配置混合 4.78 38.90 1491.363333 1.3890 \n", "2589 混合 001897 九泰久盛量化先锋混合A 20.46 90.83 1396.054545 1.80 \n", "212 股票 003016 中金中证500A 23.92 89.68 1327.906000 1.8968 \n", "678 股票 900029 中信证券量化优选A 6.44 55.86 1304.910000 2.3413 \n", "4187 混合 005290 诺德新盛灵活配置混合A 5.32 61.84 1301.222857 1.6184 \n", "125 股票 005313 万家中证1000指数增强A 29.29 129.91 1233.062000 1.9696 \n", "2345 混合 004890 中邮健康文娱混合 27.54 176.58 1219.864286 2.7658 \n", "1952 混合 001569 泰信国策驱动灵活配置混合 57.46 148.00 1189.890833 2.48 \n", "2892 混合 003516 国泰融安多策略灵活配置混合 14.83 270.10 1178.493750 3.7010 \n", "434 股票 002311 创金合信中证500指数增强A 15.08 56.87 1175.434545 1.5553 \n", "2125 混合 007468 中信建投精选混合A 37.39 118.03 1159.115000 2.1805 \n", "1909 混合 700003 平安策略先锋混合 77.61 625.44 1125.081111 6.73 \n", "2239 混合 008347 中信建投甄选混合A 31.33 112.10 1118.505000 2.1210 \n", "334 股票 006346 安信量化优选股票A 17.91 133.37 1091.676667 2.3337 \n", "2437 混合 001978 泰信互联网+混合 24.23 130.70 1090.443000 2.3070 \n", "2100 混合 002669 华商万众创新混合 38.90 216.00 1086.637000 3.16 \n", "2124 混合 002707 大摩科技领先混合 37.39 120.41 1085.390000 2.2041 \n", "5370 混合 000755 富安达新兴成长混合 -4.58 83.05 1076.657143 1.8305 \n", "1431 股票 010253 兴银中证500指数增强A NaN 16.29 1065.800000 1.1629 \n", "2506 混合 001224 中邮新思路灵活配置混合 22.09 276.90 1063.408182 3.7690 \n", "3378 混合 519097 新华中小市值优选混合 9.14 398.83 1054.095714 4.2544 \n", "5364 混合 006274 圆信永丰医药健康 -4.50 48.50 1053.584000 1.4850 \n", "3097 混合 002919 东吴智慧医疗量化混合A 11.84 48.25 1044.617000 1.4825 \n", "2355 混合 002564 新沃通盈灵活配置混合 26.91 220.73 1040.850000 2.7270 \n", "5707 混合 002598 平安消费精选混合A -11.20 6.76 1037.069000 1.0676 \n", "2021 混合 519115 浦银安盛红利精选混合A 46.97 358.39 1036.333636 4.5839 \n", "2152 混合 003822 中信建投轮换混合A 36.05 177.93 1035.320000 2.7793 \n", "2377 混合 004374 华泰保兴吉年丰混合发起A 26.14 229.35 1034.878889 3.1251 \n", "2712 混合 003241 创金合信量化发现混合A 18.16 62.76 1021.009000 1.6276 \n", "173 股票 007831 博道伍佰智航股票A 26.60 71.11 1017.237500 1.7111 \n", "3352 混合 007439 东海科技动力A 9.29 109.89 1013.577500 2.0989 \n", "1421 股票 011229 创金合信数字经济主题股票A NaN 64.44 985.200000 1.6444 \n", "1028 股票 003015 中金沪深300A -1.98 89.84 975.129000 1.8984 \n", "515 股票 005328 前海开源价值策略股票 12.30 69.98 971.194286 1.6998 \n", "2935 混合 005443 国金量化多策略混合 14.27 12.74 967.264286 1.1274 \n", "504 股票 000594 大摩进取优选股票 12.73 229.50 963.646429 3.2950 \n", "2714 混合 001839 九泰久兴灵活配置混合 18.14 94.91 956.521111 1.8310 \n", "379 股票 006195 国金量化多因子 16.21 61.18 951.036667 1.6118 \n", "100 股票 006593 博道中证500增强A 32.83 144.05 947.082000 2.3419 \n", "3703 混合 006157 财通量化核心优选混合 7.20 83.11 937.283333 1.8311 \n", "2132 混合 004895 华商鑫安灵活混合 37.05 201.56 933.116250 2.8080 \n", "4204 混合 690003 民生加银精选混合 5.24 8.40 928.610870 1.0840 \n", "4715 混合 009486 光大瑞和混合A 2.54 15.73 923.305000 1.1573 \n", "5026 混合 100060 富国高新技术产业混合 -0.28 539.41 922.715000 5.2350 \n", "5414 混合 001972 前海开源沪港深智慧生活混合 -5.16 80.30 921.032727 1.8030 \n", "\n", " 成立日期 年化收益 \n", "3811 2016-09-29 8.436301 \n", "5711 2019-11-05 8.439912 \n", "1992 2019-01-14 51.224102 \n", "3471 2017-03-02 23.067434 \n", "224 2016-12-22 11.717297 \n", "4306 2019-11-13 16.973287 \n", "2589 2015-11-10 11.161922 \n", "212 2016-07-22 12.565998 \n", "678 2020-05-22 32.604347 \n", "4187 2017-12-20 12.808850 \n", "125 2018-01-30 23.917432 \n", "2345 2017-12-13 28.848158 \n", "1952 2015-10-27 15.928049 \n", "2892 2017-07-03 34.096665 \n", "434 2015-12-31 7.837433 \n", "2125 2019-11-29 46.205776 \n", "1909 2012-05-29 23.035772 \n", "2239 2019-12-23 46.014618 \n", "334 2018-09-03 29.376029 \n", "2437 2016-06-08 16.322894 \n", "2100 2016-06-28 23.391197 \n", "2124 2017-12-13 21.762895 \n", "5370 2014-09-11 8.670273 \n", "1431 2021-03-01 20.839662 \n", "2506 2015-11-11 24.279559 \n", "3378 2011-01-28 15.897110 \n", "5364 2018-11-29 13.832389 \n", "3097 2016-08-11 7.631943 \n", "2355 2016-09-22 24.917083 \n", "5707 2016-06-08 1.190168 \n", "2021 2009-12-03 13.472307 \n", "2152 2019-01-17 41.953755 \n", "2377 2017-03-24 28.611546 \n", "2712 2016-09-27 9.771664 \n", "173 2019-09-26 27.271169 \n", "3352 2019-06-26 34.854075 \n", "1421 2021-01-20 73.059541 \n", "1028 2016-07-22 12.583549 \n", "515 2017-12-22 14.224087 \n", "2935 2018-02-01 3.141527 \n", "504 2014-05-29 17.087174 \n", "2714 2017-01-20 14.560340 \n", "379 2018-10-31 16.466688 \n", "100 2019-01-03 35.230562 \n", "3703 2018-09-17 20.443511 \n", "2132 2017-09-06 29.403458 \n", "4204 2010-02-03 0.681438 \n", "4715 2020-06-29 10.459939 \n", "5026 2012-06-27 21.619368 \n", "5414 2016-01-26 10.514522 " ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_rank_remove_AC_simple.sort_values('turnover',ascending=False).head(50)" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [], "source": [ "df = pd.merge(result_rank_remove_AC_simple,result_rank_remove_AC,how='inner',left_on='基金代码',right_on='基金代码')" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [], "source": [ "df.to_excel(\"all_fund.xlsx\",encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [], "source": [ "result_rank_remove_AC_simple.to_excel(\"all_fund.xlsx\",encoding='utf8')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "513dc2e41d739bb2c947903f3c0bbf636d03aa53ab50e61c694a27481c81805e" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/收益率曲线绘制.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from setting import get_mysql_conn" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "conn = get_mysql_conn(db='db_stock',local='local')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cursor = conn.cursor()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cmd = 'select Date,NetValue,HS300 from tb_jingzhi'\n", "cursor.execute(cmd)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ret = cursor.fetchall()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result = []\n", "for item in ret:\n", " d={}\n", " d['Date']=item[0]\n", " d['NetValue']=item[1]\n", " d['hs']=item[2]\n", " result.append(d)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = df.set_index('Date',drop=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.figure(figsize=(12,10))\n", "df['NetValue'].plot()\n", "df['hs'].plot()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['NetValue'].mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['NetValue'].std()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['NetValue'].var()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['hs'].mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['hs'].std()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['hs'].var()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/新闻分析.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from setting import get_engine\n", "first=get_engine('db_stock')\n", "import pandas as pd\n", "df =pd.read_sql('tb_cnstock',first)\n", "\n", "second = get_engine('db_news')\n", "df2=pd.read_sql('tb_cnstock',second)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateTitleURL
02016-10-18 08:43:00欧富源科技1亿拍下深南电两房产公司股权http://company.cnstock.com/company/scp_gsxw/20...
12016-10-25 09:12:00净利增速远超营收 兔宝宝回复半年报问询http://company.cnstock.com/company/scp_gsxw/20...
22016-10-25 13:06:00ST沪科重要事项未公告下午临停http://company.cnstock.com/company/scp_gsxw/20...
32016-11-02 08:56:00西王食品收购Kerr 80%股权完成交割http://company.cnstock.com/company/scp_gsxw/20...
42016-11-08 13:42:00万福生科11月8日下午开市起停牌http://company.cnstock.com/company/scp_gsxw/20...
\n", "
" ], "text/plain": [ " Date Title \\\n", "0 2016-10-18 08:43:00 欧富源科技1亿拍下深南电两房产公司股权 \n", "1 2016-10-25 09:12:00 净利增速远超营收 兔宝宝回复半年报问询 \n", "2 2016-10-25 13:06:00 ST沪科重要事项未公告下午临停 \n", "3 2016-11-02 08:56:00 西王食品收购Kerr 80%股权完成交割 \n", "4 2016-11-08 13:42:00 万福生科11月8日下午开市起停牌 \n", "\n", " URL \n", "0 http://company.cnstock.com/company/scp_gsxw/20... \n", "1 http://company.cnstock.com/company/scp_gsxw/20... \n", "2 http://company.cnstock.com/company/scp_gsxw/20... \n", "3 http://company.cnstock.com/company/scp_gsxw/20... \n", "4 http://company.cnstock.com/company/scp_gsxw/20... " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateTitleURL
02016-10-18 08:43:00欧富源科技1亿拍下深南电两房产公司股权http://company.cnstock.com/company/scp_gsxw/20...
12016-10-25 09:12:00净利增速远超营收 兔宝宝回复半年报问询http://company.cnstock.com/company/scp_gsxw/20...
22016-10-25 13:06:00ST沪科重要事项未公告下午临停http://company.cnstock.com/company/scp_gsxw/20...
32016-11-02 08:56:00西王食品收购Kerr 80%股权完成交割http://company.cnstock.com/company/scp_gsxw/20...
42016-11-08 13:42:00万福生科11月8日下午开市起停牌http://company.cnstock.com/company/scp_gsxw/20...
\n", "
" ], "text/plain": [ " Date Title \\\n", "0 2016-10-18 08:43:00 欧富源科技1亿拍下深南电两房产公司股权 \n", "1 2016-10-25 09:12:00 净利增速远超营收 兔宝宝回复半年报问询 \n", "2 2016-10-25 13:06:00 ST沪科重要事项未公告下午临停 \n", "3 2016-11-02 08:56:00 西王食品收购Kerr 80%股权完成交割 \n", "4 2016-11-08 13:42:00 万福生科11月8日下午开市起停牌 \n", "\n", " URL \n", "0 http://company.cnstock.com/company/scp_gsxw/20... \n", "1 http://company.cnstock.com/company/scp_gsxw/20... \n", "2 http://company.cnstock.com/company/scp_gsxw/20... \n", "3 http://company.cnstock.com/company/scp_gsxw/20... \n", "4 http://company.cnstock.com/company/scp_gsxw/20... " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.head()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_new[~(df_new['URL'].isin(df_old['URL'].values))]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/每日分析模板.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "from settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "db = DBSelector()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "engine = db.get_engine('db_stock','qq')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "table = 'bond'\n", "df = pd.read_sql(table,con=engine)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
可转债代码可转债名称可转债价格正股名称正股代码正股现价正股涨跌幅最新转股价溢价率可转债涨幅回售触发价转股起始日到期时间成交额(万元)强赎价格剩余时间回售起始日评级下修提示下调次数转债剩余占总市值比剩余规模发行规模股东配售率强赎标志强赎日期更新日期
0113581龙蟠转债257.300龙蟠科技60390627.61-2.449.48-11.65-5.186.642020-10-2926-04-2237567.25120.05.6222024-04-22A+04.84.0004.00076.13XNone2020-09-08 15:03
1123063大禹转债130.502大禹节水3000217.0512.444.94-8.553.483.462021-02-0326-07-2748202.03120.05.8852025-07-28AA-011.36.3806.38068.99XNone2020-09-08 15:03
2113575东时转债143.020东方时尚60337722.76-1.3914.56-8.51-1.8110.192020-10-1526-04-081368.22108.05.5842024-04-08AA03.24.2804.28020.73XNone2020-09-08 15:03
3123050聚飞转债145.000聚飞光电3003038.153.435.18-7.84-0.923.632020-10-2026-04-1331066.36118.05.5972024-04-15AA-06.87.0507.05043.22XNone2020-09-08 15:03
4123051今天转债138.282今天国际30053213.023.428.80-6.531.166.162020-12-1026-06-037182.65116.05.7372024-06-03A+07.92.8002.80076.80XNone2020-09-08 15:03
\n", "
" ], "text/plain": [ " 可转债代码 可转债名称 可转债价格 正股名称 正股代码 正股现价 ... 剩余规模 发行规模 股东配售率 强赎标志 强赎日期 更新日期\n", "0 113581 龙蟠转债 257.300 龙蟠科技 603906 27.61 ... 4.000 4.000 76.13 X None 2020-09-08 15:03\n", "1 123063 大禹转债 130.502 大禹节水 300021 7.05 ... 6.380 6.380 68.99 X None 2020-09-08 15:03\n", "2 113575 东时转债 143.020 东方时尚 603377 22.76 ... 4.280 4.280 20.73 X None 2020-09-08 15:03\n", "3 123050 聚飞转债 145.000 聚飞光电 300303 8.15 ... 7.050 7.050 43.22 X None 2020-09-08 15:03\n", "4 123051 今天转债 138.282 今天国际 300532 13.02 ... 2.800 2.800 76.80 X None 2020-09-08 15:03\n", "\n", "[5 rows x 27 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "cyb_df = df[df['正股代码'].str.startswith('3')]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.9328000000000003" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cyb_df['正股涨跌幅'].mean()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "non_cyb_df = df[~df['正股代码'].str.startswith('3')]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.39790983606557384" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "non_cyb_df['正股涨跌幅'].mean()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.3807843137254903" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cyb_df['可转债涨幅'].mean()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.2745491803278688" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "non_cyb_df['可转债涨幅'].mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 港股中签率分析" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "table = 'tb_hk_new_stock'\n", "df = pd.read_sql(table,con=engine)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 497 entries, 0 to 496\n", "Data columns (total 15 columns):\n", "id 497 non-null int64\n", "name 497 non-null object\n", "code 497 non-null object\n", "issue_date 0 non-null datetime64[ns]\n", "each_hand_stock 497 non-null object\n", "share_value_Yi 497 non-null object\n", "margin_price 497 non-null object\n", "price 457 non-null float64\n", "over_price_part 497 non-null object\n", "hit_least_num 457 non-null float64\n", "hit_ratio 457 non-null float64\n", "current_price 493 non-null float64\n", "first_day_raise 497 non-null float64\n", "accumulate_raise 490 non-null float64\n", "crawltime 0 non-null datetime64[ns]\n", "dtypes: datetime64[ns](2), float64(6), int64(1), object(6)\n", "memory usage: 58.3+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idnamecodeissue_dateeach_hand_stockshare_value_Yimargin_pricepriceover_price_parthit_least_numhit_ratiocurrent_pricefirst_day_raiseaccumulate_raisecrawltime
0233洛钼瑞银八零七购(@EC)09987.HKNaT501,961.42468.00412.051.314.025.0NaN0.0NaNNaT
1234农夫山泉09633.HKNaT200970.40-1,069.9319.50-21.5021.01,147.3150.012.033.054.054.0NaT
2235智勤控股09913.HKNaT4,0005.20-6.400.52-0.641.018.220.080.00.0-18.0-23.0NaT
3236泰格医药03347.HKNaT10094.22-107.0788.00-100.00100.0413.460.05.0110.013.010.0NaT
4237立德教育01449.HKNaT1,00014.00-17.332.10-2.602.026.910.020.01.0-12.0-42.0NaT
\n", "
" ], "text/plain": [ " id name code issue_date ... current_price first_day_raise accumulate_raise crawltime\n", "0 233 洛钼瑞银八零七购(@EC) 09987.HK NaT ... NaN 0.0 NaN NaT\n", "1 234 农夫山泉 09633.HK NaT ... 33.0 54.0 54.0 NaT\n", "2 235 智勤控股 09913.HK NaT ... 0.0 -18.0 -23.0 NaT\n", "3 236 泰格医药 03347.HK NaT ... 110.0 13.0 10.0 NaT\n", "4 237 立德教育 01449.HK NaT ... 1.0 -12.0 -42.0 NaT\n", "\n", "[5 rows x 15 columns]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 获取第一天收盘大于0的新股数" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "win=df[df['first_day_raise']>0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 获取第一天收盘小于0的新股数" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "lost=df[df['first_day_raise']<0]" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "254" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(win)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "181" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(lost)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "140.3314917127072" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(win)/len(lost)*100" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 计算收益期望 概率x收益" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### 数据清洗,格式转换, 把 3,000 的字符转为 3000 int" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "def convertor(src):\n", " try:\n", " dst = int(src.strip().replace(',',''))\n", " except:\n", " dst = None\n", " return dst" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "df['each_hand_stock']=df['each_hand_stock'].map(convertor)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 首日涨幅*中签率*每手股数*上市价格" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "E=df['first_day_raise']*df['hit_ratio']*df['each_hand_stock']*df['price']/100/100" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "43882.78999999999" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E.sum()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "497" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(E)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24500" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "490*50" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.6" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/私募基金收益率.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import json\n", "import codecs" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "filepath=r'C:\\OneDrive\\Stock' + r'\\小牛1号.txt'" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'C:\\\\OneDrive\\\\Stock\\\\小牛1号.txt'" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filepath" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "with codecs.open(filepath,'r',encoding='utf8') as fp:\n", " js_data = json.load(fp)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "index=0\n", "name = js_data[index]['name']\n", "netvalue_list = js_data[index]['list']" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "[{'date': '2015-04-21', 'value': 1.0, 'percent': 0.0},\n", " {'date': '2015-04-24', 'value': 1.0, 'percent': 0.0},\n", " {'date': '2015-04-30', 'value': 1.0, 'percent': 0.0},\n", " {'date': '2015-05-08', 'value': 1.006, 'percent': 0.006},\n", " {'date': '2015-05-15', 'value': 1.014, 'percent': 0.014},\n", " {'date': '2015-05-22', 'value': 1.046, 'percent': 0.046},\n", " {'date': '2015-05-29', 'value': 1.095, 'percent': 0.095},\n", " {'date': '2015-06-05', 'value': 1.136, 'percent': 0.136},\n", " {'date': '2015-06-12', 'value': 1.13, 'percent': 0.13},\n", " {'date': '2015-06-19', 'value': 1.099, 'percent': 0.099},\n", " {'date': '2015-06-26', 'value': 1.108, 'percent': 0.108},\n", " {'date': '2015-07-03', 'value': 1.121, 'percent': 0.121},\n", " {'date': '2015-07-10', 'value': 1.21, 'percent': 0.21},\n", " {'date': '2015-07-17', 'value': 1.316, 'percent': 0.316},\n", " {'date': '2015-07-24', 'value': 1.343, 'percent': 0.343},\n", " {'date': '2015-07-31', 'value': 1.306, 'percent': 0.306},\n", " {'date': '2015-08-07', 'value': 1.327, 'percent': 0.327},\n", " {'date': '2015-08-14', 'value': 1.364, 'percent': 0.364},\n", " {'date': '2015-08-21', 'value': 1.302, 'percent': 0.302},\n", " {'date': '2015-08-28', 'value': 1.333, 'percent': 0.333},\n", " {'date': '2015-09-02', 'value': 1.305, 'percent': 0.305},\n", " {'date': '2015-09-11', 'value': 1.327, 'percent': 0.327},\n", " {'date': '2015-09-18', 'value': 1.312, 'percent': 0.312},\n", " {'date': '2015-09-25', 'value': 1.337, 'percent': 0.337},\n", " {'date': '2015-09-30', 'value': 1.339, 'percent': 0.339},\n", " {'date': '2015-10-09', 'value': 1.396, 'percent': 0.396},\n", " {'date': '2015-10-16', 'value': 1.466, 'percent': 0.466},\n", " {'date': '2015-10-23', 'value': 1.504, 'percent': 0.504},\n", " {'date': '2015-10-30', 'value': 1.504, 'percent': 0.504},\n", " {'date': '2015-11-06', 'value': 1.556, 'percent': 0.556},\n", " {'date': '2015-11-13', 'value': 1.535, 'percent': 0.535},\n", " {'date': '2015-11-20', 'value': 1.537, 'percent': 0.537},\n", " {'date': '2015-11-27', 'value': 1.495, 'percent': 0.495},\n", " {'date': '2015-12-04', 'value': 1.568, 'percent': 0.568},\n", " {'date': '2015-12-11', 'value': 1.551, 'percent': 0.551},\n", " {'date': '2015-12-18', 'value': 1.599, 'percent': 0.599},\n", " {'date': '2015-12-25', 'value': 1.613, 'percent': 0.613},\n", " {'date': '2015-12-31', 'value': 1.605, 'percent': 0.605},\n", " {'date': '2016-01-08', 'value': 1.519, 'percent': 0.519},\n", " {'date': '2016-01-15', 'value': 1.47, 'percent': 0.47},\n", " {'date': '2016-01-22', 'value': 1.482, 'percent': 0.482},\n", " {'date': '2016-01-29', 'value': 1.473, 'percent': 0.473},\n", " {'date': '2016-02-05', 'value': 1.497, 'percent': 0.497},\n", " {'date': '2016-02-19', 'value': 1.536, 'percent': 0.536},\n", " {'date': '2016-02-26', 'value': 1.497, 'percent': 0.497},\n", " {'date': '2016-03-04', 'value': 1.475, 'percent': 0.475},\n", " {'date': '2016-03-11', 'value': 1.474, 'percent': 0.474},\n", " {'date': '2016-03-18', 'value': 1.532, 'percent': 0.532},\n", " {'date': '2016-03-25', 'value': 1.476, 'percent': 0.476},\n", " {'date': '2016-04-01', 'value': 1.486, 'percent': 0.486},\n", " {'date': '2016-04-08', 'value': 1.491, 'percent': 0.491},\n", " {'date': '2016-04-15', 'value': 1.536, 'percent': 0.536},\n", " {'date': '2016-04-22', 'value': 1.493, 'percent': 0.493},\n", " {'date': '2016-04-29', 'value': 1.505, 'percent': 0.505},\n", " {'date': '2016-05-06', 'value': 1.509, 'percent': 0.509},\n", " {'date': '2016-05-13', 'value': 1.476, 'percent': 0.476},\n", " {'date': '2016-05-20', 'value': 1.485, 'percent': 0.485},\n", " {'date': '2016-05-27', 'value': 1.492, 'percent': 0.492},\n", " {'date': '2016-06-03', 'value': 1.58, 'percent': 0.58},\n", " {'date': '2016-06-08', 'value': 1.575, 'percent': 0.575},\n", " {'date': '2016-06-17', 'value': 1.537, 'percent': 0.537},\n", " {'date': '2016-06-24', 'value': 1.525, 'percent': 0.525},\n", " {'date': '2016-07-01', 'value': 1.568, 'percent': 0.568},\n", " {'date': '2016-07-08', 'value': 1.586, 'percent': 0.586},\n", " {'date': '2016-07-15', 'value': 1.595, 'percent': 0.595},\n", " {'date': '2016-07-22', 'value': 1.585, 'percent': 0.585},\n", " {'date': '2016-07-29', 'value': 1.567, 'percent': 0.567},\n", " {'date': '2016-08-05', 'value': 1.602, 'percent': 0.602},\n", " {'date': '2016-08-12', 'value': 1.619, 'percent': 0.619},\n", " {'date': '2016-08-19', 'value': 1.642, 'percent': 0.642},\n", " {'date': '2016-08-26', 'value': 1.618, 'percent': 0.618},\n", " {'date': '2016-09-02', 'value': 1.605, 'percent': 0.605},\n", " {'date': '2016-09-09', 'value': 1.628, 'percent': 0.628},\n", " {'date': '2016-09-14', 'value': 1.601, 'percent': 0.601},\n", " {'date': '2016-09-23', 'value': 1.625, 'percent': 0.625},\n", " {'date': '2016-09-30', 'value': 1.602, 'percent': 0.602},\n", " {'date': '2016-10-14', 'value': 1.611, 'percent': 0.611},\n", " {'date': '2016-10-21', 'value': 1.612, 'percent': 0.612},\n", " {'date': '2016-10-28', 'value': 1.609, 'percent': 0.609},\n", " {'date': '2016-11-04', 'value': 1.584, 'percent': 0.584},\n", " {'date': '2016-11-11', 'value': 1.598, 'percent': 0.598},\n", " {'date': '2016-11-18', 'value': 1.604, 'percent': 0.604},\n", " {'date': '2016-11-25', 'value': 1.658, 'percent': 0.658},\n", " {'date': '2016-12-02', 'value': 1.656, 'percent': 0.656},\n", " {'date': '2016-12-09', 'value': 1.658, 'percent': 0.658},\n", " {'date': '2016-12-16', 'value': 1.6, 'percent': 0.6},\n", " {'date': '2016-12-23', 'value': 1.56, 'percent': 0.56},\n", " {'date': '2016-12-30', 'value': 1.582, 'percent': 0.582},\n", " {'date': '2017-01-06', 'value': 1.596, 'percent': 0.596},\n", " {'date': '2017-01-13', 'value': 1.633, 'percent': 0.633},\n", " {'date': '2017-01-20', 'value': 1.656, 'percent': 0.656},\n", " {'date': '2017-01-26', 'value': 1.693, 'percent': 0.693},\n", " {'date': '2017-02-03', 'value': 1.701, 'percent': 0.701},\n", " {'date': '2017-02-10', 'value': 1.762, 'percent': 0.762},\n", " {'date': '2017-02-17', 'value': 1.808, 'percent': 0.808},\n", " {'date': '2017-02-24', 'value': 1.84, 'percent': 0.84},\n", " {'date': '2017-03-03', 'value': 1.816, 'percent': 0.816},\n", " {'date': '2017-03-10', 'value': 1.928, 'percent': 0.928},\n", " {'date': '2017-03-17', 'value': 1.916, 'percent': 0.916},\n", " {'date': '2017-03-24', 'value': 2.026, 'percent': 1.026},\n", " {'date': '2017-03-31', 'value': 1.981, 'percent': 0.981},\n", " {'date': '2017-04-07', 'value': 1.999, 'percent': 0.999},\n", " {'date': '2017-04-14', 'value': 1.998, 'percent': 0.998},\n", " {'date': '2017-04-21', 'value': 2.029, 'percent': 1.029},\n", " {'date': '2017-04-28', 'value': 1.97, 'percent': 0.97},\n", " {'date': '2017-05-05', 'value': 1.946, 'percent': 0.946},\n", " {'date': '2017-05-12', 'value': 2.002, 'percent': 1.002},\n", " {'date': '2017-05-19', 'value': 2.044, 'percent': 1.044},\n", " {'date': '2017-05-26', 'value': 2.098, 'percent': 1.098},\n", " {'date': '2017-06-02', 'value': 2.211, 'percent': 1.211},\n", " {'date': '2017-06-09', 'value': 2.282, 'percent': 1.282},\n", " {'date': '2017-06-16', 'value': 2.241, 'percent': 1.241},\n", " {'date': '2017-06-23', 'value': 2.319, 'percent': 1.319},\n", " {'date': '2017-06-30', 'value': 2.439, 'percent': 1.439},\n", " {'date': '2017-07-07', 'value': 2.399, 'percent': 1.399},\n", " {'date': '2017-07-14', 'value': 2.521, 'percent': 1.521},\n", " {'date': '2017-07-21', 'value': 2.641, 'percent': 1.641},\n", " {'date': '2017-07-28', 'value': 2.648, 'percent': 1.648},\n", " {'date': '2017-08-04', 'value': 2.609, 'percent': 1.609},\n", " {'date': '2017-08-11', 'value': 2.56, 'percent': 1.56},\n", " {'date': '2017-08-18', 'value': 2.579, 'percent': 1.579},\n", " {'date': '2017-08-25', 'value': 2.697, 'percent': 1.697},\n", " {'date': '2017-09-01', 'value': 2.819, 'percent': 1.819},\n", " {'date': '2017-09-08', 'value': 2.898, 'percent': 1.898},\n", " {'date': '2017-09-15', 'value': 3.26, 'percent': 2.26},\n", " {'date': '2017-09-22', 'value': 3.346, 'percent': 2.346},\n", " {'date': '2017-09-29', 'value': 3.425, 'percent': 2.425},\n", " {'date': '2017-10-13', 'value': 3.574, 'percent': 2.574},\n", " {'date': '2017-10-20', 'value': 3.635, 'percent': 2.635},\n", " {'date': '2017-10-27', 'value': 3.638, 'percent': 2.638},\n", " {'date': '2017-11-03', 'value': 3.543, 'percent': 2.543},\n", " {'date': '2017-11-10', 'value': 3.648, 'percent': 2.648},\n", " {'date': '2017-11-17', 'value': 3.549, 'percent': 2.549},\n", " {'date': '2017-11-24', 'value': 3.672, 'percent': 2.672},\n", " {'date': '2017-12-01', 'value': 3.486, 'percent': 2.486},\n", " {'date': '2017-12-08', 'value': 3.443, 'percent': 2.443},\n", " {'date': '2017-12-15', 'value': 3.366, 'percent': 2.366},\n", " {'date': '2017-12-22', 'value': 3.343, 'percent': 2.343},\n", " {'date': '2017-12-29', 'value': 3.403, 'percent': 2.403},\n", " {'date': '2018-01-05', 'value': 3.631, 'percent': 2.631},\n", " {'date': '2018-01-12', 'value': 3.602, 'percent': 2.602},\n", " {'date': '2018-01-19', 'value': 3.517, 'percent': 2.517},\n", " {'date': '2018-01-26', 'value': 3.676, 'percent': 2.676},\n", " {'date': '2018-02-02', 'value': 3.531, 'percent': 2.531},\n", " {'date': '2018-02-09', 'value': 3.066, 'percent': 2.066},\n", " {'date': '2018-02-14', 'value': 3.219, 'percent': 2.219},\n", " {'date': '2018-02-23', 'value': 3.36, 'percent': 2.36},\n", " {'date': '2018-03-02', 'value': 3.24, 'percent': 2.24},\n", " {'date': '2018-03-09', 'value': 3.366, 'percent': 2.366},\n", " {'date': '2018-03-16', 'value': 3.401, 'percent': 2.401},\n", " {'date': '2018-03-23', 'value': 3.257, 'percent': 2.257},\n", " {'date': '2018-03-30', 'value': 3.294, 'percent': 2.294},\n", " {'date': '2018-04-04', 'value': 3.186, 'percent': 2.186},\n", " {'date': '2018-04-13', 'value': 3.492, 'percent': 2.492},\n", " {'date': '2018-04-20', 'value': 3.3, 'percent': 2.3},\n", " {'date': '2018-04-27', 'value': 3.386, 'percent': 2.386},\n", " {'date': '2018-05-04', 'value': 3.373, 'percent': 2.373},\n", " {'date': '2018-05-11', 'value': 3.478, 'percent': 2.478},\n", " {'date': '2018-05-18', 'value': 3.499, 'percent': 2.499},\n", " {'date': '2018-05-25', 'value': 3.391, 'percent': 2.391},\n", " {'date': '2018-06-01', 'value': 3.332, 'percent': 2.332},\n", " {'date': '2018-06-08', 'value': 3.373, 'percent': 2.373},\n", " {'date': '2018-06-15', 'value': 3.395, 'percent': 2.395},\n", " {'date': '2018-06-22', 'value': 3.33, 'percent': 2.33},\n", " {'date': '2018-06-29', 'value': 3.202, 'percent': 2.202},\n", " {'date': '2018-07-06', 'value': 3.076, 'percent': 2.076},\n", " {'date': '2018-07-13', 'value': 3.221, 'percent': 2.221},\n", " {'date': '2018-07-20', 'value': 3.122, 'percent': 2.122},\n", " {'date': '2018-07-27', 'value': 3.181, 'percent': 2.181},\n", " {'date': '2018-08-03', 'value': 2.961, 'percent': 1.961},\n", " {'date': '2018-08-10', 'value': 3.15, 'percent': 2.15},\n", " {'date': '2018-08-17', 'value': 2.95, 'percent': 1.95},\n", " {'date': '2018-08-24', 'value': 3.065, 'percent': 2.065},\n", " {'date': '2018-08-31', 'value': 3.097, 'percent': 2.097},\n", " {'date': '2018-09-07', 'value': 3.011, 'percent': 2.011},\n", " {'date': '2018-09-14', 'value': 2.991, 'percent': 1.991},\n", " {'date': '2018-09-21', 'value': 3.176, 'percent': 2.176},\n", " {'date': '2018-09-28', 'value': 3.033, 'percent': 2.033},\n", " {'date': '2018-10-12', 'value': 2.84, 'percent': 1.84},\n", " {'date': '2018-10-19', 'value': 2.758, 'percent': 1.758},\n", " {'date': '2018-10-26', 'value': 2.764, 'percent': 1.764},\n", " {'date': '2018-11-02', 'value': 2.995, 'percent': 1.995},\n", " {'date': '2018-11-09', 'value': 2.847, 'percent': 1.847},\n", " {'date': '2018-11-16', 'value': 2.989, 'percent': 1.989},\n", " {'date': '2018-11-23', 'value': 2.981, 'percent': 1.981},\n", " {'date': '2018-11-30', 'value': 3.084, 'percent': 2.084},\n", " {'date': '2018-12-07', 'value': 3.059, 'percent': 2.059},\n", " {'date': '2018-12-14', 'value': 3.124, 'percent': 2.124},\n", " {'date': '2018-12-21', 'value': 3.01, 'percent': 2.01},\n", " {'date': '2018-12-28', 'value': 2.98, 'percent': 1.98},\n", " {'date': '2019-01-04', 'value': 2.946, 'percent': 1.946},\n", " {'date': '2019-01-11', 'value': 2.995, 'percent': 1.995},\n", " {'date': '2019-01-18', 'value': 3.074, 'percent': 2.074},\n", " {'date': '2019-01-25', 'value': 3.147, 'percent': 2.147},\n", " {'date': '2019-02-01', 'value': 3.288, 'percent': 2.288},\n", " {'date': '2019-02-15', 'value': 3.315, 'percent': 2.315},\n", " {'date': '2019-02-22', 'value': 3.477, 'percent': 2.477},\n", " {'date': '2019-03-01', 'value': 3.523, 'percent': 2.523},\n", " {'date': '2019-03-08', 'value': 3.502, 'percent': 2.502},\n", " {'date': '2019-03-15', 'value': 3.663, 'percent': 2.663},\n", " {'date': '2019-03-22', 'value': 3.765, 'percent': 2.765},\n", " {'date': '2019-03-29', 'value': 3.847, 'percent': 2.847},\n", " {'date': '2019-04-04', 'value': 3.965, 'percent': 2.965},\n", " {'date': '2019-04-12', 'value': 4.032, 'percent': 3.032},\n", " {'date': '2019-04-19', 'value': 4.032, 'percent': 3.032},\n", " {'date': '2019-04-26', 'value': 3.931, 'percent': 2.931},\n", " {'date': '2019-04-30', 'value': 3.914, 'percent': 2.914},\n", " {'date': '2019-05-10', 'value': 3.759, 'percent': 2.759},\n", " {'date': '2019-05-17', 'value': 3.65, 'percent': 2.65},\n", " {'date': '2019-05-24', 'value': 3.561, 'percent': 2.561},\n", " {'date': '2019-05-31', 'value': 3.633, 'percent': 2.633},\n", " {'date': '2019-06-06', 'value': 3.592, 'percent': 2.592},\n", " {'date': '2019-06-14', 'value': 3.77, 'percent': 2.77},\n", " {'date': '2019-06-21', 'value': 3.905, 'percent': 2.905},\n", " {'date': '2019-06-28', 'value': 3.941, 'percent': 2.941},\n", " {'date': '2019-07-05', 'value': 3.958, 'percent': 2.958},\n", " {'date': '2019-07-12', 'value': 3.875, 'percent': 2.875},\n", " {'date': '2019-07-19', 'value': 3.918, 'percent': 2.918},\n", " {'date': '2019-07-26', 'value': 3.964, 'percent': 2.964},\n", " {'date': '2019-08-02', 'value': 3.816, 'percent': 2.816},\n", " {'date': '2019-08-09', 'value': 3.688, 'percent': 2.688},\n", " {'date': '2019-08-16', 'value': 3.744, 'percent': 2.744},\n", " {'date': '2019-08-23', 'value': 3.863, 'percent': 2.863},\n", " {'date': '2019-08-30', 'value': 3.833, 'percent': 2.833},\n", " {'date': '2019-09-06', 'value': 3.863, 'percent': 2.863},\n", " {'date': '2019-09-12', 'value': 3.883, 'percent': 2.883},\n", " {'date': '2019-09-20', 'value': 3.844, 'percent': 2.844},\n", " {'date': '2019-09-27', 'value': 3.752, 'percent': 2.752},\n", " {'date': '2019-10-11', 'value': 3.911, 'percent': 2.911},\n", " {'date': '2019-10-18', 'value': 3.982, 'percent': 2.982},\n", " {'date': '2019-10-25', 'value': 3.957, 'percent': 2.957},\n", " {'date': '2019-11-01', 'value': 4.026, 'percent': 3.026},\n", " {'date': '2019-11-08', 'value': 4.063, 'percent': 3.063},\n", " {'date': '2019-11-15', 'value': 3.913, 'percent': 2.913},\n", " {'date': '2019-11-22', 'value': 3.957, 'percent': 2.957},\n", " {'date': '2019-11-29', 'value': 3.987, 'percent': 2.987},\n", " {'date': '2019-12-06', 'value': 4.126, 'percent': 3.126},\n", " {'date': '2019-12-13', 'value': 4.228, 'percent': 3.228},\n", " {'date': '2019-12-20', 'value': 4.259, 'percent': 3.259},\n", " {'date': '2019-12-27', 'value': 4.346, 'percent': 3.346},\n", " {'date': '2020-01-03', 'value': 4.425, 'percent': 3.425},\n", " {'date': '2020-01-10', 'value': 4.391, 'percent': 3.391},\n", " {'date': '2020-01-17', 'value': 4.454, 'percent': 3.454},\n", " {'date': '2020-01-23', 'value': 4.223, 'percent': 3.223},\n", " {'date': '2020-02-07', 'value': 4.414, 'percent': 3.414},\n", " {'date': '2020-02-14', 'value': 4.564, 'percent': 3.564},\n", " {'date': '2020-02-21', 'value': 4.66, 'percent': 3.66},\n", " {'date': '2020-02-28', 'value': 4.538, 'percent': 3.538},\n", " {'date': '2020-03-06', 'value': 4.784, 'percent': 3.784},\n", " {'date': '2020-03-13', 'value': 4.569, 'percent': 3.569},\n", " {'date': '2020-03-20', 'value': 4.344, 'percent': 3.344},\n", " {'date': '2020-03-27', 'value': 4.473, 'percent': 3.473},\n", " {'date': '2020-04-03', 'value': 4.492, 'percent': 3.492},\n", " {'date': '2020-04-10', 'value': 4.57, 'percent': 3.57},\n", " {'date': '2020-04-17', 'value': 4.659, 'percent': 3.659},\n", " {'date': '2020-04-24', 'value': 4.662, 'percent': 3.662},\n", " {'date': '2020-04-30', 'value': 4.753, 'percent': 3.753},\n", " {'date': '2020-05-08', 'value': 4.835, 'percent': 3.835},\n", " {'date': '2020-05-15', 'value': 4.933, 'percent': 3.933},\n", " {'date': '2020-05-22', 'value': 4.802, 'percent': 3.802},\n", " {'date': '2020-05-29', 'value': 4.966, 'percent': 3.966},\n", " {'date': '2020-06-05', 'value': 5.089, 'percent': 4.089},\n", " {'date': '2020-06-12', 'value': 5.19, 'percent': 4.19},\n", " {'date': '2020-06-19', 'value': 5.342, 'percent': 4.342},\n", " {'date': '2020-06-24', 'value': 5.449, 'percent': 4.449},\n", " {'date': '2020-07-03', 'value': 5.803, 'percent': 4.803},\n", " {'date': '2020-07-10', 'value': 6.195, 'percent': 5.195},\n", " {'date': '2020-07-17', 'value': 5.988, 'percent': 4.988},\n", " {'date': '2020-07-24', 'value': 6.133, 'percent': 5.133},\n", " {'date': '2020-07-31', 'value': 6.328, 'percent': 5.328},\n", " {'date': '2020-08-07', 'value': 6.47, 'percent': 5.47},\n", " {'date': '2020-08-14', 'value': 6.409, 'percent': 5.409},\n", " {'date': '2020-08-21', 'value': 6.606, 'percent': 5.606},\n", " {'date': '2020-08-28', 'value': 6.769, 'percent': 5.769},\n", " {'date': '2020-09-04', 'value': 6.671, 'percent': 5.671},\n", " {'date': '2020-09-11', 'value': 6.518, 'percent': 5.518},\n", " {'date': '2020-09-18', 'value': 6.594, 'percent': 5.594},\n", " {'date': '2020-09-25', 'value': 6.426, 'percent': 5.426},\n", " {'date': '2020-09-30', 'value': 6.481, 'percent': 5.481},\n", " {'date': '2020-10-09', 'value': 6.618, 'percent': 5.618},\n", " {'date': '2020-10-16', 'value': 6.67, 'percent': 5.67},\n", " {'date': '2020-10-23', 'value': 6.58, 'percent': 5.58},\n", " {'date': '2020-10-30', 'value': 6.581, 'percent': 5.581},\n", " {'date': '2020-11-06', 'value': 6.91, 'percent': 5.91},\n", " {'date': '2020-11-13', 'value': 6.888, 'percent': 5.888},\n", " {'date': '2020-11-20', 'value': 6.992, 'percent': 5.992},\n", " {'date': '2020-11-27', 'value': 6.961, 'percent': 5.961},\n", " {'date': '2020-12-04', 'value': 6.991, 'percent': 5.991}]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "netvalue_list" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(netvalue_list)" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datevaluepercent
02015-04-211.0000.000
12015-04-241.0000.000
22015-04-301.0000.000
32015-05-081.0060.006
42015-05-151.0140.014
\n", "
" ], "text/plain": [ " date value percent\n", "0 2015-04-21 1.000 0.000\n", "1 2015-04-24 1.000 0.000\n", "2 2015-04-30 1.000 0.000\n", "3 2015-05-08 1.006 0.006\n", "4 2015-05-15 1.014 0.014" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
valuepercent
count288.000000288.000000
mean3.0480732.048073
std1.5098131.509813
min1.0000000.000000
25%1.6017500.601750
50%3.0750002.075000
75%3.8660002.866000
max6.9920005.992000
\n", "
" ], "text/plain": [ " value percent\n", "count 288.000000 288.000000\n", "mean 3.048073 2.048073\n", "std 1.509813 1.509813\n", "min 1.000000 0.000000\n", "25% 1.601750 0.601750\n", "50% 3.075000 2.075000\n", "75% 3.866000 2.866000\n", "max 6.992000 5.992000" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datevaluepercent
2682020-07-246.1335.133
2692020-07-316.3285.328
2702020-08-076.4705.470
2712020-08-146.4095.409
2722020-08-216.6065.606
2732020-08-286.7695.769
2742020-09-046.6715.671
2752020-09-116.5185.518
2762020-09-186.5945.594
2772020-09-256.4265.426
2782020-09-306.4815.481
2792020-10-096.6185.618
2802020-10-166.6705.670
2812020-10-236.5805.580
2822020-10-306.5815.581
2832020-11-066.9105.910
2842020-11-136.8885.888
2852020-11-206.9925.992
2862020-11-276.9615.961
2872020-12-046.9915.991
\n", "
" ], "text/plain": [ " date value percent\n", "268 2020-07-24 6.133 5.133\n", "269 2020-07-31 6.328 5.328\n", "270 2020-08-07 6.470 5.470\n", "271 2020-08-14 6.409 5.409\n", "272 2020-08-21 6.606 5.606\n", "273 2020-08-28 6.769 5.769\n", "274 2020-09-04 6.671 5.671\n", "275 2020-09-11 6.518 5.518\n", "276 2020-09-18 6.594 5.594\n", "277 2020-09-25 6.426 5.426\n", "278 2020-09-30 6.481 5.481\n", "279 2020-10-09 6.618 5.618\n", "280 2020-10-16 6.670 5.670\n", "281 2020-10-23 6.580 5.580\n", "282 2020-10-30 6.581 5.581\n", "283 2020-11-06 6.910 5.910\n", "284 2020-11-13 6.888 5.888\n", "285 2020-11-20 6.992 5.992\n", "286 2020-11-27 6.961 5.961\n", "287 2020-12-04 6.991 5.991" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail(20)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datevaluepercent
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [date, value, percent]\n", "Index: []" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['percent']<0]" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 288 entries, 0 to 287\n", "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 date 288 non-null object \n", " 1 value 288 non-null float64\n", " 2 percent 288 non-null float64\n", "dtypes: float64(2), object(1)\n", "memory usage: 6.9+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df['percent'].plot()" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [], "source": [ "df['pct']=df['value'].pct_change()" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datevaluepercentpct
02015-04-211.0000.000NaN
12015-04-241.0000.000NaN
22015-04-301.0000.000NaN
32015-05-081.0060.006inf
42015-05-151.0140.0141.333333
\n", "
" ], "text/plain": [ " date value percent pct\n", "0 2015-04-21 1.000 0.000 NaN\n", "1 2015-04-24 1.000 0.000 NaN\n", "2 2015-04-30 1.000 0.000 NaN\n", "3 2015-05-08 1.006 0.006 inf\n", "4 2015-05-15 1.014 0.014 1.333333" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datevaluepercentptcpct
2832020-11-066.9105.9100.0589500.058950
2842020-11-136.8885.888-0.003723-0.003723
2852020-11-206.9925.9920.0176630.017663
2862020-11-276.9615.961-0.005174-0.005174
2872020-12-046.9915.9910.0050330.005033
\n", "
" ], "text/plain": [ " date value percent ptc pct\n", "283 2020-11-06 6.910 5.910 0.058950 0.058950\n", "284 2020-11-13 6.888 5.888 -0.003723 -0.003723\n", "285 2020-11-20 6.992 5.992 0.017663 0.017663\n", "286 2020-11-27 6.961 5.961 -0.005174 -0.005174\n", "287 2020-12-04 6.991 5.991 0.005033 0.005033" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail()" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [], "source": [ "df['pct']=df['pct']*100" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [], "source": [ "df = df.drop('ptc',axis=1)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datevaluepercentpct
02015-04-211.0000.000NaN
12015-04-241.0000.000NaN
22015-04-301.0000.000NaN
32015-05-081.0060.006inf
42015-05-151.0140.0141.333333
\n", "
" ], "text/plain": [ " date value percent pct\n", "0 2015-04-21 1.000 0.000 NaN\n", "1 2015-04-24 1.000 0.000 NaN\n", "2 2015-04-30 1.000 0.000 NaN\n", "3 2015-05-08 1.006 0.006 inf\n", "4 2015-05-15 1.014 0.014 1.333333" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datevaluepercentptc
02015-04-211.0000.000NaN
12015-04-241.0000.000NaN
22015-04-301.0000.000NaN
32015-05-081.0060.006inf
42015-05-151.0140.0141.333333
52015-05-221.0460.0462.285714
62015-05-291.0950.0951.065217
72015-06-051.1360.1360.431579
82015-06-121.1300.130-0.044118
92015-06-191.0990.099-0.238462
\n", "
" ], "text/plain": [ " date value percent ptc\n", "0 2015-04-21 1.000 0.000 NaN\n", "1 2015-04-24 1.000 0.000 NaN\n", "2 2015-04-30 1.000 0.000 NaN\n", "3 2015-05-08 1.006 0.006 inf\n", "4 2015-05-15 1.014 0.014 1.333333\n", "5 2015-05-22 1.046 0.046 2.285714\n", "6 2015-05-29 1.095 0.095 1.065217\n", "7 2015-06-05 1.136 0.136 0.431579\n", "8 2015-06-12 1.130 0.130 -0.044118\n", "9 2015-06-19 1.099 0.099 -0.238462" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(10)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datevaluepercentptc
2832020-11-066.9105.9100.058950
2842020-11-136.8885.888-0.003723
2852020-11-206.9925.9920.017663
2862020-11-276.9615.961-0.005174
2872020-12-046.9915.9910.005033
\n", "
" ], "text/plain": [ " date value percent ptc\n", "283 2020-11-06 6.910 5.910 0.058950\n", "284 2020-11-13 6.888 5.888 -0.003723\n", "285 2020-11-20 6.992 5.992 0.017663\n", "286 2020-11-27 6.961 5.961 -0.005174\n", "287 2020-12-04 6.991 5.991 0.005033" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail()" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
valuepercentpct
count288.000000288.000000288.000000
mean3.0480732.0480730.724861
std1.5098131.5098133.088422
min1.0000000.000000-13.169074
25%1.6017500.601750-1.222082
50%3.0750002.0750000.817626
75%3.8660002.8660002.607213
max6.9920005.99200012.491373
\n", "
" ], "text/plain": [ " value percent pct\n", "count 288.000000 288.000000 288.000000\n", "mean 3.048073 2.048073 0.724861\n", "std 1.509813 1.509813 3.088422\n", "min 1.000000 0.000000 -13.169074\n", "25% 1.601750 0.601750 -1.222082\n", "50% 3.075000 2.075000 0.817626\n", "75% 3.866000 2.866000 2.607213\n", "max 6.992000 5.992000 12.491373" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "12.491373360938574" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['pct'].max()" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [], "source": [ "df=df.fillna(0)" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datevaluepercentpct
02015-04-211.0000.0000.000000
12015-04-241.0000.0000.000000
22015-04-301.0000.0000.000000
32015-05-081.0060.0060.600000
42015-05-151.0140.0140.795229
...............
2832020-11-066.9105.9104.999240
2842020-11-136.8885.888-0.318379
2852020-11-206.9925.9921.509872
2862020-11-276.9615.961-0.443364
2872020-12-046.9915.9910.430973
\n", "

288 rows × 4 columns

\n", "
" ], "text/plain": [ " date value percent pct\n", "0 2015-04-21 1.000 0.000 0.000000\n", "1 2015-04-24 1.000 0.000 0.000000\n", "2 2015-04-30 1.000 0.000 0.000000\n", "3 2015-05-08 1.006 0.006 0.600000\n", "4 2015-05-15 1.014 0.014 0.795229\n", ".. ... ... ... ...\n", "283 2020-11-06 6.910 5.910 4.999240\n", "284 2020-11-13 6.888 5.888 -0.318379\n", "285 2020-11-20 6.992 5.992 1.509872\n", "286 2020-11-27 6.961 5.961 -0.443364\n", "287 2020-12-04 6.991 5.991 0.430973\n", "\n", "[288 rows x 4 columns]" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "df = df.replace([np.inf, -np.inf], 0)" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.005032712632108599" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(5.991-5.961)/5.961" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: analysis/统计分时最大站跌幅.ipynb ================================================ ================================================ FILE: analysis/退市转债分析.ipynb ================================================ { "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3-final" }, "orig_nbformat": 2, "kernelspec": { "name": "python3", "display_name": "Python 3.8.3 64-bit (conda)", "metadata": { "interpreter": { "hash": "513dc2e41d739bb2c947903f3c0bbf636d03aa53ab50e61c694a27481c81805e" } } } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "file=r'C:\\OneDrive\\Stock\\截止2021-04-02日为止的退市转债.xlsx'" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "df = pd.read_excel(file)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "167" ] }, "metadata": {}, "execution_count": 4 } ], "source": [ "len(df)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 转债代码 转债名称 最后交易价格 正股代码 正股名称 发行规模(亿元) 回售规模(亿元) 剩余规模(亿元) \\\n", "0 128012 辉丰转债 99.999 2496 *ST辉丰 8.450 8.203 0.240 \n", "1 113038 隆20转债 166.130 601012 隆基股份 50.000 0.000 0.235 \n", "2 128052 凯龙转债 148.295 2783 凯龙股份 3.289 0.000 0.311 \n", "3 113029 明阳转债 141.360 601615 明阳智能 17.000 0.000 0.051 \n", "4 113590 海容转债 156.190 603187 海容冷链 5.000 0.000 0.029 \n", "\n", " 发行日期 最后交易日 到期日期 存续年限 退市原因 \n", "0 2016-04-21 2022-04-21 2022-04-21 6.0 低于3千万 \n", "1 2020-07-31 2021-03-30 2026-07-30 0.7 强赎 \n", "2 2018-12-21 2021-03-23 2024-12-21 2.3 强赎 \n", "3 2019-12-16 2021-03-18 2025-12-15 1.3 强赎 \n", "4 2020-06-29 2021-03-05 2026-06-29 0.7 强赎 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
转债代码转债名称最后交易价格正股代码正股名称发行规模(亿元)回售规模(亿元)剩余规模(亿元)发行日期最后交易日到期日期存续年限退市原因
0128012辉丰转债99.9992496*ST辉丰8.4508.2030.2402016-04-212022-04-212022-04-216.0低于3千万
1113038隆20转债166.130601012隆基股份50.0000.0000.2352020-07-312021-03-302026-07-300.7强赎
2128052凯龙转债148.2952783凯龙股份3.2890.0000.3112018-12-212021-03-232024-12-212.3强赎
3113029明阳转债141.360601615明阳智能17.0000.0000.0512019-12-162021-03-182025-12-151.3强赎
4113590海容转债156.190603187海容冷链5.0000.0000.0292020-06-292021-03-052026-06-290.7强赎
\n
" }, "metadata": {}, "execution_count": 5 } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\nRangeIndex: 167 entries, 0 to 166\nData columns (total 13 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 转债代码 167 non-null int64 \n 1 转债名称 167 non-null object \n 2 最后交易价格 167 non-null float64 \n 3 正股代码 167 non-null int64 \n 4 正股名称 167 non-null object \n 5 发行规模(亿元) 167 non-null float64 \n 6 回售规模(亿元) 167 non-null float64 \n 7 剩余规模(亿元) 167 non-null float64 \n 8 发行日期 167 non-null datetime64[ns]\n 9 最后交易日 167 non-null datetime64[ns]\n 10 到期日期 167 non-null datetime64[ns]\n 11 存续年限 167 non-null float64 \n 12 退市原因 167 non-null object \ndtypes: datetime64[ns](3), float64(5), int64(2), object(3)\nmemory usage: 17.1+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "强赎 151\n", "到期 9\n", "不足3000万 4\n", "不足2000万 2\n", "低于3千万 1\n", "Name: 退市原因, dtype: int64" ] }, "metadata": {}, "execution_count": 7 } ], "source": [ "df['退市原因'].value_counts()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "df=df[~df['转债名称'].str.endswith('EB')]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "159" ] }, "metadata": {}, "execution_count": 11 } ], "source": [ "len(df)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "强赎 150\n", "不足3000万 4\n", "到期 4\n", "低于3千万 1\n", "Name: 退市原因, dtype: int64" ] }, "metadata": {}, "execution_count": 12 } ], "source": [ "df['退市原因'].value_counts()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "count 159.000000\n", "mean 1.672956\n", "std 1.221365\n", "min 0.600000\n", "25% 0.700000\n", "50% 1.300000\n", "75% 2.150000\n", "max 6.000000\n", "Name: 存续年限, dtype: float64" ] }, "metadata": {}, "execution_count": 14 } ], "source": [ "df['存续年限'].describe()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 转债代码 转债名称 最后交易价格 正股代码 正股名称 发行规模(亿元) 回售规模(亿元) 剩余规模(亿元) \\\n", "0 128012 辉丰转债 99.999 2496 *ST辉丰 8.45 8.203 0.240 \n", "20 113008 电气转债 106.480 601727 上海电气 60.00 0.000 13.422 \n", "\n", " 发行日期 最后交易日 到期日期 存续年限 退市原因 \n", "0 2016-04-21 2022-04-21 2022-04-21 6.0 低于3千万 \n", "20 2015-02-02 2021-01-18 2021-02-02 6.0 到期 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
转债代码转债名称最后交易价格正股代码正股名称发行规模(亿元)回售规模(亿元)剩余规模(亿元)发行日期最后交易日到期日期存续年限退市原因
0128012辉丰转债99.9992496*ST辉丰8.458.2030.2402016-04-212022-04-212022-04-216.0低于3千万
20113008电气转债106.480601727上海电气60.000.00013.4222015-02-022021-01-182021-02-026.0到期
\n
" }, "metadata": {}, "execution_count": 15 } ], "source": [ "df[df['存续年限']==6]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.9433962264150944" ] }, "metadata": {}, "execution_count": 16 } ], "source": [ "150/159" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.031446540880503145" ] }, "metadata": {}, "execution_count": 17 } ], "source": [ "5/159" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.025157232704402517" ] }, "metadata": {}, "execution_count": 18 } ], "source": [ "4/159" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 转债代码 转债名称 最后交易价格 正股代码 正股名称 发行规模(亿元) 回售规模(亿元) 剩余规模(亿元) \\\n", "0 128012 辉丰转债 99.999 2496 *ST辉丰 8.45 8.203 0.240 \n", "92 128060 中装转债 166.600 2822 中装建设 5.25 0.000 0.037 \n", "101 113507 天马转债 123.290 603668 天马科技 3.05 0.000 0.030 \n", "119 113010 江南转债 100.590 601199 江南水务 7.60 7.359 0.241 \n", "166 110009 双良转债 93.820 600481 双良节能 7.20 6.938 0.261 \n", "\n", " 发行日期 最后交易日 到期日期 存续年限 退市原因 \n", "0 2016-04-21 2022-04-21 2022-04-21 6.0 低于3千万 \n", "92 2019-03-26 2020-02-12 2025-03-26 0.9 不足3000万 \n", "101 2018-04-17 2019-11-04 2024-04-17 1.6 不足3000万 \n", "119 2016-03-18 2019-01-29 2022-03-18 2.9 不足3000万 \n", "166 2010-05-04 2011-12-14 2015-05-04 1.6 不足3000万 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
转债代码转债名称最后交易价格正股代码正股名称发行规模(亿元)回售规模(亿元)剩余规模(亿元)发行日期最后交易日到期日期存续年限退市原因
0128012辉丰转债99.9992496*ST辉丰8.458.2030.2402016-04-212022-04-212022-04-216.0低于3千万
92128060中装转债166.6002822中装建设5.250.0000.0372019-03-262020-02-122025-03-260.9不足3000万
101113507天马转债123.290603668天马科技3.050.0000.0302018-04-172019-11-042024-04-171.6不足3000万
119113010江南转债100.590601199江南水务7.607.3590.2412016-03-182019-01-292022-03-182.9不足3000万
166110009双良转债93.820600481双良节能7.206.9380.2612010-05-042011-12-142015-05-041.6不足3000万
\n
" }, "metadata": {}, "execution_count": 20 } ], "source": [ "df[(df['退市原因']=='不足3000万') | (df['退市原因']=='低于3千万')]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 转债代码 转债名称 最后交易价格 正股代码 正股名称 发行规模(亿元) 回售规模(亿元) 剩余规模(亿元) \\\n", "20 113008 电气转债 106.48 601727 上海电气 60.00 0.000 13.422 \n", "99 110030 格力转债 105.69 600185 格力地产 9.80 0.000 4.251 \n", "160 110007 博汇转债 108.61 600966 博汇纸业 9.75 0.000 0.145 \n", "163 110003 新钢转债 106.55 600782 新钢股份 27.60 0.024 27.576 \n", "\n", " 发行日期 最后交易日 到期日期 存续年限 退市原因 \n", "20 2015-02-02 2021-01-18 2021-02-02 6.0 到期 \n", "99 2014-12-25 2019-12-10 2019-12-25 5.0 到期 \n", "160 2009-09-23 2014-09-05 2014-09-23 5.0 到期 \n", "163 2008-08-21 2013-08-06 2013-08-20 5.0 到期 " ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
转债代码转债名称最后交易价格正股代码正股名称发行规模(亿元)回售规模(亿元)剩余规模(亿元)发行日期最后交易日到期日期存续年限退市原因
20113008电气转债106.48601727上海电气60.000.00013.4222015-02-022021-01-182021-02-026.0到期
99110030格力转债105.69600185格力地产9.800.0004.2512014-12-252019-12-102019-12-255.0到期
160110007博汇转债108.61600966博汇纸业9.750.0000.1452009-09-232014-09-052014-09-235.0到期
163110003新钢转债106.55600782新钢股份27.600.02427.5762008-08-212013-08-062013-08-205.0到期
\n
" }, "metadata": {}, "execution_count": 21 } ], "source": [ "df[df['退市原因']=='到期']" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " 转债代码 转债名称 最后交易价格 正股代码 正股名称 发行规模(亿元) 回售规模(亿元) 剩余规模(亿元) \\\n", "1 113038 隆20转债 166.130 601012 隆基股份 50.000 0.0 0.235 \n", "4 113590 海容转债 156.190 603187 海容冷链 5.000 0.0 0.029 \n", "5 113592 安20转债 176.530 603345 安井食品 9.000 0.0 0.018 \n", "7 113583 益丰转债 111.900 603939 益丰药房 15.810 0.0 0.079 \n", "9 128112 歌尔转2 144.988 2241 歌尔股份 40.000 0.0 0.599 \n", ".. ... ... ... ... ... ... ... ... \n", "142 110028 冠城转债 177.490 600067 冠城大通 18.000 0.0 0.047 \n", "143 128006 长青转债 145.999 2391 长青股份 6.318 0.0 0.000 \n", "148 110027 东方转债 159.570 600875 东方电气 40.000 0.0 0.036 \n", "154 110025 国金转债 194.970 600109 国金证券 25.000 0.0 0.152 \n", "155 128004 久立转债 143.000 2318 久立特材 4.870 0.0 0.009 \n", "\n", " 发行日期 最后交易日 到期日期 存续年限 退市原因 \n", "1 2020-07-31 2021-03-30 2026-07-30 0.7 强赎 \n", "4 2020-06-29 2021-03-05 2026-06-29 0.7 强赎 \n", "5 2020-07-08 2021-03-05 2026-07-07 0.7 强赎 \n", "7 2020-06-01 2021-03-04 2026-05-31 0.8 强赎 \n", "9 2020-06-12 2021-03-02 2026-06-11 0.7 强赎 \n", ".. ... ... ... ... ... \n", "142 2014-07-18 2015-04-23 2020-07-18 0.8 强赎 \n", "143 2014-07-09 2015-04-15 2020-06-19 0.8 强赎 \n", "148 2014-07-10 2015-02-16 2020-07-10 0.6 强赎 \n", "154 2014-05-14 2014-12-29 2020-05-13 0.6 强赎 \n", "155 2014-02-25 2014-12-23 2020-02-24 0.8 强赎 \n", "\n", "[67 rows x 13 columns]" ], "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
转债代码转债名称最后交易价格正股代码正股名称发行规模(亿元)回售规模(亿元)剩余规模(亿元)发行日期最后交易日到期日期存续年限退市原因
1113038隆20转债166.130601012隆基股份50.0000.00.2352020-07-312021-03-302026-07-300.7强赎
4113590海容转债156.190603187海容冷链5.0000.00.0292020-06-292021-03-052026-06-290.7强赎
5113592安20转债176.530603345安井食品9.0000.00.0182020-07-082021-03-052026-07-070.7强赎
7113583益丰转债111.900603939益丰药房15.8100.00.0792020-06-012021-03-042026-05-310.8强赎
9128112歌尔转2144.9882241歌尔股份40.0000.00.5992020-06-122021-03-022026-06-110.7强赎
..........................................
142110028冠城转债177.490600067冠城大通18.0000.00.0472014-07-182015-04-232020-07-180.8强赎
143128006长青转债145.9992391长青股份6.3180.00.0002014-07-092015-04-152020-06-190.8强赎
148110027东方转债159.570600875东方电气40.0000.00.0362014-07-102015-02-162020-07-100.6强赎
154110025国金转债194.970600109国金证券25.0000.00.1522014-05-142014-12-292020-05-130.6强赎
155128004久立转债143.0002318久立特材4.8700.00.0092014-02-252014-12-232020-02-240.8强赎
\n

67 rows × 13 columns

\n
" }, "metadata": {}, "execution_count": 53 } ], "source": [ "df[df['存续年限']<=1]" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "转债代码 22\n", "转债名称 22\n", "最后交易价格 22\n", "正股代码 22\n", "正股名称 22\n", "发行规模(亿元) 22\n", "回售规模(亿元) 22\n", "剩余规模(亿元) 22\n", "发行日期 22\n", "最后交易日 22\n", "到期日期 22\n", "存续年限 22\n", "退市原因 22\n", "dtype: int64" ] }, "metadata": {}, "execution_count": 25 } ], "source": [ "df[df['存续年限']>3].count()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "-0.8616352201257862" ] }, "metadata": {}, "execution_count": 27 } ], "source": [ "22/159-1" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "import matplotlib\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 40 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "df['存续年限'].plot(kind='hist',bins=6,histtype='stepfilled', density=True,color='#0504aa')" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(array([58., 54., 25., 10., 6., 6.]),\n", " array([0., 1., 2., 3., 4., 5., 6.]),\n", " )" ] }, "metadata": {}, "execution_count": 63 }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "plt.figure(figsize=(6,7))\n", "plt.hist(df['存续年限'].tolist(),bins =np.arange(0,6.5,1),width=0.9,alpha=0.8,color='green')\n" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "转债代码 112\n", "转债名称 112\n", "最后交易价格 112\n", "正股代码 112\n", "正股名称 112\n", "发行规模(亿元) 112\n", "回售规模(亿元) 112\n", "剩余规模(亿元) 112\n", "发行日期 112\n", "最后交易日 112\n", "到期日期 112\n", "存续年限 112\n", "退市原因 112\n", "dtype: int64" ] }, "metadata": {}, "execution_count": 69 } ], "source": [ "df[df['存续年限']<2].count()" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.36477987421383645" ] }, "metadata": {}, "execution_count": 68 } ], "source": [ "58/159" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.7044025157232704" ] }, "metadata": {}, "execution_count": 70 } ], "source": [ "112/159" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ] } ================================================ FILE: analysis/选股.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "█\r" ] } ], "source": [ "#-*-coding=utf-8-*-\n", "# 用来选股的\n", "from setting import get_engine\n", "import pandas as pd\n", "import tushare as ts" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "engine = get_engine('db_stock')\n", "basic_df = pd.read_sql('tb_basic_info',engine,index_col='index')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
index
0603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018041035286.051.9841.9855.848.193.8742986.02018-04-11
1300356光一科技电气设备江苏206.513.694.15208679.9597810.2117068.50...2.492012100928831.280.69-39.02-47.7626.054.3019839.02018-04-11
2600711盛屯矿业小金属福建26.1514.9716.771125400.88590581.0076470.36...3.1119960531104130.270.6262.61223.676.852.95106700.02018-04-11
3002160常铝股份江苏32.314.727.24622252.69297916.59151107.36...1.452007082127155.900.3740.0356.0717.643.8450000.02018-04-11
4000717韶钢松山普钢广东6.3224.2024.201441538.00440514.44801547.88...5.3519970508-331470.38-1.3786.352381.1313.269.66132008.02018-04-11
\n", "

5 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals totalAssets \\\n", "index \n", "0 603897 N长城 电气设备 浙江 25.57 0.45 1.78 131807.23 \n", "1 300356 光一科技 电气设备 江苏 206.51 3.69 4.15 208679.95 \n", "2 600711 盛屯矿业 小金属 福建 26.15 14.97 16.77 1125400.88 \n", "3 002160 常铝股份 铝 江苏 32.31 4.72 7.24 622252.69 \n", "4 000717 韶钢松山 普钢 广东 6.32 24.20 24.20 1441538.00 \n", "\n", " liquidAssets fixedAssets ... pb timeToMarket undp \\\n", "index ... \n", "0 117523.63 10988.37 ... 4.27 20180410 35286.05 \n", "1 97810.21 17068.50 ... 2.49 20121009 28831.28 \n", "2 590581.00 76470.36 ... 3.11 19960531 104130.27 \n", "3 297916.59 151107.36 ... 1.45 20070821 27155.90 \n", "4 440514.44 801547.88 ... 5.35 19970508 -331470.38 \n", "\n", " perundp rev profit gpr npr holders 更新日期 \n", "index \n", "0 1.98 41.98 55.84 8.19 3.87 42986.0 2018-04-11 \n", "1 0.69 -39.02 -47.76 26.05 4.30 19839.0 2018-04-11 \n", "2 0.62 62.61 223.67 6.85 2.95 106700.0 2018-04-11 \n", "3 0.37 40.03 56.07 17.64 3.84 50000.0 2018-04-11 \n", "4 -1.37 86.35 2381.13 13.26 9.66 132008.0 2018-04-11 \n", "\n", "[5 rows x 24 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df.head()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "basic_df=basic_df[basic_df['timeToMarket']!=0]" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 3506 entries, 0 to 3509\n", "Data columns (total 24 columns):\n", "code 3506 non-null object\n", "name 3506 non-null object\n", "industry 3506 non-null object\n", "area 3506 non-null object\n", "pe 3506 non-null float64\n", "outstanding 3506 non-null float64\n", "totals 3506 non-null float64\n", "totalAssets 3506 non-null float64\n", "liquidAssets 3506 non-null float64\n", "fixedAssets 3506 non-null float64\n", "reserved 3506 non-null float64\n", "reservedPerShare 3506 non-null float64\n", "esp 3506 non-null float64\n", "bvps 3506 non-null float64\n", "pb 3506 non-null float64\n", "timeToMarket 3506 non-null int64\n", "undp 3506 non-null float64\n", "perundp 3506 non-null float64\n", "rev 3506 non-null float64\n", "profit 3506 non-null float64\n", "gpr 3506 non-null float64\n", "npr 3506 non-null float64\n", "holders 3506 non-null float64\n", "更新日期 3506 non-null object\n", "dtypes: float64(18), int64(1), object(5)\n", "memory usage: 684.8+ KB\n" ] } ], "source": [ "basic_df.info()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python2.7/dist-packages/pandas/core/ops.py:816: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", " result = getattr(x, name)(y)\n" ] }, { "ename": "TypeError", "evalue": "invalid type comparison", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mbasic_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbasic_df\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreset_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbasic_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timeToMarket'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc\u001b[0m in \u001b[0;36mreset_index\u001b[0;34m(self, level, drop, inplace, col_level, col_fill)\u001b[0m\n\u001b[1;32m 3339\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3340\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3341\u001b[0;31m \u001b[0mlevel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_level_number\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlev\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mlev\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3342\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mMultiIndex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3343\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/indexes/base.pyc\u001b[0m in \u001b[0;36m_get_level_number\u001b[0;34m(self, level)\u001b[0m\n\u001b[1;32m 1618\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1619\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_level_number\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1620\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_index_level\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1621\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1622\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/indexes/base.pyc\u001b[0m in \u001b[0;36m_validate_index_level\u001b[0;34m(self, level)\u001b[0m\n\u001b[1;32m 1613\u001b[0m \u001b[0;34m\" Index has only 1 level, not %d\"\u001b[0m \u001b[0;34m%\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1614\u001b[0m (level + 1))\n\u001b[0;32m-> 1615\u001b[0;31m \u001b[0;32melif\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1616\u001b[0m raise KeyError('Level %s must be same as name (%s)' %\n\u001b[1;32m 1617\u001b[0m (level, self.name))\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/ops.pyc\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(self, other, axis)\u001b[0m\n\u001b[1;32m 877\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 878\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrstate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'ignore'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 879\u001b[0;31m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mna_op\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 880\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_scalar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mres\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 881\u001b[0m raise TypeError('Could not compare {typ} type with Series'\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/ops.pyc\u001b[0m in \u001b[0;36mna_op\u001b[0;34m(x, y)\u001b[0m\n\u001b[1;32m 816\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mNotImplemented\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 818\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"invalid type comparison\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 819\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 820\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: invalid type comparison" ] } ], "source": [ "basic_df = basic_df.reset_index(basic_df['timeToMarket'],drop=True)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
index
0603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018041035286.051.9841.9855.848.193.8742986.02018-04-11
1300356光一科技电气设备江苏206.513.694.15208679.9597810.2117068.50...2.492012100928831.280.69-39.02-47.7626.054.3019839.02018-04-11
2600711盛屯矿业小金属福建26.1514.9716.771125400.88590581.0076470.36...3.1119960531104130.270.6262.61223.676.852.95106700.02018-04-11
3002160常铝股份江苏32.314.727.24622252.69297916.59151107.36...1.452007082127155.900.3740.0356.0717.643.8450000.02018-04-11
4000717韶钢松山普钢广东6.3224.2024.201441538.00440514.44801547.88...5.3519970508-331470.38-1.3786.352381.1313.269.66132008.02018-04-11
\n", "

5 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals totalAssets \\\n", "index \n", "0 603897 N长城 电气设备 浙江 25.57 0.45 1.78 131807.23 \n", "1 300356 光一科技 电气设备 江苏 206.51 3.69 4.15 208679.95 \n", "2 600711 盛屯矿业 小金属 福建 26.15 14.97 16.77 1125400.88 \n", "3 002160 常铝股份 铝 江苏 32.31 4.72 7.24 622252.69 \n", "4 000717 韶钢松山 普钢 广东 6.32 24.20 24.20 1441538.00 \n", "\n", " liquidAssets fixedAssets ... pb timeToMarket undp \\\n", "index ... \n", "0 117523.63 10988.37 ... 4.27 20180410 35286.05 \n", "1 97810.21 17068.50 ... 2.49 20121009 28831.28 \n", "2 590581.00 76470.36 ... 3.11 19960531 104130.27 \n", "3 297916.59 151107.36 ... 1.45 20070821 27155.90 \n", "4 440514.44 801547.88 ... 5.35 19970508 -331470.38 \n", "\n", " perundp rev profit gpr npr holders 更新日期 \n", "index \n", "0 1.98 41.98 55.84 8.19 3.87 42986.0 2018-04-11 \n", "1 0.69 -39.02 -47.76 26.05 4.30 19839.0 2018-04-11 \n", "2 0.62 62.61 223.67 6.85 2.95 106700.0 2018-04-11 \n", "3 0.37 40.03 56.07 17.64 3.84 50000.0 2018-04-11 \n", "4 -1.37 86.35 2381.13 13.26 9.66 132008.0 2018-04-11 \n", "\n", "[5 rows x 24 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df.head()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "basic_df['timeToMarket']=pd.to_datetime(basic_df['timeToMarket'],format='%Y%m%d')" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
index
0603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018-04-1035286.051.9841.9855.848.193.8742986.02018-04-11
1300356光一科技电气设备江苏206.513.694.15208679.9597810.2117068.50...2.492012-10-0928831.280.69-39.02-47.7626.054.3019839.02018-04-11
2600711盛屯矿业小金属福建26.1514.9716.771125400.88590581.0076470.36...3.111996-05-31104130.270.6262.61223.676.852.95106700.02018-04-11
3002160常铝股份江苏32.314.727.24622252.69297916.59151107.36...1.452007-08-2127155.900.3740.0356.0717.643.8450000.02018-04-11
4000717韶钢松山普钢广东6.3224.2024.201441538.00440514.44801547.88...5.351997-05-08-331470.38-1.3786.352381.1313.269.66132008.02018-04-11
\n", "

5 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals totalAssets \\\n", "index \n", "0 603897 N长城 电气设备 浙江 25.57 0.45 1.78 131807.23 \n", "1 300356 光一科技 电气设备 江苏 206.51 3.69 4.15 208679.95 \n", "2 600711 盛屯矿业 小金属 福建 26.15 14.97 16.77 1125400.88 \n", "3 002160 常铝股份 铝 江苏 32.31 4.72 7.24 622252.69 \n", "4 000717 韶钢松山 普钢 广东 6.32 24.20 24.20 1441538.00 \n", "\n", " liquidAssets fixedAssets ... pb timeToMarket undp \\\n", "index ... \n", "0 117523.63 10988.37 ... 4.27 2018-04-10 35286.05 \n", "1 97810.21 17068.50 ... 2.49 2012-10-09 28831.28 \n", "2 590581.00 76470.36 ... 3.11 1996-05-31 104130.27 \n", "3 297916.59 151107.36 ... 1.45 2007-08-21 27155.90 \n", "4 440514.44 801547.88 ... 5.35 1997-05-08 -331470.38 \n", "\n", " perundp rev profit gpr npr holders 更新日期 \n", "index \n", "0 1.98 41.98 55.84 8.19 3.87 42986.0 2018-04-11 \n", "1 0.69 -39.02 -47.76 26.05 4.30 19839.0 2018-04-11 \n", "2 0.62 62.61 223.67 6.85 2.95 106700.0 2018-04-11 \n", "3 0.37 40.03 56.07 17.64 3.84 50000.0 2018-04-11 \n", "4 -1.37 86.35 2381.13 13.26 9.66 132008.0 2018-04-11 \n", "\n", "[5 rows x 24 columns]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df.head()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
timeToMarket
2018-04-10603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018-04-1035286.051.9841.9855.848.193.8742986.02018-04-11
2012-10-09300356光一科技电气设备江苏206.513.694.15208679.9597810.2117068.50...2.492012-10-0928831.280.69-39.02-47.7626.054.3019839.02018-04-11
1996-05-31600711盛屯矿业小金属福建26.1514.9716.771125400.88590581.0076470.36...3.111996-05-31104130.270.6262.61223.676.852.95106700.02018-04-11
2007-08-21002160常铝股份江苏32.314.727.24622252.69297916.59151107.36...1.452007-08-2127155.900.3740.0356.0717.643.8450000.02018-04-11
1997-05-08000717韶钢松山普钢广东6.3224.2024.201441538.00440514.44801547.88...5.351997-05-08-331470.38-1.3786.352381.1313.269.66132008.02018-04-11
1996-05-03600896览海投资水运海南0.005.778.69448937.09363976.13453.85...2.741996-05-03-60134.50-0.69-94.8018.3891.85-416.7543837.02018-04-11
1997-06-25000819岳阳兴长石油加工湖南0.002.712.7181995.8859217.6317258.00...4.921997-06-2519668.430.7216.55-132.478.32-0.6231400.02018-04-11
2018-03-26600929湖南盐业食品湖南72.521.509.18310491.6378859.31139873.81...5.362018-03-2671625.130.781.3015.0647.717.24140295.02018-04-11
2010-04-30300076GQY视讯电脑设备浙江0.003.684.24116227.6176413.8121807.57...2.352010-04-3010759.370.25-40.70-1298.9335.65-29.9141000.02018-04-11
2007-08-03002144宏达高科纺织浙江26.281.361.77199379.3851652.7828723.63...1.512007-08-0352805.732.9912.73-6.0329.9215.7121057.02018-04-11
2017-03-16300621维业股份装修装饰深圳37.990.431.39186181.06169977.592515.88...3.412017-03-1626666.501.920.000.0013.344.2219044.02018-04-11
2017-09-20603106恒银金融电脑设备天津45.400.702.80212309.42190471.2716428.07...4.802017-09-2027721.100.990.000.0033.9511.2336000.02018-04-11
2017-03-15603811诚意药业化学制药浙江38.800.570.8567298.3246722.6212191.86...4.482017-03-159561.421.126.121.5752.1120.3110574.02018-04-11
2018-03-28002930宏川智慧仓储物流广东62.900.612.43187270.8013539.20103894.40...3.662018-03-2838270.211.57-0.7410.3356.5925.41115500.02018-04-11
2017-09-22603963大理药业化学制药云南73.920.251.0062622.2044925.3010986.69...8.402017-09-229541.130.950.000.0063.8520.0027488.02018-04-11
2018-03-30603214爱婴室百货上海49.450.251.0076961.1561297.167078.72...9.272018-03-3025456.172.5514.0626.4728.415.1826639.02018-04-11
2017-01-17300595欧普康视医疗保健安徽54.160.761.2484769.4671856.963970.03...10.122017-01-1720604.491.6631.6129.5676.0650.726781.02018-04-11
2017-03-21300627华测导航通信设备上海85.660.501.2395269.3088869.282105.35...9.132017-03-2119288.671.560.000.0054.5614.9716380.02018-04-11
2017-02-08603637镇海股份建筑施工浙江66.690.331.3386330.4676018.325968.18...4.332017-02-0820656.951.55-37.75-28.9131.5422.639897.02018-04-11
2017-10-10300705九典制药化学制药湖南89.940.291.1776920.2551869.2613084.78...9.342017-10-1012709.621.0842.0125.7651.9312.8321243.02018-04-11
2017-10-31603289泰瑞机器专用机械浙江45.820.512.0488554.8268437.2115267.82...5.652017-10-3126118.491.280.000.0030.6312.4048514.02018-04-11
2017-05-09603229奥翔药业化学制药浙江93.030.401.6068624.1345903.0014470.87...7.222017-05-0914151.700.880.000.0060.6322.6514088.02018-04-11
2017-06-02300660江苏雷利电气设备江苏26.100.251.02280316.22256656.8016994.20...3.212017-06-0233226.213.260.000.0026.7412.0718283.02018-04-11
2016-08-02300529健帆生物医疗保健广东62.991.064.18170240.02123065.9532537.78...12.852016-08-0248161.671.1532.1640.7284.1439.5822527.02018-04-11
2017-09-22002900哈三联化学制药黑龙江44.110.532.11218374.66135898.9268163.18...4.352017-09-2239189.781.8650.993.3674.1715.7638400.02018-04-11
2017-05-19002873新天药业中成药贵州44.540.170.6991925.2757405.9021257.95...5.892017-05-1918090.752.630.000.0081.0911.759615.02018-04-11
2010-02-03002350北京科锐电气设备北京184.533.763.87280886.13197356.5642124.90...3.112010-02-0334932.310.9023.04-44.2823.271.0352854.02018-04-11
2008-05-16002235安妮股份造纸福建58.103.344.16272703.47126430.0619098.98...2.012008-05-165426.160.1366.06473.5031.6314.4630659.02018-04-11
2017-08-10300688创业黑马综合类北京171.330.170.6841396.5540351.37380.64...14.132017-08-106212.930.910.000.0056.9117.9715720.02018-04-11
2018-02-26603712七一二通信设备天津363.051.007.72348015.50277392.6357633.35...21.082018-02-2620558.850.270.000.0049.578.3988473.02018-04-11
..................................................................
2014-09-10300392腾信股份互联网北京192.021.643.84150430.13116865.2614213.17...7.382014-09-1011726.030.3117.47324.1310.241.5327346.02018-04-11
1999-03-25600209罗顿发展综合类海南0.004.264.3986705.9323242.8016197.40...6.311999-03-255083.850.1253.0151.864.02-30.8159619.02018-04-11
1997-06-11000735罗 牛 山农业综合海南54.6810.6011.52618940.00207991.38180241.88...3.021997-06-1172196.310.63116.2985.1130.9213.8880000.02018-04-11
2010-02-11300054鼎龙股份化工原料湖北30.936.659.61397465.50226564.6647543.53...2.702010-02-1177185.900.8035.4130.8436.6718.2417874.02018-04-11
1997-01-28000613大东海A旅游服务海南1574.132.663.648746.661382.313908.87...58.341997-01-28-34110.73-0.9428.55207.4460.0810.2420000.02018-04-11
2016-03-22300484蓝海华腾电气设备深圳25.000.942.08103367.3690467.023893.34...5.062016-03-2235972.951.732.540.9439.2724.1414835.02018-04-11
2015-03-18300433蓝思科技元器件湖南46.394.4426.293134060.001093617.131565460.63...3.242015-03-18823279.003.1341.9312.3925.005.9135003.02018-04-11
2017-06-06300661圣邦股份元器件北京87.020.150.6186190.9682643.931150.35...8.732017-06-0619735.473.240.000.0043.6216.025677.02018-04-11
2017-01-05300588熙菱信息软件服务新疆65.770.311.0084675.4279111.96736.22...8.192017-01-0513293.881.3335.5685.3924.817.4710945.02018-04-11
2017-01-26300603立昂技术通信设备新疆47.460.571.03124445.8299134.212345.56...8.702017-01-2616070.231.57247.32259.1620.038.6111752.02018-04-11
2017-11-09300719安达维尔航空北京53.580.421.68111330.5299828.749335.78...5.002017-11-0926470.751.5810.59-1.5253.6720.4225100.02018-04-11
2009-12-16002320海峡股份水运海南74.694.305.08390513.69136325.91235803.70...4.752009-12-1679676.131.5726.1564.7142.1323.2917700.02018-04-11
2017-08-03300687赛意信息软件服务广东52.570.200.8083921.6880942.17291.20...6.362017-08-0314224.571.780.000.0031.3613.3413585.02018-04-11
2010-05-20300083劲胜智能元器件广东16.4111.9114.321144811.25728822.63176756.77...1.642010-05-2039800.050.2831.86424.0327.298.9647930.02018-04-11
2008-05-08002229鸿博股份广告包装福建525.654.155.03210997.52117592.2261739.38...3.452008-05-0821342.100.42-17.88-15.1424.061.5540500.02018-04-11
2017-10-19300709精研科技元器件江苏31.010.220.88104817.9751288.0536566.43...3.832017-10-1926389.693.000.000.0040.4917.0416000.02018-04-11
2017-05-16300653正海生物医疗保健山东65.830.200.8053081.6045645.282500.00...8.402017-05-1612030.731.5021.3535.6393.6733.748714.02018-04-11
2017-11-27300727润禾材料化工原料浙江90.090.240.9843196.9225291.6112968.00...8.962017-11-278362.070.860.000.0029.5610.7550562.02018-04-11
2011-01-25300166东方国信软件服务北京78.818.0610.50468344.94273063.0022614.40...3.722011-01-2597738.210.9318.8630.8945.8619.7235285.02018-04-11
2015-03-24603729龙韵股份广告包装上海176.040.670.6797434.9382516.067244.75...4.192015-03-2446754.807.01-6.88-53.6210.852.045819.02018-04-11
2017-05-23300657弘信电子元器件福建67.080.261.04184841.84111414.6059763.01...6.422017-05-2318206.141.750.000.0013.573.7911765.02018-04-11
2016-03-03300502新易盛通信设备四川39.291.252.38135900.52100870.7729193.11...4.652016-03-0348375.462.0329.8820.0325.6114.6021261.02018-04-11
1999-12-09000955欣龙控股纺织海南0.005.385.38140784.4268316.9946174.09...5.761999-12-09-40120.17-0.7536.59-155.8112.15-9.5833494.02018-04-11
2011-07-07002596海南瑞泽其他建材海南76.577.2610.74498120.41292194.8459208.46...5.372011-07-0763369.160.5956.17150.9419.126.1221200.02018-04-11
2011-03-16300189神农基因种植业海南0.008.8210.24260142.09166160.4129938.77...2.982011-03-169359.570.09148.6649.1312.07-1.2062017.02018-04-11
1994-01-03600806*ST昆机机床制造云南0.003.905.31193646.66121889.9745542.53...0.001994-01-03-45091.93-0.8521.07-23.373.60-51.4333099.02018-04-11
2003-09-05600432*ST吉恩小金属吉林0.0016.0416.041373541.75297409.28768094.25...0.002003-09-05-549617.19-3.439.91-56.2415.12-42.8670654.02018-04-11
1999-09-16000950*ST建峰农药化肥重庆0.005.9917.281562395.131296451.6348986.46...0.001999-09-16193228.361.121.16758.449.075.2030624.02018-04-11
1996-11-15000629*ST钒钛普钢四川0.0047.6785.901047323.31429526.09468832.44...0.001996-11-15-1126974.13-1.31-11.07114.4217.749.15309055.02018-04-11
1993-05-18000511*ST烯碳矿物制品辽宁0.0011.5511.55346274.91312833.032405.45...0.001993-05-18-63425.48-0.5543.62-55.460.22-14.68164822.02018-04-11
\n", "

3506 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals \\\n", "timeToMarket \n", "2018-04-10 603897 N长城 电气设备 浙江 25.57 0.45 1.78 \n", "2012-10-09 300356 光一科技 电气设备 江苏 206.51 3.69 4.15 \n", "1996-05-31 600711 盛屯矿业 小金属 福建 26.15 14.97 16.77 \n", "2007-08-21 002160 常铝股份 铝 江苏 32.31 4.72 7.24 \n", "1997-05-08 000717 韶钢松山 普钢 广东 6.32 24.20 24.20 \n", "1996-05-03 600896 览海投资 水运 海南 0.00 5.77 8.69 \n", "1997-06-25 000819 岳阳兴长 石油加工 湖南 0.00 2.71 2.71 \n", "2018-03-26 600929 湖南盐业 食品 湖南 72.52 1.50 9.18 \n", "2010-04-30 300076 GQY视讯 电脑设备 浙江 0.00 3.68 4.24 \n", "2007-08-03 002144 宏达高科 纺织 浙江 26.28 1.36 1.77 \n", "2017-03-16 300621 维业股份 装修装饰 深圳 37.99 0.43 1.39 \n", "2017-09-20 603106 恒银金融 电脑设备 天津 45.40 0.70 2.80 \n", "2017-03-15 603811 诚意药业 化学制药 浙江 38.80 0.57 0.85 \n", "2018-03-28 002930 宏川智慧 仓储物流 广东 62.90 0.61 2.43 \n", "2017-09-22 603963 大理药业 化学制药 云南 73.92 0.25 1.00 \n", "2018-03-30 603214 爱婴室 百货 上海 49.45 0.25 1.00 \n", "2017-01-17 300595 欧普康视 医疗保健 安徽 54.16 0.76 1.24 \n", "2017-03-21 300627 华测导航 通信设备 上海 85.66 0.50 1.23 \n", "2017-02-08 603637 镇海股份 建筑施工 浙江 66.69 0.33 1.33 \n", "2017-10-10 300705 九典制药 化学制药 湖南 89.94 0.29 1.17 \n", "2017-10-31 603289 泰瑞机器 专用机械 浙江 45.82 0.51 2.04 \n", "2017-05-09 603229 奥翔药业 化学制药 浙江 93.03 0.40 1.60 \n", "2017-06-02 300660 江苏雷利 电气设备 江苏 26.10 0.25 1.02 \n", "2016-08-02 300529 健帆生物 医疗保健 广东 62.99 1.06 4.18 \n", "2017-09-22 002900 哈三联 化学制药 黑龙江 44.11 0.53 2.11 \n", "2017-05-19 002873 新天药业 中成药 贵州 44.54 0.17 0.69 \n", "2010-02-03 002350 北京科锐 电气设备 北京 184.53 3.76 3.87 \n", "2008-05-16 002235 安妮股份 造纸 福建 58.10 3.34 4.16 \n", "2017-08-10 300688 创业黑马 综合类 北京 171.33 0.17 0.68 \n", "2018-02-26 603712 七一二 通信设备 天津 363.05 1.00 7.72 \n", "... ... ... ... ... ... ... ... \n", "2014-09-10 300392 腾信股份 互联网 北京 192.02 1.64 3.84 \n", "1999-03-25 600209 罗顿发展 综合类 海南 0.00 4.26 4.39 \n", "1997-06-11 000735 罗 牛 山 农业综合 海南 54.68 10.60 11.52 \n", "2010-02-11 300054 鼎龙股份 化工原料 湖北 30.93 6.65 9.61 \n", "1997-01-28 000613 大东海A 旅游服务 海南 1574.13 2.66 3.64 \n", "2016-03-22 300484 蓝海华腾 电气设备 深圳 25.00 0.94 2.08 \n", "2015-03-18 300433 蓝思科技 元器件 湖南 46.39 4.44 26.29 \n", "2017-06-06 300661 圣邦股份 元器件 北京 87.02 0.15 0.61 \n", "2017-01-05 300588 熙菱信息 软件服务 新疆 65.77 0.31 1.00 \n", "2017-01-26 300603 立昂技术 通信设备 新疆 47.46 0.57 1.03 \n", "2017-11-09 300719 安达维尔 航空 北京 53.58 0.42 1.68 \n", "2009-12-16 002320 海峡股份 水运 海南 74.69 4.30 5.08 \n", "2017-08-03 300687 赛意信息 软件服务 广东 52.57 0.20 0.80 \n", "2010-05-20 300083 劲胜智能 元器件 广东 16.41 11.91 14.32 \n", "2008-05-08 002229 鸿博股份 广告包装 福建 525.65 4.15 5.03 \n", "2017-10-19 300709 精研科技 元器件 江苏 31.01 0.22 0.88 \n", "2017-05-16 300653 正海生物 医疗保健 山东 65.83 0.20 0.80 \n", "2017-11-27 300727 润禾材料 化工原料 浙江 90.09 0.24 0.98 \n", "2011-01-25 300166 东方国信 软件服务 北京 78.81 8.06 10.50 \n", "2015-03-24 603729 龙韵股份 广告包装 上海 176.04 0.67 0.67 \n", "2017-05-23 300657 弘信电子 元器件 福建 67.08 0.26 1.04 \n", "2016-03-03 300502 新易盛 通信设备 四川 39.29 1.25 2.38 \n", "1999-12-09 000955 欣龙控股 纺织 海南 0.00 5.38 5.38 \n", "2011-07-07 002596 海南瑞泽 其他建材 海南 76.57 7.26 10.74 \n", "2011-03-16 300189 神农基因 种植业 海南 0.00 8.82 10.24 \n", "1994-01-03 600806 *ST昆机 机床制造 云南 0.00 3.90 5.31 \n", "2003-09-05 600432 *ST吉恩 小金属 吉林 0.00 16.04 16.04 \n", "1999-09-16 000950 *ST建峰 农药化肥 重庆 0.00 5.99 17.28 \n", "1996-11-15 000629 *ST钒钛 普钢 四川 0.00 47.67 85.90 \n", "1993-05-18 000511 *ST烯碳 矿物制品 辽宁 0.00 11.55 11.55 \n", "\n", " totalAssets liquidAssets fixedAssets ... pb \\\n", "timeToMarket ... \n", "2018-04-10 131807.23 117523.63 10988.37 ... 4.27 \n", "2012-10-09 208679.95 97810.21 17068.50 ... 2.49 \n", "1996-05-31 1125400.88 590581.00 76470.36 ... 3.11 \n", "2007-08-21 622252.69 297916.59 151107.36 ... 1.45 \n", "1997-05-08 1441538.00 440514.44 801547.88 ... 5.35 \n", "1996-05-03 448937.09 363976.13 453.85 ... 2.74 \n", "1997-06-25 81995.88 59217.63 17258.00 ... 4.92 \n", "2018-03-26 310491.63 78859.31 139873.81 ... 5.36 \n", "2010-04-30 116227.61 76413.81 21807.57 ... 2.35 \n", "2007-08-03 199379.38 51652.78 28723.63 ... 1.51 \n", "2017-03-16 186181.06 169977.59 2515.88 ... 3.41 \n", "2017-09-20 212309.42 190471.27 16428.07 ... 4.80 \n", "2017-03-15 67298.32 46722.62 12191.86 ... 4.48 \n", "2018-03-28 187270.80 13539.20 103894.40 ... 3.66 \n", "2017-09-22 62622.20 44925.30 10986.69 ... 8.40 \n", "2018-03-30 76961.15 61297.16 7078.72 ... 9.27 \n", "2017-01-17 84769.46 71856.96 3970.03 ... 10.12 \n", "2017-03-21 95269.30 88869.28 2105.35 ... 9.13 \n", "2017-02-08 86330.46 76018.32 5968.18 ... 4.33 \n", "2017-10-10 76920.25 51869.26 13084.78 ... 9.34 \n", "2017-10-31 88554.82 68437.21 15267.82 ... 5.65 \n", "2017-05-09 68624.13 45903.00 14470.87 ... 7.22 \n", "2017-06-02 280316.22 256656.80 16994.20 ... 3.21 \n", "2016-08-02 170240.02 123065.95 32537.78 ... 12.85 \n", "2017-09-22 218374.66 135898.92 68163.18 ... 4.35 \n", "2017-05-19 91925.27 57405.90 21257.95 ... 5.89 \n", "2010-02-03 280886.13 197356.56 42124.90 ... 3.11 \n", "2008-05-16 272703.47 126430.06 19098.98 ... 2.01 \n", "2017-08-10 41396.55 40351.37 380.64 ... 14.13 \n", "2018-02-26 348015.50 277392.63 57633.35 ... 21.08 \n", "... ... ... ... ... ... \n", "2014-09-10 150430.13 116865.26 14213.17 ... 7.38 \n", "1999-03-25 86705.93 23242.80 16197.40 ... 6.31 \n", "1997-06-11 618940.00 207991.38 180241.88 ... 3.02 \n", "2010-02-11 397465.50 226564.66 47543.53 ... 2.70 \n", "1997-01-28 8746.66 1382.31 3908.87 ... 58.34 \n", "2016-03-22 103367.36 90467.02 3893.34 ... 5.06 \n", "2015-03-18 3134060.00 1093617.13 1565460.63 ... 3.24 \n", "2017-06-06 86190.96 82643.93 1150.35 ... 8.73 \n", "2017-01-05 84675.42 79111.96 736.22 ... 8.19 \n", "2017-01-26 124445.82 99134.21 2345.56 ... 8.70 \n", "2017-11-09 111330.52 99828.74 9335.78 ... 5.00 \n", "2009-12-16 390513.69 136325.91 235803.70 ... 4.75 \n", "2017-08-03 83921.68 80942.17 291.20 ... 6.36 \n", "2010-05-20 1144811.25 728822.63 176756.77 ... 1.64 \n", "2008-05-08 210997.52 117592.22 61739.38 ... 3.45 \n", "2017-10-19 104817.97 51288.05 36566.43 ... 3.83 \n", "2017-05-16 53081.60 45645.28 2500.00 ... 8.40 \n", "2017-11-27 43196.92 25291.61 12968.00 ... 8.96 \n", "2011-01-25 468344.94 273063.00 22614.40 ... 3.72 \n", "2015-03-24 97434.93 82516.06 7244.75 ... 4.19 \n", "2017-05-23 184841.84 111414.60 59763.01 ... 6.42 \n", "2016-03-03 135900.52 100870.77 29193.11 ... 4.65 \n", "1999-12-09 140784.42 68316.99 46174.09 ... 5.76 \n", "2011-07-07 498120.41 292194.84 59208.46 ... 5.37 \n", "2011-03-16 260142.09 166160.41 29938.77 ... 2.98 \n", "1994-01-03 193646.66 121889.97 45542.53 ... 0.00 \n", "2003-09-05 1373541.75 297409.28 768094.25 ... 0.00 \n", "1999-09-16 1562395.13 1296451.63 48986.46 ... 0.00 \n", "1996-11-15 1047323.31 429526.09 468832.44 ... 0.00 \n", "1993-05-18 346274.91 312833.03 2405.45 ... 0.00 \n", "\n", " timeToMarket undp perundp rev profit gpr \\\n", "timeToMarket \n", "2018-04-10 2018-04-10 35286.05 1.98 41.98 55.84 8.19 \n", "2012-10-09 2012-10-09 28831.28 0.69 -39.02 -47.76 26.05 \n", "1996-05-31 1996-05-31 104130.27 0.62 62.61 223.67 6.85 \n", "2007-08-21 2007-08-21 27155.90 0.37 40.03 56.07 17.64 \n", "1997-05-08 1997-05-08 -331470.38 -1.37 86.35 2381.13 13.26 \n", "1996-05-03 1996-05-03 -60134.50 -0.69 -94.80 18.38 91.85 \n", "1997-06-25 1997-06-25 19668.43 0.72 16.55 -132.47 8.32 \n", "2018-03-26 2018-03-26 71625.13 0.78 1.30 15.06 47.71 \n", "2010-04-30 2010-04-30 10759.37 0.25 -40.70 -1298.93 35.65 \n", "2007-08-03 2007-08-03 52805.73 2.99 12.73 -6.03 29.92 \n", "2017-03-16 2017-03-16 26666.50 1.92 0.00 0.00 13.34 \n", "2017-09-20 2017-09-20 27721.10 0.99 0.00 0.00 33.95 \n", "2017-03-15 2017-03-15 9561.42 1.12 6.12 1.57 52.11 \n", "2018-03-28 2018-03-28 38270.21 1.57 -0.74 10.33 56.59 \n", "2017-09-22 2017-09-22 9541.13 0.95 0.00 0.00 63.85 \n", "2018-03-30 2018-03-30 25456.17 2.55 14.06 26.47 28.41 \n", "2017-01-17 2017-01-17 20604.49 1.66 31.61 29.56 76.06 \n", "2017-03-21 2017-03-21 19288.67 1.56 0.00 0.00 54.56 \n", "2017-02-08 2017-02-08 20656.95 1.55 -37.75 -28.91 31.54 \n", "2017-10-10 2017-10-10 12709.62 1.08 42.01 25.76 51.93 \n", "2017-10-31 2017-10-31 26118.49 1.28 0.00 0.00 30.63 \n", "2017-05-09 2017-05-09 14151.70 0.88 0.00 0.00 60.63 \n", "2017-06-02 2017-06-02 33226.21 3.26 0.00 0.00 26.74 \n", "2016-08-02 2016-08-02 48161.67 1.15 32.16 40.72 84.14 \n", "2017-09-22 2017-09-22 39189.78 1.86 50.99 3.36 74.17 \n", "2017-05-19 2017-05-19 18090.75 2.63 0.00 0.00 81.09 \n", "2010-02-03 2010-02-03 34932.31 0.90 23.04 -44.28 23.27 \n", "2008-05-16 2008-05-16 5426.16 0.13 66.06 473.50 31.63 \n", "2017-08-10 2017-08-10 6212.93 0.91 0.00 0.00 56.91 \n", "2018-02-26 2018-02-26 20558.85 0.27 0.00 0.00 49.57 \n", "... ... ... ... ... ... ... \n", "2014-09-10 2014-09-10 11726.03 0.31 17.47 324.13 10.24 \n", "1999-03-25 1999-03-25 5083.85 0.12 53.01 51.86 4.02 \n", "1997-06-11 1997-06-11 72196.31 0.63 116.29 85.11 30.92 \n", "2010-02-11 2010-02-11 77185.90 0.80 35.41 30.84 36.67 \n", "1997-01-28 1997-01-28 -34110.73 -0.94 28.55 207.44 60.08 \n", "2016-03-22 2016-03-22 35972.95 1.73 2.54 0.94 39.27 \n", "2015-03-18 2015-03-18 823279.00 3.13 41.93 12.39 25.00 \n", "2017-06-06 2017-06-06 19735.47 3.24 0.00 0.00 43.62 \n", "2017-01-05 2017-01-05 13293.88 1.33 35.56 85.39 24.81 \n", "2017-01-26 2017-01-26 16070.23 1.57 247.32 259.16 20.03 \n", "2017-11-09 2017-11-09 26470.75 1.58 10.59 -1.52 53.67 \n", "2009-12-16 2009-12-16 79676.13 1.57 26.15 64.71 42.13 \n", "2017-08-03 2017-08-03 14224.57 1.78 0.00 0.00 31.36 \n", "2010-05-20 2010-05-20 39800.05 0.28 31.86 424.03 27.29 \n", "2008-05-08 2008-05-08 21342.10 0.42 -17.88 -15.14 24.06 \n", "2017-10-19 2017-10-19 26389.69 3.00 0.00 0.00 40.49 \n", "2017-05-16 2017-05-16 12030.73 1.50 21.35 35.63 93.67 \n", "2017-11-27 2017-11-27 8362.07 0.86 0.00 0.00 29.56 \n", "2011-01-25 2011-01-25 97738.21 0.93 18.86 30.89 45.86 \n", "2015-03-24 2015-03-24 46754.80 7.01 -6.88 -53.62 10.85 \n", "2017-05-23 2017-05-23 18206.14 1.75 0.00 0.00 13.57 \n", "2016-03-03 2016-03-03 48375.46 2.03 29.88 20.03 25.61 \n", "1999-12-09 1999-12-09 -40120.17 -0.75 36.59 -155.81 12.15 \n", "2011-07-07 2011-07-07 63369.16 0.59 56.17 150.94 19.12 \n", "2011-03-16 2011-03-16 9359.57 0.09 148.66 49.13 12.07 \n", "1994-01-03 1994-01-03 -45091.93 -0.85 21.07 -23.37 3.60 \n", "2003-09-05 2003-09-05 -549617.19 -3.43 9.91 -56.24 15.12 \n", "1999-09-16 1999-09-16 193228.36 1.12 1.16 758.44 9.07 \n", "1996-11-15 1996-11-15 -1126974.13 -1.31 -11.07 114.42 17.74 \n", "1993-05-18 1993-05-18 -63425.48 -0.55 43.62 -55.46 0.22 \n", "\n", " npr holders 更新日期 \n", "timeToMarket \n", "2018-04-10 3.87 42986.0 2018-04-11 \n", "2012-10-09 4.30 19839.0 2018-04-11 \n", "1996-05-31 2.95 106700.0 2018-04-11 \n", "2007-08-21 3.84 50000.0 2018-04-11 \n", "1997-05-08 9.66 132008.0 2018-04-11 \n", "1996-05-03 -416.75 43837.0 2018-04-11 \n", "1997-06-25 -0.62 31400.0 2018-04-11 \n", "2018-03-26 7.24 140295.0 2018-04-11 \n", "2010-04-30 -29.91 41000.0 2018-04-11 \n", "2007-08-03 15.71 21057.0 2018-04-11 \n", "2017-03-16 4.22 19044.0 2018-04-11 \n", "2017-09-20 11.23 36000.0 2018-04-11 \n", "2017-03-15 20.31 10574.0 2018-04-11 \n", "2018-03-28 25.41 115500.0 2018-04-11 \n", "2017-09-22 20.00 27488.0 2018-04-11 \n", "2018-03-30 5.18 26639.0 2018-04-11 \n", "2017-01-17 50.72 6781.0 2018-04-11 \n", "2017-03-21 14.97 16380.0 2018-04-11 \n", "2017-02-08 22.63 9897.0 2018-04-11 \n", "2017-10-10 12.83 21243.0 2018-04-11 \n", "2017-10-31 12.40 48514.0 2018-04-11 \n", "2017-05-09 22.65 14088.0 2018-04-11 \n", "2017-06-02 12.07 18283.0 2018-04-11 \n", "2016-08-02 39.58 22527.0 2018-04-11 \n", "2017-09-22 15.76 38400.0 2018-04-11 \n", "2017-05-19 11.75 9615.0 2018-04-11 \n", "2010-02-03 1.03 52854.0 2018-04-11 \n", "2008-05-16 14.46 30659.0 2018-04-11 \n", "2017-08-10 17.97 15720.0 2018-04-11 \n", "2018-02-26 8.39 88473.0 2018-04-11 \n", "... ... ... ... \n", "2014-09-10 1.53 27346.0 2018-04-11 \n", "1999-03-25 -30.81 59619.0 2018-04-11 \n", "1997-06-11 13.88 80000.0 2018-04-11 \n", "2010-02-11 18.24 17874.0 2018-04-11 \n", "1997-01-28 10.24 20000.0 2018-04-11 \n", "2016-03-22 24.14 14835.0 2018-04-11 \n", "2015-03-18 5.91 35003.0 2018-04-11 \n", "2017-06-06 16.02 5677.0 2018-04-11 \n", "2017-01-05 7.47 10945.0 2018-04-11 \n", "2017-01-26 8.61 11752.0 2018-04-11 \n", "2017-11-09 20.42 25100.0 2018-04-11 \n", "2009-12-16 23.29 17700.0 2018-04-11 \n", "2017-08-03 13.34 13585.0 2018-04-11 \n", "2010-05-20 8.96 47930.0 2018-04-11 \n", "2008-05-08 1.55 40500.0 2018-04-11 \n", "2017-10-19 17.04 16000.0 2018-04-11 \n", "2017-05-16 33.74 8714.0 2018-04-11 \n", "2017-11-27 10.75 50562.0 2018-04-11 \n", "2011-01-25 19.72 35285.0 2018-04-11 \n", "2015-03-24 2.04 5819.0 2018-04-11 \n", "2017-05-23 3.79 11765.0 2018-04-11 \n", "2016-03-03 14.60 21261.0 2018-04-11 \n", "1999-12-09 -9.58 33494.0 2018-04-11 \n", "2011-07-07 6.12 21200.0 2018-04-11 \n", "2011-03-16 -1.20 62017.0 2018-04-11 \n", "1994-01-03 -51.43 33099.0 2018-04-11 \n", "2003-09-05 -42.86 70654.0 2018-04-11 \n", "1999-09-16 5.20 30624.0 2018-04-11 \n", "1996-11-15 9.15 309055.0 2018-04-11 \n", "1993-05-18 -14.68 164822.0 2018-04-11 \n", "\n", "[3506 rows x 24 columns]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df.set_index(basic_df['timeToMarket'],drop=True)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
timeToMarket
2018-04-10603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018-04-1035286.051.9841.9855.848.193.8742986.02018-04-11
2018-03-26600929湖南盐业食品湖南72.521.509.18310491.6378859.31139873.81...5.362018-03-2671625.130.781.3015.0647.717.24140295.02018-04-11
2017-03-16300621维业股份装修装饰深圳37.990.431.39186181.06169977.592515.88...3.412017-03-1626666.501.920.000.0013.344.2219044.02018-04-11
2017-09-20603106恒银金融电脑设备天津45.400.702.80212309.42190471.2716428.07...4.802017-09-2027721.100.990.000.0033.9511.2336000.02018-04-11
2017-03-15603811诚意药业化学制药浙江38.800.570.8567298.3246722.6212191.86...4.482017-03-159561.421.126.121.5752.1120.3110574.02018-04-11
2018-03-28002930宏川智慧仓储物流广东62.900.612.43187270.8013539.20103894.40...3.662018-03-2838270.211.57-0.7410.3356.5925.41115500.02018-04-11
2017-09-22603963大理药业化学制药云南73.920.251.0062622.2044925.3010986.69...8.402017-09-229541.130.950.000.0063.8520.0027488.02018-04-11
2018-03-30603214爱婴室百货上海49.450.251.0076961.1561297.167078.72...9.272018-03-3025456.172.5514.0626.4728.415.1826639.02018-04-11
2017-01-17300595欧普康视医疗保健安徽54.160.761.2484769.4671856.963970.03...10.122017-01-1720604.491.6631.6129.5676.0650.726781.02018-04-11
2017-03-21300627华测导航通信设备上海85.660.501.2395269.3088869.282105.35...9.132017-03-2119288.671.560.000.0054.5614.9716380.02018-04-11
2017-02-08603637镇海股份建筑施工浙江66.690.331.3386330.4676018.325968.18...4.332017-02-0820656.951.55-37.75-28.9131.5422.639897.02018-04-11
2017-10-10300705九典制药化学制药湖南89.940.291.1776920.2551869.2613084.78...9.342017-10-1012709.621.0842.0125.7651.9312.8321243.02018-04-11
2017-10-31603289泰瑞机器专用机械浙江45.820.512.0488554.8268437.2115267.82...5.652017-10-3126118.491.280.000.0030.6312.4048514.02018-04-11
2017-05-09603229奥翔药业化学制药浙江93.030.401.6068624.1345903.0014470.87...7.222017-05-0914151.700.880.000.0060.6322.6514088.02018-04-11
2017-06-02300660江苏雷利电气设备江苏26.100.251.02280316.22256656.8016994.20...3.212017-06-0233226.213.260.000.0026.7412.0718283.02018-04-11
2017-09-22002900哈三联化学制药黑龙江44.110.532.11218374.66135898.9268163.18...4.352017-09-2239189.781.8650.993.3674.1715.7638400.02018-04-11
2017-05-19002873新天药业中成药贵州44.540.170.6991925.2757405.9021257.95...5.892017-05-1918090.752.630.000.0081.0911.759615.02018-04-11
2017-08-10300688创业黑马综合类北京171.330.170.6841396.5540351.37380.64...14.132017-08-106212.930.910.000.0056.9117.9715720.02018-04-11
2018-02-26603712七一二通信设备天津363.051.007.72348015.50277392.6357633.35...21.082018-02-2620558.850.270.000.0049.578.3988473.02018-04-11
2017-11-21300726宏达电子元器件湖南86.520.404.00100780.3080427.538466.57...16.702017-11-2123141.200.580.000.0070.7339.7379196.02018-04-11
2017-07-03300670大烨智能电气设备江苏88.130.271.0869398.4259512.136638.05...6.812017-07-0314113.521.310.000.0031.0615.7713484.02018-04-11
2017-04-21300554三超新材矿物制品江苏94.440.130.5248783.3233910.7512251.67...10.862017-04-2110747.622.070.000.0047.1524.984538.02018-04-11
2017-05-22603383顶点软件软件服务福建49.790.210.86115820.30104881.363878.28...5.412017-05-2238075.214.4319.0944.5978.7841.808928.02018-04-11
2018-02-23002927泰永长征电气设备贵州102.260.230.9443605.3535037.030.00...12.702018-02-230.000.000.000.000.0018.5148823.02018-04-11
2018-02-06300644南京聚隆塑料江苏62.160.160.6482547.7860597.2318706.01...6.212018-02-0625969.654.0613.33-28.2617.555.5131946.02018-04-11
2017-01-20300598诚迈科技软件服务江苏111.580.480.8053850.8644918.25626.82...9.782017-01-2017461.712.18-3.84-22.1231.268.109182.02018-04-11
2017-01-10603266天龙股份塑料浙江34.030.251.0098374.4671618.7218603.42...3.682017-01-1033154.173.328.214.7228.0510.338819.02018-04-11
2017-12-18002919名臣健康日用化工广东69.130.200.8146302.280.000.00...6.242017-12-180.000.000.000.000.007.7743677.02018-04-11
2017-04-21603139康惠制药中成药陕西61.040.251.0094826.3581229.315390.80...3.352017-04-2133866.513.390.000.0057.1015.6413137.02018-04-11
2018-03-23300634彩讯股份软件服务深圳81.300.404.00100621.5565063.451320.74...11.012018-03-2319710.350.4933.4644.5448.0121.3677432.02018-04-11
..................................................................
2017-03-24300629新劲刚矿物制品广东137.290.290.6748471.4036097.238623.61...9.682017-03-2412290.361.842.26-8.1032.249.847729.02018-04-11
2017-11-15300721怡达股份化工原料江苏40.040.200.80100619.9360467.4821425.98...3.092017-11-1518573.722.320.000.0016.715.4814138.02018-04-11
2017-08-22300693盛弘股份电气设备深圳54.610.230.9178534.1576455.401210.45...5.002017-08-2212563.211.380.000.0050.4011.9613821.02018-04-11
2017-12-29300735光弘科技通信设备广东43.810.893.55106216.2248046.2348601.87...5.122017-12-2922749.500.640.000.0027.7714.2758700.02018-04-11
2017-12-05300730科创信息软件服务湖南907.520.230.9332997.2624184.006611.02...17.952017-12-058310.850.890.000.0036.002.6948600.02018-04-11
2017-10-31002910庄园牧场乳制品甘肃63.180.471.87180371.7787209.1562579.91...3.832017-10-3139948.322.13-5.62-9.9630.7110.8827589.02018-04-11
2017-11-01300711广哈通信通信设备广东85.400.361.4434718.6230575.381612.71...11.252017-11-0111660.600.810.000.0053.0320.2271217.02018-04-11
2018-01-19300738奥飞数据电信运营广东73.050.160.6533440.900.000.00...14.122018-01-190.000.000.000.000.0017.3332672.02018-04-11
2017-08-08603535嘉诚国际仓储物流广东31.440.381.50171046.63107917.2736970.78...2.712017-08-0851971.033.4620.4714.3223.1111.4916499.02018-04-11
2017-04-26300514友讯达通信设备深圳62.790.251.0068944.2166716.281369.74...8.142017-04-2613530.611.350.000.0041.9813.4911522.02018-04-11
2018-01-16300733西菱动力汽车配件四川47.620.401.60102448.710.000.00...5.472018-01-160.000.000.000.000.0015.6177780.02018-04-11
2018-02-01300739明阳电路元器件深圳39.960.311.2396984.0054019.5736262.06...7.392018-02-0114147.721.150.000.0032.1511.7461548.02018-04-11
2017-07-31300679电连技术元器件深圳25.500.301.20329440.88281085.1634557.31...3.012017-07-3159821.284.990.000.0047.2326.2123866.02018-04-11
2017-09-26603363傲农生物饲料福建75.900.604.26253808.34117686.9071882.36...10.012017-09-2617489.060.41-1.5218.3218.862.2132006.02018-04-11
2017-12-27300684中石科技化工原料北京79.800.220.8783437.3156011.8024528.76...11.842017-12-2720423.992.35187.49123.0636.4214.4217500.02018-04-11
2017-01-05603032德新交运公路新疆175.300.651.3349133.6240787.214330.50...10.942017-01-0512899.170.97-22.93-46.6136.6113.732328.02018-04-11
2017-08-22300696爱乐达航空四川103.570.170.6972619.9653274.5514581.25...7.532017-08-229670.871.400.000.0071.1452.0014938.02018-04-11
2017-02-20300613富瀚微半导体上海68.970.130.4597363.9085505.561777.51...7.872017-02-2026320.405.810.000.0049.4625.2611264.02018-04-11
2017-09-13603648畅联股份仓储物流上海48.820.923.69181480.97129244.9528878.70...5.112017-09-1320402.980.550.000.0027.6313.5458370.02018-04-11
2017-12-29603329上海雅仕仓储物流上海65.330.331.3284900.6872657.600.00...8.462017-12-290.000.000.000.000.004.3735041.02018-04-11
2017-12-08300731科创新源橡胶深圳52.750.220.8726369.3823502.031737.75...11.112017-12-085390.140.620.000.0048.5425.9445956.02018-04-11
2017-06-06300661圣邦股份元器件北京87.020.150.6186190.9682643.931150.35...8.732017-06-0619735.473.240.000.0043.6216.025677.02018-04-11
2017-01-05300588熙菱信息软件服务新疆65.770.311.0084675.4279111.96736.22...8.192017-01-0513293.881.3335.5685.3924.817.4710945.02018-04-11
2017-01-26300603立昂技术通信设备新疆47.460.571.03124445.8299134.212345.56...8.702017-01-2616070.231.57247.32259.1620.038.6111752.02018-04-11
2017-11-09300719安达维尔航空北京53.580.421.68111330.5299828.749335.78...5.002017-11-0926470.751.5810.59-1.5253.6720.4225100.02018-04-11
2017-08-03300687赛意信息软件服务广东52.570.200.8083921.6880942.17291.20...6.362017-08-0314224.571.780.000.0031.3613.3413585.02018-04-11
2017-10-19300709精研科技元器件江苏31.010.220.88104817.9751288.0536566.43...3.832017-10-1926389.693.000.000.0040.4917.0416000.02018-04-11
2017-05-16300653正海生物医疗保健山东65.830.200.8053081.6045645.282500.00...8.402017-05-1612030.731.5021.3535.6393.6733.748714.02018-04-11
2017-11-27300727润禾材料化工原料浙江90.090.240.9843196.9225291.6112968.00...8.962017-11-278362.070.860.000.0029.5610.7550562.02018-04-11
2017-05-23300657弘信电子元器件福建67.080.261.04184841.84111414.6059763.01...6.422017-05-2318206.141.750.000.0013.573.7911765.02018-04-11
\n", "

477 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals \\\n", "timeToMarket \n", "2018-04-10 603897 N长城 电气设备 浙江 25.57 0.45 1.78 \n", "2018-03-26 600929 湖南盐业 食品 湖南 72.52 1.50 9.18 \n", "2017-03-16 300621 维业股份 装修装饰 深圳 37.99 0.43 1.39 \n", "2017-09-20 603106 恒银金融 电脑设备 天津 45.40 0.70 2.80 \n", "2017-03-15 603811 诚意药业 化学制药 浙江 38.80 0.57 0.85 \n", "2018-03-28 002930 宏川智慧 仓储物流 广东 62.90 0.61 2.43 \n", "2017-09-22 603963 大理药业 化学制药 云南 73.92 0.25 1.00 \n", "2018-03-30 603214 爱婴室 百货 上海 49.45 0.25 1.00 \n", "2017-01-17 300595 欧普康视 医疗保健 安徽 54.16 0.76 1.24 \n", "2017-03-21 300627 华测导航 通信设备 上海 85.66 0.50 1.23 \n", "2017-02-08 603637 镇海股份 建筑施工 浙江 66.69 0.33 1.33 \n", "2017-10-10 300705 九典制药 化学制药 湖南 89.94 0.29 1.17 \n", "2017-10-31 603289 泰瑞机器 专用机械 浙江 45.82 0.51 2.04 \n", "2017-05-09 603229 奥翔药业 化学制药 浙江 93.03 0.40 1.60 \n", "2017-06-02 300660 江苏雷利 电气设备 江苏 26.10 0.25 1.02 \n", "2017-09-22 002900 哈三联 化学制药 黑龙江 44.11 0.53 2.11 \n", "2017-05-19 002873 新天药业 中成药 贵州 44.54 0.17 0.69 \n", "2017-08-10 300688 创业黑马 综合类 北京 171.33 0.17 0.68 \n", "2018-02-26 603712 七一二 通信设备 天津 363.05 1.00 7.72 \n", "2017-11-21 300726 宏达电子 元器件 湖南 86.52 0.40 4.00 \n", "2017-07-03 300670 大烨智能 电气设备 江苏 88.13 0.27 1.08 \n", "2017-04-21 300554 三超新材 矿物制品 江苏 94.44 0.13 0.52 \n", "2017-05-22 603383 顶点软件 软件服务 福建 49.79 0.21 0.86 \n", "2018-02-23 002927 泰永长征 电气设备 贵州 102.26 0.23 0.94 \n", "2018-02-06 300644 南京聚隆 塑料 江苏 62.16 0.16 0.64 \n", "2017-01-20 300598 诚迈科技 软件服务 江苏 111.58 0.48 0.80 \n", "2017-01-10 603266 天龙股份 塑料 浙江 34.03 0.25 1.00 \n", "2017-12-18 002919 名臣健康 日用化工 广东 69.13 0.20 0.81 \n", "2017-04-21 603139 康惠制药 中成药 陕西 61.04 0.25 1.00 \n", "2018-03-23 300634 彩讯股份 软件服务 深圳 81.30 0.40 4.00 \n", "... ... ... ... ... ... ... ... \n", "2017-03-24 300629 新劲刚 矿物制品 广东 137.29 0.29 0.67 \n", "2017-11-15 300721 怡达股份 化工原料 江苏 40.04 0.20 0.80 \n", "2017-08-22 300693 盛弘股份 电气设备 深圳 54.61 0.23 0.91 \n", "2017-12-29 300735 光弘科技 通信设备 广东 43.81 0.89 3.55 \n", "2017-12-05 300730 科创信息 软件服务 湖南 907.52 0.23 0.93 \n", "2017-10-31 002910 庄园牧场 乳制品 甘肃 63.18 0.47 1.87 \n", "2017-11-01 300711 广哈通信 通信设备 广东 85.40 0.36 1.44 \n", "2018-01-19 300738 奥飞数据 电信运营 广东 73.05 0.16 0.65 \n", "2017-08-08 603535 嘉诚国际 仓储物流 广东 31.44 0.38 1.50 \n", "2017-04-26 300514 友讯达 通信设备 深圳 62.79 0.25 1.00 \n", "2018-01-16 300733 西菱动力 汽车配件 四川 47.62 0.40 1.60 \n", "2018-02-01 300739 明阳电路 元器件 深圳 39.96 0.31 1.23 \n", "2017-07-31 300679 电连技术 元器件 深圳 25.50 0.30 1.20 \n", "2017-09-26 603363 傲农生物 饲料 福建 75.90 0.60 4.26 \n", "2017-12-27 300684 中石科技 化工原料 北京 79.80 0.22 0.87 \n", "2017-01-05 603032 德新交运 公路 新疆 175.30 0.65 1.33 \n", "2017-08-22 300696 爱乐达 航空 四川 103.57 0.17 0.69 \n", "2017-02-20 300613 富瀚微 半导体 上海 68.97 0.13 0.45 \n", "2017-09-13 603648 畅联股份 仓储物流 上海 48.82 0.92 3.69 \n", "2017-12-29 603329 上海雅仕 仓储物流 上海 65.33 0.33 1.32 \n", "2017-12-08 300731 科创新源 橡胶 深圳 52.75 0.22 0.87 \n", "2017-06-06 300661 圣邦股份 元器件 北京 87.02 0.15 0.61 \n", "2017-01-05 300588 熙菱信息 软件服务 新疆 65.77 0.31 1.00 \n", "2017-01-26 300603 立昂技术 通信设备 新疆 47.46 0.57 1.03 \n", "2017-11-09 300719 安达维尔 航空 北京 53.58 0.42 1.68 \n", "2017-08-03 300687 赛意信息 软件服务 广东 52.57 0.20 0.80 \n", "2017-10-19 300709 精研科技 元器件 江苏 31.01 0.22 0.88 \n", "2017-05-16 300653 正海生物 医疗保健 山东 65.83 0.20 0.80 \n", "2017-11-27 300727 润禾材料 化工原料 浙江 90.09 0.24 0.98 \n", "2017-05-23 300657 弘信电子 元器件 福建 67.08 0.26 1.04 \n", "\n", " totalAssets liquidAssets fixedAssets ... pb \\\n", "timeToMarket ... \n", "2018-04-10 131807.23 117523.63 10988.37 ... 4.27 \n", "2018-03-26 310491.63 78859.31 139873.81 ... 5.36 \n", "2017-03-16 186181.06 169977.59 2515.88 ... 3.41 \n", "2017-09-20 212309.42 190471.27 16428.07 ... 4.80 \n", "2017-03-15 67298.32 46722.62 12191.86 ... 4.48 \n", "2018-03-28 187270.80 13539.20 103894.40 ... 3.66 \n", "2017-09-22 62622.20 44925.30 10986.69 ... 8.40 \n", "2018-03-30 76961.15 61297.16 7078.72 ... 9.27 \n", "2017-01-17 84769.46 71856.96 3970.03 ... 10.12 \n", "2017-03-21 95269.30 88869.28 2105.35 ... 9.13 \n", "2017-02-08 86330.46 76018.32 5968.18 ... 4.33 \n", "2017-10-10 76920.25 51869.26 13084.78 ... 9.34 \n", "2017-10-31 88554.82 68437.21 15267.82 ... 5.65 \n", "2017-05-09 68624.13 45903.00 14470.87 ... 7.22 \n", "2017-06-02 280316.22 256656.80 16994.20 ... 3.21 \n", "2017-09-22 218374.66 135898.92 68163.18 ... 4.35 \n", "2017-05-19 91925.27 57405.90 21257.95 ... 5.89 \n", "2017-08-10 41396.55 40351.37 380.64 ... 14.13 \n", "2018-02-26 348015.50 277392.63 57633.35 ... 21.08 \n", "2017-11-21 100780.30 80427.53 8466.57 ... 16.70 \n", "2017-07-03 69398.42 59512.13 6638.05 ... 6.81 \n", "2017-04-21 48783.32 33910.75 12251.67 ... 10.86 \n", "2017-05-22 115820.30 104881.36 3878.28 ... 5.41 \n", "2018-02-23 43605.35 35037.03 0.00 ... 12.70 \n", "2018-02-06 82547.78 60597.23 18706.01 ... 6.21 \n", "2017-01-20 53850.86 44918.25 626.82 ... 9.78 \n", "2017-01-10 98374.46 71618.72 18603.42 ... 3.68 \n", "2017-12-18 46302.28 0.00 0.00 ... 6.24 \n", "2017-04-21 94826.35 81229.31 5390.80 ... 3.35 \n", "2018-03-23 100621.55 65063.45 1320.74 ... 11.01 \n", "... ... ... ... ... ... \n", "2017-03-24 48471.40 36097.23 8623.61 ... 9.68 \n", "2017-11-15 100619.93 60467.48 21425.98 ... 3.09 \n", "2017-08-22 78534.15 76455.40 1210.45 ... 5.00 \n", "2017-12-29 106216.22 48046.23 48601.87 ... 5.12 \n", "2017-12-05 32997.26 24184.00 6611.02 ... 17.95 \n", "2017-10-31 180371.77 87209.15 62579.91 ... 3.83 \n", "2017-11-01 34718.62 30575.38 1612.71 ... 11.25 \n", "2018-01-19 33440.90 0.00 0.00 ... 14.12 \n", "2017-08-08 171046.63 107917.27 36970.78 ... 2.71 \n", "2017-04-26 68944.21 66716.28 1369.74 ... 8.14 \n", "2018-01-16 102448.71 0.00 0.00 ... 5.47 \n", "2018-02-01 96984.00 54019.57 36262.06 ... 7.39 \n", "2017-07-31 329440.88 281085.16 34557.31 ... 3.01 \n", "2017-09-26 253808.34 117686.90 71882.36 ... 10.01 \n", "2017-12-27 83437.31 56011.80 24528.76 ... 11.84 \n", "2017-01-05 49133.62 40787.21 4330.50 ... 10.94 \n", "2017-08-22 72619.96 53274.55 14581.25 ... 7.53 \n", "2017-02-20 97363.90 85505.56 1777.51 ... 7.87 \n", "2017-09-13 181480.97 129244.95 28878.70 ... 5.11 \n", "2017-12-29 84900.68 72657.60 0.00 ... 8.46 \n", "2017-12-08 26369.38 23502.03 1737.75 ... 11.11 \n", "2017-06-06 86190.96 82643.93 1150.35 ... 8.73 \n", "2017-01-05 84675.42 79111.96 736.22 ... 8.19 \n", "2017-01-26 124445.82 99134.21 2345.56 ... 8.70 \n", "2017-11-09 111330.52 99828.74 9335.78 ... 5.00 \n", "2017-08-03 83921.68 80942.17 291.20 ... 6.36 \n", "2017-10-19 104817.97 51288.05 36566.43 ... 3.83 \n", "2017-05-16 53081.60 45645.28 2500.00 ... 8.40 \n", "2017-11-27 43196.92 25291.61 12968.00 ... 8.96 \n", "2017-05-23 184841.84 111414.60 59763.01 ... 6.42 \n", "\n", " timeToMarket undp perundp rev profit gpr npr \\\n", "timeToMarket \n", "2018-04-10 2018-04-10 35286.05 1.98 41.98 55.84 8.19 3.87 \n", "2018-03-26 2018-03-26 71625.13 0.78 1.30 15.06 47.71 7.24 \n", "2017-03-16 2017-03-16 26666.50 1.92 0.00 0.00 13.34 4.22 \n", "2017-09-20 2017-09-20 27721.10 0.99 0.00 0.00 33.95 11.23 \n", "2017-03-15 2017-03-15 9561.42 1.12 6.12 1.57 52.11 20.31 \n", "2018-03-28 2018-03-28 38270.21 1.57 -0.74 10.33 56.59 25.41 \n", "2017-09-22 2017-09-22 9541.13 0.95 0.00 0.00 63.85 20.00 \n", "2018-03-30 2018-03-30 25456.17 2.55 14.06 26.47 28.41 5.18 \n", "2017-01-17 2017-01-17 20604.49 1.66 31.61 29.56 76.06 50.72 \n", "2017-03-21 2017-03-21 19288.67 1.56 0.00 0.00 54.56 14.97 \n", "2017-02-08 2017-02-08 20656.95 1.55 -37.75 -28.91 31.54 22.63 \n", "2017-10-10 2017-10-10 12709.62 1.08 42.01 25.76 51.93 12.83 \n", "2017-10-31 2017-10-31 26118.49 1.28 0.00 0.00 30.63 12.40 \n", "2017-05-09 2017-05-09 14151.70 0.88 0.00 0.00 60.63 22.65 \n", "2017-06-02 2017-06-02 33226.21 3.26 0.00 0.00 26.74 12.07 \n", "2017-09-22 2017-09-22 39189.78 1.86 50.99 3.36 74.17 15.76 \n", "2017-05-19 2017-05-19 18090.75 2.63 0.00 0.00 81.09 11.75 \n", "2017-08-10 2017-08-10 6212.93 0.91 0.00 0.00 56.91 17.97 \n", "2018-02-26 2018-02-26 20558.85 0.27 0.00 0.00 49.57 8.39 \n", "2017-11-21 2017-11-21 23141.20 0.58 0.00 0.00 70.73 39.73 \n", "2017-07-03 2017-07-03 14113.52 1.31 0.00 0.00 31.06 15.77 \n", "2017-04-21 2017-04-21 10747.62 2.07 0.00 0.00 47.15 24.98 \n", "2017-05-22 2017-05-22 38075.21 4.43 19.09 44.59 78.78 41.80 \n", "2018-02-23 2018-02-23 0.00 0.00 0.00 0.00 0.00 18.51 \n", "2018-02-06 2018-02-06 25969.65 4.06 13.33 -28.26 17.55 5.51 \n", "2017-01-20 2017-01-20 17461.71 2.18 -3.84 -22.12 31.26 8.10 \n", "2017-01-10 2017-01-10 33154.17 3.32 8.21 4.72 28.05 10.33 \n", "2017-12-18 2017-12-18 0.00 0.00 0.00 0.00 0.00 7.77 \n", "2017-04-21 2017-04-21 33866.51 3.39 0.00 0.00 57.10 15.64 \n", "2018-03-23 2018-03-23 19710.35 0.49 33.46 44.54 48.01 21.36 \n", "... ... ... ... ... ... ... ... \n", "2017-03-24 2017-03-24 12290.36 1.84 2.26 -8.10 32.24 9.84 \n", "2017-11-15 2017-11-15 18573.72 2.32 0.00 0.00 16.71 5.48 \n", "2017-08-22 2017-08-22 12563.21 1.38 0.00 0.00 50.40 11.96 \n", "2017-12-29 2017-12-29 22749.50 0.64 0.00 0.00 27.77 14.27 \n", "2017-12-05 2017-12-05 8310.85 0.89 0.00 0.00 36.00 2.69 \n", "2017-10-31 2017-10-31 39948.32 2.13 -5.62 -9.96 30.71 10.88 \n", "2017-11-01 2017-11-01 11660.60 0.81 0.00 0.00 53.03 20.22 \n", "2018-01-19 2018-01-19 0.00 0.00 0.00 0.00 0.00 17.33 \n", "2017-08-08 2017-08-08 51971.03 3.46 20.47 14.32 23.11 11.49 \n", "2017-04-26 2017-04-26 13530.61 1.35 0.00 0.00 41.98 13.49 \n", "2018-01-16 2018-01-16 0.00 0.00 0.00 0.00 0.00 15.61 \n", "2018-02-01 2018-02-01 14147.72 1.15 0.00 0.00 32.15 11.74 \n", "2017-07-31 2017-07-31 59821.28 4.99 0.00 0.00 47.23 26.21 \n", "2017-09-26 2017-09-26 17489.06 0.41 -1.52 18.32 18.86 2.21 \n", "2017-12-27 2017-12-27 20423.99 2.35 187.49 123.06 36.42 14.42 \n", "2017-01-05 2017-01-05 12899.17 0.97 -22.93 -46.61 36.61 13.73 \n", "2017-08-22 2017-08-22 9670.87 1.40 0.00 0.00 71.14 52.00 \n", "2017-02-20 2017-02-20 26320.40 5.81 0.00 0.00 49.46 25.26 \n", "2017-09-13 2017-09-13 20402.98 0.55 0.00 0.00 27.63 13.54 \n", "2017-12-29 2017-12-29 0.00 0.00 0.00 0.00 0.00 4.37 \n", "2017-12-08 2017-12-08 5390.14 0.62 0.00 0.00 48.54 25.94 \n", "2017-06-06 2017-06-06 19735.47 3.24 0.00 0.00 43.62 16.02 \n", "2017-01-05 2017-01-05 13293.88 1.33 35.56 85.39 24.81 7.47 \n", "2017-01-26 2017-01-26 16070.23 1.57 247.32 259.16 20.03 8.61 \n", "2017-11-09 2017-11-09 26470.75 1.58 10.59 -1.52 53.67 20.42 \n", "2017-08-03 2017-08-03 14224.57 1.78 0.00 0.00 31.36 13.34 \n", "2017-10-19 2017-10-19 26389.69 3.00 0.00 0.00 40.49 17.04 \n", "2017-05-16 2017-05-16 12030.73 1.50 21.35 35.63 93.67 33.74 \n", "2017-11-27 2017-11-27 8362.07 0.86 0.00 0.00 29.56 10.75 \n", "2017-05-23 2017-05-23 18206.14 1.75 0.00 0.00 13.57 3.79 \n", "\n", " holders 更新日期 \n", "timeToMarket \n", "2018-04-10 42986.0 2018-04-11 \n", "2018-03-26 140295.0 2018-04-11 \n", "2017-03-16 19044.0 2018-04-11 \n", "2017-09-20 36000.0 2018-04-11 \n", "2017-03-15 10574.0 2018-04-11 \n", "2018-03-28 115500.0 2018-04-11 \n", "2017-09-22 27488.0 2018-04-11 \n", "2018-03-30 26639.0 2018-04-11 \n", "2017-01-17 6781.0 2018-04-11 \n", "2017-03-21 16380.0 2018-04-11 \n", "2017-02-08 9897.0 2018-04-11 \n", "2017-10-10 21243.0 2018-04-11 \n", "2017-10-31 48514.0 2018-04-11 \n", "2017-05-09 14088.0 2018-04-11 \n", "2017-06-02 18283.0 2018-04-11 \n", "2017-09-22 38400.0 2018-04-11 \n", "2017-05-19 9615.0 2018-04-11 \n", "2017-08-10 15720.0 2018-04-11 \n", "2018-02-26 88473.0 2018-04-11 \n", "2017-11-21 79196.0 2018-04-11 \n", "2017-07-03 13484.0 2018-04-11 \n", "2017-04-21 4538.0 2018-04-11 \n", "2017-05-22 8928.0 2018-04-11 \n", "2018-02-23 48823.0 2018-04-11 \n", "2018-02-06 31946.0 2018-04-11 \n", "2017-01-20 9182.0 2018-04-11 \n", "2017-01-10 8819.0 2018-04-11 \n", "2017-12-18 43677.0 2018-04-11 \n", "2017-04-21 13137.0 2018-04-11 \n", "2018-03-23 77432.0 2018-04-11 \n", "... ... ... \n", "2017-03-24 7729.0 2018-04-11 \n", "2017-11-15 14138.0 2018-04-11 \n", "2017-08-22 13821.0 2018-04-11 \n", "2017-12-29 58700.0 2018-04-11 \n", "2017-12-05 48600.0 2018-04-11 \n", "2017-10-31 27589.0 2018-04-11 \n", "2017-11-01 71217.0 2018-04-11 \n", "2018-01-19 32672.0 2018-04-11 \n", "2017-08-08 16499.0 2018-04-11 \n", "2017-04-26 11522.0 2018-04-11 \n", "2018-01-16 77780.0 2018-04-11 \n", "2018-02-01 61548.0 2018-04-11 \n", "2017-07-31 23866.0 2018-04-11 \n", "2017-09-26 32006.0 2018-04-11 \n", "2017-12-27 17500.0 2018-04-11 \n", "2017-01-05 2328.0 2018-04-11 \n", "2017-08-22 14938.0 2018-04-11 \n", "2017-02-20 11264.0 2018-04-11 \n", "2017-09-13 58370.0 2018-04-11 \n", "2017-12-29 35041.0 2018-04-11 \n", "2017-12-08 45956.0 2018-04-11 \n", "2017-06-06 5677.0 2018-04-11 \n", "2017-01-05 10945.0 2018-04-11 \n", "2017-01-26 11752.0 2018-04-11 \n", "2017-11-09 25100.0 2018-04-11 \n", "2017-08-03 13585.0 2018-04-11 \n", "2017-10-19 16000.0 2018-04-11 \n", "2017-05-16 8714.0 2018-04-11 \n", "2017-11-27 50562.0 2018-04-11 \n", "2017-05-23 11765.0 2018-04-11 \n", "\n", "[477 rows x 24 columns]" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df['2017':'2018']" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "dfs = basic_df['2016':'2018']" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
timeToMarket
2017-05-04603501韦尔股份半导体上海137.280.424.56204200.45169034.1917705.68...14.752017-05-0447177.931.040.000.0019.106.2022079.02018-04-11
2017-07-05300671富满电子半导体深圳95.240.251.0168242.4351843.6214202.12...7.732017-07-0510927.211.080.000.0027.9511.6310100.02018-04-11
2017-03-17300625三雄极光半导体广东29.170.912.80271604.44225907.6623129.76...2.962017-03-1760387.822.160.000.0033.2810.8544932.02018-04-11
2017-04-06300632光莆股份半导体福建41.730.371.1666851.9643581.0119568.85...4.802017-04-0619050.151.650.000.0030.1312.3811562.02018-04-11
2016-10-12002815崇达技术半导体深圳32.881.064.10494307.56244897.22177228.13...5.782016-10-12114256.762.7938.1018.1432.6114.3127600.02018-04-11
2016-12-28300582英飞特半导体浙江83.811.212.03136238.9745586.1056919.20...3.622016-12-2820920.551.0318.08-34.8830.555.6917911.02018-04-11
2017-03-14300623捷捷微电半导体江苏42.110.370.94133111.3891724.8025565.35...5.182017-03-1433622.193.590.000.0056.4935.6114861.02018-04-11
2016-08-18603986兆易创新半导体北京85.621.472.03213397.97169092.529192.86...24.172016-08-1873909.363.6544.69134.7438.5722.3816098.02018-04-11
2017-12-01002913奥士康半导体湖南41.270.361.44190226.63104183.2281802.18...3.152017-12-0136008.442.500.000.0023.979.1830331.02018-04-11
2017-07-12300672国科微半导体湖南1273.880.281.1296894.6871145.507825.18...7.972017-07-1210634.240.950.000.0048.042.5216331.02018-04-11
2017-10-16300708聚灿光电半导体江苏67.730.642.57147835.2775164.5546085.87...10.452017-10-1618079.840.7029.3281.5328.9717.7236514.02018-04-11
2017-02-20300613富瀚微半导体上海68.970.130.4597363.9085505.561777.51...7.872017-02-2026320.405.810.000.0049.4625.2611264.02018-04-11
\n", "

12 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals \\\n", "timeToMarket \n", "2017-05-04 603501 韦尔股份 半导体 上海 137.28 0.42 4.56 \n", "2017-07-05 300671 富满电子 半导体 深圳 95.24 0.25 1.01 \n", "2017-03-17 300625 三雄极光 半导体 广东 29.17 0.91 2.80 \n", "2017-04-06 300632 光莆股份 半导体 福建 41.73 0.37 1.16 \n", "2016-10-12 002815 崇达技术 半导体 深圳 32.88 1.06 4.10 \n", "2016-12-28 300582 英飞特 半导体 浙江 83.81 1.21 2.03 \n", "2017-03-14 300623 捷捷微电 半导体 江苏 42.11 0.37 0.94 \n", "2016-08-18 603986 兆易创新 半导体 北京 85.62 1.47 2.03 \n", "2017-12-01 002913 奥士康 半导体 湖南 41.27 0.36 1.44 \n", "2017-07-12 300672 国科微 半导体 湖南 1273.88 0.28 1.12 \n", "2017-10-16 300708 聚灿光电 半导体 江苏 67.73 0.64 2.57 \n", "2017-02-20 300613 富瀚微 半导体 上海 68.97 0.13 0.45 \n", "\n", " totalAssets liquidAssets fixedAssets ... pb \\\n", "timeToMarket ... \n", "2017-05-04 204200.45 169034.19 17705.68 ... 14.75 \n", "2017-07-05 68242.43 51843.62 14202.12 ... 7.73 \n", "2017-03-17 271604.44 225907.66 23129.76 ... 2.96 \n", "2017-04-06 66851.96 43581.01 19568.85 ... 4.80 \n", "2016-10-12 494307.56 244897.22 177228.13 ... 5.78 \n", "2016-12-28 136238.97 45586.10 56919.20 ... 3.62 \n", "2017-03-14 133111.38 91724.80 25565.35 ... 5.18 \n", "2016-08-18 213397.97 169092.52 9192.86 ... 24.17 \n", "2017-12-01 190226.63 104183.22 81802.18 ... 3.15 \n", "2017-07-12 96894.68 71145.50 7825.18 ... 7.97 \n", "2017-10-16 147835.27 75164.55 46085.87 ... 10.45 \n", "2017-02-20 97363.90 85505.56 1777.51 ... 7.87 \n", "\n", " timeToMarket undp perundp rev profit gpr npr \\\n", "timeToMarket \n", "2017-05-04 2017-05-04 47177.93 1.04 0.00 0.00 19.10 6.20 \n", "2017-07-05 2017-07-05 10927.21 1.08 0.00 0.00 27.95 11.63 \n", "2017-03-17 2017-03-17 60387.82 2.16 0.00 0.00 33.28 10.85 \n", "2017-04-06 2017-04-06 19050.15 1.65 0.00 0.00 30.13 12.38 \n", "2016-10-12 2016-10-12 114256.76 2.79 38.10 18.14 32.61 14.31 \n", "2016-12-28 2016-12-28 20920.55 1.03 18.08 -34.88 30.55 5.69 \n", "2017-03-14 2017-03-14 33622.19 3.59 0.00 0.00 56.49 35.61 \n", "2016-08-18 2016-08-18 73909.36 3.65 44.69 134.74 38.57 22.38 \n", "2017-12-01 2017-12-01 36008.44 2.50 0.00 0.00 23.97 9.18 \n", "2017-07-12 2017-07-12 10634.24 0.95 0.00 0.00 48.04 2.52 \n", "2017-10-16 2017-10-16 18079.84 0.70 29.32 81.53 28.97 17.72 \n", "2017-02-20 2017-02-20 26320.40 5.81 0.00 0.00 49.46 25.26 \n", "\n", " holders 更新日期 \n", "timeToMarket \n", "2017-05-04 22079.0 2018-04-11 \n", "2017-07-05 10100.0 2018-04-11 \n", "2017-03-17 44932.0 2018-04-11 \n", "2017-04-06 11562.0 2018-04-11 \n", "2016-10-12 27600.0 2018-04-11 \n", "2016-12-28 17911.0 2018-04-11 \n", "2017-03-14 14861.0 2018-04-11 \n", "2016-08-18 16098.0 2018-04-11 \n", "2017-12-01 30331.0 2018-04-11 \n", "2017-07-12 16331.0 2018-04-11 \n", "2017-10-16 36514.0 2018-04-11 \n", "2017-02-20 11264.0 2018-04-11 \n", "\n", "[12 rows x 24 columns]" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfs[dfs['industry']==u'半导体']" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "df = ts.get_day_all()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "engine =get_engine('db_rocky')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df.to_sql('tb_temp',engine)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/雪球私募收益率分析.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('..')\n", "from configure.settings import DBSelector" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "client = DBSelector().mongo('qq')" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "doc_name = 'xueqiu_private_2024-01-22'\n", "data = list(client['db_stock'][doc_name].find())" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "627" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(data)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "df = pd.DataFrame(data)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
prioritysymbolnamemanager_nick_nameunit_net_valueend_dateend_date_valprofit_ratemax_drawdown_rateannual_return_this_year...fd_codehas_selectrisk_ratingis_open_day_tmpis_raisecreate_timesharp_ratehalf_a_yearcrawltimenormal_Item
0-1P000777大禾投资-掘金5号大禾投资12.881001-12170498880000011.88100.5787-0.0389...SM6778FalseNoneNoneNoneNone1.09False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.00...
1-1P001029仙人掌盈沣远航一号上海仙人掌7.587001-1217049888000006.58700.3798-0.0928...SS5579FalseNoneNoneNoneNone1.09False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.04...
2-1P000865达理1号成于思7.313001-1217049888000006.31300.3404-0.0757...SL3433FalseNoneNoneNoneNone1.04False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.03...
3-1P000946正圆壹号正圆投资4.346001-1217049888000006.23300.5562-0.4111...SJ5352FalseNoneNoneNoneNone0.58False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.09...
4-1P000531希瓦小牛1号梁宏5.504801-1217049888000006.08540.4055-0.0934...A00003TrueNoneNoneNoneNone0.95False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.00...
\n", "

5 rows × 22 columns

\n", "
" ], "text/plain": [ " priority symbol name manager_nick_name unit_net_value end_date \\\n", "0 -1 P000777 大禾投资-掘金5号 大禾投资 12.8810 01-12 \n", "1 -1 P001029 仙人掌盈沣远航一号 上海仙人掌 7.5870 01-12 \n", "2 -1 P000865 达理1号 成于思 7.3130 01-12 \n", "3 -1 P000946 正圆壹号 正圆投资 4.3460 01-12 \n", "4 -1 P000531 希瓦小牛1号 梁宏 5.5048 01-12 \n", "\n", " end_date_val profit_rate max_drawdown_rate annual_return_this_year \\\n", "0 1704988800000 11.8810 0.5787 -0.0389 \n", "1 1704988800000 6.5870 0.3798 -0.0928 \n", "2 1704988800000 6.3130 0.3404 -0.0757 \n", "3 1704988800000 6.2330 0.5562 -0.4111 \n", "4 1704988800000 6.0854 0.4055 -0.0934 \n", "\n", " ... fd_code has_select risk_rating is_open_day_tmp is_raise create_time \\\n", "0 ... SM6778 False None None None None \n", "1 ... SS5579 False None None None None \n", "2 ... SL3433 False None None None None \n", "3 ... SJ5352 False None None None None \n", "4 ... A00003 True None None None None \n", "\n", " sharp_rate half_a_year crawltime \\\n", "0 1.09 False 2024-01-21 19:43:49.432 \n", "1 1.09 False 2024-01-21 19:43:49.432 \n", "2 1.04 False 2024-01-21 19:43:49.432 \n", "3 0.58 False 2024-01-21 19:43:49.432 \n", "4 0.95 False 2024-01-21 19:43:49.432 \n", "\n", " normal_Item \n", "0 {'nav_type': 'normal', 'max_draw_down': '-0.00... \n", "1 {'nav_type': 'normal', 'max_draw_down': '-0.04... \n", "2 {'nav_type': 'normal', 'max_draw_down': '-0.03... \n", "3 {'nav_type': 'normal', 'max_draw_down': '-0.09... \n", "4 {'nav_type': 'normal', 'max_draw_down': '-0.00... \n", "\n", "[5 rows x 22 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "del df['_id']" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
prioritysymbolnamemanager_nick_nameunit_net_valueend_dateend_date_valprofit_ratemax_drawdown_rateannual_return_this_year...fd_codehas_selectrisk_ratingis_open_day_tmpis_raisecreate_timesharp_ratehalf_a_yearcrawltimenormal_Item
0-1P000777大禾投资-掘金5号大禾投资12.97901-19170559360000011.9790.5787-0.0779...SM6778FalseNoneNoneNoneNone1.09False2024-01-22 18:11:32.741{'nav_type': 'normal', 'max_draw_down': '-0.00...
\n", "

1 rows × 22 columns

\n", "
" ], "text/plain": [ " priority symbol name manager_nick_name unit_net_value end_date \\\n", "0 -1 P000777 大禾投资-掘金5号 大禾投资 12.979 01-19 \n", "\n", " end_date_val profit_rate max_drawdown_rate annual_return_this_year \\\n", "0 1705593600000 11.979 0.5787 -0.0779 \n", "\n", " ... fd_code has_select risk_rating is_open_day_tmp is_raise create_time \\\n", "0 ... SM6778 False None None None None \n", "\n", " sharp_rate half_a_year crawltime \\\n", "0 1.09 False 2024-01-22 18:11:32.741 \n", "\n", " normal_Item \n", "0 {'nav_type': 'normal', 'max_draw_down': '-0.00... \n", "\n", "[1 rows x 22 columns]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(1)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "df['annual_return_this_year']=df['annual_return_this_year'].map(lambda x:100*x)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "df['combine-name']=df['name']+'-'+df['manager_nick_name']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head(5)\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "top = df.sort_values('annual_return_this_year',ascending=False).head(20)\n", "bottom = df.sort_values('annual_return_this_year',ascending=True).head(20)\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "temp_data = df[df['symbol']=='P000531']['normal_Item']" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4 -0.0934\n", "Name: annual_return_this_year, dtype: float64" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['symbol']=='P000531']['annual_return_this_year']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'nav_type': 'normal',\n", " 'max_draw_down': '-0.0064',\n", " 'sharp': '2.86',\n", " 'desc': '本产品',\n", " 'rate': '0.0082'}" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_data.iloc[0]" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "def this_year_actual_return(x):\n", " # item = x['normal_Item']\n", " return float(x['rate'])*100" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "df['this_year_actual_return'] = df['normal_Item'].map(this_year_actual_return)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "df.to_excel('xueqiu_private_fund.xlsx',encoding='utf8',index=False)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "top = df.sort_values('this_year_actual_return',ascending=False).head(20)\n", "bottom = df.sort_values('this_year_actual_return',ascending=True).head(20)\n" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
prioritysymbolnamemanager_nick_nameunit_net_valueend_dateend_date_valprofit_ratemax_drawdown_rateannual_return_this_year...has_selectrisk_ratingis_open_day_tmpis_raisecreate_timesharp_ratehalf_a_yearcrawltimenormal_Itemthis_year_actual_return
0-1P000777大禾投资-掘金5号大禾投资12.881001-12170498880000011.88100.5787-0.0389...FalseNoneNoneNoneNone1.09False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.00...0.76
1-1P001029仙人掌盈沣远航一号上海仙人掌7.587001-1217049888000006.58700.3798-0.0928...FalseNoneNoneNoneNone1.09False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.04...-4.43
2-1P000865达理1号成于思7.313001-1217049888000006.31300.3404-0.0757...FalseNoneNoneNoneNone1.04False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.03...-1.96
3-1P000946正圆壹号正圆投资4.346001-1217049888000006.23300.5562-0.4111...FalseNoneNoneNoneNone0.58False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.09...-9.04
4-1P000531希瓦小牛1号梁宏5.504801-1217049888000006.08540.4055-0.0934...TrueNoneNoneNoneNone0.95False2024-01-21 19:43:49.432{'nav_type': 'normal', 'max_draw_down': '-0.00...0.82
\n", "

5 rows × 23 columns

\n", "
" ], "text/plain": [ " priority symbol name manager_nick_name unit_net_value end_date \\\n", "0 -1 P000777 大禾投资-掘金5号 大禾投资 12.8810 01-12 \n", "1 -1 P001029 仙人掌盈沣远航一号 上海仙人掌 7.5870 01-12 \n", "2 -1 P000865 达理1号 成于思 7.3130 01-12 \n", "3 -1 P000946 正圆壹号 正圆投资 4.3460 01-12 \n", "4 -1 P000531 希瓦小牛1号 梁宏 5.5048 01-12 \n", "\n", " end_date_val profit_rate max_drawdown_rate annual_return_this_year \\\n", "0 1704988800000 11.8810 0.5787 -0.0389 \n", "1 1704988800000 6.5870 0.3798 -0.0928 \n", "2 1704988800000 6.3130 0.3404 -0.0757 \n", "3 1704988800000 6.2330 0.5562 -0.4111 \n", "4 1704988800000 6.0854 0.4055 -0.0934 \n", "\n", " ... has_select risk_rating is_open_day_tmp is_raise create_time \\\n", "0 ... False None None None None \n", "1 ... False None None None None \n", "2 ... False None None None None \n", "3 ... False None None None None \n", "4 ... True None None None None \n", "\n", " sharp_rate half_a_year crawltime \\\n", "0 1.09 False 2024-01-21 19:43:49.432 \n", "1 1.09 False 2024-01-21 19:43:49.432 \n", "2 1.04 False 2024-01-21 19:43:49.432 \n", "3 0.58 False 2024-01-21 19:43:49.432 \n", "4 0.95 False 2024-01-21 19:43:49.432 \n", "\n", " normal_Item this_year_actual_return \n", "0 {'nav_type': 'normal', 'max_draw_down': '-0.00... 0.76 \n", "1 {'nav_type': 'normal', 'max_draw_down': '-0.04... -4.43 \n", "2 {'nav_type': 'normal', 'max_draw_down': '-0.03... -1.96 \n", "3 {'nav_type': 'normal', 'max_draw_down': '-0.09... -9.04 \n", "4 {'nav_type': 'normal', 'max_draw_down': '-0.00... 0.82 \n", "\n", "[5 rows x 23 columns]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "# 绘图部分\n", "from pyecharts import options as opts\n", "from pyecharts.charts import Bar\n", "from pyecharts.globals import ThemeType\n", "\n", "# simple_result ={}\n", "# for k,v in industry_dict.items():\n", "# simple_result[k]=round(v['premium_rt'].mean(),0)\n", "\n", "# simple_result = list(sorted(simple_result.items(),key=lambda x:x[1],reverse=True))\n", "# X=[i[0] for i in simple_result]\n", "# Y=[i[1] for i in simple_result]\n", "X=top['name'].tolist()\n", "Y=top['this_year_actual_return'].tolist()\n", "Y=[round(i) for i in Y]\n", "c = (\n", " Bar()\n", " .add_xaxis(X)\n", " .add_yaxis(y_axis=Y,series_name='收益率%',\n", " category_gap=\"70%\"\n", " )\n", " # .reversal_axis()\n", " .set_series_opts(label_opts=opts.LabelOpts(position=\"right\"))\n", " .set_global_opts(title_opts=opts.TitleOpts(title=\"雪球私募收益率2024年1-月排名前20\"),\n", " xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),\n", " yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True),),\n", " # datazoom_opts=opts.DataZoomOpts()\n", " )\n", " # .render(\"../plot_image/私募收益率靠前.html\")\n", ")\n", "\n", "from pyecharts.charts import Bar, Grid, Line\n", "grid = (\n", " Grid(init_opts=opts.InitOpts(theme= ThemeType.CHALK))\n", " .add(c, grid_opts=opts.GridOpts(pos_bottom=\"25%\"))\n", " .render(\"../plot_image/私募收益率靠前top-20.html\")\n", ")" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-4.24518341307815" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['this_year_actual_return'].mean()" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-4.24" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['this_year_actual_return'].median()" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-22.439999999999998" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['end_date']>='01-19']['this_year_actual_return'].min()" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "375" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['end_date']>='01-19']['this_year_actual_return'].argmin()" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "594" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['this_year_actual_return'].argmin()" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "priority -1\n", "symbol P000685\n", "name 上海斯诺波-爱久量化\n", "manager_nick_name 爱久投资\n", "unit_net_value 0.736\n", "end_date 01-19\n", "end_date_val 1705593600000\n", "profit_rate -0.264\n", "max_drawdown_rate 0.5482\n", "annual_return_this_year -45.76\n", "annual_return_year -0.4576\n", "show_profit_status 1\n", "fd_code SJV254\n", "has_select False\n", "risk_rating None\n", "is_open_day_tmp None\n", "is_raise None\n", "create_time None\n", "sharp_rate -0.28\n", "half_a_year False\n", "crawltime 2024-01-22 18:11:32.742000\n", "normal_Item {'nav_type': 'normal', 'max_draw_down': '-0.22...\n", "this_year_actual_return -22.44\n", "Name: 594, dtype: object" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[594]" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "X=bottom['name'].tolist()\n", "Y=bottom['this_year_actual_return'].tolist()\n", "Y=[round(i) for i in Y]\n", "c = (\n", " Bar()\n", " .add_xaxis(X)\n", " .add_yaxis(y_axis=Y,series_name='收益率%',\n", " category_gap=\"70%\"\n", " )\n", " .set_series_opts(label_opts=opts.LabelOpts(position=\"right\"))\n", " .set_global_opts(title_opts=opts.TitleOpts(title=\"雪球私募收益率2024年1月排名倒数20\"),\n", " xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45),splitline_opts=opts.SplitLineOpts(is_show=False),),\n", " yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True),),\n", " )\n", ")\n", "\n", "from pyecharts.charts import Bar, Grid, Line\n", "grid = (\n", " Grid(init_opts=opts.InitOpts(theme= ThemeType.CHALK))\n", " .add(c, grid_opts=opts.GridOpts(pos_bottom=\"25%\"))\n", " .render(\"../plot_image/私募收益率靠后-tail.html\")\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "df['max_drawdown_rate']=df['max_drawdown_rate'].map(lambda x:x*100)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "df['max_drawdown_rate']=df['max_drawdown_rate'].map(lambda x:x*100)\n", "top__ = df.sort_values('annual_return_this_year',ascending=False).head(50)\n", "bottom__ = df.sort_values('annual_return_this_year',ascending=True).head(50)\n", "top_=top__.rename(columns={'name':'私募名称','manager_nick_name':'管理人','annual_return_this_year':'今年收益率','unit_net_value':'单位净值','max_drawdown_rate':'最大回撤'})\n", "# top[['name','manager_nick_name','annual_return_this_year','unit_net_value']].head(50)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "top_[['私募名称','管理人','今年收益率','单位净值','最大回撤']].reset_index(drop=True).head(50).to_excel('top.xlsx')" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "bottom_=bottom__.rename(columns={'name':'私募名称','manager_nick_name':'管理人','annual_return_this_year':'今年收益率','unit_net_value':'单位净值','max_drawdown_rate':'最大回撤'})\n" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "bottom_[['私募名称','管理人','今年收益率','单位净值','最大回撤']].reset_index(drop=True).head(50).to_excel('bottom.xlsx')" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "# 合并\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "data_full = list(client['db_stock']['xueqiu_private_2022-08-18_brute_force'].find())" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "data_full_df = pd.DataFrame(data_full)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
_idsymbolnameprofit_rateannual_return_this_yearmanager_nick_namenetvalue_datecreate_dateclose_statuscrwaltime
062fdfcde3662f56a59ea53cdP000030私募工场(格顿1期)58.15NaNNone2015-11-132014-01-17True2022-08-18 16:48:30.167
162fdfcde3662f56a59ea53ceP000031私募工场(英菲证券)90.44NaNNone2015-10-212014-01-17True2022-08-18 16:48:30.532
262fdfcdf3662f56a59ea53cfP000032私募工场(思考8号)11.47NaNNone2014-09-162014-01-20True2022-08-18 16:48:31.036
362fdfcdf3662f56a59ea53d0P000033私募工场(曦微成长精选1期)85.72NaNNone2015-12-082014-02-20True2022-08-18 16:48:31.380
462fdfceb3662f56a59ea53d1P000048私募工场(以恒1号)82.33NaNNone2016-08-242014-01-17True2022-08-18 16:48:43.106
\n", "
" ], "text/plain": [ " _id symbol name profit_rate \\\n", "0 62fdfcde3662f56a59ea53cd P000030 私募工场(格顿1期) 58.15 \n", "1 62fdfcde3662f56a59ea53ce P000031 私募工场(英菲证券) 90.44 \n", "2 62fdfcdf3662f56a59ea53cf P000032 私募工场(思考8号) 11.47 \n", "3 62fdfcdf3662f56a59ea53d0 P000033 私募工场(曦微成长精选1期) 85.72 \n", "4 62fdfceb3662f56a59ea53d1 P000048 私募工场(以恒1号) 82.33 \n", "\n", " annual_return_this_year manager_nick_name netvalue_date create_date \\\n", "0 NaN None 2015-11-13 2014-01-17 \n", "1 NaN None 2015-10-21 2014-01-17 \n", "2 NaN None 2014-09-16 2014-01-20 \n", "3 NaN None 2015-12-08 2014-02-20 \n", "4 NaN None 2016-08-24 2014-01-17 \n", "\n", " close_status crwaltime \n", "0 True 2022-08-18 16:48:30.167 \n", "1 True 2022-08-18 16:48:30.532 \n", "2 True 2022-08-18 16:48:31.036 \n", "3 True 2022-08-18 16:48:31.380 \n", "4 True 2022-08-18 16:48:43.106 " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_full_df.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "del data_full_df['_id']" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "merge_df = pd.merge(df,data_full_df,left_on='symbol',right_on='symbol',how='outer')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
_idprioritysymbolname_xmanager_nick_name_xunit_net_valueend_dateend_date_valprofit_rate_xmax_drawdown_rate...half_a_yearcrawltimename_yprofit_rate_yannual_return_this_year_ymanager_nick_name_ynetvalue_datecreate_dateclose_statuscrwaltime
063063461e1b8ad401d34c646-1.0P000946正圆壹号正圆投资9.485008-191.660838e+1211.37200.3664...False2022-08-24 22:23:29.646正圆壹号1067.608.90正圆投资2022-08-122016-07-14False2022-08-18 17:02:13.945
163063461e1b8ad401d34c647-1.0P000777大禾投资-掘金5号大禾投资10.711008-191.660838e+129.71100.4272...False2022-08-24 22:23:29.646大禾投资-掘金5号958.50-17.26大禾投资2022-08-122016-10-12False2022-08-18 17:00:04.894
263063461e1b8ad401d34c648-1.0P001029仙人掌盈沣远航一号上海仙人掌10.638008-191.660838e+129.63800.2797...False2022-08-24 22:23:29.646仙人掌盈沣远航一号953.70-9.30None2022-08-122017-04-12False2022-08-18 17:02:57.366
363063461e1b8ad401d34c649-1.0P000865达理1号成于思7.807908-191.660838e+126.80790.3404...False2022-08-24 22:23:29.646达理1号701.71-15.58None2022-08-122016-07-28False2022-08-18 17:01:17.810
463063461e1b8ad401d34c64a-1.0P000531希瓦小牛1号梁宏5.031808-191.660838e+125.61240.3726...False2022-08-24 22:23:29.646希瓦小牛1号569.80-12.08None2022-08-122015-04-21False2022-08-18 16:55:06.650
\n", "

5 rows × 30 columns

\n", "
" ], "text/plain": [ " _id priority symbol name_x manager_nick_name_x \\\n", "0 63063461e1b8ad401d34c646 -1.0 P000946 正圆壹号 正圆投资 \n", "1 63063461e1b8ad401d34c647 -1.0 P000777 大禾投资-掘金5号 大禾投资 \n", "2 63063461e1b8ad401d34c648 -1.0 P001029 仙人掌盈沣远航一号 上海仙人掌 \n", "3 63063461e1b8ad401d34c649 -1.0 P000865 达理1号 成于思 \n", "4 63063461e1b8ad401d34c64a -1.0 P000531 希瓦小牛1号 梁宏 \n", "\n", " unit_net_value end_date end_date_val profit_rate_x max_drawdown_rate \\\n", "0 9.4850 08-19 1.660838e+12 11.3720 0.3664 \n", "1 10.7110 08-19 1.660838e+12 9.7110 0.4272 \n", "2 10.6380 08-19 1.660838e+12 9.6380 0.2797 \n", "3 7.8079 08-19 1.660838e+12 6.8079 0.3404 \n", "4 5.0318 08-19 1.660838e+12 5.6124 0.3726 \n", "\n", " ... half_a_year crawltime name_y profit_rate_y \\\n", "0 ... False 2022-08-24 22:23:29.646 正圆壹号 1067.60 \n", "1 ... False 2022-08-24 22:23:29.646 大禾投资-掘金5号 958.50 \n", "2 ... False 2022-08-24 22:23:29.646 仙人掌盈沣远航一号 953.70 \n", "3 ... False 2022-08-24 22:23:29.646 达理1号 701.71 \n", "4 ... False 2022-08-24 22:23:29.646 希瓦小牛1号 569.80 \n", "\n", " annual_return_this_year_y manager_nick_name_y netvalue_date create_date \\\n", "0 8.90 正圆投资 2022-08-12 2016-07-14 \n", "1 -17.26 大禾投资 2022-08-12 2016-10-12 \n", "2 -9.30 None 2022-08-12 2017-04-12 \n", "3 -15.58 None 2022-08-12 2016-07-28 \n", "4 -12.08 None 2022-08-12 2015-04-21 \n", "\n", " close_status crwaltime \n", "0 False 2022-08-18 17:02:13.945 \n", "1 False 2022-08-18 17:00:04.894 \n", "2 False 2022-08-18 17:02:57.366 \n", "3 False 2022-08-18 17:01:17.810 \n", "4 False 2022-08-18 16:55:06.650 \n", "\n", "[5 rows x 30 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merge_df.head()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "del merge_df['_id']" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "del merge_df['priority']" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'merge_df' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m/home/xda/github/stock/analysis/雪球私募收益率分析.ipynb Cell 34\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m---->
1\u001b[0m merge_df\u001b[39m.\u001b[39mhead()\n", "\u001b[0;31mNameError\u001b[0m: name 'merge_df' is not defined" ] } ], "source": [ "merge_df.head()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1016" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(merge_df)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolname_xmanager_nick_name_xunit_net_valueend_dateend_date_valprofit_rate_xmax_drawdown_rateannual_return_this_year_xannual_return_year...half_a_yearcrawltimename_yprofit_rate_yannual_return_this_year_ymanager_nick_name_ynetvalue_datecreate_dateclose_statuscrwaltime
11P666012青骊长兴青骊投资4.959008-191.660838e+123.95900.37680.08970.1405...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
23P666011青骊长川青骊投资3.464008-191.660838e+122.46400.09880.09000.1028...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
24P666013兆天金牛精选2号兆天投资3.090008-191.660838e+122.39000.3670-0.0888-0.2075...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
60P666007赫富500指数增强一号赫富投资2.648008-191.660838e+121.64800.2749-0.01230.0157...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
117P666023相聚畅联一期相聚资本2.054508-191.660838e+121.05450.28970.03760.1335...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
123P666009启林正兴东绣1号启林投资0.978008-191.660838e+121.00400.2642-0.01900.0255...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
161P666019悟空对冲量化11期深圳悟空投资1.791608-191.660838e+120.79160.2364-0.1979-0.1445...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
181P666020翼虎成长23期翼虎投资余定恒1.447008-191.660838e+120.70340.2959-0.2587-0.1961...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
185P101729圆球财富增值计划FOF私募FOF研究1.679008-221.661098e+120.67900.5277-0.2834-0.3085...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
223P666003雪球私募精英荟3号偏股型FOF私募FOF研究1.501008-221.661098e+120.50100.3604-0.1973-0.2050...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
231P666004玖鹏稳健成长7号A玖鹏资产1.482008-221.661098e+120.48200.3834-0.0789-0.1434...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
241P666018翼虎成长18期翼虎投资余定恒1.428008-191.660838e+120.42800.2848-0.2547-0.2049...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
242P666016青骊长川3号青骊投资1.236008-191.660838e+120.42800.08790.10460.1226...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
243P007128飞龙FOFNone1.426008-221.661098e+120.42600.3544-0.1856-0.1781...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
246P123456厚雪长坡私募FOF研究1.421008-221.661098e+120.42100.4841-0.2790-0.2958...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
277P001272殊馥馥源套利1号殊馥投资1.001808-191.660838e+120.30280.01470.02830.0396...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
285P666021熙德博远医疗优选1号李秋实的投资修行0.806008-191.660838e+120.27700.3162-0.0562-0.1213...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
357P666014汇升星泰FOF一号汇鸿汇升投资1.074108-191.660838e+120.07410.0579-0.00890.0170...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
360P666025博孚利CTA-FOF1A号wenson文灏1.068808-191.660838e+120.06880.06190.03100.0867...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
362P666027博孚利CTA-FOF5A号wenson文灏1.065008-191.660838e+120.06500.07700.05030.1071...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
417P001273仲阳博观量化选股1号1期仲阳天王星0.999508-191.660838e+12-0.00050.0005-0.0005NaN...True2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
420P001271殊馥馥荣2号殊馥投资0.998708-221.661098e+12-0.00130.0060-0.0013NaN...True2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
485P666010熙德博远医疗优选3号A李秋实的投资修行0.856008-191.660838e+12-0.14400.2532-0.0404NaN...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
493P666024悟空11期8号深圳悟空投资0.820308-191.660838e+12-0.17970.2261-0.2078NaN...False2022-08-24 22:23:29.646NaNNaNNaNNaNNaNNaNNaNNaT
511P666005华宝证券华量安瑞1号FOF集合资产管理计划华宝资管总部1.239308-021.659370e+120.23930.04720.04220.0424...False2022-08-24 22:23:41.368NaNNaNNaNNaNNaNNaNNaNNaT
514P666017洛书裕和建安洛书投资1.174707-291.659024e+120.17470.1376-0.06130.0256...False2022-08-24 22:23:41.368NaNNaNNaNNaNNaNNaNNaNNaT
\n", "

26 rows × 28 columns

\n", "
" ], "text/plain": [ " symbol name_x manager_nick_name_x unit_net_value \\\n", "11 P666012 青骊长兴 青骊投资 4.9590 \n", "23 P666011 青骊长川 青骊投资 3.4640 \n", "24 P666013 兆天金牛精选2号 兆天投资 3.0900 \n", "60 P666007 赫富500指数增强一号 赫富投资 2.6480 \n", "117 P666023 相聚畅联一期 相聚资本 2.0545 \n", "123 P666009 启林正兴东绣1号 启林投资 0.9780 \n", "161 P666019 悟空对冲量化11期 深圳悟空投资 1.7916 \n", "181 P666020 翼虎成长23期 翼虎投资余定恒 1.4470 \n", "185 P101729 圆球财富增值计划FOF 私募FOF研究 1.6790 \n", "223 P666003 雪球私募精英荟3号偏股型FOF 私募FOF研究 1.5010 \n", "231 P666004 玖鹏稳健成长7号A 玖鹏资产 1.4820 \n", "241 P666018 翼虎成长18期 翼虎投资余定恒 1.4280 \n", "242 P666016 青骊长川3号 青骊投资 1.2360 \n", "243 P007128 飞龙FOF None 1.4260 \n", "246 P123456 厚雪长坡 私募FOF研究 1.4210 \n", "277 P001272 殊馥馥源套利1号 殊馥投资 1.0018 \n", "285 P666021 熙德博远医疗优选1号 李秋实的投资修行 0.8060 \n", "357 P666014 汇升星泰FOF一号 汇鸿汇升投资 1.0741 \n", "360 P666025 博孚利CTA-FOF1A号 wenson文灏 1.0688 \n", "362 P666027 博孚利CTA-FOF5A号 wenson文灏 1.0650 \n", "417 P001273 仲阳博观量化选股1号1期 仲阳天王星 0.9995 \n", "420 P001271 殊馥馥荣2号 殊馥投资 0.9987 \n", "485 P666010 熙德博远医疗优选3号A 李秋实的投资修行 0.8560 \n", "493 P666024 悟空11期8号 深圳悟空投资 0.8203 \n", "511 P666005 华宝证券华量安瑞1号FOF集合资产管理计划 华宝资管总部 1.2393 \n", "514 P666017 洛书裕和建安 洛书投资 1.1747 \n", "\n", " end_date end_date_val profit_rate_x max_drawdown_rate \\\n", "11 08-19 1.660838e+12 3.9590 0.3768 \n", "23 08-19 1.660838e+12 2.4640 0.0988 \n", "24 08-19 1.660838e+12 2.3900 0.3670 \n", "60 08-19 1.660838e+12 1.6480 0.2749 \n", "117 08-19 1.660838e+12 1.0545 0.2897 \n", "123 08-19 1.660838e+12 1.0040 0.2642 \n", "161 08-19 1.660838e+12 0.7916 0.2364 \n", "181 08-19 1.660838e+12 0.7034 0.2959 \n", "185 08-22 1.661098e+12 0.6790 0.5277 \n", "223 08-22 1.661098e+12 0.5010 0.3604 \n", "231 08-22 1.661098e+12 0.4820 0.3834 \n", "241 08-19 1.660838e+12 0.4280 0.2848 \n", "242 08-19 1.660838e+12 0.4280 0.0879 \n", "243 08-22 1.661098e+12 0.4260 0.3544 \n", "246 08-22 1.661098e+12 0.4210 0.4841 \n", "277 08-19 1.660838e+12 0.3028 0.0147 \n", "285 08-19 1.660838e+12 0.2770 0.3162 \n", "357 08-19 1.660838e+12 0.0741 0.0579 \n", "360 08-19 1.660838e+12 0.0688 0.0619 \n", "362 08-19 1.660838e+12 0.0650 0.0770 \n", "417 08-19 1.660838e+12 -0.0005 0.0005 \n", "420 08-22 1.661098e+12 -0.0013 0.0060 \n", "485 08-19 1.660838e+12 -0.1440 0.2532 \n", "493 08-19 1.660838e+12 -0.1797 0.2261 \n", "511 08-02 1.659370e+12 0.2393 0.0472 \n", "514 07-29 1.659024e+12 0.1747 0.1376 \n", "\n", " annual_return_this_year_x annual_return_year ... half_a_year \\\n", "11 0.0897 0.1405 ... False \n", "23 0.0900 0.1028 ... False \n", "24 -0.0888 -0.2075 ... False \n", "60 -0.0123 0.0157 ... False \n", "117 0.0376 0.1335 ... False \n", "123 -0.0190 0.0255 ... False \n", "161 -0.1979 -0.1445 ... False \n", "181 -0.2587 -0.1961 ... False \n", "185 -0.2834 -0.3085 ... False \n", "223 -0.1973 -0.2050 ... False \n", "231 -0.0789 -0.1434 ... False \n", "241 -0.2547 -0.2049 ... False \n", "242 0.1046 0.1226 ... False \n", "243 -0.1856 -0.1781 ... False \n", "246 -0.2790 -0.2958 ... False \n", "277 0.0283 0.0396 ... False \n", "285 -0.0562 -0.1213 ... False \n", "357 -0.0089 0.0170 ... False \n", "360 0.0310 0.0867 ... False \n", "362 0.0503 0.1071 ... False \n", "417 -0.0005 NaN ... True \n", "420 -0.0013 NaN ... True \n", "485 -0.0404 NaN ... False \n", "493 -0.2078 NaN ... False \n", "511 0.0422 0.0424 ... False \n", "514 -0.0613 0.0256 ... False \n", "\n", " crawltime name_y profit_rate_y annual_return_this_year_y \\\n", "11 2022-08-24 22:23:29.646 NaN NaN NaN \n", "23 2022-08-24 22:23:29.646 NaN NaN NaN \n", "24 2022-08-24 22:23:29.646 NaN NaN NaN \n", "60 2022-08-24 22:23:29.646 NaN NaN NaN \n", "117 2022-08-24 22:23:29.646 NaN NaN NaN \n", "123 2022-08-24 22:23:29.646 NaN NaN NaN \n", "161 2022-08-24 22:23:29.646 NaN NaN NaN \n", "181 2022-08-24 22:23:29.646 NaN NaN NaN \n", "185 2022-08-24 22:23:29.646 NaN NaN NaN \n", "223 2022-08-24 22:23:29.646 NaN NaN NaN \n", "231 2022-08-24 22:23:29.646 NaN NaN NaN \n", "241 2022-08-24 22:23:29.646 NaN NaN NaN \n", "242 2022-08-24 22:23:29.646 NaN NaN NaN \n", "243 2022-08-24 22:23:29.646 NaN NaN NaN \n", "246 2022-08-24 22:23:29.646 NaN NaN NaN \n", "277 2022-08-24 22:23:29.646 NaN NaN NaN \n", "285 2022-08-24 22:23:29.646 NaN NaN NaN \n", "357 2022-08-24 22:23:29.646 NaN NaN NaN \n", "360 2022-08-24 22:23:29.646 NaN NaN NaN \n", "362 2022-08-24 22:23:29.646 NaN NaN NaN \n", "417 2022-08-24 22:23:29.646 NaN NaN NaN \n", "420 2022-08-24 22:23:29.646 NaN NaN NaN \n", "485 2022-08-24 22:23:29.646 NaN NaN NaN \n", "493 2022-08-24 22:23:29.646 NaN NaN NaN \n", "511 2022-08-24 22:23:41.368 NaN NaN NaN \n", "514 2022-08-24 22:23:41.368 NaN NaN NaN \n", "\n", " manager_nick_name_y netvalue_date create_date close_status crwaltime \n", "11 NaN NaN NaN NaN NaT \n", "23 NaN NaN NaN NaN NaT \n", "24 NaN NaN NaN NaN NaT \n", "60 NaN NaN NaN NaN NaT \n", "117 NaN NaN NaN NaN NaT \n", "123 NaN NaN NaN NaN NaT \n", "161 NaN NaN NaN NaN NaT \n", "181 NaN NaN NaN NaN NaT \n", "185 NaN NaN NaN NaN NaT \n", "223 NaN NaN NaN NaN NaT \n", "231 NaN NaN NaN NaN NaT \n", "241 NaN NaN NaN NaN NaT \n", "242 NaN NaN NaN NaN NaT \n", "243 NaN NaN NaN NaN NaT \n", "246 NaN NaN NaN NaN NaT \n", "277 NaN NaN NaN NaN NaT \n", "285 NaN NaN NaN NaN NaT \n", "357 NaN NaN NaN NaN NaT \n", "360 NaN NaN NaN NaN NaT \n", "362 NaN NaN NaN NaN NaT \n", "417 NaN NaN NaN NaN NaT \n", "420 NaN NaN NaN NaN NaT \n", "485 NaN NaN NaN NaN NaT \n", "493 NaN NaN NaN NaN NaT \n", "511 NaN NaN NaN NaN NaT \n", "514 NaN NaN NaN NaN NaT \n", "\n", "[26 rows x 28 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merge_df[merge_df['create_date'].isnull()]" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "60" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(merge_df[merge_df['create_date']>'2022-01-01'])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
prioritysymbolnamemanager_nick_nameunit_net_valueend_dateend_date_valprofit_ratemax_drawdown_rateannual_return_this_year...show_profit_statusfd_codehas_selectrisk_ratingis_open_day_tmpis_raisecreate_timesharp_ratehalf_a_yearcrawltime
\n", "

0 rows × 21 columns

\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [priority, symbol, name, manager_nick_name, unit_net_value, end_date, end_date_val, profit_rate, max_drawdown_rate, annual_return_this_year, annual_return_year, show_profit_status, fd_code, has_select, risk_rating, is_open_day_tmp, is_raise, create_time, sharp_rate, half_a_year, crawltime]\n", "Index: []\n", "\n", "[0 rows x 21 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['annual_return_this_year'].isnull()]" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "238" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(merge_df[merge_df['close_status']==True])" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "752" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(merge_df[merge_df['close_status']==False])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "238" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False 752\n", "True 238\n", "Name: close_status, dtype: int64" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merge_df['close_status'].value_counts()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_20055/1612014277.py:1: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n", " merge_df[merge_df[merge_df['close_status']==False]['create_date']<'2022-01-01']\n" ] }, { "ename": "IndexingError", "evalue": "Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexingError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m/home/xda/github/stock/analysis/雪球私募收益率分析.ipynb Cell 37'\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0m merge_df[merge_df[merge_df[\u001b[39m'\u001b[39;49m\u001b[39mclose_status\u001b[39;49m\u001b[39m'\u001b[39;49m]\u001b[39m==\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m][\u001b[39m'\u001b[39;49m\u001b[39mcreate_date\u001b[39;49m\u001b[39m'\u001b[39;49m]\u001b[39m<\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m2022-01-01\u001b[39;49m\u001b[39m'\u001b[39;49m]\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/core/frame.py:3496\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3494\u001b[0m \u001b[39m# Do we have a (boolean) 1d indexer?\u001b[39;00m\n\u001b[1;32m 3495\u001b[0m \u001b[39mif\u001b[39;00m com\u001b[39m.\u001b[39mis_bool_indexer(key):\n\u001b[0;32m-> 3496\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_getitem_bool_array(key)\n\u001b[1;32m 3498\u001b[0m \u001b[39m# We are left with two options: a single key, and a collection of keys,\u001b[39;00m\n\u001b[1;32m 3499\u001b[0m \u001b[39m# We interpret tuples as collections only for non-MultiIndex\u001b[39;00m\n\u001b[1;32m 3500\u001b[0m is_single_key \u001b[39m=\u001b[39m \u001b[39misinstance\u001b[39m(key, \u001b[39mtuple\u001b[39m) \u001b[39mor\u001b[39;00m \u001b[39mnot\u001b[39;00m is_list_like(key)\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/core/frame.py:3549\u001b[0m, in \u001b[0;36mDataFrame._getitem_bool_array\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3543\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[1;32m 3544\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mItem wrong length \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mlen\u001b[39m(key)\u001b[39m}\u001b[39;00m\u001b[39m instead of \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mlen\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mindex)\u001b[39m}\u001b[39;00m\u001b[39m.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 3545\u001b[0m )\n\u001b[1;32m 3547\u001b[0m \u001b[39m# check_bool_indexer will throw exception if Series key cannot\u001b[39;00m\n\u001b[1;32m 3548\u001b[0m \u001b[39m# be reindexed to match DataFrame rows\u001b[39;00m\n\u001b[0;32m-> 3549\u001b[0m key \u001b[39m=\u001b[39m check_bool_indexer(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mindex, key)\n\u001b[1;32m 3550\u001b[0m indexer \u001b[39m=\u001b[39m key\u001b[39m.\u001b[39mnonzero()[\u001b[39m0\u001b[39m]\n\u001b[1;32m 3551\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_take_with_is_copy(indexer, axis\u001b[39m=\u001b[39m\u001b[39m0\u001b[39m)\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/core/indexing.py:2376\u001b[0m, in \u001b[0;36mcheck_bool_indexer\u001b[0;34m(index, key)\u001b[0m\n\u001b[1;32m 2374\u001b[0m mask \u001b[39m=\u001b[39m isna(result\u001b[39m.\u001b[39m_values)\n\u001b[1;32m 2375\u001b[0m \u001b[39mif\u001b[39;00m mask\u001b[39m.\u001b[39many():\n\u001b[0;32m-> 2376\u001b[0m \u001b[39mraise\u001b[39;00m IndexingError(\n\u001b[1;32m 2377\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mUnalignable boolean Series provided as \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 2378\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mindexer (index of the boolean Series and of \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 2379\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mthe indexed object do not match).\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 2380\u001b[0m )\n\u001b[1;32m 2381\u001b[0m \u001b[39mreturn\u001b[39;00m result\u001b[39m.\u001b[39mastype(\u001b[39mbool\u001b[39m)\u001b[39m.\u001b[39m_values\n\u001b[1;32m 2382\u001b[0m \u001b[39mif\u001b[39;00m is_object_dtype(key):\n\u001b[1;32m 2383\u001b[0m \u001b[39m# key might be object-dtype bool, check_array_indexer needs bool array\u001b[39;00m\n", "\u001b[0;31mIndexingError\u001b[0m: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match)." ] } ], "source": [ "merge_df[merge_df[merge_df['close_status']==False]['create_date']<'2022-01-01']" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "t1=merge_df[merge_df['close_status']==False]" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "692" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(t1[t1['create_date']<'2022-01-01'])" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 752 entries, 0 to 1015\n", "Data columns (total 28 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 symbol 752 non-null object \n", " 1 name_x 494 non-null object \n", " 2 manager_nick_name_x 475 non-null object \n", " 3 unit_net_value 494 non-null float64 \n", " 4 end_date 494 non-null object \n", " 5 end_date_val 494 non-null float64 \n", " 6 profit_rate_x 494 non-null float64 \n", " 7 max_drawdown_rate 494 non-null float64 \n", " 8 annual_return_this_year_x 494 non-null float64 \n", " 9 annual_return_year 410 non-null float64 \n", " 10 show_profit_status 494 non-null float64 \n", " 11 fd_code 494 non-null object \n", " 12 has_select 494 non-null object \n", " 13 risk_rating 0 non-null object \n", " 14 is_open_day_tmp 0 non-null object \n", " 15 is_raise 0 non-null object \n", " 16 create_time 0 non-null object \n", " 17 sharp_rate 466 non-null float64 \n", " 18 half_a_year 494 non-null object \n", " 19 crawltime 494 non-null datetime64[ns]\n", " 20 name_y 752 non-null object \n", " 21 profit_rate_y 672 non-null float64 \n", " 22 annual_return_this_year_y 589 non-null float64 \n", " 23 manager_nick_name_y 310 non-null object \n", " 24 netvalue_date 752 non-null object \n", " 25 create_date 752 non-null object \n", " 26 close_status 752 non-null object \n", " 27 crwaltime 752 non-null datetime64[ns]\n", "dtypes: datetime64[ns](2), float64(10), object(16)\n", "memory usage: 170.4+ KB\n" ] } ], "source": [ "t1.info()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolname_xmanager_nick_name_xunit_net_valueend_dateend_date_valprofit_rate_xmax_drawdown_rateannual_return_this_year_xannual_return_year...half_a_yearcrawltimename_yprofit_rate_yannual_return_this_year_ymanager_nick_name_ynetvalue_datecreate_dateclose_statuscrwaltime
570P000145NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT私募工场(牛金)100.70NaNNone2019-11-292014-12-23False2022-08-18 16:49:57.213
627P000220NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT沐海基金66.39-19.98None2022-08-152016-01-07False2022-08-18 16:50:46.413
628P000223NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT朴信起航一号59.56NaNNone2021-09-102016-02-02False2022-08-18 16:50:48.161
631P000230NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT私募工场鼎杉1期12.84NaNNone2018-12-072014-08-28False2022-08-18 16:50:52.007
637P000236NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT私募工场兴富进取1期200.00NaN广东兴富投资2017-07-212014-07-11False2022-08-18 16:50:59.576
..................................................................
1011P001231NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT衍复雪瑞500指增1期NaNNaNNone2022-08-22False2022-08-18 17:05:06.779
1012P001233NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT稳博壬寅1000指数增强1-6号NaNNaN稳博投资2022-08-25False2022-08-18 17:05:07.763
1013P001248NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT展弘多策略21号NaNNaNNone2022-08-24False2022-08-18 17:05:18.894
1014P001255NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT广金美好玻色1期NaNNaNNone2022-08-22False2022-08-18 17:05:31.547
1015P001268NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT广金美好康德多策略1期NaNNaNNone2022-09-14False2022-08-18 17:05:42.691
\n", "

258 rows × 28 columns

\n", "
" ], "text/plain": [ " symbol name_x manager_nick_name_x unit_net_value end_date \\\n", "570 P000145 NaN NaN NaN NaN \n", "627 P000220 NaN NaN NaN NaN \n", "628 P000223 NaN NaN NaN NaN \n", "631 P000230 NaN NaN NaN NaN \n", "637 P000236 NaN NaN NaN NaN \n", "... ... ... ... ... ... \n", "1011 P001231 NaN NaN NaN NaN \n", "1012 P001233 NaN NaN NaN NaN \n", "1013 P001248 NaN NaN NaN NaN \n", "1014 P001255 NaN NaN NaN NaN \n", "1015 P001268 NaN NaN NaN NaN \n", "\n", " end_date_val profit_rate_x max_drawdown_rate \\\n", "570 NaN NaN NaN \n", "627 NaN NaN NaN \n", "628 NaN NaN NaN \n", "631 NaN NaN NaN \n", "637 NaN NaN NaN \n", "... ... ... ... \n", "1011 NaN NaN NaN \n", "1012 NaN NaN NaN \n", "1013 NaN NaN NaN \n", "1014 NaN NaN NaN \n", "1015 NaN NaN NaN \n", "\n", " annual_return_this_year_x annual_return_year ... half_a_year \\\n", "570 NaN NaN ... NaN \n", "627 NaN NaN ... NaN \n", "628 NaN NaN ... NaN \n", "631 NaN NaN ... NaN \n", "637 NaN NaN ... NaN \n", "... ... ... ... ... \n", "1011 NaN NaN ... NaN \n", "1012 NaN NaN ... NaN \n", "1013 NaN NaN ... NaN \n", "1014 NaN NaN ... NaN \n", "1015 NaN NaN ... NaN \n", "\n", " crawltime name_y profit_rate_y annual_return_this_year_y \\\n", "570 NaT 私募工场(牛金) 100.70 NaN \n", "627 NaT 沐海基金 66.39 -19.98 \n", "628 NaT 朴信起航一号 59.56 NaN \n", "631 NaT 私募工场鼎杉1期 12.84 NaN \n", "637 NaT 私募工场兴富进取1期 200.00 NaN \n", "... ... ... ... ... \n", "1011 NaT 衍复雪瑞500指增1期 NaN NaN \n", "1012 NaT 稳博壬寅1000指数增强1-6号 NaN NaN \n", "1013 NaT 展弘多策略21号 NaN NaN \n", "1014 NaT 广金美好玻色1期 NaN NaN \n", "1015 NaT 广金美好康德多策略1期 NaN NaN \n", "\n", " manager_nick_name_y netvalue_date create_date close_status \\\n", "570 None 2019-11-29 2014-12-23 False \n", "627 None 2022-08-15 2016-01-07 False \n", "628 None 2021-09-10 2016-02-02 False \n", "631 None 2018-12-07 2014-08-28 False \n", "637 广东兴富投资 2017-07-21 2014-07-11 False \n", "... ... ... ... ... \n", "1011 None 2022-08-22 False \n", "1012 稳博投资 2022-08-25 False \n", "1013 None 2022-08-24 False \n", "1014 None 2022-08-22 False \n", "1015 None 2022-09-14 False \n", "\n", " crwaltime \n", "570 2022-08-18 16:49:57.213 \n", "627 2022-08-18 16:50:46.413 \n", "628 2022-08-18 16:50:48.161 \n", "631 2022-08-18 16:50:52.007 \n", "637 2022-08-18 16:50:59.576 \n", "... ... \n", "1011 2022-08-18 17:05:06.779 \n", "1012 2022-08-18 17:05:07.763 \n", "1013 2022-08-18 17:05:18.894 \n", "1014 2022-08-18 17:05:31.547 \n", "1015 2022-08-18 17:05:42.691 \n", "\n", "[258 rows x 28 columns]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t1[t1['annual_return_this_year_x'].isnull()]" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolname_xmanager_nick_name_xunit_net_valueend_dateend_date_valprofit_rate_xmax_drawdown_rateannual_return_this_year_xannual_return_year...half_a_yearcrawltimename_yprofit_rate_yannual_return_this_year_ymanager_nick_name_ynetvalue_datecreate_dateclose_statuscrwaltime
570P000145NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT私募工场(牛金)100.70NaNNone2019-11-292014-12-23False2022-08-18 16:49:57.213
628P000223NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT朴信起航一号59.56NaNNone2021-09-102016-02-02False2022-08-18 16:50:48.161
631P000230NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT私募工场鼎杉1期12.84NaNNone2018-12-072014-08-28False2022-08-18 16:50:52.007
637P000236NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT私募工场兴富进取1期200.00NaN广东兴富投资2017-07-212014-07-11False2022-08-18 16:50:59.576
647P000267NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT私募工场麟悦1期39.46NaNNone2020-09-182016-03-28False2022-08-18 16:51:40.217
..................................................................
1011P001231NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT衍复雪瑞500指增1期NaNNaNNone2022-08-22False2022-08-18 17:05:06.779
1012P001233NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT稳博壬寅1000指数增强1-6号NaNNaN稳博投资2022-08-25False2022-08-18 17:05:07.763
1013P001248NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT展弘多策略21号NaNNaNNone2022-08-24False2022-08-18 17:05:18.894
1014P001255NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT广金美好玻色1期NaNNaNNone2022-08-22False2022-08-18 17:05:31.547
1015P001268NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaT广金美好康德多策略1期NaNNaNNone2022-09-14False2022-08-18 17:05:42.691
\n", "

159 rows × 28 columns

\n", "
" ], "text/plain": [ " symbol name_x manager_nick_name_x unit_net_value end_date \\\n", "570 P000145 NaN NaN NaN NaN \n", "628 P000223 NaN NaN NaN NaN \n", "631 P000230 NaN NaN NaN NaN \n", "637 P000236 NaN NaN NaN NaN \n", "647 P000267 NaN NaN NaN NaN \n", "... ... ... ... ... ... \n", "1011 P001231 NaN NaN NaN NaN \n", "1012 P001233 NaN NaN NaN NaN \n", "1013 P001248 NaN NaN NaN NaN \n", "1014 P001255 NaN NaN NaN NaN \n", "1015 P001268 NaN NaN NaN NaN \n", "\n", " end_date_val profit_rate_x max_drawdown_rate \\\n", "570 NaN NaN NaN \n", "628 NaN NaN NaN \n", "631 NaN NaN NaN \n", "637 NaN NaN NaN \n", "647 NaN NaN NaN \n", "... ... ... ... \n", "1011 NaN NaN NaN \n", "1012 NaN NaN NaN \n", "1013 NaN NaN NaN \n", "1014 NaN NaN NaN \n", "1015 NaN NaN NaN \n", "\n", " annual_return_this_year_x annual_return_year ... half_a_year \\\n", "570 NaN NaN ... NaN \n", "628 NaN NaN ... NaN \n", "631 NaN NaN ... NaN \n", "637 NaN NaN ... NaN \n", "647 NaN NaN ... NaN \n", "... ... ... ... ... \n", "1011 NaN NaN ... NaN \n", "1012 NaN NaN ... NaN \n", "1013 NaN NaN ... NaN \n", "1014 NaN NaN ... NaN \n", "1015 NaN NaN ... NaN \n", "\n", " crawltime name_y profit_rate_y annual_return_this_year_y \\\n", "570 NaT 私募工场(牛金) 100.70 NaN \n", "628 NaT 朴信起航一号 59.56 NaN \n", "631 NaT 私募工场鼎杉1期 12.84 NaN \n", "637 NaT 私募工场兴富进取1期 200.00 NaN \n", "647 NaT 私募工场麟悦1期 39.46 NaN \n", "... ... ... ... ... \n", "1011 NaT 衍复雪瑞500指增1期 NaN NaN \n", "1012 NaT 稳博壬寅1000指数增强1-6号 NaN NaN \n", "1013 NaT 展弘多策略21号 NaN NaN \n", "1014 NaT 广金美好玻色1期 NaN NaN \n", "1015 NaT 广金美好康德多策略1期 NaN NaN \n", "\n", " manager_nick_name_y netvalue_date create_date close_status \\\n", "570 None 2019-11-29 2014-12-23 False \n", "628 None 2021-09-10 2016-02-02 False \n", "631 None 2018-12-07 2014-08-28 False \n", "637 广东兴富投资 2017-07-21 2014-07-11 False \n", "647 None 2020-09-18 2016-03-28 False \n", "... ... ... ... ... \n", "1011 None 2022-08-22 False \n", "1012 稳博投资 2022-08-25 False \n", "1013 None 2022-08-24 False \n", "1014 None 2022-08-22 False \n", "1015 None 2022-09-14 False \n", "\n", " crwaltime \n", "570 2022-08-18 16:49:57.213 \n", "628 2022-08-18 16:50:48.161 \n", "631 2022-08-18 16:50:52.007 \n", "637 2022-08-18 16:50:59.576 \n", "647 2022-08-18 16:51:40.217 \n", "... ... \n", "1011 2022-08-18 17:05:06.779 \n", "1012 2022-08-18 17:05:07.763 \n", "1013 2022-08-18 17:05:18.894 \n", "1014 2022-08-18 17:05:31.547 \n", "1015 2022-08-18 17:05:42.691 \n", "\n", "[159 rows x 28 columns]" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t1[t1['netvalue_date']<'2022-01-01']" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "520" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(df)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
index_idprioritysymbolnamemanager_nick_nameunit_net_valueend_dateend_date_valprofit_rate...show_profit_statusfd_codehas_selectrisk_ratingis_open_day_tmpis_raisecreate_timesharp_ratehalf_a_yearcrawltime
1394116306346ae1b8ad401d34c7e1-1P001038珠池景元雪球相对价值珠池资产1.000808-1916608384000000.0009...0STL168FalseNoneNoneNoneNoneNaNTrue2022-08-24 22:23:29.646
1404126306346ae1b8ad401d34c7e2-1P001166SAP智龙雪球CTA深圳前海智龙资本1.000908-1916608384000000.0009...0SVJ630FalseNoneNoneNoneNoneNaNTrue2022-08-24 22:23:29.646
1414136306346ae1b8ad401d34c7e3-1P001172鸿道创新改革尊享6号鸿道投资1.000808-2216610976000000.0007...0SVK522FalseNoneNoneNoneNoneNaNTrue2022-08-24 22:23:29.646
1425116306346de1b8ad401d34c845-1P666005华宝证券华量安瑞1号FOF集合资产管理计划华宝资管总部1.239308-0216593696000000.2393...0E20112FalseNoneNoneNoneNone1.09False2022-08-24 22:23:41.368
1435156306346fe1b8ad401d34c849-1P001264素养鸣石量化18号鸣石投资1.173508-0516596288000000.5080...0SCX293FalseNoneNoneNoneNone1.24False2022-08-24 22:23:41.368
\n", "

5 rows × 23 columns

\n", "
" ], "text/plain": [ " index _id priority symbol \\\n", "139 411 6306346ae1b8ad401d34c7e1 -1 P001038 \n", "140 412 6306346ae1b8ad401d34c7e2 -1 P001166 \n", "141 413 6306346ae1b8ad401d34c7e3 -1 P001172 \n", "142 511 6306346de1b8ad401d34c845 -1 P666005 \n", "143 515 6306346fe1b8ad401d34c849 -1 P001264 \n", "\n", " name manager_nick_name unit_net_value end_date \\\n", "139 珠池景元雪球相对价值 珠池资产 1.0008 08-19 \n", "140 SAP智龙雪球CTA 深圳前海智龙资本 1.0009 08-19 \n", "141 鸿道创新改革尊享6号 鸿道投资 1.0008 08-22 \n", "142 华宝证券华量安瑞1号FOF集合资产管理计划 华宝资管总部 1.2393 08-02 \n", "143 素养鸣石量化18号 鸣石投资 1.1735 08-05 \n", "\n", " end_date_val profit_rate ... show_profit_status fd_code has_select \\\n", "139 1660838400000 0.0009 ... 0 STL168 False \n", "140 1660838400000 0.0009 ... 0 SVJ630 False \n", "141 1661097600000 0.0007 ... 0 SVK522 False \n", "142 1659369600000 0.2393 ... 0 E20112 False \n", "143 1659628800000 0.5080 ... 0 SCX293 False \n", "\n", " risk_rating is_open_day_tmp is_raise create_time sharp_rate half_a_year \\\n", "139 None None None None NaN True \n", "140 None None None None NaN True \n", "141 None None None None NaN True \n", "142 None None None None 1.09 False \n", "143 None None None None 1.24 False \n", "\n", " crawltime \n", "139 2022-08-24 22:23:29.646 \n", "140 2022-08-24 22:23:29.646 \n", "141 2022-08-24 22:23:29.646 \n", "142 2022-08-24 22:23:41.368 \n", "143 2022-08-24 22:23:41.368 \n", "\n", "[5 rows x 23 columns]" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['annual_return_this_year']>0].reset_index().tail()" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'df' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m/home/xda/github/stock/analysis/雪球私募收益率分析.ipynb Cell 45'\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[39mlen\u001b[39m(df)\n", "\u001b[0;31mNameError\u001b[0m: name 'df' is not defined" ] } ], "source": [ "len(df)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "df.to_excel('xueqiu_private_fund.xlsx')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "df['rank']=df['annual_return_this_year'].rank(ascending=False)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namerank
4希瓦小牛1号390.0
16希瓦小牛3号393.0
95希瓦大牛1号355.5
188希瓦辉耀1号385.0
251希瓦大牛2号384.0
269希瓦小牛雪球357.5
319希瓦小牛17号381.0
341希瓦小牛雪球2号386.0
471希瓦小牛15号367.0
483希瓦刀塔FOF1号335.0
497希瓦大牛7号343.0
499希瓦大牛5号330.0
501希瓦刀塔FOF2号326.0
504希瓦大牛3号329.0
507希瓦辉耀2号339.0
\n", "
" ], "text/plain": [ " name rank\n", "4 希瓦小牛1号 390.0\n", "16 希瓦小牛3号 393.0\n", "95 希瓦大牛1号 355.5\n", "188 希瓦辉耀1号 385.0\n", "251 希瓦大牛2号 384.0\n", "269 希瓦小牛雪球 357.5\n", "319 希瓦小牛17号 381.0\n", "341 希瓦小牛雪球2号 386.0\n", "471 希瓦小牛15号 367.0\n", "483 希瓦刀塔FOF1号 335.0\n", "497 希瓦大牛7号 343.0\n", "499 希瓦大牛5号 330.0\n", "501 希瓦刀塔FOF2号 326.0\n", "504 希瓦大牛3号 329.0\n", "507 希瓦辉耀2号 339.0" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['manager_nick_name']=='梁宏'][['name','rank']]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "414 145.0\n", "Name: rank, dtype: float64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['annual_return_this_year']==0]['rank']" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-6.254499999999999" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['annual_return_this_year'].mean()" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(df[df['manager_nick_name']=='梁宏'][['name','manager_nick_name','this_year_actual_return']])" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.20125" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['manager_nick_name']=='梁宏'][['name','manager_nick_name','this_year_actual_return']]['this_year_actual_return'].mean()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.3988125" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['manager_nick_name']=='梁宏']['max_drawdown_rate'].mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "906064a35c7980fda78a8b97014bc5560dca56efd2e047844bdf4fb8a9b9c8a3" }, "kernelspec": { "display_name": "Python 3.9.7 ('cpy')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: analysis/雪球赏金.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# 元卫南 赏金分析\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pymongo\n", "client = pymongo.MongoClient('10.18.6.46',27001)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "doc=client['xueqiu']['reward']" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "result =[]\n", "for i in doc.find({},{'_id':0}):\n", " result.append(i)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8968" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(result)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
amountbeen_rewardcreated_atdescriptionnameorigin_post_iduser_id
06.00元卫南2019-08-13 21:31:36None慕狼为友1310853141880162437
11.00元卫南2019-08-13 22:03:16价值兜底,趋势赚钱,分批买卖,组合选股。秦韬1310853149644764163
21.00元卫南2019-08-13 21:51:36比较懒,有钱就定期买入一些,现在主要买入一些指数基金Betula111310853143256958535
366.66元卫南2019-08-13 08:09:38Shero冉冉71310390854102521305
419.99元卫南2019-08-13 15:11:39失去的会以另外的方式永远存在babyluo1310390858941786191
\n", "
" ], "text/plain": [ " amount been_reward created_at description \\\n", "0 6.00 元卫南 2019-08-13 21:31:36 None \n", "1 1.00 元卫南 2019-08-13 22:03:16 价值兜底,趋势赚钱,分批买卖,组合选股。 \n", "2 1.00 元卫南 2019-08-13 21:51:36 比较懒,有钱就定期买入一些,现在主要买入一些指数基金 \n", "3 66.66 元卫南 2019-08-13 08:09:38 \n", "4 19.99 元卫南 2019-08-13 15:11:39 失去的会以另外的方式永远存在 \n", "\n", " name origin_post_id user_id \n", "0 慕狼为友 131085314 1880162437 \n", "1 秦韬 131085314 9644764163 \n", "2 Betula11 131085314 3256958535 \n", "3 Shero冉冉7 131039085 4102521305 \n", "4 babyluo 131039085 8941786191 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 8968 entries, 0 to 8967\n", "Data columns (total 7 columns):\n", "amount 8968 non-null float64\n", "been_reward 8968 non-null object\n", "created_at 8968 non-null object\n", "description 6536 non-null object\n", "name 8968 non-null object\n", "origin_post_id 8968 non-null int64\n", "user_id 8968 non-null int64\n", "dtypes: float64(1), int64(2), object(4)\n", "memory usage: 490.5+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "df['created_at']=pd.to_datetime(df['created_at'])" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 8968 entries, 0 to 8967\n", "Data columns (total 7 columns):\n", "amount 8968 non-null float64\n", "been_reward 8968 non-null object\n", "created_at 8968 non-null datetime64[ns]\n", "description 6536 non-null object\n", "name 8968 non-null object\n", "origin_post_id 8968 non-null int64\n", "user_id 8968 non-null int64\n", "dtypes: datetime64[ns](1), float64(1), int64(2), object(3)\n", "memory usage: 490.5+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "df=df.set_index('created_at',drop=True)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
amountbeen_rewarddescriptionnameorigin_post_iduser_id
created_at
2019-08-13 21:31:366.00元卫南None慕狼为友1310853141880162437
2019-08-13 22:03:161.00元卫南价值兜底,趋势赚钱,分批买卖,组合选股。秦韬1310853149644764163
2019-08-13 21:51:361.00元卫南比较懒,有钱就定期买入一些,现在主要买入一些指数基金Betula111310853143256958535
2019-08-13 08:09:3866.66元卫南Shero冉冉71310390854102521305
2019-08-13 15:11:3919.99元卫南失去的会以另外的方式永远存在babyluo1310390858941786191
\n", "
" ], "text/plain": [ " amount been_reward description name \\\n", "created_at \n", "2019-08-13 21:31:36 6.00 元卫南 None 慕狼为友 \n", "2019-08-13 22:03:16 1.00 元卫南 价值兜底,趋势赚钱,分批买卖,组合选股。 秦韬 \n", "2019-08-13 21:51:36 1.00 元卫南 比较懒,有钱就定期买入一些,现在主要买入一些指数基金 Betula11 \n", "2019-08-13 08:09:38 66.66 元卫南 Shero冉冉7 \n", "2019-08-13 15:11:39 19.99 元卫南 失去的会以另外的方式永远存在 babyluo \n", "\n", " origin_post_id user_id \n", "created_at \n", "2019-08-13 21:31:36 131085314 1880162437 \n", "2019-08-13 22:03:16 131085314 9644764163 \n", "2019-08-13 21:51:36 131085314 3256958535 \n", "2019-08-13 08:09:38 131039085 4102521305 \n", "2019-08-13 15:11:39 131039085 8941786191 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "31851.6" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['2019']['amount'].sum()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['2018']['amount'].sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: backtest/backtrader-course-lession1.py ================================================ from __future__ import (absolute_import, division, print_function, unicode_literals) import backtrader as bt import os import sys import datetime # Create a Stratey class TestStrategy(bt.Strategy): def log(self, txt, dt=None): ''' Logging function for this strategy''' dt = dt or self.datas[0].datetime.date(0) print('日志 : %s, %s' % (dt.isoformat(), txt)) def __init__(self): # Keep a reference to the "close" line in the data[0] dataseries #这个名字可以随意该 print('datas',self.datas) self.dataclose_change = self.datas[0].close print('init',self.datas[0]) self.order = None def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: # Buy/Sell order submitted/accepted to/by broker - Nothing to do return # Check if an order has been completed # Attention: broker could reject order if not enough cash if order.status in [order.Completed]: if order.isbuy(): self.log('BUY EXECUTED, %.2f' % order.executed.price) elif order.issell(): self.log('SELL EXECUTED, %.2f' % order.executed.price) self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') # Write down: no pending order self.order = None def log(self,txt,dt=None): dt = dt or self.datas[0].datetime.date(0) print('-1', self.datas[0].datetime.date(-1)) # 上一天 # print('1', self.datas[-2].datetime.date(0)) print(' 0',dt) print('dataclose_change ',self.dataclose_change[0]) def next(self): # Simply log the closing price of the series from the reference # self.log('收盘价, %.2f' % self.dataclose_change[0]) # if self.dataclose_change[0]>self.dataclose_change[-1]: # self.log('当天收盘价, %.2f , 昨天收盘价 %.2f' % (self.dataclose_change[0],self.dataclose_change[-1])) # self.log('买入价%.2f' % self.dataclose_change[0]) # self.buy() if self.order: return # Check if we are in the market if not self.position: # Not yet ... we MIGHT BUY if ... if self.dataclose_change[0] < self.dataclose_change[-1]: # current close less than previous close if self.dataclose_change[-1] < self.dataclose_change[-2]: # previous close less than the previous close # BUY, BUY, BUY!!! (with default parameters) self.log('BUY CREATE, %.2f' % self.dataclose_change[0]) # Keep track of the created order to avoid a 2nd order self.order = self.buy() else: # Already in the market ... we might sell if len(self) >= (self.bar_executed + 5): # SELL, SELL, SELL!!! (with all possible default parameters) self.log('SELL CREATE, %.2f' % self.dataclose_change[0]) # Keep track of the created order to avoid a 2nd order self.order = self.sell() def main(): cerebro = bt.Cerebro() cerebro.addstrategy(TestStrategy) modpath = os.path.dirname(os.path.abspath(sys.argv[0])) datapath = os.path.join(modpath, '/home/xda/othergit/backtrader/datas/nvda-1999-2014.txt') print(modpath) data = bt.feeds.YahooFinanceCSVData( dataname=datapath, # Do not pass values before this date fromdate=datetime.datetime(2014, 1, 2), # Do not pass values after this date todate=datetime.datetime(2014, 9, 1), reverse=False) # Add the Data Feed to Cerebro cerebro.adddata(data) cerebro.broker.setcash(100000.0) cerebro.broker.setcommission(commission=0.001) print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) cerebro.run() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) if __name__ == '__main__': main() ================================================ FILE: backtest/dataframe-feed.py ================================================ from __future__ import (absolute_import, division, print_function, unicode_literals) import argparse import backtrader as bt import backtrader.feeds as btfeeds from datapath import ROOT import pandas import datetime def convert_time(x): return datetime.datetime.fromtimestamp(int(x/1000)) def runstrat(): args = parse_args() # Create a cerebro entity cerebro = bt.Cerebro(stdstats=False) # Add a strategy cerebro.addstrategy(bt.Strategy) # Get a pandas dataframe # datapath = (ROOT + '2006-day-001.txt') ROOT = '/home/xda/github/stock_strategy/backtrader-code/' datapath = (ROOT + 'BNBUSDT.csv') # Simulate the header row isn't there if noheaders requested skiprows = 1 if args.noheaders else 0 header = None if args.noheaders else 0 dataframe = pandas.read_csv(datapath, skiprows=skiprows, header=header, ) dataframe['open_time']=dataframe['open_time'].map(convert_time) dataframe=dataframe.set_index('open_time',drop=True) if not args.noprint: print('--------------------------------------------------') print(dataframe) print('--------------------------------------------------') # Pass it to the backtrader datafeed and add it to the cerebro data = bt.feeds.PandasData(dataname=dataframe) cerebro.adddata(data) # Run over everything cerebro.run() # Plot the result cerebro.plot(style='bar') def parse_args(): parser = argparse.ArgumentParser( description='Pandas test script') parser.add_argument('--noheaders', action='store_true', default=False, required=False, help='Do not use header rows') parser.add_argument('--noprint', action='store_true', default=False, help='Print the dataframe') return parser.parse_args() if __name__ == '__main__': runstrat() ================================================ FILE: backtest/datapath.py ================================================ ROOT = '/home/xda/othergit/backtrader/datas/' ================================================ FILE: backtest/examle1/sma-demo.py ================================================ # -*- coding:utf-8 -*- import backtrader as bt import datetime class TestStrategy(bt.Strategy): """ 继承并构建自己的bt策略 """ def log(self, txt, dt=None, doprint=False): ''' 日志函数,用于统一输出日志格式 ''' if doprint: dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): # 初始化相关数据 print("数据源长度 ",len(self.datas)) self.dataclose = self.datas[0].close print(len(self.dataclose)) print(type(self.dataclose)) print(self.dataclose[0]) self.order = None self.buyprice = None self.buycomm = None # 五日移动平均线 self.sma5 = bt.indicators.SimpleMovingAverage( self.datas[0], period=5) # 十日移动平均线 self.sma10 = bt.indicators.SimpleMovingAverage( self.datas[0], period=10) def notify_order(self, order): """ 订单状态处理 Arguments: order {object} -- 订单状态 """ if order.status in [order.Submitted, order.Accepted]: # 如订单已被处理,则不用做任何事情 return # 检查订单是否完成 if order.status in [order.Completed]: if order.isbuy(): self.buyprice = order.executed.price self.buycomm = order.executed.comm self.bar_executed = len(self) # 订单因为缺少资金之类的原因被拒绝执行 elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') # 订单状态处理完成,设为空 self.order = None def notify_trade(self, trade): """ 交易成果 Arguments: trade {object} -- 交易状态 """ if not trade.isclosed: return # 显示交易的毛利率和净利润 self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' % (trade.pnl, trade.pnlcomm), doprint=True) def next(self): ''' 下一次执行 ''' # 记录收盘价 self.log('Close, %.2f' % self.dataclose[0]) # 是否正在下单,如果是的话不能提交第二次订单 if self.order: return # 是否已经买入 if not self.position: # 还没买,如果 MA5 > MA10 说明涨势,买入 if self.sma5[0] > self.sma10[0]: self.order = self.buy() else: # 已经买了,如果 MA5 < MA10 ,说明跌势,卖出 if self.sma5[0] < self.sma10[0]: self.order = self.sell() def stop(self): self.log(u'(回测结束) Ending Value %.2f' % (self.broker.getvalue()), doprint=True) if __name__ == '__main__': # 初始化模型 cerebro = bt.Cerebro() # 构建策略 strats = cerebro.addstrategy(TestStrategy) # 每次买100股 cerebro.addsizer(bt.sizers.FixedSize, stake=100) # 加载数据到模型中 data = bt.feeds.GenericCSVData( dataname='600519.csv', fromdate=datetime.datetime(2010, 1, 1), todate=datetime.datetime(2020, 4, 12), dtformat='%Y%m%d', datetime=2, open=3, high=4, low=5, close=6, volume=10 ) cerebro.adddata(data) # 设定初始资金和佣金 cerebro.broker.setcash(1000000.0) cerebro.broker.setcommission(0.005) # 策略执行前的资金 print('启动资金: %.2f' % cerebro.broker.getvalue()) # 策略执行 cerebro.run() ================================================ FILE: backtest/ma_line_backtest.py ================================================ import backtrader as bt import pandas as pd import datetime as dt class MyStrategy(bt.Strategy): def __init__(self): self.dataclose = self.datas[0].close self.sma_period = self.params.sma_period self.sma = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.sma_period) def next(self): if not self.position: if self.dataclose[0] > self.sma[0] and self.dataclose[-1] <= self.sma[-1]: self.buy() else: if self.dataclose[0] < self.sma[0] and self.dataclose[-1] >= self.sma[-1]: self.sell() if __name__ == '__main__': cerebro = bt.Cerebro() from datapath import ROOT datapath = ROOT+ 'orcl-1995-2014.txt' # 可以公众号:可转债量化分析 后台留言 backtrade数据 获取 dataframe = pd.read_csv(datapath) dataframe['Date'] = pd.to_datetime(dataframe['Date']) dataframe.set_index('Date', inplace=True) data = bt.feeds.PandasData(dataname=dataframe) cerebro.adddata(data) strategy = MyStrategy() cerebro.addstrategy(strategy ) # 设置10日均线周期 cerebro.broker.setcash(100000.0) cerebro.broker.setcommission(commission=0.002) cerebro.run() cerebro.plot(style='candle') ================================================ FILE: common/Base.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/4/2 20:02 # @File : Base.py # @Author : Rocky C@www.30daydo.com import xcsc_tushare as xc import sys sys.path.append('..') from configure.settings import config xc_token_pro=config.get('xc_token_pro') xc.set_token(xc_token_pro) simulation_server = config.get('xc_server') pro =xc.pro_api(env='prd',server=simulation_server) __all__=('pro',) ================================================ FILE: common/BaseService.py ================================================ # -*-coding=utf-8-*- import datetime import json import os import re import time import requests import parsel from loguru import logger from configure.util import send_message_via_wechat class BaseService(object): def __init__(self, logfile='default.log'): self.logger = logger self.logger.add(logfile) self.init_const_data() self.params = None self.cookies = None def init_const_data(self): ''' 常见的数据初始化 ''' self.today = datetime.datetime.now().strftime('%Y-%m-%d') def check_path(self, path): if not os.path.exists(path): try: os.makedirs(path) except Exception as e: self.logger.error(e) def get_url_filename(self, url): return url.split('/')[-1] def save_iamge(self, content, path): with open(path, 'wb') as fp: fp.write(content) def get(self, url, _json=False, binary=False, retry=5): start = 0 while start < retry: try: r = requests.get( url=url, params=self.params, headers=self.headers, cookies=self.cookies) except Exception as e: self.logger.error('base class error '.format(e)) start += 1 continue else: if _json: result = r.json() elif binary: result = r.content else: r.encoding='utf8' result = r.text return result return None def post(self, url, post_data, _json=False, binary=False, retry=5): start = 0 while start < retry: try: r = requests.post( url=url, headers=self.headers, data=post_data ) except Exception as e: print(e) start += 1 continue else: if _json: result = r.json() elif binary: result = r.content else: result = r.text return result return None @property def headers(self): raise NotImplemented def parse(self, content): ''' 页面解析 ''' response = parsel.Selector(text=content) return response def process(self, data, history=False): ''' 数据存储 ''' pass def time_str(self, x): return x.strftime('%Y-%m-%d') def trading_time(self): ''' 判定时候交易时间 0 为交易时间, 1和-1为非交易时间 :return: ''' TRADING = 0 MORNING_STOP = -1 AFTERNOON_STOP = 1 NOON_STOP = -1 current = datetime.datetime.now() year, month, day = current.year, current.month, current.day start = datetime.datetime(year, month, day, 9, 23, 0) noon_start = datetime.datetime(year, month, day, 12, 58, 0) morning_end = datetime.datetime(year, month, day, 11, 31, 0) end = datetime.datetime(year, month, day, 15, 2, 5) if current > start and current < morning_end: return TRADING elif current > noon_start and current < end: return TRADING elif current > end: return AFTERNOON_STOP elif current < start: return MORNING_STOP else: return NOON_STOP def notify(self, title): send_message_via_wechat(title) def weekday(self, day=datetime.datetime.now().strftime('%Y-%m-%d')): '''判断星期几''' if re.search('\d{4}-\d{2}-\d{2}', day): fmt = '%Y-%m-%d' elif re.search('\d{8}', day): fmt = '%Y%m%d' else: raise ValueError('请输入正确的日期格式') current_date = datetime.datetime.strptime(day, fmt) year_2000th = datetime.datetime(year=2000, month=1, day=2) day_diff = current_date - year_2000th return day_diff.days % 7 def is_weekday(self, day=datetime.datetime.now().strftime('%Y-%m-%d')): if self.weekday(day) in [0, 6]: return False else: return True def execute(self, cmd, data, conn, logger=None): cursor = conn.cursor() if not isinstance(data, tuple): data = (data,) try: cursor.execute(cmd, data) except Exception as e: conn.rollback() logger.error('执行数据库错误 {},{}'.format(e, cmd)) ret = None else: ret = cursor.fetchall() conn.commit() return ret def jsonp2json(self, str_): return json.loads(str_[str_.find('{'):str_.rfind('}') + 1]) def set_proxy_param(self, proxy): self.proxy_ip = proxy def get_proxy(self, retry=10): if not hasattr(self, 'proxy_ip'): raise AttributeError('Please set proxy ip before use it') proxyurl = f'http://{self.proxy_ip}/dynamicIp/common/getDynamicIp.do' count = 0 for i in range(retry): try: r = requests.get(proxyurl, timeout=10) except Exception as e: print(e) count += 1 print('代理获取失败,重试' + str(count)) time.sleep(1) else: js = r.json() proxyServer = '://{0}:{1}'.format(js.get('ip'), js.get('port')) proxies_random = { 'http': 'http' + proxyServer, 'https': 'https' + proxyServer, } return proxies_random return None def convert_timestamp(self, t): return datetime.datetime.fromtimestamp(int(t / 1000)).strftime('%Y-%m-%d') class HistorySet(object): def __init__(self, expire=1800): self.data = {} self.expire = expire def add(self, value): now = datetime.datetime.now() expire = now + datetime.timedelta(seconds=self.expire) try: hash(value) except: raise ValueError('value not hashble') else: self.data.update({value: expire}) def is_expire(self, value): # 没有过期 返回 True if value not in self.data or self.data[value] < datetime.datetime.now(): return True else: return False if __name__ == '__main__': base = BaseService() base.is_weekday() # base.set_proxy_param() print(base.get_proxy()) ================================================ FILE: common/SecurityBase.py ================================================ # -*- coding: utf-8 -*- # @Time : 2020/11/26 15:14 # @File : SecurityBase.py # @Author : Rocky C@www.30daydo.com import re class StockBase: def __init__(self): pass def valid_code(self,code): pattern = re.search('(\d{6})', code) if pattern: code = pattern.group(1) else: code = None return code ================================================ FILE: common/TushareUtil.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/4/2 18:08 # @File : TushareUtil.py # @Author : Rocky C@www.30daydo.com import tushare as ts import sys sys.path.append('..') from configure.settings import config from datetime import datetime import time class TushareBaseUtil: ''' tushare 常用调用 ''' def __init__(self): ts_token = config.get('ts_token') ts.set_token(ts_token) self.pro = ts.pro_api() self.cache = {} def get_trade_date(self, start_date=None, end_date=datetime.now().strftime('%Y%m%d')): ''' 返回交易日历 :param start_date: :param end_date: :return: ''' # if self.cache if 'cal_date' not in self.cache: df = self.pro.trade_cal(exchange='', is_open='1', start_date=start_date, end_date=end_date) self.cache['cal_date'] = df['cal_date'].tolist() return self.cache['cal_date'] def date_convertor(self, s): return datetime.strptime(s, '%Y%m%d').strftime('%Y-%m-%d') def get_last_trade_date(self): return self.get_trade_date()[-2] def get_last_week_trade_date(self): return self.get_trade_date()[-5] def clear_cache(self): self.cache = {} def main(): # today =datetime.now().strftime('%Y%m%d') app = TushareBaseUtil() df = app.get_trade_date() df = app.get_trade_date() df = app.get_trade_date() df = app.get_trade_date() d = app.get_last_trade_date() print(d) if __name__ == '__main__': start = time.time() main() print(f'time used {time.time() - start}') ================================================ FILE: common/__init__.py ================================================ # -*- coding: utf-8 -*- # @Time : 2020/11/16 11:39 # @File : __init__.py # @Author : Rocky C@www.30daydo.com ================================================ FILE: common/aes.py ================================================ import sys import base64 from Crypto.Cipher import AES from Crypto import Random import os import base64 import json from binascii import b2a_hex, a2b_hex class AESDecrypt: def set_key(self,key): # key = '' self.key = self.add_to_16(key) def add_to_16(self, text): while len(text) % 16 != 0: text += '\0' return text.encode('utf8') def decode_base64(self, data): missing_padding = 4-len(data) % 4 if missing_padding: data += '='*missing_padding return (data.encode('utf8')) def decrypt(self, encrypt_data): encrypt_data = self.decode_base64(encrypt_data) cipher = AES.new(self.key, mode=AES.MODE_ECB) result2 = base64.b64decode(encrypt_data) a = cipher.decrypt(result2) a = a.decode('utf-8', 'ignore') a = a.rstrip('\n') a = a.rstrip('\t') a = a.rstrip('\r') a = a.replace('\x06', '') a = a.replace('\x03', '') a = a.replace('\03', '') return a ================================================ FILE: common/pdf_convertor.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/3/19 1:01 # @File : pdf_convertor.py # @Author : Rocky C@www.30daydo.com import pdfplumber path=r'D:\Photo\s素材\da83e97d-29aa-49ea-9783-e25abe402012.pdf' def pdf_convert_txt(filename): with pdfplumber.open(filename) as pdf: content = '' #len(pdf.pages)为PDF文档页数 for i in range(len(pdf.pages)): #pdf.pages[i] 是读取PDF文档第i+1页 page = pdf.pages[i] #page.extract_text()函数即读取文本内容,下面这步是去掉文档最下面的页码 page_content = '\n'.join(page.extract_text().split('\n')[:-1]) content = content + page_content print(content) return content ================================================ FILE: daily/fupan.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('../')\n", "from setting import get_engine\n", "import pandas as pd\n", "import datetime" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "engine = get_engine('db_stock')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
证券代码证券名称保本价股票余额盈亏比例盈亏市值现价2018-04-122018-04-132018-04-162018-04-172018-04-182018-04-192018-04-202018-04-232018-04-242018-04-252018-04-26
0600846同济科技10.055600-11.29-681.05352.08.92-114.024.0-84.0-144.0144.0132.090.024.060.0210.0-282.0
1000693*ST华泽14.443600-75.91-6577.82088.03.48-186.0-174.0-168.0-156.0-150.0-144.0-132.0-126.0-120.0-114.0-108.0
2300102乾照光电10.526300-20.20-637.82520.08.4012.042.0-15.0-78.0144.06.030.0-33.069.0-33.0-48.0
3000572海马汽车5.155900-27.06-1255.53384.03.7663.0-198.0378.0-306.0-117.0-27.0-180.0-72.063.018.0-126.0
4002165红 宝 丽9.490500-52.58-2495.02250.04.50-30.05.0-10.0-60.00.0-15.0-80.0-45.035.0-5.0-65.0
5300625三雄极光48.950100-51.26-2509.02386.023.86-41.043.0-67.0-87.098.0-10.0-58.013.0108.0-1.0-47.0
6601212白银有色17.427200-68.50-2387.41098.05.4920.0-46.04.0-52.0-26.020.0-52.0-34.016.00.0-40.0
7300141和顺电气19.967300-53.27-3191.12799.09.336.0174.0-87.0-192.069.0-33.0-66.0-9.087.03.0-129.0
8002316键桥通讯45.642300-77.89-10665.63027.010.09-51.0-21.06.0-84.021.03.057.0-72.075.057.0-60.0
9300580贝斯特32.568200-46.11-3003.63510.017.55-82.0-52.0-76.0-154.0102.0-2.0-214.0-70.0114.024.0-144.0
\n", "
" ], "text/plain": [ " 证券代码 证券名称 保本价 股票余额 盈亏比例 盈亏 市值 现价 2018-04-12 \\\n", "0 600846 同济科技 10.055 600 -11.29 -681.0 5352.0 8.92 -114.0 \n", "1 000693 *ST华泽 14.443 600 -75.91 -6577.8 2088.0 3.48 -186.0 \n", "2 300102 乾照光电 10.526 300 -20.20 -637.8 2520.0 8.40 12.0 \n", "3 000572 海马汽车 5.155 900 -27.06 -1255.5 3384.0 3.76 63.0 \n", "4 002165 红 宝 丽 9.490 500 -52.58 -2495.0 2250.0 4.50 -30.0 \n", "5 300625 三雄极光 48.950 100 -51.26 -2509.0 2386.0 23.86 -41.0 \n", "6 601212 白银有色 17.427 200 -68.50 -2387.4 1098.0 5.49 20.0 \n", "7 300141 和顺电气 19.967 300 -53.27 -3191.1 2799.0 9.33 6.0 \n", "8 002316 键桥通讯 45.642 300 -77.89 -10665.6 3027.0 10.09 -51.0 \n", "9 300580 贝斯特 32.568 200 -46.11 -3003.6 3510.0 17.55 -82.0 \n", "\n", " 2018-04-13 2018-04-16 2018-04-17 2018-04-18 2018-04-19 2018-04-20 \\\n", "0 24.0 -84.0 -144.0 144.0 132.0 90.0 \n", "1 -174.0 -168.0 -156.0 -150.0 -144.0 -132.0 \n", "2 42.0 -15.0 -78.0 144.0 6.0 30.0 \n", "3 -198.0 378.0 -306.0 -117.0 -27.0 -180.0 \n", "4 5.0 -10.0 -60.0 0.0 -15.0 -80.0 \n", "5 43.0 -67.0 -87.0 98.0 -10.0 -58.0 \n", "6 -46.0 4.0 -52.0 -26.0 20.0 -52.0 \n", "7 174.0 -87.0 -192.0 69.0 -33.0 -66.0 \n", "8 -21.0 6.0 -84.0 21.0 3.0 57.0 \n", "9 -52.0 -76.0 -154.0 102.0 -2.0 -214.0 \n", "\n", " 2018-04-23 2018-04-24 2018-04-25 2018-04-26 \n", "0 24.0 60.0 210.0 -282.0 \n", "1 -126.0 -120.0 -114.0 -108.0 \n", "2 -33.0 69.0 -33.0 -48.0 \n", "3 -72.0 63.0 18.0 -126.0 \n", "4 -45.0 35.0 -5.0 -65.0 \n", "5 13.0 108.0 -1.0 -47.0 \n", "6 -34.0 16.0 0.0 -40.0 \n", "7 -9.0 87.0 3.0 -129.0 \n", "8 -72.0 75.0 57.0 -60.0 \n", "9 -70.0 114.0 24.0 -144.0 " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_sql('tb_profit',engine)\n", "df" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "today=datetime.datetime.now().strftime('%Y-%m-%d')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "ename": "KeyError", "evalue": "'2018-04-27'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtoday\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32mc:\\python27\\lib\\site-packages\\pandas\\core\\frame.pyc\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 2137\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2138\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2139\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2140\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2141\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mc:\\python27\\lib\\site-packages\\pandas\\core\\frame.pyc\u001b[0m in \u001b[0;36m_getitem_column\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 2144\u001b[0m \u001b[1;31m# get column\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2145\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_unique\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2146\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_item_cache\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2147\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2148\u001b[0m \u001b[1;31m# duplicate columns & possible reduce dimensionality\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mc:\\python27\\lib\\site-packages\\pandas\\core\\generic.pyc\u001b[0m in \u001b[0;36m_get_item_cache\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 1840\u001b[0m \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1841\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mres\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1842\u001b[1;33m \u001b[0mvalues\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1843\u001b[0m \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_box_item_values\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1844\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mres\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mc:\\python27\\lib\\site-packages\\pandas\\core\\internals.pyc\u001b[0m in \u001b[0;36mget\u001b[1;34m(self, item, fastpath)\u001b[0m\n\u001b[0;32m 3841\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3842\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0misna\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3843\u001b[1;33m \u001b[0mloc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3844\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3845\u001b[0m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0misna\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mc:\\python27\\lib\\site-packages\\pandas\\core\\indexes\\base.pyc\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m 2525\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2526\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2527\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_maybe_cast_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2528\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2529\u001b[0m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n", "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n", "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n", "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n", "\u001b[1;31mKeyError\u001b[0m: '2018-04-27'" ] } ], "source": [ "df[today]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1049.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['2018-04-26'].sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: datahub/A_stock_daily_info.py ================================================ # -*- coding: utf-8 -*- # @Time : 2022/12/29 16:29 # @File : A_stock_daily_info.py # @Author : Rocky C@www.30daydo.com # A 股日线行情导入数据库 import sys sys.path.append('..') from configure.settings import get_tushare_pro,DBSelector from configure.util import calendar import time class AStockDailyInfo(): def __init__(self): self.pro = get_tushare_pro() self.conn = DBSelector().get_engine('db_stock_daily','t') def run(self): date = calendar('2022-01-01','2022-12-28') for d in date: print(d) df = self.pro.daily(trade_date=d) df.to_sql('tb_{}'.format(d),con=self.conn) time.sleep(1) def main(): app=AStockDailyInfo() app.run() if __name__ == '__main__': main() ================================================ FILE: datahub/SPSIOP_PRICE.py ================================================ # -*-coding=utf-8-*- # @Time : 2019/10/20 23:14 # @File : SPSIOP_PRICE.py # 获取SPSIOP的价格,每天早上美股收盘 # 先获取xop的前一天的涨幅,然后在前一天华宝油气的基础上相加 import sys sys.path.append('..') import datetime import requests from common.BaseService import BaseService from configure.util import send_from_aliyun_ssl from configure.settings import DBSelector DB = DBSelector() client = DB.mongo(location_type='qq',async_type=False) doc = client['db_stock']['SPSIOP'] # 先访问一下雪球首页得到cookies home_headers = {'User-Agent': 'Xueqiu App'} headers = {'User-Agent': 'Xueqiu App', 'Access-Control-Allow-Origin': 'https://xueqiu.com', 'Content-Type': 'application/json;charset=UTF-8', 'P3P': 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'} xueqiu_url = 'https://stock.xueqiu.com/v5/stock/quote.json?symbol=.SPSIOP&extend=detail' home_page = 'https://xueqiu.com' today = datetime.datetime.now().strftime('%Y-%m-%d') class SPSIOP(BaseService): def __init__(self): super(SPSIOP, self).__init__('../log/huabaoyouqi.log') def predict_price(self): session = requests.Session() session.get(url=home_page, headers=home_headers) r = session.get(url=xueqiu_url, headers=headers) js_data = r.json() quote = js_data.get('data', {}).get('quote') quote['crawltime'] = datetime.datetime.now() doc.insert_one(quote) percent = quote.get('percent') jsl_qdii,est_val_dt = self.qdii_info() if jsl_qdii: predict_v = round((1 + percent * 0.95 * 0.01) * jsl_qdii, 3) self.logger.info(f'最新估值{predict_v}') d = {'日期': today, '估值': predict_v} client['db_stock']['huabaoyouqi_predict'].insert_one(d) title = f'华宝估值{predict_v} 净值日期{est_val_dt[5:]}' send_from_aliyun_ssl(title, '') else: self.notify(title='华宝油气获取估值失败') def qdii_info(self): url = 'https://www.jisilu.cn/data/qdii/qdii_list/?rp=25&page=1' r = requests.get(url=url, headers=home_headers) js_data = r.json() rows = js_data.get('rows', []) new_rows = [] for row in rows: new_rows.append(row.get('cell')) doc_ = client['DB_QDII'][today] try: doc_.insert_many(new_rows) except Exception as e: self.logger.error(e) next_url = 'https://www.jisilu.cn/data/qdii/qdii_list/C?___jsl=LST___t=1604513012662&rp=22' r = requests.get(url=next_url, headers=home_headers) js_data = r.json() rows = js_data.get('rows', []) for row in rows: if row.get('cell', {}).get('fund_nm') == '华宝油气': nav = row.get('cell', {}).get('fund_nav') est_val_dt = row.get('cell', {}).get('est_val_dt') try: nav = float(nav) # 网站给的是字符 except: return None else: return nav,est_val_dt def main(): spider = SPSIOP() spider.predict_price() if __name__ == '__main__': main() ================================================ FILE: datahub/__init__.py ================================================ # -*- coding: utf-8 -*- # @Time : 2020/11/21 0:02 # @File : __init__.py.py # @Author : Rocky C@www.30daydo.com ================================================ FILE: datahub/basic_market_info.py ================================================ __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import datetime import time import tushare as ts import sys sys.path.append('..') from configure.settings import DBSelector,config_dict from common.BaseService import BaseService # 获取市场全貌 class BasicMarket(BaseService): def __init__(self): super(BasicMarket, self).__init__(f'../log/{self.__class__.__name__}.log') work_space=config_dict('data_path') ts_token=config_dict('ts_token') self.check_path(work_space) ts.set_token(ts_token) self.pro = ts.pro_api() def get_basic_info(self, retry=5): ''' 保存全市场数据 :param retry: :return: ''' # 需要添加异常处理 重试次数 count = 0 df = None while count < retry: try: df = self.pro.stock_basic(exchange='', list_status='', fields='') except Exception as e: self.logger.info(e) time.sleep(10) count+=1 continue else: break if count==retry: self.notify(title=f'{self.__class__.__name__}获取股市市场全景数据失败') exit(0) if df is not None: df = df.reset_index(drop=True) df.rename(columns={'symbol':'code'},inplace=True) df['更新日期'] = datetime.datetime.now() engine = DBSelector().get_engine('db_stock','qq') try: df.to_sql('tb_basic_info', engine, if_exists='replace') except Exception as e: self.logger.error(e) self.notify(title=f'{self.__class__}mysql入库出错') return df def main(): obj=BasicMarket() obj.get_basic_info() if __name__=='__main__': main() ================================================ FILE: datahub/black_list_sql.py ================================================ # -*-coding=utf-8-*- # 股市黑名单 import sys sys.path.append('..') from configure.settings import DBSelector, config import os import codecs from loguru import logger logger = logger.add('log/blacklist.log') DATA_PATH = config.get('data_path') def create_tb(conn): cmd = '''CREATE TABLE IF NOT EXISTS `tb_blacklist` (DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,CODE VARCHAR(6) PRIMARY KEY,NAME VARCHAR(60),REASON TEXT);''' cur = conn.cursor() try: cur.execute(cmd) except Exception as e: logger.info(e) conn.rollback() else: conn.commit() def update_data(filename, conn): cur = conn.cursor() with codecs.open(filename, 'r', encoding='utf8') as f: content = f.readlines() if not content: return for line in content: (code, name, reason) = line.strip().split(';') cmd = '''INSERT INTO `tb_blacklist` (CODE,NAME,REASON) VALUES (\"%s\",\"%s\",\"%s\")''' % (code, name, reason) try: cur.execute(cmd) except Exception as e: logger.info(e) logger.info('dup code {}'.format(code)) conn.rollback() continue else: conn.commit() logger.info('insert successfully {}'.format(name)) # 调试 def get_name_number(): filename = os.path.join(DATA_PATH, 'blacklist.csv') with codecs.open(filename, 'r', encoding='utf8') as f: content = f.readlines() if not content: return logger.info('len of content {}'.format(len(content))) code_list = [] for i in content: code_list.append(i.split(';')[0]) logger.info(code_list) logger.info(len(set(code_list))) # 找出重复 seen = set() dup_list = [] for i in code_list: if i in seen: dup_list.append(i) else: seen.add(i) logger.info('dup item {}'.format(dup_list)) def main(): filename = os.path.join(DATA_PATH, 'blacklist.csv') # 本地更新 db_name = 'db_stock' DB = DBSelector() conn = DB.get_mysql_conn(db_name, 'qq') create_tb(conn) update_data(filename, conn) # 远程更新 # db_name = 'db_stock' remote_conn = DB.get_mysql_conn('qdm225205669_db', 'qq') create_tb(remote_conn) update_data(filename, remote_conn) if __name__ == '__main__': main() # get_name_number() ================================================ FILE: datahub/bond_industry_info.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/8/9 11:56 # @File : bond_industry_info.py # @Author : Rocky C@www.30daydo.com import datetime import os from joblib import dump import parsel from datahub.jsl_login import login from configure.settings import config import time headers = { "Accept-Encoding": "gzip, deflate, br", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Host": "www.jisilu.cn", "Origin": "https://www.jisilu.cn", "Referer": "https://www.jisilu.cn/data/cbnew/", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "X-Requested-With": "XMLHttpRequest", } class BondIndustry: def __init__(self): self.today = datetime.date.today().strftime('%Y%m%d') def run(self): name_value = self.parse_selection_id() session = self.get_session() df_dict = {} for name, value in name_value: result = self.get_bond_info(session, value) df_dict[name] = result dump(df_dict, f'industry_{self.today}.pkl') def get_session(self): return login(config['jsl_monitor']['JSL_USER'], config['jsl_monitor']['JSL_PASSWORD']) def get_bond_info(self, session, industry_id): ts = int(time.time() * 1000) url = 'https://www.jisilu.cn/data/cbnew/cb_list/?___jsl=LST___t={}'.format(ts) data = { "fprice": None, "tprice": None, "curr_iss_amt": None, "volume": None, "svolume": None, "premium_rt": None, "ytm_rt": None, "rating_cd": None, "is_search": 'R', "btype": None, "listed": 'Y', "qflag": 'N', "sw_cd": industry_id, "bond_ids": None, "rp": 50 } r = session.post( url=url, headers=headers, data=data ) ret = r.json() result = [] for item in ret['rows']: result.append(item['cell']) return result def parse_data(self, data): pass def parse_selection_id(self): parent = os.path.dirname(__file__) file = os.path.join(parent, 'selection.html') with open(file, 'r', encoding='utf8') as f: content = f.read() resp = parsel.Selector(text=content) nodes = resp.xpath('//option[@data-level="1"]') result_list = [] for nod in nodes: value = nod.xpath('.//@value').extract_first() name = nod.xpath('.//text()').extract_first() name = name.split('(')[0] result_list.append((name, int(value))) return result_list def main(): app = BondIndustry() app.run() if __name__ == '__main__': main() ================================================ FILE: datahub/daily_stock_market_info.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' # 获取每天的行情信息 import tushare as ts import pandas as pd import time import os from sqlalchemy import VARCHAR import sys sys.path.append('..') from common.BaseService import BaseService from configure.settings import DBSelector,config_dict FIX_TABLE_NAME = 'astock_market' class FetchDaily(BaseService): def __init__(self): super(FetchDaily, self).__init__(f'../log/{self.__class__.__name__}.log') self.path = config_dict('data_path') self.check_path(self.path) self.df_today_all = pd.DataFrame() self.TIMEOUT = 10 self.DB = DBSelector() self.engine = self.DB.get_engine('db_daily', 'qq') def transfer_db(self,df): self.engine_tf = self.DB.get_engine('ptrade', 'qq') try: df.to_sql(FIX_TABLE_NAME, self.engine_tf, if_exists='replace', dtype={'code': VARCHAR(6)}) except Exception as e: self.logger.info(e) self.notify(f'{__file__}报错') def get_today_market(self, re_try=10): while re_try > 0: try: df = ts.get_today_all() if df is None: continue if len(df) == 0: continue except Exception as e: self.logger.error(e) re_try = re_try - 1 time.sleep(self.TIMEOUT) else: return df return None def run(self): self.df_today_all = self.get_today_market() # 存储每天 涨幅排行 榜,避免每次读取耗时过长 filename = self.today + '_all_.xls' # 放在data文件夹下 full_filename = os.path.join(self.path, filename) if self.df_today_all is not None: # 保留小数点的后两位数 self.df_today_all['turnoverratio'] = self.df_today_all['turnoverratio'].map(lambda x: round(x, 2)) self.df_today_all['per'] = self.df_today_all['per'].map(lambda x: round(x, 2)) self.df_today_all['pb'] = self.df_today_all['pb'].map(lambda x: round(x, 2)) try: self.df_today_all.to_excel(full_filename) except Exception as e: self.notify(title=f'{self.__class__}写excel出错') self.logger.error(e) try: self.df_today_all['code'] = self.df_today_all['code'].astype(str) self.df_today_all.drop_duplicates(subset='code', keep='first', inplace=True) self.df_today_all.to_sql(self.today, self.engine, if_exists='replace',dtype={'code': VARCHAR(6)}) self.transfer_db(self.df_today_all) except Exception as e: self.notify(title=f'{__file__} mysql出错') self.logger.error(e) def main(): obj = FetchDaily() obj.run() if __name__ == "__main__": main() ================================================ FILE: datahub/dfcf_hot_block.py ================================================ # 东财涨停板 import sys sys.path.append('..') import datetime import pandas as pd import requests import re from configure.util import send_message_via_wechat from configure.settings import DBSelector import akshare as ak ak.stock_zt_pool_em() headers = { 'Accept': '*/*', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Referer': 'https://quote.eastmoney.com/ztb/detail', 'Sec-Fetch-Dest': 'script', 'Sec-Fetch-Mode': 'no-cors', 'Sec-Fetch-Site': 'same-site', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"' } def get_ut_value(): url = 'https://quote.eastmoney.com/ztb/newstatic/build/detail.js' req = requests.get(url, headers=headers) text = req.text match = re.search('{ut:"(\w+)",', text) if match: return match.group(1) else: return None ut = get_ut_value() if ut is None: send_message_via_wechat('eastmoney ut None') raise ValueError('ut is None') def stock_zt_pool_em(date: str = "20241008") -> pd.DataFrame: """ 东方财富网-行情中心-涨停板行情-涨停股池 https://quote.eastmoney.com/ztb/detail#type=ztgc :param date: 交易日 :type date: str :return: 涨停股池 :rtype: pandas.DataFrame """ url = "https://push2ex.eastmoney.com/getTopicZTPool" params = { "ut": ut, "dpt": "wz.ztzt", "Pageindex": "0", "pagesize": "10000", "sort": "fbt:asc", "date": date, } r = requests.get(url, params=params, headers=headers) data_json = r.json() if data_json["data"] is None: return pd.DataFrame() if len(data_json["data"]["pool"]) == 0: return pd.DataFrame() temp_df = pd.DataFrame(data_json["data"]["pool"]) temp_df.reset_index(inplace=True) temp_df["index"] = range(1, len(temp_df) + 1) temp_df.columns = [ "序号", "代码", "_", "名称", "最新价", "涨跌幅", "成交额", "流通市值", "总市值", "换手率", "连板数", "首次封板时间", "最后封板时间", "封板资金", "炸板次数", "所属行业", "涨停统计", ] temp_df["涨停统计"] = ( temp_df["涨停统计"].apply(lambda x: dict(x)["days"]).astype(str) + "/" + temp_df["涨停统计"].apply(lambda x: dict(x)["ct"]).astype(str) ) temp_df = temp_df[ [ "序号", "代码", "名称", "涨跌幅", "最新价", "成交额", "流通市值", "总市值", "换手率", "封板资金", "首次封板时间", "最后封板时间", "炸板次数", "涨停统计", "连板数", "所属行业", ] ] temp_df["首次封板时间"] = temp_df["首次封板时间"].astype(str).str.zfill(6) temp_df["最后封板时间"] = temp_df["最后封板时间"].astype(str).str.zfill(6) temp_df["最新价"] = temp_df["最新价"] / 1000 temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce") temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce") temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce") temp_df["流通市值"] = pd.to_numeric(temp_df["流通市值"], errors="coerce") temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce") temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce") temp_df["封板资金"] = pd.to_numeric(temp_df["封板资金"], errors="coerce") temp_df["炸板次数"] = pd.to_numeric(temp_df["炸板次数"], errors="coerce") temp_df["连板数"] = pd.to_numeric(temp_df["连板数"], errors="coerce") return temp_df def stock_zt_pool_strong_em(date: str = "20241231") -> pd.DataFrame: """ 东方财富网-行情中心-涨停板行情-强势股池 https://quote.eastmoney.com/ztb/detail#type=qsgc :param date: 交易日 :type date: str :return: 强势股池 :rtype: pandas.DataFrame """ url = "https://push2ex.eastmoney.com/getTopicQSPool" params = { "ut": ut, "dpt": "wz.ztzt", "Pageindex": "0", "pagesize": "5000", "sort": "zdp:desc", "date": date, } r = requests.get(url, params=params) data_json = r.json() if data_json["data"] is None: return pd.DataFrame() if len(data_json["data"]["pool"]) == 0: return pd.DataFrame() temp_df = pd.DataFrame(data_json["data"]["pool"]) temp_df.reset_index(inplace=True) temp_df["index"] = range(1, len(temp_df) + 1) temp_df.columns = [ "序号", "代码", "_", "名称", "最新价", "涨停价", "_", "涨跌幅", "成交额", "流通市值", "总市值", "换手率", "是否新高", "入选理由", "量比", "涨速", "涨停统计", "所属行业", ] temp_df["涨停统计"] = ( temp_df["涨停统计"].apply(lambda x: dict(x)["days"]).astype(str) + "/" + temp_df["涨停统计"].apply(lambda x: dict(x)["ct"]).astype(str) ) temp_df = temp_df[ [ "序号", "代码", "名称", "涨跌幅", "最新价", "涨停价", "成交额", "流通市值", "总市值", "换手率", "涨速", "是否新高", "量比", "涨停统计", "入选理由", "所属行业", ] ] temp_df["最新价"] = temp_df["最新价"] / 1000 temp_df["涨停价"] = temp_df["涨停价"] / 1000 explained_map = {1: "60日新高", 2: "近期多次涨停", 3: "60日新高且近期多次涨停"} temp_df["入选理由"] = temp_df["入选理由"].apply(lambda x: explained_map[x]) temp_df["是否新高"] = temp_df["是否新高"].apply(lambda x: "是" if x == 1 else "否") temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce") temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce") temp_df["涨停价"] = pd.to_numeric(temp_df["涨停价"], errors="coerce") temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce") temp_df["流通市值"] = pd.to_numeric(temp_df["流通市值"], errors="coerce") temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce") temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce") temp_df["涨速"] = pd.to_numeric(temp_df["涨速"], errors="coerce") temp_df["量比"] = pd.to_numeric(temp_df["量比"], errors="coerce") return temp_df def stock_zt_pool_zbgc_em(date: str = "20241011") -> pd.DataFrame: """ 东方财富网-行情中心-涨停板行情-炸板股池 https://quote.eastmoney.com/ztb/detail#type=zbgc :param date: 交易日 :type date: str :return: 炸板股池 :rtype: pandas.DataFrame """ thirty_days_ago = datetime.datetime.now() - datetime.timedelta(days=30) thirty_days_ago_str = thirty_days_ago.strftime("%Y%m%d") if int(date) < int(thirty_days_ago_str): raise ValueError("炸板股池只能获取最近 30 个交易日的数据") url = "https://push2ex.eastmoney.com/getTopicZBPool" params = { "ut": ut, "dpt": "wz.ztzt", "Pageindex": "0", "pagesize": "5000", "sort": "fbt:asc", "date": date, } r = requests.get(url, params=params) data_json = r.json() if data_json["data"] is None: return pd.DataFrame() if len(data_json["data"]["pool"]) == 0: return pd.DataFrame() temp_df = pd.DataFrame(data_json["data"]["pool"]) temp_df.reset_index(inplace=True) temp_df["index"] = range(1, len(temp_df) + 1) temp_df.columns = [ "序号", "代码", "_", "名称", "最新价", "涨停价", "涨跌幅", "成交额", "流通市值", "总市值", "换手率", "首次封板时间", "炸板次数", "振幅", "涨速", "涨停统计", "所属行业", ] temp_df["涨停统计"] = ( temp_df["涨停统计"].apply(lambda x: dict(x)["days"]).astype(str) + "/" + temp_df["涨停统计"].apply(lambda x: dict(x)["ct"]).astype(str) ) temp_df = temp_df[ [ "序号", "代码", "名称", "涨跌幅", "最新价", "涨停价", "成交额", "流通市值", "总市值", "换手率", "涨速", "首次封板时间", "炸板次数", "涨停统计", "振幅", "所属行业", ] ] temp_df["最新价"] = temp_df["最新价"] / 1000 temp_df["涨停价"] = temp_df["涨停价"] / 1000 temp_df["首次封板时间"] = temp_df["首次封板时间"].astype(str).str.zfill(6) return temp_df def stock_zt_pool_dtgc_em(date: str = "20241011") -> pd.DataFrame: """ 东方财富网-行情中心-涨停板行情-跌停股池 https://quote.eastmoney.com/ztb/detail#type=dtgc :param date: 交易日 :type date: str :return: 跌停股池 :rtype: pandas.DataFrame """ thirty_days_ago = datetime.datetime.now() - datetime.timedelta(days=30) thirty_days_ago_str = thirty_days_ago.strftime("%Y%m%d") if int(date) < int(thirty_days_ago_str): raise ValueError("跌停股池只能获取最近 30 个交易日的数据") url = "https://push2ex.eastmoney.com/getTopicDTPool" params = { "ut": ut, "dpt": "wz.ztzt", "Pageindex": "0", "pagesize": "10000", "sort": "fund:asc", "date": date, } r = requests.get(url, params=params) data_json = r.json() if len(data_json["data"]["pool"]) == 0: return pd.DataFrame() temp_df = pd.DataFrame(data_json["data"]["pool"]) temp_df.reset_index(inplace=True) temp_df["index"] = range(1, len(temp_df) + 1) temp_df.columns = [ "序号", "代码", "_", "名称", "最新价", "涨跌幅", "成交额", "流通市值", "总市值", "动态市盈率", "换手率", "封单资金", "最后封板时间", "板上成交额", "连续跌停", "开板次数", "所属行业", ] temp_df = temp_df[ [ "序号", "代码", "名称", "涨跌幅", "最新价", "成交额", "流通市值", "总市值", "动态市盈率", "换手率", "封单资金", "最后封板时间", "板上成交额", "连续跌停", "开板次数", "所属行业", ] ] temp_df["最新价"] = temp_df["最新价"] / 1000 temp_df["最后封板时间"] = temp_df["最后封板时间"].astype(str).str.zfill(6) temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce") temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce") temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce") temp_df["流通市值"] = pd.to_numeric(temp_df["流通市值"], errors="coerce") temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce") temp_df["动态市盈率"] = pd.to_numeric(temp_df["动态市盈率"], errors="coerce") temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce") temp_df["封单资金"] = pd.to_numeric(temp_df["封单资金"], errors="coerce") temp_df["板上成交额"] = pd.to_numeric(temp_df["板上成交额"], errors="coerce") temp_df["连续跌停"] = pd.to_numeric(temp_df["连续跌停"], errors="coerce") temp_df["开板次数"] = pd.to_numeric(temp_df["开板次数"], errors="coerce") temp_df["开板次数"] = pd.to_numeric(temp_df["开板次数"], errors="coerce") return temp_df def stock_zt_pool_previous_em(date: str = "20240415") -> pd.DataFrame: """ 东方财富网-行情中心-涨停板行情-昨日涨停股池 https://quote.eastmoney.com/ztb/detail#type=zrzt :param date: 交易日 :type date: str :return: 昨日涨停股池 :rtype: pandas.DataFrame """ url = "https://push2ex.eastmoney.com/getYesterdayZTPool" params = { "ut": ut, "dpt": "wz.ztzt", "Pageindex": "0", "pagesize": "5000", "sort": "zs:desc", "date": date, } r = requests.get(url, params=params) data_json = r.json() if data_json["data"] is None: return pd.DataFrame() if len(data_json["data"]["pool"]) == 0: return pd.DataFrame() temp_df = pd.DataFrame(data_json["data"]["pool"]) temp_df.reset_index(inplace=True) temp_df["index"] = range(1, len(temp_df) + 1) temp_df.columns = [ "序号", "代码", "_", "名称", "最新价", "涨停价", "涨跌幅", "成交额", "流通市值", "总市值", "换手率", "振幅", "涨速", "昨日封板时间", "昨日连板数", "所属行业", "涨停统计", ] temp_df["涨停统计"] = ( temp_df["涨停统计"].apply(lambda x: dict(x)["days"]).astype(str) + "/" + temp_df["涨停统计"].apply(lambda x: dict(x)["ct"]).astype(str) ) temp_df = temp_df[ [ "序号", "代码", "名称", "涨跌幅", "最新价", "涨停价", "成交额", "流通市值", "总市值", "换手率", "涨速", "振幅", "昨日封板时间", "昨日连板数", "涨停统计", "所属行业", ] ] temp_df["最新价"] = temp_df["最新价"] / 1000 temp_df["涨停价"] = temp_df["涨停价"] / 1000 temp_df["昨日封板时间"] = temp_df["昨日封板时间"].astype(str).str.zfill(6) return temp_df def data_dump(df, table_name): engine = DBSelector().get_engine('db_zdt', 'qq') print(df) if len(df)==0: return try: df.to_sql(table_name, con=engine, if_exists='replace', index=False) except Exception as e: print(e) def main(): date = datetime.datetime.now().strftime('%Y%m%d') zt_df = stock_zt_pool_em(date) data_dump(zt_df, date + '_zt') strong_df = stock_zt_pool_strong_em(date) data_dump(strong_df, date + '_strong') break_df = stock_zt_pool_zbgc_em(date) data_dump(break_df, date + '_break') dt_df = stock_zt_pool_dtgc_em(date) data_dump(dt_df, date + '_dt') zrzt_df = stock_zt_pool_previous_em(date) data_dump(zrzt_df, date + '_zrzt') if __name__ == '__main__': weekday = datetime.datetime.now().weekday() if weekday == 5 or weekday == 6: print('周末不执行') exit(0) else: print('工作日执行') main() ================================================ FILE: datahub/foreignexchange.py ================================================ # -*-coding=utf-8-*- # @Time : 2018/8/7 13:45 # @File : foreignexchange.py # 实时获取外汇 import re import datetime import requests import sys sys.path.append('..') from common.BaseService import BaseService from configure.util import send_message_via_wechat from configure.settings import DBSelector # 失效 class ForeighExchange(BaseService): def __init__(self): super(ForeighExchange, self).__init__('log/usd.log') self.url = 'http://data.bank.hexun.com/other/cms/foreignexchangejson.ashx?callback=ShowDatalist' self.update_req = 10 self.retry = 5 @property def headers(self): return {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'} def run(self): content = self.fetch_web() if content: pattern = re.compile('\{bank:\'工商银行\',currency:\'美元\',code:\'USD\',currencyUnit:\'\',cenPrice:\'\',(buyPrice1:\'[.0-9]+\',sellPrice1:\'[.0-9]+\'),.*?\'\}') ret_str = pattern.search(content).group(1) buy=re.search('buyPrice1:\'([0-9.]+)\'',ret_str).group(1) sell=re.search('sellPrice1:\'([0-9.]+)\'',ret_str).group(1) return (buy,sell) def start(self): buy,sell=self.run() sub = '{}: 美元汇率{}'.format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M'),buy) self.logger.info(sub) conn=DBSelector().get_mysql_conn('db_stock','qq') cmd = 'insert into `usd_ratio` (`price`,`date`) VALUES ({},{!r})'.format(buy,datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) self.execute(cmd,(),conn) send_message_via_wechat(sub) def fetch_web(self): for i in range(self.retry): try: r = requests.get(url=self.url,headers=self.headers) if r.status_code==200: r.encoding='gbk' return r.text else: continue except Exception as e: self.logger.error(e) return None def main(): obj = ForeighExchange() obj.start() if __name__ == '__main__': main() ================================================ FILE: datahub/industry_info/ak_bk.py ================================================ import akshare as ak # stock_board_industry_summary_ths_df = ak.stock_board_industry_summary_ths() # print(stock_board_industry_summary_ths_df) from cookies_generator import gen_cookies v = gen_cookies() print(v) ================================================ FILE: datahub/industry_info/cookies.txt ================================================ A3DdP9F344FZZ7-FjUIT2mvvQD_CuVQDdp2oB2rBPEueJRDPEskkk8ateJa5 ================================================ FILE: datahub/industry_info/ths_industry_cralwer_top.py ================================================ import time from parsel import Selector import requests from data_dump import DataDump from cookies_generator import gen_cookies import re URL = 'https://data.10jqka.com.cn/funds/hyzjl/field/tradezdf/order/desc/page/{}/ajax/1/free/1/' payload = {} headers = { 'Accept': 'text/html, */*; q=0.01', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Referer': 'https://data.10jqka.com.cn/funds/hyzjl/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', } dataObj = DataDump() dataObj.create_table() def update_cookies(): c = gen_cookies() cookie = 'v={}'.format(c) headers['Cookie'] = cookie headers['Hexin-V'] = c return headers WAIT_TIME = 10 def crawl(url, is_detail=False): _headers = update_cookies() try: print('crawl {} '.format(url)) response = requests.request("GET", url, headers=_headers, data=payload) except Exception as e: print(e) time.sleep(WAIT_TIME) return None else: time.sleep(WAIT_TIME) return response.text top_count = 10 def parser(html): resp = Selector(text=html) top_raise_list = resp.xpath('//table[@class="m-table m-pager-table"]/tbody/tr') industry_data = [] if len(top_raise_list) == 0: print('异常,数据为空') print(html) for tr in top_raise_list[:top_count]: industry = {} name = tr.xpath('./td[2]/a/text()').get() industry_detail_url = tr.xpath('./td[2]/a/@href').get() pct_change = tr.xpath('./td[3]/text()').get() pct_change = float(pct_change.replace('%', '')) industry['name'] = name industry['pct_change'] = pct_change industry['industry_detail_url'] = industry_detail_url match = re.search('http://q.10jqka.com.cn/thshy/detail/code/(\d+)', industry_detail_url) industry_code = match.group(1) industry['industry_code'] = industry_code industry_id = dataObj.insert_industry(industry['name'], industry['pct_change'], industry['industry_detail_url'], industry_code) print('插入 ', industry_id) print(name, pct_change, industry_detail_url) detail_response = crawl(industry_detail_url, is_detail=True) detail_info = parse_detail(detail_response, industry_code) # print(detail_info) industry['details'] = detail_info industry_data.append(industry) return industry_data detail_url = 'https://q.10jqka.com.cn/thshy/detail/code/{}/page/{}' def parse_detail(html, industry_code): # 分页 # print(html) if 'forbid' in html: print('详情页被封了') # print(html) return [] # total_page = get_total_page(html) total_page = 1 # 强制变1 if total_page == 1: return _parse_detail(html, industry_code) else: detail_list = [_parse_detail(html, industry_code)] for i in range(2, total_page + 1): html = crawl(detail_url.format(industry_code, i)) data = _parse_detail(html, industry_code) detail_list.append(data) return detail_list def _parse_detail(html, industry_code): resp = Selector(text=html) industry_detail = resp.xpath('//table[@class="m-table m-pager-table"]/tbody/tr') industry_stock_data = [] if (len(industry_detail) == 0): print('数据为空,详情页') print(html) return [] for tr in industry_detail: stock_obj = {} stock_code = tr.xpath('./td[2]/a/text()').get() stock_name = tr.xpath('./td[3]/a/text()').get() percent = tr.xpath('./td[5]/text()').get() turnover_rate = tr.xpath('./td[8]/text()').get() vol = tr.xpath('./td[11]/text()').get() # 1.2 亿 print('vol',vol) vol = vol.replace('亿','') vol = float(vol) * 100000000 # stock_pct_change = tr.xpath('./td[@class="tr cur c-rise"]/text()').get() # print(stock_pct_change) # print(stock_name, stock_pct_change) stock_obj['stock_code'] = stock_code stock_obj['stock_name'] = stock_name # stock_obj['stock_pct_change'] = stock_pct_change stock_obj['percent'] = percent stock_obj['vol'] = vol stock_obj['turnover_rate'] = turnover_rate dataObj.insert_stock(industry_code, stock_obj['stock_code'], stock_obj['stock_name'], stock_obj['percent'], stock_obj['vol'], stock_obj['turnover_rate']) industry_stock_data.append(stock_obj) return industry_stock_data def get_total_page(html): page_info = Selector(text=html).xpath('//span[@class="page_info"]/text()').get() if page_info is None: # print(html) print('page info not found') return 1 pages = page_info.split('/') if len(pages) == 2: return int(pages[1]) else: raise ValueError('page info error') def dumpData(data): for industry in data: industry_id = dataObj.insert_industry(industry['name'], industry['pct_change'], industry['industry_detail_url']) for stock in industry['details']: dataObj.insert_stock(industry_id, stock['stock_code'], stock['stock_name'], stock['percent'], stock['vol'], stock['turnover_rate']) def main(): next_url = 'https://q.10jqka.com.cn/thshy/' html = crawl(next_url) parser(html) if __name__ == "__main__": main() ================================================ FILE: datahub/industry_info/ths_industry_detail.py ================================================ import requests import time from parsel import Selector import requests from data_dump import DataDump from cookies_generator import gen_cookies import re # hexin='Aycl1pkNDM-2QIhDE8yt9QRStlD0rP5MVYl_FvmXQc_f6EmOAXyL3mVQD1oK' BASIC_URL = "https://q.10jqka.com.cn/thshy/detail/field/199112/order/desc/page/{}/ajax/1/code/{}" payload = {} def get_total_page(html): page_info = Selector(text=html).xpath('//span[@class="page_info"]/text()').get() if page_info is None: # print(html) print('page number info not found,only 1 page') return 1 pages = page_info.split('/') if len(pages) == 2: return int(pages[1]) else: raise ValueError('page info error') def read_cookies(): api_url = "http://127.0.0.1:7000/ths/hexin" payload = {} headers = {} response = requests.request("GET", api_url, headers=headers, data=payload) data=response.json() hexin = data['hexin'] return hexin def get_headers(): # hexin = gen_cookies() # print(hexin) hexin = read_cookies() headers = { 'Accept': 'text/html, */*; q=0.01', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Cookie': 'Hm_lvt_722143063e4892925903024537075d0d=1739618766; Hm_lpvt_722143063e4892925903024537075d0d=1739618766; HMACCOUNT=8144A39C4F4A22E9; Hm_lvt_929f8b362150b1f77b477230541dbbc2=1739618767; Hm_lpvt_929f8b362150b1f77b477230541dbbc2=1739618767; Hm_lvt_78c58f01938e4d85eaf619eae71b4ed1=1739618767; historystock=000627; spversion=20130314; Hm_lpvt_78c58f01938e4d85eaf619eae71b4ed1=1742117683; u_ukey=A10702B8689642C6BE607730E11E6E4A; u_uver=1.0.0; u_dpass=xm%2F5h1ycNmxybkXT5OHYvn%2BzS8FOyrdJXsUWRxtn%2BBUMTzTPYe8995kQarA0qO%2FsHi80LrSsTFH9a%2B6rtRvqGg%3D%3D; u_did=33B5B946911B443683389E0F857364C0; u_ttype=WEB; ttype=WEB; user=MDpyb2NreXpzdTo6Tm9uZTo1MDA6MjM5NDg0ODc0OjcsMTExMTExMTExMTEsNDA7NDQsMTEsNDA7NiwxLDQwOzUsMSw0MDsxLDEwMSw0MDsyLDEsNDA7MywxLDQwOzUsMSw0MDs4LDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxLDQwOzEwMiwxLDQwOjI3Ojo6MjI5NDg0ODc0OjE3NDM5NTI1MDc6OjoxNDI4NDEyNjIwOjYwNDgwMDowOjFmODFlMDA0YWZmYmU5ODIyNTNmZmM4MmVmZDRjYWZjYTpkZWZhdWx0XzQ6MA%3D%3D; userid=229484874; u_name=rockyzsu; escapename=rockyzsu; ticket=a5ac51d899a5e0f16b5ec60c0caac153; user_status=0; utk=9d55d410895cb948f07e9d387c45eb83; v={}'.format(hexin), 'Pragma': 'no-cache', 'Referer': 'https://q.10jqka.com.cn/thshy/detail/code/881117/', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'hexin-v': hexin, 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"' } return headers def crawl(url): while 1: _headers = get_headers() try: response = requests.request("GET", url, headers=_headers, data=payload) html = response.text resp = Selector(text=html) industry_detail = resp.xpath('//table[@class="m-table m-pager-table"]/tbody/tr') if (len(industry_detail) == 0): print('数据为空,详情页') print('需要更新cookies') input('请更新cookies,然后按回车继续') _headers = get_headers() else: return html except Exception as e: print(e) raise ValueError('请求异常,退出') dataObj = DataDump() dataObj.create_table_fixed_name() def get_crawl_list(): result_tuple = dataObj.query_queue() industry_code_list = [] for item in result_tuple: industry_code = item[4] industry_name = item[1] industry_code_list.append((industry_code, industry_name)) return industry_code_list def _parse_detail(html, industry_code): resp = Selector(text=html) industry_detail = resp.xpath('//table[@class="m-table m-pager-table"]/tbody/tr') industry_stock_data = [] if (len(industry_detail) == 0): print('数据为空,详情页') raise ValueError('数据为空,详情页,退出') return False for tr in industry_detail: stock_obj = {} stock_code = tr.xpath('./td[2]/a/text()').get() stock_name = tr.xpath('./td[3]/a/text()').get() percent = tr.xpath('./td[5]/text()').get() turnover_rate = tr.xpath('./td[8]/text()').get() vol = tr.xpath('./td[11]/text()').get() # stock_pct_change = tr.xpath('./td[@class="tr cur c-rise"]/text()').get() # print(stock_pct_change) # print(stock_name, stock_pct_change) stock_obj['stock_code'] = stock_code stock_obj['stock_name'] = stock_name # stock_obj['stock_pct_change'] = stock_pct_change stock_obj['percent'] = percent stock_obj['vol'] = vol stock_obj['turnover_rate'] = turnover_rate dataObj.insert_stock_fix_table(industry_code, stock_obj['stock_code'], stock_obj['stock_name'], stock_obj['percent'], stock_obj['vol'], stock_obj['turnover_rate']) industry_stock_data.append(stock_obj) return True def process_detail(industry_code): # industry_code = 881102 url = BASIC_URL.format(1, industry_code) html = crawl(url) page = get_total_page(html) print(page) dataObj.update_page_num(industry_code, page) result = _parse_detail(html, industry_code) if page > 1: result_list = [] for p in range(2, page + 1): time.sleep(1) print('processing page {}'.format(p)) url = BASIC_URL.format(p, industry_code) html = crawl(url) result_list.append(_parse_detail(html, industry_code)) time.sleep(1) if all((result_list)): dataObj.update_done(industry_code) else: if result: dataObj.update_done(industry_code) def main(): industry_code_list = get_crawl_list() for item in industry_code_list: code = item[0] name = item[1] print('procesing industry code {} name {}'.format(code, name)) process_detail(code) time.sleep(1) if __name__ == '__main__': main() ================================================ FILE: datahub/industry_info/ths_industry_list.py ================================================ import sys sys.path.append('../../') from configure.settings import config from parsel import Selector import requests from configure.util import send_message_via_wechat from data_dump import DataDump import re from loguru import logger # 每日更新 logger.add('ths_industry_list.log', rotation='10 MB', level='INFO', encoding='utf-8') API_HOST = config['API_HOST'] payload = {} dataObj = DataDump() dataObj.create_table(only_industry=True) def get_headers(): hexin = read_cookies() headers = { 'Accept': 'text/html, */*; q=0.01', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Cookie': 'Hm_lvt_722143063e4892925903024537075d0d=1739618766; Hm_lpvt_722143063e4892925903024537075d0d=1739618766; HMACCOUNT=8144A39C4F4A22E9; Hm_lvt_929f8b362150b1f77b477230541dbbc2=1739618767; Hm_lpvt_929f8b362150b1f77b477230541dbbc2=1739618767; Hm_lvt_78c58f01938e4d85eaf619eae71b4ed1=1739618767; historystock=000627; spversion=20130314; Hm_lpvt_78c58f01938e4d85eaf619eae71b4ed1=1742117683; u_ukey=A10702B8689642C6BE607730E11E6E4A; u_uver=1.0.0; u_dpass=xm%2F5h1ycNmxybkXT5OHYvn%2BzS8FOyrdJXsUWRxtn%2BBUMTzTPYe8995kQarA0qO%2FsHi80LrSsTFH9a%2B6rtRvqGg%3D%3D; u_did=33B5B946911B443683389E0F857364C0; u_ttype=WEB; ttype=WEB; user=MDpyb2NreXpzdTo6Tm9uZTo1MDA6MjM5NDg0ODc0OjcsMTExMTExMTExMTEsNDA7NDQsMTEsNDA7NiwxLDQwOzUsMSw0MDsxLDEwMSw0MDsyLDEsNDA7MywxLDQwOzUsMSw0MDs4LDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxLDQwOzEwMiwxLDQwOjI3Ojo6MjI5NDg0ODc0OjE3NDM5NTI1MDc6OjoxNDI4NDEyNjIwOjYwNDgwMDowOjFmODFlMDA0YWZmYmU5ODIyNTNmZmM4MmVmZDRjYWZjYTpkZWZhdWx0XzQ6MA%3D%3D; userid=229484874; u_name=rockyzsu; escapename=rockyzsu; ticket=a5ac51d899a5e0f16b5ec60c0caac153; user_status=0; utk=9d55d410895cb948f07e9d387c45eb83; v={}'.format( hexin), 'Pragma': 'no-cache', 'Referer': 'https://q.10jqka.com.cn/thshy/detail/code/881117/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'hexin-v': hexin, } return headers def read_cookies(): api_url = "{}/api/ths/hexin".format(API_HOST) payload = {} headers = {} response = requests.request("GET", api_url, headers=headers, data=payload) data = response.json() hexin = data['hexin'] return hexin def crawl(url): try: _headers = get_headers() response = requests.request("GET", url, headers=_headers, data=payload) # print(response.text) return response.text except Exception as e: return None def parser(html): resp = Selector(text=html) top_raise_list = resp.xpath('//table[@class="m-table m-pager-table"]/tbody/tr') if len(top_raise_list) == 0: logger.info('异常,数据为空') for tr in top_raise_list: industry = {} name = tr.xpath('./td[2]/a/text()').get() industry_detail_url = tr.xpath('./td[2]/a/@href').get() pct_change = tr.xpath('./td[3]/text()').get() pct_change = float(pct_change.replace('%', '')) vol = tr.xpath('./td[4]/text()').get() amount = tr.xpath('./td[5]/text()').get() flow_direction = tr.xpath('./td[6]/text()').get() raise_number = tr.xpath('./td[7]/text()').get() fall_number = tr.xpath('./td[8]/text()').get() avg_price = tr.xpath('./td[9]/text()').get() # 均价 lead_stock = tr.xpath('./td[10]/a/text()').get() industry['industry_name'] = name industry['industry_pct_change'] = pct_change industry['industry_detail_url'] = industry_detail_url industry['industry_vol'] = vol industry['industry_amount'] = amount industry['industry_flow_direction_amount'] = flow_direction industry['raise_number'] = raise_number industry['fall_number'] = fall_number industry['avg_price'] = avg_price industry['lead_stock'] = lead_stock match = re.search('http://q.10jqka.com.cn/thshy/detail/code/(\d+)', industry_detail_url) industry_code = match.group(1) industry['industry_code'] = industry_code industry_id = dataObj.insert_industry_only(industry) print('插入 ', industry_id) def main(): industrty_list_url = "https://q.10jqka.com.cn/thshy/index/field/199112/order/desc/page/{}/ajax/1/" # 目前只有2页 for page in range(1, 3): url = industrty_list_url.format(page) print('crawl {} '.format(url)) response = crawl(url) if response: parser(response) else: logger.info('请求失败') if __name__ == '__main__': try: main() except Exception as e: send_message_via_wechat('{}异常'.format(__file__)) logger.info(e) ================================================ FILE: datahub/jisilu.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import sys sys.path.append('..') import re import time import datetime import pandas as pd from configure.settings import DBSelector, config from configure.util import send_message_via_wechat from sqlalchemy import VARCHAR from common.BaseService import BaseService from datahub.jsl_login import login # 爬取集思录 可转债的数据 class Jisilu(BaseService): def __init__(self, check_holiday=False, remote='qq'): super(Jisilu, self).__init__(logfile='log/jisilu.log') if check_holiday: self.check_holiday() self.date = datetime.datetime.now().strftime('%Y-%m-%d') # self.date = '2020-02-07' # 用于调整时间 self.timestamp = int(time.time() * 1000) self.url = 'https://www.jisilu.cn/data/cbnew/cb_list_new/?___jsl=LST___t={}'.format(self.timestamp) self.pre_release_url = 'https://www.jisilu.cn/data/cbnew/pre_list/?___jsl=LST___t={}'.format(self.timestamp) self.remote = remote self.DB = DBSelector() self.get_session() @property def headers(self): _header = { 'Host': 'www.jisilu.cn', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Accept': 'application/json,text/javascript,*/*;q=0.01', 'Origin': 'https://www.jisilu.cn', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/67.0.3396.99Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'Referer': 'https://www.jisilu.cn/login/', 'Accept-Encoding': 'gzip,deflate,br', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8' } return _header def check_holiday(self): if self.is_weekday(): self.logger.info("Start") else: self.logger.info("Holidy") exit(0) def get_session(self): self.session = login(config['jsl_monitor']['JSL_USER'], config['jsl_monitor']['JSL_PASSWORD']) def download(self, url, data, retry=5): for i in range(retry): try: r = self.session.post(url, headers=self.headers, data=data) if not r.text or r.status_code != 200: continue else: return r except Exception as e: self.logger.info(e) self.notify(title=f'下载失败 {self.__class__}') continue return None def daily_update(self, adjust_no_use=True): post_data = { "fprice": None, "tprice": None, "curr_iss_amt": None, "volume": None, "svolume": None, "premium_rt": None, "ytm_rt": None, "rating_cd": None, "is_search": "N", "btype": "C", "listed": "Y", "qflag": "N", "sw_cd": None, "bond_ids": None, "rp": 50, } js = self.download(self.url, data=post_data) if not js: return None ret = js.json() bond_list = ret.get('rows', {}) df = self.data_parse(bond_list, adjust_no_use) print(df) self.store_mysql(df) def identify_margin(self,x): if len(x) == 0: return '否' else: return '是' def data_parse(self, bond_list, adjust_no_use): cell_list = [] for item in bond_list: cell_list.append(pd.Series(item.get('cell'))) df = pd.DataFrame(cell_list) if adjust_no_use: # 类型转换 部分含有% df['price'] = df['price'].astype('float64') df['convert_price'] = df['convert_price'].astype('float64') df['premium_rt'] = df['premium_rt'].astype('float64') df['force_redeem_price'] = df['force_redeem_price'].astype('float64') df['margin_flg'] = df['icons'].map(self.identify_margin) df['icons'] = df['icons'].map(str) del df['t_flag'] rename_columns = {'bond_id': '可转债代码', 'bond_nm': '可转债名称', 'price': '可转债价格', 'stock_nm': '正股名称', 'stock_id': '正股代码', 'sprice': '正股现价', 'sincrease_rt': '正股涨跌幅', 'convert_price': '最新转股价', 'premium_rt': '溢价率', 'increase_rt': '可转债涨幅', 'convert_value': '转股价值', 'dblow': '双低', 'put_convert_price': '回售触发价', 'convert_dt': '转股起始日', 'maturity_dt': '到期时间', # 'short_maturity_dt': '到期时间', 'volume': '成交额(万元)', 'force_redeem_price': '强赎价格', 'year_left': '剩余时间', # 'next_put_dt': '回售起始日', 'rating_cd': '评级', # 'issue_dt': '发行时间', # 'redeem_tc': '强制赎回条款', # 'adjust_tc': '下修条件', # 'adjust_condition': '下修条件', 'turnover_rt': '换手率', 'convert_price_tips': '下修提示', # 'put_tc': '回售', 'adj_cnt': '提出下调次数', 'svolume': '正股成交量', # 'ration':'已转股比例' 'convert_amt_ratio': '转债剩余占总市值比', 'curr_iss_amt': '剩余规模', 'orig_iss_amt': '发行规模', # 'ration_rt': '股东配售率', 'option_tip': '期权价值', # 'bond_nm_tip': '强赎提示', 'redeem_dt': '强赎日期', 'list_dt': '上市日期', 'ytm_rt': '到期收益率', # 'redeem_icon': '强赎标志', 'icons':'标记', 'margin_flg': '是否两融标的', 'adj_scnt': '下修成功次数', 'convert_cd_tip': '转股日期提示', 'ref_yield_info': '参考YTM', # 'year_left':'剩余年限', # 'guarantor': '担保', } df = df.rename(columns=rename_columns) # df = df[list(rename_columns.values())] df['更新日期'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M') df = df.set_index('可转债代码', drop=True) return df def update_daily_report(self,df): ''' 更新每日报告 ''' conn = self.DB.get_mysql_conn('db_stock', self.remote) # cursor = conn.cursor() cmd = 'select 1 from bond_market_daily_report where trade_date=%s' data = self.date ret = self.execute(cmd, data, conn) df['成交额(亿元)'] = df['成交额(万元)']/10000 df = df.sort_values(by='成交额(亿元)', ascending=False,inplace=False) bond_trade_amount_total = df['成交额(亿元)'].sum() bond_trade_amount_exclude_top10 = df['成交额(亿元)'].iloc[10:].sum() bond_trade_amount_median = round(df['成交额(万元)'].median(),0) bond_count = len(df) bond_price_median = df['可转债价格'].median() bond_scale_median = df['剩余规模'].median() bond_daily_percent_median = df['可转债涨幅'].median() now = datetime.datetime.now() if len(ret)==0 : cmd = '''insert into bond_market_daily_report (trade_date,bond_trade_amount_total,bond_trade_amount_exclude_top10,bond_trade_amount_median, bond_count, bond_price_median, bond_scale_median, bond_daily_percent_median, updated_time) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)''' data = (self.date,bond_trade_amount_total, bond_trade_amount_exclude_top10, bond_trade_amount_median, bond_count, bond_price_median, bond_scale_median, bond_daily_percent_median,now) self.execute(cmd, data, conn) else: cmd = '''update bond_market_daily_report set updated_time=%s,bond_trade_amount_total=%s,bond_trade_amount_exclude_top10=%s,bond_trade_amount_median=%s, bond_count=%s, bond_price_median=%s, bond_scale_median=%s, bond_daily_percent_median=%s where trade_date=%s''' data = ( now,bond_trade_amount_total, bond_trade_amount_exclude_top10, bond_trade_amount_median, bond_count,bond_price_median, bond_scale_median, bond_daily_percent_median,self.date) self.execute(cmd, data, conn) def to_excel(self, df): try: df.to_excel(f'jisilu_{self.date}.xlsx', encoding='utf8') except Exception as e: print(e) def store_mysql(self, df): # 根据不同配置写入到不同数据库 TABLE_DICT = {'qq': {'fix_db': 'db_stock', 'daily_db': 'db_jisilu'}, 'ptrade': {'fix_db': 'ptrade', 'daily_db': 'db_jisilu_end'}} try: engine = self.DB.get_engine(TABLE_DICT.get(self.remote).get('daily_db'), self.remote) df.to_sql('tb_jsl_{}'.format(self.date), engine, if_exists='replace', dtype={'可转债代码': VARCHAR(10)}) engine = self.DB.get_engine(TABLE_DICT.get(self.remote).get('fix_db'), self.remote) df.to_sql('tb_bond_jisilu', engine, if_exists='replace', dtype={'可转债代码': VARCHAR(10)}) except Exception as e: self.logger.info(e) # send_from_aliyun_ssl(title='jisilu可转债', content='写入数据库出错') send_message_via_wechat('jisilu可转债写入数据库出错') else: # daily report self.update_daily_report(df) def init_release_table(self, conn): creat_table = ''' create table if not exists tb_bond_release ( 可转债代码 varchar(10), 可转债名称 varchar(10), 集思录建议 varchar(500), 包销比例 float(6,3), 中签率 float(6,3), 上市日期 varchar(20), 申购户数(万户) int, 单账户中签(顶格) float(6,3), 股东配售率 float(6,3), 评级 varchar(8), 现价比转股价 float(6,3), 抓取时间 datetime ); ''' self.execute(creat_table, (), conn) def get_conn(self): return self.DB.get_mysql_conn('db_stock', self.remote) # 这个数据最好晚上10点执行 def release_data(self): conn = self.get_conn() self.init_release_table(conn) post_data = {'cb_type_Y': 'Y', 'progress': '', 'rp': 22, } r = self.download(url=self.pre_release_url, data=post_data) js_data = r.json() rows = js_data.get('rows') self.save_release_data(rows, conn) def save_release_data(self, rows, conn): for items in rows: item = items.get('cell') single_draw = item.get('single_draw') if single_draw: jsl_advise_text = item.get('jsl_advise_text') # 集思录建议 underwriter_rt = self.convert_float(item.get('underwriter_rt')) # 包销比例 bond_nm = item.get('bond_nm') lucky_draw_rt = self.convert_float(item.get('lucky_draw_rt')) # 中签率 if lucky_draw_rt: lucky_draw_rt = lucky_draw_rt * 100 list_date = item.get('list_date') valid_apply = self.convert_float(item.get('valid_apply')) # 申购户数(万户) single_draw = self.convert_float(item.get('single_draw')) # 单账户中签(顶格) ration_rt = self.convert_float(item.get('ration_rt')) # 股东配售率 rating_cd = item.get('rating_cd') # 评级 bond_id = item.get('bond_id') # 可转债代码 pma_rt = self.convert_float(item.get('pma_rt')) # 现价比转股价 update_time = datetime.datetime.now() if self.check_bond_exist(bond_id, conn): if self.check_update(bond_id, conn): update_data = (underwriter_rt, list_date, update_time, bond_id) self.update_release_data(update_data, conn) else: continue # 插入 else: insert_data_tuple = ( bond_id, bond_nm, jsl_advise_text, underwriter_rt, lucky_draw_rt, list_date, valid_apply, single_draw, ration_rt, rating_cd, pma_rt, update_time) self.insert_release_data(insert_data_tuple, conn) def check_update(self, bond_id, conn): check_update = '''select * from tb_bond_release where 可转债代码=%s and 包销比例 is null''' return self.execute(check_update, bond_id, conn) def update_release_data(self, update_data, conn): '''更新发布数据''' update_sql = '''update tb_bond_release set 包销比例=%s , 上市日期=%s ,抓取时间=%s where 可转债代码 = %s''' self.execute(update_sql, update_data, conn) def insert_release_data(self, data, conn): '''插入发布数据''' insert_sql = '''insert into tb_bond_release (可转债代码 , 可转债名称 , 集思录建议 , 包销比例 , 中签率 ,上市日期 ,申购户数(万户), 单账户中签(顶格), 股东配售率 ,评级 , 现价比转股价,抓取时间) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)''' self.execute(insert_sql, data, conn) def check_bond_exist(self, bond_id, conn): ''' 判断债券是否存在 ''' check_exist = '''select * from tb_bond_release where 可转债代码=%s''' return self.execute(check_exist, bond_id, conn) def execute(self, cmd, data, conn): cursor = conn.cursor() if not isinstance(data, tuple): data = (data,) try: cursor.execute(cmd, data) except Exception as e: conn.rollback() self.logger.error('执行数据库错误 {}'.format(e)) ret = None else: ret = cursor.fetchall() conn.commit() return ret def convert_float(self, x): if not x: return None if '%' in x: ration = 100 else: ration = 1 x = re.sub('%', '', x) try: ret = float(x) * ration except Exception as e: self.logger.error('转换失败{}'.format(e)) ret = None return ret def main(): obj = Jisilu(check_holiday=False, remote='qq') obj.daily_update() # obj.release_data() if __name__ == '__main__': main() ================================================ FILE: datahub/jisilu_bond_announcement.py ================================================ # 集思录可转债公告数据 import datetime import time import pandas as pd import requests import sys sys.path.append('..') from configure.settings import DBSelector from jsl_login import main as get_bond_info # 下修 client = DBSelector().mongo('qq') doc = client['db_parker']['Not_LowDown_ConvertPrice'] class Announcement: def __init__(self, kw): self.url = 'https://www.jisilu.cn/data/cbnew/announcement_list/?___jsl=LST___t={}' self.headers = {'Accept': 'application/json, text/javascript, */*; q=0.01', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Host': 'www.jisilu.cn', 'Origin': 'https://www.jisilu.cn', 'Referer': 'https://www.jisilu.cn/data/cbnew/announcement/', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', } self.kw = kw today = datetime.datetime.now().strftime('%Y%m%d') self.path = '../data/{}-{}.xlsx'.format(self.kw, today) def bond_info(self): code_list = get_bond_info()['bond_id'].tolist() return code_list def crawl(self, code): ts = int(time.time()) data = {'code': code, 'title': self.kw, 'tp[]': 'Y', 'rp': '22'} req = requests.post( url=self.url.format(ts), headers=self.headers, data=data ) return req.json() def parse(self, content): latest_date = None latest_news = None for row in content['rows']: cell = row['cell'] anno_tm = cell['anno_tm'] if latest_date is None or latest_date < anno_tm: latest_date = anno_tm latest_news = cell # print(cell) return latest_news def run(self): result = [] for code in self.bond_info(): content = self.crawl(code) cell = self.parse(content) if cell is None: continue result.append(cell) df = pd.DataFrame(result) df = df.rename( columns={'bond_id': '代码', 'anno_dt': '公告日期', 'stock_nm': '正股名称', 'stock_id': '正股代码', 'anno_url': '公告url', 'anno_title': '公告标题'}) df.to_excel(self.path, encoding='utf8') def persistence(self): # 读取整理的excel文件到mongodb # import numpy as np df = pd.read_excel(self.path, index_col=None, dtype={'正股代码': str, '代码': str}) for index, row in df.iterrows(): code = row['代码'] announce_date = row['公告日期'] if not doc.find_one({'代码': code, '公告日期': announce_date}): try: re_calculate_date = row['重新计算日期'] except: re_calculate_date = None # 修改过得excel # doc.insert_one({'代码':row['代码'],'重新计算日期':re_calculate_date,'公告日期':row['公告日期'],'正股代码':row['正股代码'],'正股名称':row['正股名称'],'公告标题':row['公告标题']}) now = datetime.datetime.now() doc.insert_one({'代码': row['代码'], '重新计算日期': re_calculate_date, '公告日期': row['公告日期'], '正股代码': row['正股代码'], '正股名称': row['正股名称'], '公告标题': row['公告标题'], '公告链接': row['公告url'],'更新时间':now}) # doc.update_one({'代码': code, '公告日期': announce_date},{'$set':{'公告链接':row['公告标题']}}) print('update one {}'.format(row['代码'])) def update_only(self): # 临时更新数据 import os import sys sys.path.append('..') from configure.settings import DBSelector client = DBSelector().mongo('qq') doc = client['db_parker']['Not_LowDown_ConvertPrice'] path_list = [ # '不向下修-20220824.xlsx', '不向下修-20220925.xlsx', # '不向下修-20221025.xlsx' ] for path in path_list: df = pd.read_excel(os.path.join('../data', path), index_col=None, dtype={'正股代码': str, '代码': str}) for index, row in df.iterrows(): code = row['代码'] announce_date = row['公告日期'] if not doc.find_one({'代码': code, '公告日期': announce_date}): try: re_calculate_date = row['重新计算日期'] except: re_calculate_date = None doc.insert_one({ '代码': row['代码'], '转债名称': row['转债名称'], '重新计算日期': re_calculate_date, '公告日期': row['公告日期'], '正股代码': row['正股代码'], '正股名称': row['正股名称'], '公告标题': row['标题'], '公告链接': row['公告url']}) # print(item) # title = item['公告标题'] # if title.startswith('http'): # doc.update_one({'_id':item['_id']},{'$set':{'公告链接':title}}) def main(): # 不向下修 可能满足赎回 不提前赎回 kw = '不向下修' app = Announcement(kw) app.run() # 下载到本地 app.persistence() # 持久化到mongodb # app.update_only() if __name__ == '__main__': main() ================================================ FILE: datahub/js_file/encode_jsl.js ================================================ var CryptoJS = CryptoJS || (function(Math, undefined) { var create = Object.create || (function() { function F() {} return function(obj) { var subtype; F.prototype = obj; subtype = new F(); F.prototype = null; return subtype } }()); var C = {}; var C_lib = C.lib = {}; var Base = C_lib.Base = (function() { return { extend: function(overrides) { var subtype = create(this); if (overrides) { subtype.mixIn(overrides) } if (!subtype.hasOwnProperty("init") || this.init === subtype.init) { subtype.init = function() { subtype.$super.init.apply(this, arguments) } } subtype.init.prototype = subtype; subtype.$super = this; return subtype }, create: function() { var instance = this.extend(); instance.init.apply(instance, arguments); return instance }, init: function() {}, mixIn: function(properties) { for (var propertyName in properties) { if (properties.hasOwnProperty(propertyName)) { this[propertyName] = properties[propertyName] } } if (properties.hasOwnProperty("toString")) { this.toString = properties.toString } }, clone: function() { return this.init.prototype.extend(this) } } }()); var WordArray = C_lib.WordArray = Base.extend({ init: function(words, sigBytes) { words = this.words = words || []; if (sigBytes != undefined) { this.sigBytes = sigBytes } else { this.sigBytes = words.length * 4 } }, toString: function(encoder) { return (encoder || Hex).stringify(this) }, concat: function(wordArray) { var thisWords = this.words; var thatWords = wordArray.words; var thisSigBytes = this.sigBytes; var thatSigBytes = wordArray.sigBytes; this.clamp(); if (thisSigBytes % 4) { for (var i = 0; i < thatSigBytes; i++) { var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 255; thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8) } } else { for (var i = 0; i < thatSigBytes; i += 4) { thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2] } } this.sigBytes += thatSigBytes; return this }, clamp: function() { var words = this.words; var sigBytes = this.sigBytes; words[sigBytes >>> 2] &= 4294967295 << (32 - (sigBytes % 4) * 8); words.length = Math.ceil(sigBytes / 4) }, clone: function() { var clone = Base.clone.call(this); clone.words = this.words.slice(0); return clone }, random: function(nBytes) { var words = []; var r = (function(m_w) { var m_w = m_w; var m_z = 987654321; var mask = 4294967295; return function() { m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & mask; m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & mask; var result = ((m_z << 16) + m_w) & mask; result /= 4294967296; result += 0.5; return result * (Math.random() > 0.5 ? 1 : -1) } } ); for (var i = 0, rcache; i < nBytes; i += 4) { var _r = r((rcache || Math.random()) * 4294967296); rcache = _r() * 987654071; words.push((_r() * 4294967296) | 0) } return new WordArray.init(words,nBytes) } }); var C_enc = C.enc = {}; var Hex = C_enc.Hex = { stringify: function(wordArray) { var words = wordArray.words; var sigBytes = wordArray.sigBytes; var hexChars = []; for (var i = 0; i < sigBytes; i++) { var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 255; hexChars.push((bite >>> 4).toString(16)); hexChars.push((bite & 15).toString(16)) } return hexChars.join("") }, parse: function(hexStr) { var hexStrLength = hexStr.length; var words = []; for (var i = 0; i < hexStrLength; i += 2) { words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4) } return new WordArray.init(words,hexStrLength / 2) } }; var Latin1 = C_enc.Latin1 = { stringify: function(wordArray) { var words = wordArray.words; var sigBytes = wordArray.sigBytes; var latin1Chars = []; for (var i = 0; i < sigBytes; i++) { var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 255; latin1Chars.push(String.fromCharCode(bite)) } return latin1Chars.join("") }, parse: function(latin1Str) { var latin1StrLength = latin1Str.length; var words = []; for (var i = 0; i < latin1StrLength; i++) { words[i >>> 2] |= (latin1Str.charCodeAt(i) & 255) << (24 - (i % 4) * 8) } return new WordArray.init(words,latin1StrLength) } }; var Utf8 = C_enc.Utf8 = { stringify: function(wordArray) { try { return decodeURIComponent(escape(Latin1.stringify(wordArray))) } catch (e) { throw new Error("Malformed UTF-8 data") } }, parse: function(utf8Str) { return Latin1.parse(unescape(encodeURIComponent(utf8Str))) } }; var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ reset: function() { this._data = new WordArray.init(); this._nDataBytes = 0 }, _append: function(data) { if (typeof data == "string") { data = Utf8.parse(data) } this._data.concat(data); this._nDataBytes += data.sigBytes }, _process: function(doFlush) { var data = this._data; var dataWords = data.words; var dataSigBytes = data.sigBytes; var blockSize = this.blockSize; var blockSizeBytes = blockSize * 4; var nBlocksReady = dataSigBytes / blockSizeBytes; if (doFlush) { nBlocksReady = Math.ceil(nBlocksReady) } else { nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0) } var nWordsReady = nBlocksReady * blockSize; var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); if (nWordsReady) { for (var offset = 0; offset < nWordsReady; offset += blockSize) { this._doProcessBlock(dataWords, offset) } var processedWords = dataWords.splice(0, nWordsReady); data.sigBytes -= nBytesReady } return new WordArray.init(processedWords,nBytesReady) }, clone: function() { var clone = Base.clone.call(this); clone._data = this._data.clone(); return clone }, _minBufferSize: 0 }); var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ cfg: Base.extend(), init: function(cfg) { this.cfg = this.cfg.extend(cfg); this.reset() }, reset: function() { BufferedBlockAlgorithm.reset.call(this); this._doReset() }, update: function(messageUpdate) { this._append(messageUpdate); this._process(); return this }, finalize: function(messageUpdate) { if (messageUpdate) { this._append(messageUpdate) } var hash = this._doFinalize(); return hash }, blockSize: 512 / 32, _createHelper: function(hasher) { return function(message, cfg) { return new hasher.init(cfg).finalize(message) } }, _createHmacHelper: function(hasher) { return function(message, key) { return new C_algo.HMAC.init(hasher,key).finalize(message) } } }); var C_algo = C.algo = {}; return C }(Math)); (function() { var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var C_enc = C.enc; var Base64 = C_enc.Base64 = { stringify: function(wordArray) { var words = wordArray.words; var sigBytes = wordArray.sigBytes; var map = this._map; wordArray.clamp(); var base64Chars = []; for (var i = 0; i < sigBytes; i += 3) { var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 255; var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 255; var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 255; var triplet = (byte1 << 16) | (byte2 << 8) | byte3; for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 63)) } } var paddingChar = map.charAt(64); if (paddingChar) { while (base64Chars.length % 4) { base64Chars.push(paddingChar) } } return base64Chars.join("") }, parse: function(base64Str) { var base64StrLength = base64Str.length; var map = this._map; var reverseMap = this._reverseMap; if (!reverseMap) { reverseMap = this._reverseMap = []; for (var j = 0; j < map.length; j++) { reverseMap[map.charCodeAt(j)] = j } } var paddingChar = map.charAt(64); if (paddingChar) { var paddingIndex = base64Str.indexOf(paddingChar); if (paddingIndex !== -1) { base64StrLength = paddingIndex } } return parseLoop(base64Str, base64StrLength, reverseMap) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" }; function parseLoop(base64Str, base64StrLength, reverseMap) { var words = []; var nBytes = 0; for (var i = 0; i < base64StrLength; i++) { if (i % 4) { var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); nBytes++ } } return WordArray.create(words, nBytes) } }()); (function(Math) { var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_algo = C.algo; var T = []; (function() { for (var i = 0; i < 64; i++) { T[i] = (Math.abs(Math.sin(i + 1)) * 4294967296) | 0 } }()); var MD5 = C_algo.MD5 = Hasher.extend({ _doReset: function() { this._hash = new WordArray.init([1732584193, 4023233417, 2562383102, 271733878]) }, _doProcessBlock: function(M, offset) { for (var i = 0; i < 16; i++) { var offset_i = offset + i; var M_offset_i = M[offset_i]; M[offset_i] = ((((M_offset_i << 8) | (M_offset_i >>> 24)) & 16711935) | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 4278255360)) } var H = this._hash.words; var M_offset_0 = M[offset + 0]; var M_offset_1 = M[offset + 1]; var M_offset_2 = M[offset + 2]; var M_offset_3 = M[offset + 3]; var M_offset_4 = M[offset + 4]; var M_offset_5 = M[offset + 5]; var M_offset_6 = M[offset + 6]; var M_offset_7 = M[offset + 7]; var M_offset_8 = M[offset + 8]; var M_offset_9 = M[offset + 9]; var M_offset_10 = M[offset + 10]; var M_offset_11 = M[offset + 11]; var M_offset_12 = M[offset + 12]; var M_offset_13 = M[offset + 13]; var M_offset_14 = M[offset + 14]; var M_offset_15 = M[offset + 15]; var a = H[0]; var b = H[1]; var c = H[2]; var d = H[3]; a = FF(a, b, c, d, M_offset_0, 7, T[0]); d = FF(d, a, b, c, M_offset_1, 12, T[1]); c = FF(c, d, a, b, M_offset_2, 17, T[2]); b = FF(b, c, d, a, M_offset_3, 22, T[3]); a = FF(a, b, c, d, M_offset_4, 7, T[4]); d = FF(d, a, b, c, M_offset_5, 12, T[5]); c = FF(c, d, a, b, M_offset_6, 17, T[6]); b = FF(b, c, d, a, M_offset_7, 22, T[7]); a = FF(a, b, c, d, M_offset_8, 7, T[8]); d = FF(d, a, b, c, M_offset_9, 12, T[9]); c = FF(c, d, a, b, M_offset_10, 17, T[10]); b = FF(b, c, d, a, M_offset_11, 22, T[11]); a = FF(a, b, c, d, M_offset_12, 7, T[12]); d = FF(d, a, b, c, M_offset_13, 12, T[13]); c = FF(c, d, a, b, M_offset_14, 17, T[14]); b = FF(b, c, d, a, M_offset_15, 22, T[15]); a = GG(a, b, c, d, M_offset_1, 5, T[16]); d = GG(d, a, b, c, M_offset_6, 9, T[17]); c = GG(c, d, a, b, M_offset_11, 14, T[18]); b = GG(b, c, d, a, M_offset_0, 20, T[19]); a = GG(a, b, c, d, M_offset_5, 5, T[20]); d = GG(d, a, b, c, M_offset_10, 9, T[21]); c = GG(c, d, a, b, M_offset_15, 14, T[22]); b = GG(b, c, d, a, M_offset_4, 20, T[23]); a = GG(a, b, c, d, M_offset_9, 5, T[24]); d = GG(d, a, b, c, M_offset_14, 9, T[25]); c = GG(c, d, a, b, M_offset_3, 14, T[26]); b = GG(b, c, d, a, M_offset_8, 20, T[27]); a = GG(a, b, c, d, M_offset_13, 5, T[28]); d = GG(d, a, b, c, M_offset_2, 9, T[29]); c = GG(c, d, a, b, M_offset_7, 14, T[30]); b = GG(b, c, d, a, M_offset_12, 20, T[31]); a = HH(a, b, c, d, M_offset_5, 4, T[32]); d = HH(d, a, b, c, M_offset_8, 11, T[33]); c = HH(c, d, a, b, M_offset_11, 16, T[34]); b = HH(b, c, d, a, M_offset_14, 23, T[35]); a = HH(a, b, c, d, M_offset_1, 4, T[36]); d = HH(d, a, b, c, M_offset_4, 11, T[37]); c = HH(c, d, a, b, M_offset_7, 16, T[38]); b = HH(b, c, d, a, M_offset_10, 23, T[39]); a = HH(a, b, c, d, M_offset_13, 4, T[40]); d = HH(d, a, b, c, M_offset_0, 11, T[41]); c = HH(c, d, a, b, M_offset_3, 16, T[42]); b = HH(b, c, d, a, M_offset_6, 23, T[43]); a = HH(a, b, c, d, M_offset_9, 4, T[44]); d = HH(d, a, b, c, M_offset_12, 11, T[45]); c = HH(c, d, a, b, M_offset_15, 16, T[46]); b = HH(b, c, d, a, M_offset_2, 23, T[47]); a = II(a, b, c, d, M_offset_0, 6, T[48]); d = II(d, a, b, c, M_offset_7, 10, T[49]); c = II(c, d, a, b, M_offset_14, 15, T[50]); b = II(b, c, d, a, M_offset_5, 21, T[51]); a = II(a, b, c, d, M_offset_12, 6, T[52]); d = II(d, a, b, c, M_offset_3, 10, T[53]); c = II(c, d, a, b, M_offset_10, 15, T[54]); b = II(b, c, d, a, M_offset_1, 21, T[55]); a = II(a, b, c, d, M_offset_8, 6, T[56]); d = II(d, a, b, c, M_offset_15, 10, T[57]); c = II(c, d, a, b, M_offset_6, 15, T[58]); b = II(b, c, d, a, M_offset_13, 21, T[59]); a = II(a, b, c, d, M_offset_4, 6, T[60]); d = II(d, a, b, c, M_offset_11, 10, T[61]); c = II(c, d, a, b, M_offset_2, 15, T[62]); b = II(b, c, d, a, M_offset_9, 21, T[63]); H[0] = (H[0] + a) | 0; H[1] = (H[1] + b) | 0; H[2] = (H[2] + c) | 0; H[3] = (H[3] + d) | 0 }, _doFinalize: function() { var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; dataWords[nBitsLeft >>> 5] |= 128 << (24 - nBitsLeft % 32); var nBitsTotalH = Math.floor(nBitsTotal / 4294967296); var nBitsTotalL = nBitsTotal; dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ((((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 16711935) | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 4278255360)); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ((((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 16711935) | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 4278255360)); data.sigBytes = (dataWords.length + 1) * 4; this._process(); var hash = this._hash; var H = hash.words; for (var i = 0; i < 4; i++) { var H_i = H[i]; H[i] = (((H_i << 8) | (H_i >>> 24)) & 16711935) | (((H_i << 24) | (H_i >>> 8)) & 4278255360) } return hash }, clone: function() { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone } }); function FF(a, b, c, d, x, s, t) { var n = a + ((b & c) | (~b & d)) + x + t; return ((n << s) | (n >>> (32 - s))) + b } function GG(a, b, c, d, x, s, t) { var n = a + ((b & d) | (c & ~d)) + x + t; return ((n << s) | (n >>> (32 - s))) + b } function HH(a, b, c, d, x, s, t) { var n = a + (b ^ c ^ d) + x + t; return ((n << s) | (n >>> (32 - s))) + b } function II(a, b, c, d, x, s, t) { var n = a + (c ^ (b | ~d)) + x + t; return ((n << s) | (n >>> (32 - s))) + b } C.MD5 = Hasher._createHelper(MD5); C.HmacMD5 = Hasher._createHmacHelper(MD5) }(Math)); (function() { var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_algo = C.algo; var W = []; var SHA1 = C_algo.SHA1 = Hasher.extend({ _doReset: function() { this._hash = new WordArray.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function(M, offset) { var H = this._hash.words; var a = H[0]; var b = H[1]; var c = H[2]; var d = H[3]; var e = H[4]; for (var i = 0; i < 80; i++) { if (i < 16) { W[i] = M[offset + i] | 0 } else { var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; W[i] = (n << 1) | (n >>> 31) } var t = ((a << 5) | (a >>> 27)) + e + W[i]; if (i < 20) { t += ((b & c) | (~b & d)) + 1518500249 } else { if (i < 40) { t += (b ^ c ^ d) + 1859775393 } else { if (i < 60) { t += ((b & c) | (b & d) | (c & d)) - 1894007588 } else { t += (b ^ c ^ d) - 899497514 } } } e = d; d = c; c = (b << 30) | (b >>> 2); b = a; a = t } H[0] = (H[0] + a) | 0; H[1] = (H[1] + b) | 0; H[2] = (H[2] + c) | 0; H[3] = (H[3] + d) | 0; H[4] = (H[4] + e) | 0 }, _doFinalize: function() { var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; dataWords[nBitsLeft >>> 5] |= 128 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 4294967296); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; data.sigBytes = dataWords.length * 4; this._process(); return this._hash }, clone: function() { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone } }); C.SHA1 = Hasher._createHelper(SHA1); C.HmacSHA1 = Hasher._createHmacHelper(SHA1) }()); (function(Math) { var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_algo = C.algo; var H = []; var K = []; (function() { function isPrime(n) { var sqrtN = Math.sqrt(n); for (var factor = 2; factor <= sqrtN; factor++) { if (!(n % factor)) { return false } } return true } function getFractionalBits(n) { return ((n - (n | 0)) * 4294967296) | 0 } var n = 2; var nPrime = 0; while (nPrime < 64) { if (isPrime(n)) { if (nPrime < 8) { H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)) } K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); nPrime++ } n++ } }()); var W = []; var SHA256 = C_algo.SHA256 = Hasher.extend({ _doReset: function() { this._hash = new WordArray.init(H.slice(0)) }, _doProcessBlock: function(M, offset) { var H = this._hash.words; var a = H[0]; var b = H[1]; var c = H[2]; var d = H[3]; var e = H[4]; var f = H[5]; var g = H[6]; var h = H[7]; for (var i = 0; i < 64; i++) { if (i < 16) { W[i] = M[offset + i] | 0 } else { var gamma0x = W[i - 15]; var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ ((gamma0x << 14) | (gamma0x >>> 18)) ^ (gamma0x >>> 3); var gamma1x = W[i - 2]; var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ ((gamma1x << 13) | (gamma1x >>> 19)) ^ (gamma1x >>> 10); W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] } var ch = (e & f) ^ (~e & g); var maj = (a & b) ^ (a & c) ^ (b & c); var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); var t1 = h + sigma1 + ch + K[i] + W[i]; var t2 = sigma0 + maj; h = g; g = f; f = e; e = (d + t1) | 0; d = c; c = b; b = a; a = (t1 + t2) | 0 } H[0] = (H[0] + a) | 0; H[1] = (H[1] + b) | 0; H[2] = (H[2] + c) | 0; H[3] = (H[3] + d) | 0; H[4] = (H[4] + e) | 0; H[5] = (H[5] + f) | 0; H[6] = (H[6] + g) | 0; H[7] = (H[7] + h) | 0 }, _doFinalize: function() { var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; dataWords[nBitsLeft >>> 5] |= 128 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 4294967296); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; data.sigBytes = dataWords.length * 4; this._process(); return this._hash }, clone: function() { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone } }); C.SHA256 = Hasher._createHelper(SHA256); C.HmacSHA256 = Hasher._createHmacHelper(SHA256) }(Math)); (function() { var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var C_enc = C.enc; var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { stringify: function(wordArray) { var words = wordArray.words; var sigBytes = wordArray.sigBytes; var utf16Chars = []; for (var i = 0; i < sigBytes; i += 2) { var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 65535; utf16Chars.push(String.fromCharCode(codePoint)) } return utf16Chars.join("") }, parse: function(utf16Str) { var utf16StrLength = utf16Str.length; var words = []; for (var i = 0; i < utf16StrLength; i++) { words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16) } return WordArray.create(words, utf16StrLength * 2) } }; C_enc.Utf16LE = { stringify: function(wordArray) { var words = wordArray.words; var sigBytes = wordArray.sigBytes; var utf16Chars = []; for (var i = 0; i < sigBytes; i += 2) { var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 65535); utf16Chars.push(String.fromCharCode(codePoint)) } return utf16Chars.join("") }, parse: function(utf16Str) { var utf16StrLength = utf16Str.length; var words = []; for (var i = 0; i < utf16StrLength; i++) { words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)) } return WordArray.create(words, utf16StrLength * 2) } }; function swapEndian(word) { return ((word << 8) & 4278255360) | ((word >>> 8) & 16711935) } }()); (function() { if (typeof ArrayBuffer != "function") { return } var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var superInit = WordArray.init; var subInit = WordArray.init = function(typedArray) { if (typedArray instanceof ArrayBuffer) { typedArray = new Uint8Array(typedArray) } if (typedArray instanceof Int8Array || (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || typedArray instanceof Int16Array || typedArray instanceof Uint16Array || typedArray instanceof Int32Array || typedArray instanceof Uint32Array || typedArray instanceof Float32Array || typedArray instanceof Float64Array) { typedArray = new Uint8Array(typedArray.buffer,typedArray.byteOffset,typedArray.byteLength) } if (typedArray instanceof Uint8Array) { var typedArrayByteLength = typedArray.byteLength; var words = []; for (var i = 0; i < typedArrayByteLength; i++) { words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8) } superInit.call(this, words, typedArrayByteLength) } else { superInit.apply(this, arguments) } } ; subInit.prototype = WordArray }()); (function(Math) { var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_algo = C.algo; var _zl = WordArray.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); var _zr = WordArray.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); var _sl = WordArray.create([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]); var _sr = WordArray.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]); var _hl = WordArray.create([0, 1518500249, 1859775393, 2400959708, 2840853838]); var _hr = WordArray.create([1352829926, 1548603684, 1836072691, 2053994217, 0]); var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ _doReset: function() { this._hash = WordArray.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function(M, offset) { for (var i = 0; i < 16; i++) { var offset_i = offset + i; var M_offset_i = M[offset_i]; M[offset_i] = ((((M_offset_i << 8) | (M_offset_i >>> 24)) & 16711935) | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 4278255360)) } var H = this._hash.words; var hl = _hl.words; var hr = _hr.words; var zl = _zl.words; var zr = _zr.words; var sl = _sl.words; var sr = _sr.words; var al, bl, cl, dl, el; var ar, br, cr, dr, er; ar = al = H[0]; br = bl = H[1]; cr = cl = H[2]; dr = dl = H[3]; er = el = H[4]; var t; for (var i = 0; i < 80; i += 1) { t = (al + M[offset + zl[i]]) | 0; if (i < 16) { t += f1(bl, cl, dl) + hl[0] } else { if (i < 32) { t += f2(bl, cl, dl) + hl[1] } else { if (i < 48) { t += f3(bl, cl, dl) + hl[2] } else { if (i < 64) { t += f4(bl, cl, dl) + hl[3] } else { t += f5(bl, cl, dl) + hl[4] } } } } t = t | 0; t = rotl(t, sl[i]); t = (t + el) | 0; al = el; el = dl; dl = rotl(cl, 10); cl = bl; bl = t; t = (ar + M[offset + zr[i]]) | 0; if (i < 16) { t += f5(br, cr, dr) + hr[0] } else { if (i < 32) { t += f4(br, cr, dr) + hr[1] } else { if (i < 48) { t += f3(br, cr, dr) + hr[2] } else { if (i < 64) { t += f2(br, cr, dr) + hr[3] } else { t += f1(br, cr, dr) + hr[4] } } } } t = t | 0; t = rotl(t, sr[i]); t = (t + er) | 0; ar = er; er = dr; dr = rotl(cr, 10); cr = br; br = t } t = (H[1] + cl + dr) | 0; H[1] = (H[2] + dl + er) | 0; H[2] = (H[3] + el + ar) | 0; H[3] = (H[4] + al + br) | 0; H[4] = (H[0] + bl + cr) | 0; H[0] = t }, _doFinalize: function() { var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; dataWords[nBitsLeft >>> 5] |= 128 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ((((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 16711935) | (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 4278255360)); data.sigBytes = (dataWords.length + 1) * 4; this._process(); var hash = this._hash; var H = hash.words; for (var i = 0; i < 5; i++) { var H_i = H[i]; H[i] = (((H_i << 8) | (H_i >>> 24)) & 16711935) | (((H_i << 24) | (H_i >>> 8)) & 4278255360) } return hash }, clone: function() { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone } }); function f1(x, y, z) { return ((x) ^ (y) ^ (z)) } function f2(x, y, z) { return (((x) & (y)) | ((~x) & (z))) } function f3(x, y, z) { return (((x) | (~(y))) ^ (z)) } function f4(x, y, z) { return (((x) & (z)) | ((y) & (~(z)))) } function f5(x, y, z) { return ((x) ^ ((y) | (~(z)))) } function rotl(x, n) { return (x << n) | (x >>> (32 - n)) } C.RIPEMD160 = Hasher._createHelper(RIPEMD160); C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160) }(Math)); (function() { var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var C_enc = C.enc; var Utf8 = C_enc.Utf8; var C_algo = C.algo; var HMAC = C_algo.HMAC = Base.extend({ init: function(hasher, key) { hasher = this._hasher = new hasher.init(); if (typeof key == "string") { key = Utf8.parse(key) } var hasherBlockSize = hasher.blockSize; var hasherBlockSizeBytes = hasherBlockSize * 4; if (key.sigBytes > hasherBlockSizeBytes) { key = hasher.finalize(key) } key.clamp(); var oKey = this._oKey = key.clone(); var iKey = this._iKey = key.clone(); var oKeyWords = oKey.words; var iKeyWords = iKey.words; for (var i = 0; i < hasherBlockSize; i++) { oKeyWords[i] ^= 1549556828; iKeyWords[i] ^= 909522486 } oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; this.reset() }, reset: function() { var hasher = this._hasher; hasher.reset(); hasher.update(this._iKey) }, update: function(messageUpdate) { this._hasher.update(messageUpdate); return this }, finalize: function(messageUpdate) { var hasher = this._hasher; var innerHash = hasher.finalize(messageUpdate); hasher.reset(); var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); return hmac } }) }()); (function() { var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var WordArray = C_lib.WordArray; var C_algo = C.algo; var SHA1 = C_algo.SHA1; var HMAC = C_algo.HMAC; var PBKDF2 = C_algo.PBKDF2 = Base.extend({ cfg: Base.extend({ keySize: 128 / 32, hasher: SHA1, iterations: 1 }), init: function(cfg) { this.cfg = this.cfg.extend(cfg) }, compute: function(password, salt) { var cfg = this.cfg; var hmac = HMAC.create(cfg.hasher, password); var derivedKey = WordArray.create(); var blockIndex = WordArray.create([1]); var derivedKeyWords = derivedKey.words; var blockIndexWords = blockIndex.words; var keySize = cfg.keySize; var iterations = cfg.iterations; while (derivedKeyWords.length < keySize) { var block = hmac.update(salt).finalize(blockIndex); hmac.reset(); var blockWords = block.words; var blockWordsLength = blockWords.length; var intermediate = block; for (var i = 1; i < iterations; i++) { intermediate = hmac.finalize(intermediate); hmac.reset(); var intermediateWords = intermediate.words; for (var j = 0; j < blockWordsLength; j++) { blockWords[j] ^= intermediateWords[j] } } derivedKey.concat(block); blockIndexWords[0]++ } derivedKey.sigBytes = keySize * 4; return derivedKey } }); C.PBKDF2 = function(password, salt, cfg) { return PBKDF2.create(cfg).compute(password, salt) } }()); (function() { var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var WordArray = C_lib.WordArray; var C_algo = C.algo; var MD5 = C_algo.MD5; var EvpKDF = C_algo.EvpKDF = Base.extend({ cfg: Base.extend({ keySize: 128 / 32, hasher: MD5, iterations: 1 }), init: function(cfg) { this.cfg = this.cfg.extend(cfg) }, compute: function(password, salt) { var cfg = this.cfg; var hasher = cfg.hasher.create(); var derivedKey = WordArray.create(); var derivedKeyWords = derivedKey.words; var keySize = cfg.keySize; var iterations = cfg.iterations; while (derivedKeyWords.length < keySize) { if (block) { hasher.update(block) } var block = hasher.update(password).finalize(salt); hasher.reset(); for (var i = 1; i < iterations; i++) { block = hasher.finalize(block); hasher.reset() } derivedKey.concat(block) } derivedKey.sigBytes = keySize * 4; return derivedKey } }); C.EvpKDF = function(password, salt, cfg) { return EvpKDF.create(cfg).compute(password, salt) } }()); (function() { var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var C_algo = C.algo; var SHA256 = C_algo.SHA256; var SHA224 = C_algo.SHA224 = SHA256.extend({ _doReset: function() { this._hash = new WordArray.init([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428]) }, _doFinalize: function() { var hash = SHA256._doFinalize.call(this); hash.sigBytes -= 4; return hash } }); C.SHA224 = SHA256._createHelper(SHA224); C.HmacSHA224 = SHA256._createHmacHelper(SHA224) }()); (function(undefined) { var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var X32WordArray = C_lib.WordArray; var C_x64 = C.x64 = {}; var X64Word = C_x64.Word = Base.extend({ init: function(high, low) { this.high = high; this.low = low } }); var X64WordArray = C_x64.WordArray = Base.extend({ init: function(words, sigBytes) { words = this.words = words || []; if (sigBytes != undefined) { this.sigBytes = sigBytes } else { this.sigBytes = words.length * 8 } }, toX32: function() { var x64Words = this.words; var x64WordsLength = x64Words.length; var x32Words = []; for (var i = 0; i < x64WordsLength; i++) { var x64Word = x64Words[i]; x32Words.push(x64Word.high); x32Words.push(x64Word.low) } return X32WordArray.create(x32Words, this.sigBytes) }, clone: function() { var clone = Base.clone.call(this); var words = clone.words = this.words.slice(0); var wordsLength = words.length; for (var i = 0; i < wordsLength; i++) { words[i] = words[i].clone() } return clone } }) }()); (function(Math) { var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var Hasher = C_lib.Hasher; var C_x64 = C.x64; var X64Word = C_x64.Word; var C_algo = C.algo; var RHO_OFFSETS = []; var PI_INDEXES = []; var ROUND_CONSTANTS = []; (function() { var x = 1 , y = 0; for (var t = 0; t < 24; t++) { RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; var newX = y % 5; var newY = (2 * x + 3 * y) % 5; x = newX; y = newY } for (var x = 0; x < 5; x++) { for (var y = 0; y < 5; y++) { PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5 } } var LFSR = 1; for (var i = 0; i < 24; i++) { var roundConstantMsw = 0; var roundConstantLsw = 0; for (var j = 0; j < 7; j++) { if (LFSR & 1) { var bitPosition = (1 << j) - 1; if (bitPosition < 32) { roundConstantLsw ^= 1 << bitPosition } else { roundConstantMsw ^= 1 << (bitPosition - 32) } } if (LFSR & 128) { LFSR = (LFSR << 1) ^ 113 } else { LFSR <<= 1 } } ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw) } }()); var T = []; (function() { for (var i = 0; i < 25; i++) { T[i] = X64Word.create() } }()); var SHA3 = C_algo.SHA3 = Hasher.extend({ cfg: Hasher.cfg.extend({ outputLength: 512 }), _doReset: function() { var state = this._state = []; for (var i = 0; i < 25; i++) { state[i] = new X64Word.init() } this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32 }, _doProcessBlock: function(M, offset) { var state = this._state; var nBlockSizeLanes = this.blockSize / 2; for (var i = 0; i < nBlockSizeLanes; i++) { var M2i = M[offset + 2 * i]; var M2i1 = M[offset + 2 * i + 1]; M2i = ((((M2i << 8) | (M2i >>> 24)) & 16711935) | (((M2i << 24) | (M2i >>> 8)) & 4278255360)); M2i1 = ((((M2i1 << 8) | (M2i1 >>> 24)) & 16711935) | (((M2i1 << 24) | (M2i1 >>> 8)) & 4278255360)); var lane = state[i]; lane.high ^= M2i1; lane.low ^= M2i } for (var round = 0; round < 24; round++) { for (var x = 0; x < 5; x++) { var tMsw = 0 , tLsw = 0; for (var y = 0; y < 5; y++) { var lane = state[x + 5 * y]; tMsw ^= lane.high; tLsw ^= lane.low } var Tx = T[x]; Tx.high = tMsw; Tx.low = tLsw } for (var x = 0; x < 5; x++) { var Tx4 = T[(x + 4) % 5]; var Tx1 = T[(x + 1) % 5]; var Tx1Msw = Tx1.high; var Tx1Lsw = Tx1.low; var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); for (var y = 0; y < 5; y++) { var lane = state[x + 5 * y]; lane.high ^= tMsw; lane.low ^= tLsw } } for (var laneIndex = 1; laneIndex < 25; laneIndex++) { var lane = state[laneIndex]; var laneMsw = lane.high; var laneLsw = lane.low; var rhoOffset = RHO_OFFSETS[laneIndex]; if (rhoOffset < 32) { var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)) } else { var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)) } var TPiLane = T[PI_INDEXES[laneIndex]]; TPiLane.high = tMsw; TPiLane.low = tLsw } var T0 = T[0]; var state0 = state[0]; T0.high = state0.high; T0.low = state0.low; for (var x = 0; x < 5; x++) { for (var y = 0; y < 5; y++) { var laneIndex = x + 5 * y; var lane = state[laneIndex]; var TLane = T[laneIndex]; var Tx1Lane = T[((x + 1) % 5) + 5 * y]; var Tx2Lane = T[((x + 2) % 5) + 5 * y]; lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low) } } var lane = state[0]; var roundConstant = ROUND_CONSTANTS[round]; lane.high ^= roundConstant.high; lane.low ^= roundConstant.low } }, _doFinalize: function() { var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; var blockSizeBits = this.blockSize * 32; dataWords[nBitsLeft >>> 5] |= 1 << (24 - nBitsLeft % 32); dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 128; data.sigBytes = dataWords.length * 4; this._process(); var state = this._state; var outputLengthBytes = this.cfg.outputLength / 8; var outputLengthLanes = outputLengthBytes / 8; var hashWords = []; for (var i = 0; i < outputLengthLanes; i++) { var lane = state[i]; var laneMsw = lane.high; var laneLsw = lane.low; laneMsw = ((((laneMsw << 8) | (laneMsw >>> 24)) & 16711935) | (((laneMsw << 24) | (laneMsw >>> 8)) & 4278255360)); laneLsw = ((((laneLsw << 8) | (laneLsw >>> 24)) & 16711935) | (((laneLsw << 24) | (laneLsw >>> 8)) & 4278255360)); hashWords.push(laneLsw); hashWords.push(laneMsw) } return new WordArray.init(hashWords,outputLengthBytes) }, clone: function() { var clone = Hasher.clone.call(this); var state = clone._state = this._state.slice(0); for (var i = 0; i < 25; i++) { state[i] = state[i].clone() } return clone } }); C.SHA3 = Hasher._createHelper(SHA3); C.HmacSHA3 = Hasher._createHmacHelper(SHA3) }(Math)); (function() { var C = CryptoJS; var C_lib = C.lib; var Hasher = C_lib.Hasher; var C_x64 = C.x64; var X64Word = C_x64.Word; var X64WordArray = C_x64.WordArray; var C_algo = C.algo; function X64Word_create() { return X64Word.create.apply(X64Word, arguments) } var K = [X64Word_create(1116352408, 3609767458), X64Word_create(1899447441, 602891725), X64Word_create(3049323471, 3964484399), X64Word_create(3921009573, 2173295548), X64Word_create(961987163, 4081628472), X64Word_create(1508970993, 3053834265), X64Word_create(2453635748, 2937671579), X64Word_create(2870763221, 3664609560), X64Word_create(3624381080, 2734883394), X64Word_create(310598401, 1164996542), X64Word_create(607225278, 1323610764), X64Word_create(1426881987, 3590304994), X64Word_create(1925078388, 4068182383), X64Word_create(2162078206, 991336113), X64Word_create(2614888103, 633803317), X64Word_create(3248222580, 3479774868), X64Word_create(3835390401, 2666613458), X64Word_create(4022224774, 944711139), X64Word_create(264347078, 2341262773), X64Word_create(604807628, 2007800933), X64Word_create(770255983, 1495990901), X64Word_create(1249150122, 1856431235), X64Word_create(1555081692, 3175218132), X64Word_create(1996064986, 2198950837), X64Word_create(2554220882, 3999719339), X64Word_create(2821834349, 766784016), X64Word_create(2952996808, 2566594879), X64Word_create(3210313671, 3203337956), X64Word_create(3336571891, 1034457026), X64Word_create(3584528711, 2466948901), X64Word_create(113926993, 3758326383), X64Word_create(338241895, 168717936), X64Word_create(666307205, 1188179964), X64Word_create(773529912, 1546045734), X64Word_create(1294757372, 1522805485), X64Word_create(1396182291, 2643833823), X64Word_create(1695183700, 2343527390), X64Word_create(1986661051, 1014477480), X64Word_create(2177026350, 1206759142), X64Word_create(2456956037, 344077627), X64Word_create(2730485921, 1290863460), X64Word_create(2820302411, 3158454273), X64Word_create(3259730800, 3505952657), X64Word_create(3345764771, 106217008), X64Word_create(3516065817, 3606008344), X64Word_create(3600352804, 1432725776), X64Word_create(4094571909, 1467031594), X64Word_create(275423344, 851169720), X64Word_create(430227734, 3100823752), X64Word_create(506948616, 1363258195), X64Word_create(659060556, 3750685593), X64Word_create(883997877, 3785050280), X64Word_create(958139571, 3318307427), X64Word_create(1322822218, 3812723403), X64Word_create(1537002063, 2003034995), X64Word_create(1747873779, 3602036899), X64Word_create(1955562222, 1575990012), X64Word_create(2024104815, 1125592928), X64Word_create(2227730452, 2716904306), X64Word_create(2361852424, 442776044), X64Word_create(2428436474, 593698344), X64Word_create(2756734187, 3733110249), X64Word_create(3204031479, 2999351573), X64Word_create(3329325298, 3815920427), X64Word_create(3391569614, 3928383900), X64Word_create(3515267271, 566280711), X64Word_create(3940187606, 3454069534), X64Word_create(4118630271, 4000239992), X64Word_create(116418474, 1914138554), X64Word_create(174292421, 2731055270), X64Word_create(289380356, 3203993006), X64Word_create(460393269, 320620315), X64Word_create(685471733, 587496836), X64Word_create(852142971, 1086792851), X64Word_create(1017036298, 365543100), X64Word_create(1126000580, 2618297676), X64Word_create(1288033470, 3409855158), X64Word_create(1501505948, 4234509866), X64Word_create(1607167915, 987167468), X64Word_create(1816402316, 1246189591)]; var W = []; (function() { for (var i = 0; i < 80; i++) { W[i] = X64Word_create() } }()); var SHA512 = C_algo.SHA512 = Hasher.extend({ _doReset: function() { this._hash = new X64WordArray.init([new X64Word.init(1779033703,4089235720), new X64Word.init(3144134277,2227873595), new X64Word.init(1013904242,4271175723), new X64Word.init(2773480762,1595750129), new X64Word.init(1359893119,2917565137), new X64Word.init(2600822924,725511199), new X64Word.init(528734635,4215389547), new X64Word.init(1541459225,327033209)]) }, _doProcessBlock: function(M, offset) { var H = this._hash.words; var H0 = H[0]; var H1 = H[1]; var H2 = H[2]; var H3 = H[3]; var H4 = H[4]; var H5 = H[5]; var H6 = H[6]; var H7 = H[7]; var H0h = H0.high; var H0l = H0.low; var H1h = H1.high; var H1l = H1.low; var H2h = H2.high; var H2l = H2.low; var H3h = H3.high; var H3l = H3.low; var H4h = H4.high; var H4l = H4.low; var H5h = H5.high; var H5l = H5.low; var H6h = H6.high; var H6l = H6.low; var H7h = H7.high; var H7l = H7.low; var ah = H0h; var al = H0l; var bh = H1h; var bl = H1l; var ch = H2h; var cl = H2l; var dh = H3h; var dl = H3l; var eh = H4h; var el = H4l; var fh = H5h; var fl = H5l; var gh = H6h; var gl = H6l; var hh = H7h; var hl = H7l; for (var i = 0; i < 80; i++) { var Wi = W[i]; if (i < 16) { var Wih = Wi.high = M[offset + i * 2] | 0; var Wil = Wi.low = M[offset + i * 2 + 1] | 0 } else { var gamma0x = W[i - 15]; var gamma0xh = gamma0x.high; var gamma0xl = gamma0x.low; var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); var gamma1x = W[i - 2]; var gamma1xh = gamma1x.high; var gamma1xl = gamma1x.low; var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); var Wi7 = W[i - 7]; var Wi7h = Wi7.high; var Wi7l = Wi7.low; var Wi16 = W[i - 16]; var Wi16h = Wi16.high; var Wi16l = Wi16.low; var Wil = gamma0l + Wi7l; var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); var Wil = Wil + gamma1l; var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); var Wil = Wil + Wi16l; var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); Wi.high = Wih; Wi.low = Wil } var chh = (eh & fh) ^ (~eh & gh); var chl = (el & fl) ^ (~el & gl); var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); var majl = (al & bl) ^ (al & cl) ^ (bl & cl); var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); var Ki = K[i]; var Kih = Ki.high; var Kil = Ki.low; var t1l = hl + sigma1l; var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); var t1l = t1l + chl; var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); var t1l = t1l + Kil; var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); var t1l = t1l + Wil; var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); var t2l = sigma0l + majl; var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); hh = gh; hl = gl; gh = fh; gl = fl; fh = eh; fl = el; el = (dl + t1l) | 0; eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; dh = ch; dl = cl; ch = bh; cl = bl; bh = ah; bl = al; al = (t1l + t2l) | 0; ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0 } H0l = H0.low = (H0l + al); H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); H1l = H1.low = (H1l + bl); H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); H2l = H2.low = (H2l + cl); H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); H3l = H3.low = (H3l + dl); H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); H4l = H4.low = (H4l + el); H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); H5l = H5.low = (H5l + fl); H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); H6l = H6.low = (H6l + gl); H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); H7l = H7.low = (H7l + hl); H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)) }, _doFinalize: function() { var data = this._data; var dataWords = data.words; var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; dataWords[nBitsLeft >>> 5] |= 128 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 4294967296); dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; data.sigBytes = dataWords.length * 4; this._process(); var hash = this._hash.toX32(); return hash }, clone: function() { var clone = Hasher.clone.call(this); clone._hash = this._hash.clone(); return clone }, blockSize: 1024 / 32 }); C.SHA512 = Hasher._createHelper(SHA512); C.HmacSHA512 = Hasher._createHmacHelper(SHA512) }()); (function() { var C = CryptoJS; var C_x64 = C.x64; var X64Word = C_x64.Word; var X64WordArray = C_x64.WordArray; var C_algo = C.algo; var SHA512 = C_algo.SHA512; var SHA384 = C_algo.SHA384 = SHA512.extend({ _doReset: function() { this._hash = new X64WordArray.init([new X64Word.init(3418070365,3238371032), new X64Word.init(1654270250,914150663), new X64Word.init(2438529370,812702999), new X64Word.init(355462360,4144912697), new X64Word.init(1731405415,4290775857), new X64Word.init(2394180231,1750603025), new X64Word.init(3675008525,1694076839), new X64Word.init(1203062813,3204075428)]) }, _doFinalize: function() { var hash = SHA512._doFinalize.call(this); hash.sigBytes -= 16; return hash } }); C.SHA384 = SHA512._createHelper(SHA384); C.HmacSHA384 = SHA512._createHmacHelper(SHA384) }()); CryptoJS.lib.Cipher || (function(undefined) { var C = CryptoJS; var C_lib = C.lib; var Base = C_lib.Base; var WordArray = C_lib.WordArray; var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; var C_enc = C.enc; var Utf8 = C_enc.Utf8; var Base64 = C_enc.Base64; var C_algo = C.algo; var EvpKDF = C_algo.EvpKDF; var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ cfg: Base.extend(), createEncryptor: function(key, cfg) { return this.create(this._ENC_XFORM_MODE, key, cfg) }, createDecryptor: function(key, cfg) { return this.create(this._DEC_XFORM_MODE, key, cfg) }, init: function(xformMode, key, cfg) { this.cfg = this.cfg.extend(cfg); this._xformMode = xformMode; this._key = key; this.reset() }, reset: function() { BufferedBlockAlgorithm.reset.call(this); this._doReset() }, process: function(dataUpdate) { this._append(dataUpdate); return this._process() }, finalize: function(dataUpdate) { if (dataUpdate) { this._append(dataUpdate) } var finalProcessedData = this._doFinalize(); return finalProcessedData }, keySize: 128 / 32, ivSize: 128 / 32, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: (function() { function selectCipherStrategy(key) { if (typeof key == "string") { return PasswordBasedCipher } else { return SerializableCipher } } return function(cipher) { return { encrypt: function(message, key, cfg) { return selectCipherStrategy(key).encrypt(cipher, message, key, cfg) }, decrypt: function(ciphertext, key, cfg) { return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg) } } } }()) }); var StreamCipher = C_lib.StreamCipher = Cipher.extend({ _doFinalize: function() { var finalProcessedBlocks = this._process(!!"flush"); return finalProcessedBlocks }, blockSize: 1 }); var C_mode = C.mode = {}; var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ createEncryptor: function(cipher, iv) { return this.Encryptor.create(cipher, iv) }, createDecryptor: function(cipher, iv) { return this.Decryptor.create(cipher, iv) }, init: function(cipher, iv) { this._cipher = cipher; this._iv = iv } }); var CBC = C_mode.CBC = (function() { var CBC = BlockCipherMode.extend(); CBC.Encryptor = CBC.extend({ processBlock: function(words, offset) { var cipher = this._cipher; var blockSize = cipher.blockSize; xorBlock.call(this, words, offset, blockSize); cipher.encryptBlock(words, offset); this._prevBlock = words.slice(offset, offset + blockSize) } }); CBC.Decryptor = CBC.extend({ processBlock: function(words, offset) { var cipher = this._cipher; var blockSize = cipher.blockSize; var thisBlock = words.slice(offset, offset + blockSize); cipher.decryptBlock(words, offset); xorBlock.call(this, words, offset, blockSize); this._prevBlock = thisBlock } }); function xorBlock(words, offset, blockSize) { var iv = this._iv; if (iv) { var block = iv; this._iv = undefined } else { var block = this._prevBlock } for (var i = 0; i < blockSize; i++) { words[offset + i] ^= block[i] } } return CBC }()); var C_pad = C.pad = {}; var Pkcs7 = C_pad.Pkcs7 = { pad: function(data, blockSize) { var blockSizeBytes = blockSize * 4; var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; var paddingWords = []; for (var i = 0; i < nPaddingBytes; i += 4) { paddingWords.push(paddingWord) } var padding = WordArray.create(paddingWords, nPaddingBytes); data.concat(padding) }, unpad: function(data) { var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 255; data.sigBytes -= nPaddingBytes } }; var BlockCipher = C_lib.BlockCipher = Cipher.extend({ cfg: Cipher.cfg.extend({ mode: CBC, padding: Pkcs7 }), reset: function() { Cipher.reset.call(this); var cfg = this.cfg; var iv = cfg.iv; var mode = cfg.mode; if (this._xformMode == this._ENC_XFORM_MODE) { var modeCreator = mode.createEncryptor } else { var modeCreator = mode.createDecryptor; this._minBufferSize = 1 } if (this._mode && this._mode.__creator == modeCreator) { this._mode.init(this, iv && iv.words) } else { this._mode = modeCreator.call(mode, this, iv && iv.words); this._mode.__creator = modeCreator } }, _doProcessBlock: function(words, offset) { this._mode.processBlock(words, offset) }, _doFinalize: function() { var padding = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { padding.pad(this._data, this.blockSize); var finalProcessedBlocks = this._process(!!"flush") } else { var finalProcessedBlocks = this._process(!!"flush"); padding.unpad(finalProcessedBlocks) } return finalProcessedBlocks }, blockSize: 128 / 32 }); var CipherParams = C_lib.CipherParams = Base.extend({ init: function(cipherParams) { this.mixIn(cipherParams) }, toString: function(formatter) { return (formatter || this.formatter).stringify(this) } }); var C_format = C.format = {}; var OpenSSLFormatter = C_format.OpenSSL = { stringify: function(cipherParams) { var ciphertext = cipherParams.ciphertext; var salt = cipherParams.salt; if (salt) { var wordArray = WordArray.create([1398893684, 1701076831]).concat(salt).concat(ciphertext) } else { var wordArray = ciphertext } return wordArray.toString(Base64) }, parse: function(openSSLStr) { var ciphertext = Base64.parse(openSSLStr); var ciphertextWords = ciphertext.words; if (ciphertextWords[0] == 1398893684 && ciphertextWords[1] == 1701076831) { var salt = WordArray.create(ciphertextWords.slice(2, 4)); ciphertextWords.splice(0, 4); ciphertext.sigBytes -= 16 } return CipherParams.create({ ciphertext: ciphertext, salt: salt }) } }; var SerializableCipher = C_lib.SerializableCipher = Base.extend({ cfg: Base.extend({ format: OpenSSLFormatter }), encrypt: function(cipher, message, key, cfg) { cfg = this.cfg.extend(cfg); var encryptor = cipher.createEncryptor(key, cfg); var ciphertext = encryptor.finalize(message); var cipherCfg = encryptor.cfg; return CipherParams.create({ ciphertext: ciphertext, key: key, iv: cipherCfg.iv, algorithm: cipher, mode: cipherCfg.mode, padding: cipherCfg.padding, blockSize: cipher.blockSize, formatter: cfg.format }) }, decrypt: function(cipher, ciphertext, key, cfg) { cfg = this.cfg.extend(cfg); ciphertext = this._parse(ciphertext, cfg.format); var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); return plaintext }, _parse: function(ciphertext, format) { if (typeof ciphertext == "string") { return format.parse(ciphertext, this) } else { return ciphertext } } }); var C_kdf = C.kdf = {}; var OpenSSLKdf = C_kdf.OpenSSL = { execute: function(password, keySize, ivSize, salt) { if (!salt) { salt = WordArray.random(64 / 8) } var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); key.sigBytes = keySize * 4; return CipherParams.create({ key: key, iv: iv, salt: salt }) } }; var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ cfg: SerializableCipher.cfg.extend({ kdf: OpenSSLKdf }), encrypt: function(cipher, message, password, cfg) { cfg = this.cfg.extend(cfg); var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); cfg.iv = derivedParams.iv; var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); ciphertext.mixIn(derivedParams); return ciphertext }, decrypt: function(cipher, ciphertext, password, cfg) { cfg = this.cfg.extend(cfg); ciphertext = this._parse(ciphertext, cfg.format); var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); cfg.iv = derivedParams.iv; var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); return plaintext } }) }()); CryptoJS.mode.CFB = (function() { var CFB = CryptoJS.lib.BlockCipherMode.extend(); CFB.Encryptor = CFB.extend({ processBlock: function(words, offset) { var cipher = this._cipher; var blockSize = cipher.blockSize; generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); this._prevBlock = words.slice(offset, offset + blockSize) } }); CFB.Decryptor = CFB.extend({ processBlock: function(words, offset) { var cipher = this._cipher; var blockSize = cipher.blockSize; var thisBlock = words.slice(offset, offset + blockSize); generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); this._prevBlock = thisBlock } }); function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { var iv = this._iv; if (iv) { var keystream = iv.slice(0); this._iv = undefined } else { var keystream = this._prevBlock } cipher.encryptBlock(keystream, 0); for (var i = 0; i < blockSize; i++) { words[offset + i] ^= keystream[i] } } return CFB }()); CryptoJS.mode.ECB = (function() { var ECB = CryptoJS.lib.BlockCipherMode.extend(); ECB.Encryptor = ECB.extend({ processBlock: function(words, offset) { this._cipher.encryptBlock(words, offset) } }); ECB.Decryptor = ECB.extend({ processBlock: function(words, offset) { this._cipher.decryptBlock(words, offset) } }); return ECB }()); CryptoJS.pad.AnsiX923 = { pad: function(data, blockSize) { var dataSigBytes = data.sigBytes; var blockSizeBytes = blockSize * 4; var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; var lastBytePos = dataSigBytes + nPaddingBytes - 1; data.clamp(); data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); data.sigBytes += nPaddingBytes }, unpad: function(data) { var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 255; data.sigBytes -= nPaddingBytes } }; CryptoJS.pad.Iso10126 = { pad: function(data, blockSize) { var blockSizeBytes = blockSize * 4; var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)) }, unpad: function(data) { var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 255; data.sigBytes -= nPaddingBytes } }; CryptoJS.pad.Iso97971 = { pad: function(data, blockSize) { data.concat(CryptoJS.lib.WordArray.create([2147483648], 1)); CryptoJS.pad.ZeroPadding.pad(data, blockSize) }, unpad: function(data) { CryptoJS.pad.ZeroPadding.unpad(data); data.sigBytes-- } }; CryptoJS.mode.OFB = (function() { var OFB = CryptoJS.lib.BlockCipherMode.extend(); var Encryptor = OFB.Encryptor = OFB.extend({ processBlock: function(words, offset) { var cipher = this._cipher; var blockSize = cipher.blockSize; var iv = this._iv; var keystream = this._keystream; if (iv) { keystream = this._keystream = iv.slice(0); this._iv = undefined } cipher.encryptBlock(keystream, 0); for (var i = 0; i < blockSize; i++) { words[offset + i] ^= keystream[i] } } }); OFB.Decryptor = Encryptor; return OFB }()); CryptoJS.pad.NoPadding = { pad: function() {}, unpad: function() {} }; (function(undefined) { var C = CryptoJS; var C_lib = C.lib; var CipherParams = C_lib.CipherParams; var C_enc = C.enc; var Hex = C_enc.Hex; var C_format = C.format; var HexFormatter = C_format.Hex = { stringify: function(cipherParams) { return cipherParams.ciphertext.toString(Hex) }, parse: function(input) { var ciphertext = Hex.parse(input); return CipherParams.create({ ciphertext: ciphertext }) } } }()); (function() { var C = CryptoJS; var C_lib = C.lib; var BlockCipher = C_lib.BlockCipher; var C_algo = C.algo; var SBOX = []; var INV_SBOX = []; var SUB_MIX_0 = []; var SUB_MIX_1 = []; var SUB_MIX_2 = []; var SUB_MIX_3 = []; var INV_SUB_MIX_0 = []; var INV_SUB_MIX_1 = []; var INV_SUB_MIX_2 = []; var INV_SUB_MIX_3 = []; (function() { var d = []; for (var i = 0; i < 256; i++) { if (i < 128) { d[i] = i << 1 } else { d[i] = (i << 1) ^ 283 } } var x = 0; var xi = 0; for (var i = 0; i < 256; i++) { var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); sx = (sx >>> 8) ^ (sx & 255) ^ 99; SBOX[x] = sx; INV_SBOX[sx] = x; var x2 = d[x]; var x4 = d[x2]; var x8 = d[x4]; var t = (d[sx] * 257) ^ (sx * 16843008); SUB_MIX_0[x] = (t << 24) | (t >>> 8); SUB_MIX_1[x] = (t << 16) | (t >>> 16); SUB_MIX_2[x] = (t << 8) | (t >>> 24); SUB_MIX_3[x] = t; var t = (x8 * 16843009) ^ (x4 * 65537) ^ (x2 * 257) ^ (x * 16843008); INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); INV_SUB_MIX_3[sx] = t; if (!x) { x = xi = 1 } else { x = x2 ^ d[d[d[x8 ^ x2]]]; xi ^= d[d[xi]] } } }()); var RCON = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]; var AES = C_algo.AES = BlockCipher.extend({ _doReset: function() { if (this._nRounds && this._keyPriorReset === this._key) { return } var key = this._keyPriorReset = this._key; var keyWords = key.words; var keySize = key.sigBytes / 4; var nRounds = this._nRounds = keySize + 6; var ksRows = (nRounds + 1) * 4; var keySchedule = this._keySchedule = []; for (var ksRow = 0; ksRow < ksRows; ksRow++) { if (ksRow < keySize) { keySchedule[ksRow] = keyWords[ksRow] } else { var t = keySchedule[ksRow - 1]; if (!(ksRow % keySize)) { t = (t << 8) | (t >>> 24); t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 255] << 16) | (SBOX[(t >>> 8) & 255] << 8) | SBOX[t & 255]; t ^= RCON[(ksRow / keySize) | 0] << 24 } else { if (keySize > 6 && ksRow % keySize == 4) { t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 255] << 16) | (SBOX[(t >>> 8) & 255] << 8) | SBOX[t & 255] } } keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t } } var invKeySchedule = this._invKeySchedule = []; for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { var ksRow = ksRows - invKsRow; if (invKsRow % 4) { var t = keySchedule[ksRow] } else { var t = keySchedule[ksRow - 4] } if (invKsRow < 4 || ksRow <= 4) { invKeySchedule[invKsRow] = t } else { invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 255]] ^ INV_SUB_MIX_2[SBOX[(t >>> 8) & 255]] ^ INV_SUB_MIX_3[SBOX[t & 255]] } } }, encryptBlock: function(M, offset) { this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) }, decryptBlock: function(M, offset) { var t = M[offset + 1]; M[offset + 1] = M[offset + 3]; M[offset + 3] = t; this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); var t = M[offset + 1]; M[offset + 1] = M[offset + 3]; M[offset + 3] = t }, _doCryptBlock: function(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { var nRounds = this._nRounds; var s0 = M[offset] ^ keySchedule[0]; var s1 = M[offset + 1] ^ keySchedule[1]; var s2 = M[offset + 2] ^ keySchedule[2]; var s3 = M[offset + 3] ^ keySchedule[3]; var ksRow = 4; for (var round = 1; round < nRounds; round++) { var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 255] ^ SUB_MIX_2[(s2 >>> 8) & 255] ^ SUB_MIX_3[s3 & 255] ^ keySchedule[ksRow++]; var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 255] ^ SUB_MIX_2[(s3 >>> 8) & 255] ^ SUB_MIX_3[s0 & 255] ^ keySchedule[ksRow++]; var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 255] ^ SUB_MIX_2[(s0 >>> 8) & 255] ^ SUB_MIX_3[s1 & 255] ^ keySchedule[ksRow++]; var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 255] ^ SUB_MIX_2[(s1 >>> 8) & 255] ^ SUB_MIX_3[s2 & 255] ^ keySchedule[ksRow++]; s0 = t0; s1 = t1; s2 = t2; s3 = t3 } var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 255] << 16) | (SBOX[(s2 >>> 8) & 255] << 8) | SBOX[s3 & 255]) ^ keySchedule[ksRow++]; var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 255] << 16) | (SBOX[(s3 >>> 8) & 255] << 8) | SBOX[s0 & 255]) ^ keySchedule[ksRow++]; var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 255] << 16) | (SBOX[(s0 >>> 8) & 255] << 8) | SBOX[s1 & 255]) ^ keySchedule[ksRow++]; var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 255] << 16) | (SBOX[(s1 >>> 8) & 255] << 8) | SBOX[s2 & 255]) ^ keySchedule[ksRow++]; M[offset] = t0; M[offset + 1] = t1; M[offset + 2] = t2; M[offset + 3] = t3 }, keySize: 256 / 32 }); C.AES = BlockCipher._createHelper(AES) }()); (function() { var C = CryptoJS; var C_lib = C.lib; var WordArray = C_lib.WordArray; var BlockCipher = C_lib.BlockCipher; var C_algo = C.algo; var PC1 = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4]; var PC2 = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32]; var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; var SBOX_P = [{ 0: 8421888, 268435456: 32768, 536870912: 8421378, 805306368: 2, 1073741824: 512, 1342177280: 8421890, 1610612736: 8389122, 1879048192: 8388608, 2147483648: 514, 2415919104: 8389120, 2684354560: 33280, 2952790016: 8421376, 3221225472: 32770, 3489660928: 8388610, 3758096384: 0, 4026531840: 33282, 134217728: 0, 402653184: 8421890, 671088640: 33282, 939524096: 32768, 1207959552: 8421888, 1476395008: 512, 1744830464: 8421378, 2013265920: 2, 2281701376: 8389120, 2550136832: 33280, 2818572288: 8421376, 3087007744: 8389122, 3355443200: 8388610, 3623878656: 32770, 3892314112: 514, 4160749568: 8388608, 1: 32768, 268435457: 2, 536870913: 8421888, 805306369: 8388608, 1073741825: 8421378, 1342177281: 33280, 1610612737: 512, 1879048193: 8389122, 2147483649: 8421890, 2415919105: 8421376, 2684354561: 8388610, 2952790017: 33282, 3221225473: 514, 3489660929: 8389120, 3758096385: 32770, 4026531841: 0, 134217729: 8421890, 402653185: 8421376, 671088641: 8388608, 939524097: 512, 1207959553: 32768, 1476395009: 8388610, 1744830465: 2, 2013265921: 33282, 2281701377: 32770, 2550136833: 8389122, 2818572289: 514, 3087007745: 8421888, 3355443201: 8389120, 3623878657: 0, 3892314113: 33280, 4160749569: 8421378 }, { 0: 1074282512, 16777216: 16384, 33554432: 524288, 50331648: 1074266128, 67108864: 1073741840, 83886080: 1074282496, 100663296: 1073758208, 117440512: 16, 134217728: 540672, 150994944: 1073758224, 167772160: 1073741824, 184549376: 540688, 201326592: 524304, 218103808: 0, 234881024: 16400, 251658240: 1074266112, 8388608: 1073758208, 25165824: 540688, 41943040: 16, 58720256: 1073758224, 75497472: 1074282512, 92274688: 1073741824, 109051904: 524288, 125829120: 1074266128, 142606336: 524304, 159383552: 0, 176160768: 16384, 192937984: 1074266112, 209715200: 1073741840, 226492416: 540672, 243269632: 1074282496, 260046848: 16400, 268435456: 0, 285212672: 1074266128, 301989888: 1073758224, 318767104: 1074282496, 335544320: 1074266112, 352321536: 16, 369098752: 540688, 385875968: 16384, 402653184: 16400, 419430400: 524288, 436207616: 524304, 452984832: 1073741840, 469762048: 540672, 486539264: 1073758208, 503316480: 1073741824, 520093696: 1074282512, 276824064: 540688, 293601280: 524288, 310378496: 1074266112, 327155712: 16384, 343932928: 1073758208, 360710144: 1074282512, 377487360: 16, 394264576: 1073741824, 411041792: 1074282496, 427819008: 1073741840, 444596224: 1073758224, 461373440: 524304, 478150656: 0, 494927872: 16400, 511705088: 1074266128, 528482304: 540672 }, { 0: 260, 1048576: 0, 2097152: 67109120, 3145728: 65796, 4194304: 65540, 5242880: 67108868, 6291456: 67174660, 7340032: 67174400, 8388608: 67108864, 9437184: 67174656, 10485760: 65792, 11534336: 67174404, 12582912: 67109124, 13631488: 65536, 14680064: 4, 15728640: 256, 524288: 67174656, 1572864: 67174404, 2621440: 0, 3670016: 67109120, 4718592: 67108868, 5767168: 65536, 6815744: 65540, 7864320: 260, 8912896: 4, 9961472: 256, 11010048: 67174400, 12058624: 65796, 13107200: 65792, 14155776: 67109124, 15204352: 67174660, 16252928: 67108864, 16777216: 67174656, 17825792: 65540, 18874368: 65536, 19922944: 67109120, 20971520: 256, 22020096: 67174660, 23068672: 67108868, 24117248: 0, 25165824: 67109124, 26214400: 67108864, 27262976: 4, 28311552: 65792, 29360128: 67174400, 30408704: 260, 31457280: 65796, 32505856: 67174404, 17301504: 67108864, 18350080: 260, 19398656: 67174656, 20447232: 0, 21495808: 65540, 22544384: 67109120, 23592960: 256, 24641536: 67174404, 25690112: 65536, 26738688: 67174660, 27787264: 65796, 28835840: 67108868, 29884416: 67109124, 30932992: 67174400, 31981568: 4, 33030144: 65792 }, { 0: 2151682048, 65536: 2147487808, 131072: 4198464, 196608: 2151677952, 262144: 0, 327680: 4198400, 393216: 2147483712, 458752: 4194368, 524288: 2147483648, 589824: 4194304, 655360: 64, 720896: 2147487744, 786432: 2151678016, 851968: 4160, 917504: 4096, 983040: 2151682112, 32768: 2147487808, 98304: 64, 163840: 2151678016, 229376: 2147487744, 294912: 4198400, 360448: 2151682112, 425984: 0, 491520: 2151677952, 557056: 4096, 622592: 2151682048, 688128: 4194304, 753664: 4160, 819200: 2147483648, 884736: 4194368, 950272: 4198464, 1015808: 2147483712, 1048576: 4194368, 1114112: 4198400, 1179648: 2147483712, 1245184: 0, 1310720: 4160, 1376256: 2151678016, 1441792: 2151682048, 1507328: 2147487808, 1572864: 2151682112, 1638400: 2147483648, 1703936: 2151677952, 1769472: 4198464, 1835008: 2147487744, 1900544: 4194304, 1966080: 64, 2031616: 4096, 1081344: 2151677952, 1146880: 2151682112, 1212416: 0, 1277952: 4198400, 1343488: 4194368, 1409024: 2147483648, 1474560: 2147487808, 1540096: 64, 1605632: 2147483712, 1671168: 4096, 1736704: 2147487744, 1802240: 2151678016, 1867776: 4160, 1933312: 2151682048, 1998848: 4194304, 2064384: 4198464 }, { 0: 128, 4096: 17039360, 8192: 262144, 12288: 536870912, 16384: 537133184, 20480: 16777344, 24576: 553648256, 28672: 262272, 32768: 16777216, 36864: 537133056, 40960: 536871040, 45056: 553910400, 49152: 553910272, 53248: 0, 57344: 17039488, 61440: 553648128, 2048: 17039488, 6144: 553648256, 10240: 128, 14336: 17039360, 18432: 262144, 22528: 537133184, 26624: 553910272, 30720: 536870912, 34816: 537133056, 38912: 0, 43008: 553910400, 47104: 16777344, 51200: 536871040, 55296: 553648128, 59392: 16777216, 63488: 262272, 65536: 262144, 69632: 128, 73728: 536870912, 77824: 553648256, 81920: 16777344, 86016: 553910272, 90112: 537133184, 94208: 16777216, 98304: 553910400, 102400: 553648128, 106496: 17039360, 110592: 537133056, 114688: 262272, 118784: 536871040, 122880: 0, 126976: 17039488, 67584: 553648256, 71680: 16777216, 75776: 17039360, 79872: 537133184, 83968: 536870912, 88064: 17039488, 92160: 128, 96256: 553910272, 100352: 262272, 104448: 553910400, 108544: 0, 112640: 553648128, 116736: 16777344, 120832: 262144, 124928: 537133056, 129024: 536871040 }, { 0: 268435464, 256: 8192, 512: 270532608, 768: 270540808, 1024: 268443648, 1280: 2097152, 1536: 2097160, 1792: 268435456, 2048: 0, 2304: 268443656, 2560: 2105344, 2816: 8, 3072: 270532616, 3328: 2105352, 3584: 8200, 3840: 270540800, 128: 270532608, 384: 270540808, 640: 8, 896: 2097152, 1152: 2105352, 1408: 268435464, 1664: 268443648, 1920: 8200, 2176: 2097160, 2432: 8192, 2688: 268443656, 2944: 270532616, 3200: 0, 3456: 270540800, 3712: 2105344, 3968: 268435456, 4096: 268443648, 4352: 270532616, 4608: 270540808, 4864: 8200, 5120: 2097152, 5376: 268435456, 5632: 268435464, 5888: 2105344, 6144: 2105352, 6400: 0, 6656: 8, 6912: 270532608, 7168: 8192, 7424: 268443656, 7680: 270540800, 7936: 2097160, 4224: 8, 4480: 2105344, 4736: 2097152, 4992: 268435464, 5248: 268443648, 5504: 8200, 5760: 270540808, 6016: 270532608, 6272: 270540800, 6528: 270532616, 6784: 8192, 7040: 2105352, 7296: 2097160, 7552: 0, 7808: 268435456, 8064: 268443656 }, { 0: 1048576, 16: 33555457, 32: 1024, 48: 1049601, 64: 34604033, 80: 0, 96: 1, 112: 34603009, 128: 33555456, 144: 1048577, 160: 33554433, 176: 34604032, 192: 34603008, 208: 1025, 224: 1049600, 240: 33554432, 8: 34603009, 24: 0, 40: 33555457, 56: 34604032, 72: 1048576, 88: 33554433, 104: 33554432, 120: 1025, 136: 1049601, 152: 33555456, 168: 34603008, 184: 1048577, 200: 1024, 216: 34604033, 232: 1, 248: 1049600, 256: 33554432, 272: 1048576, 288: 33555457, 304: 34603009, 320: 1048577, 336: 33555456, 352: 34604032, 368: 1049601, 384: 1025, 400: 34604033, 416: 1049600, 432: 1, 448: 0, 464: 34603008, 480: 33554433, 496: 1024, 264: 1049600, 280: 33555457, 296: 34603009, 312: 1, 328: 33554432, 344: 1048576, 360: 1025, 376: 34604032, 392: 33554433, 408: 34603008, 424: 0, 440: 34604033, 456: 1049601, 472: 1024, 488: 33555456, 504: 1048577 }, { 0: 134219808, 1: 131072, 2: 134217728, 3: 32, 4: 131104, 5: 134350880, 6: 134350848, 7: 2048, 8: 134348800, 9: 134219776, 10: 133120, 11: 134348832, 12: 2080, 13: 0, 14: 134217760, 15: 133152, 2147483648: 2048, 2147483649: 134350880, 2147483650: 134219808, 2147483651: 134217728, 2147483652: 134348800, 2147483653: 133120, 2147483654: 133152, 2147483655: 32, 2147483656: 134217760, 2147483657: 2080, 2147483658: 131104, 2147483659: 134350848, 2147483660: 0, 2147483661: 134348832, 2147483662: 134219776, 2147483663: 131072, 16: 133152, 17: 134350848, 18: 32, 19: 2048, 20: 134219776, 21: 134217760, 22: 134348832, 23: 131072, 24: 0, 25: 131104, 26: 134348800, 27: 134219808, 28: 134350880, 29: 133120, 30: 2080, 31: 134217728, 2147483664: 131072, 2147483665: 2048, 2147483666: 134348832, 2147483667: 133152, 2147483668: 32, 2147483669: 134348800, 2147483670: 134217728, 2147483671: 134219808, 2147483672: 134350880, 2147483673: 134217760, 2147483674: 134219776, 2147483675: 0, 2147483676: 133120, 2147483677: 2080, 2147483678: 131104, 2147483679: 134350848 }]; var SBOX_MASK = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679]; var DES = C_algo.DES = BlockCipher.extend({ _doReset: function() { var key = this._key; var keyWords = key.words; var keyBits = []; for (var i = 0; i < 56; i++) { var keyBitPos = PC1[i] - 1; keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1 } var subKeys = this._subKeys = []; for (var nSubKey = 0; nSubKey < 16; nSubKey++) { var subKey = subKeys[nSubKey] = []; var bitShift = BIT_SHIFTS[nSubKey]; for (var i = 0; i < 24; i++) { subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6) } subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); for (var i = 1; i < 7; i++) { subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3) } subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27) } var invSubKeys = this._invSubKeys = []; for (var i = 0; i < 16; i++) { invSubKeys[i] = subKeys[15 - i] } }, encryptBlock: function(M, offset) { this._doCryptBlock(M, offset, this._subKeys) }, decryptBlock: function(M, offset) { this._doCryptBlock(M, offset, this._invSubKeys) }, _doCryptBlock: function(M, offset, subKeys) { this._lBlock = M[offset]; this._rBlock = M[offset + 1]; exchangeLR.call(this, 4, 252645135); exchangeLR.call(this, 16, 65535); exchangeRL.call(this, 2, 858993459); exchangeRL.call(this, 8, 16711935); exchangeLR.call(this, 1, 1431655765); for (var round = 0; round < 16; round++) { var subKey = subKeys[round]; var lBlock = this._lBlock; var rBlock = this._rBlock; var f = 0; for (var i = 0; i < 8; i++) { f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0] } this._lBlock = rBlock; this._rBlock = lBlock ^ f } var t = this._lBlock; this._lBlock = this._rBlock; this._rBlock = t; exchangeLR.call(this, 1, 1431655765); exchangeRL.call(this, 8, 16711935); exchangeRL.call(this, 2, 858993459); exchangeLR.call(this, 16, 65535); exchangeLR.call(this, 4, 252645135); M[offset] = this._lBlock; M[offset + 1] = this._rBlock }, keySize: 64 / 32, ivSize: 64 / 32, blockSize: 64 / 32 }); function exchangeLR(offset, mask) { var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; this._rBlock ^= t; this._lBlock ^= t << offset } function exchangeRL(offset, mask) { var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; this._lBlock ^= t; this._rBlock ^= t << offset } C.DES = BlockCipher._createHelper(DES); var TripleDES = C_algo.TripleDES = BlockCipher.extend({ _doReset: function() { var key = this._key; var keyWords = key.words; this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))) }, encryptBlock: function(M, offset) { this._des1.encryptBlock(M, offset); this._des2.decryptBlock(M, offset); this._des3.encryptBlock(M, offset) }, decryptBlock: function(M, offset) { this._des3.decryptBlock(M, offset); this._des2.encryptBlock(M, offset); this._des1.decryptBlock(M, offset) }, keySize: 192 / 32, ivSize: 64 / 32, blockSize: 64 / 32 }); C.TripleDES = BlockCipher._createHelper(TripleDES) }()); (function() { var C = CryptoJS; var C_lib = C.lib; var StreamCipher = C_lib.StreamCipher; var C_algo = C.algo; var RC4 = C_algo.RC4 = StreamCipher.extend({ _doReset: function() { var key = this._key; var keyWords = key.words; var keySigBytes = key.sigBytes; var S = this._S = []; for (var i = 0; i < 256; i++) { S[i] = i } for (var i = 0, j = 0; i < 256; i++) { var keyByteIndex = i % keySigBytes; var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 255; j = (j + S[i] + keyByte) % 256; var t = S[i]; S[i] = S[j]; S[j] = t } this._i = this._j = 0 }, _doProcessBlock: function(M, offset) { M[offset] ^= generateKeystreamWord.call(this) }, keySize: 256 / 32, ivSize: 0 }); function generateKeystreamWord() { var S = this._S; var i = this._i; var j = this._j; var keystreamWord = 0; for (var n = 0; n < 4; n++) { i = (i + 1) % 256; j = (j + S[i]) % 256; var t = S[i]; S[i] = S[j]; S[j] = t; keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8) } this._i = i; this._j = j; return keystreamWord } C.RC4 = StreamCipher._createHelper(RC4); var RC4Drop = C_algo.RC4Drop = RC4.extend({ cfg: RC4.cfg.extend({ drop: 192 }), _doReset: function() { RC4._doReset.call(this); for (var i = this.cfg.drop; i > 0; i--) { generateKeystreamWord.call(this) } } }); C.RC4Drop = StreamCipher._createHelper(RC4Drop) }()); CryptoJS.mode.CTRGladman = (function() { var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); function incWord(word) { if (((word >> 24) & 255) === 255) { var b1 = (word >> 16) & 255; var b2 = (word >> 8) & 255; var b3 = word & 255; if (b1 === 255) { b1 = 0; if (b2 === 255) { b2 = 0; if (b3 === 255) { b3 = 0 } else { ++b3 } } else { ++b2 } } else { ++b1 } word = 0; word += (b1 << 16); word += (b2 << 8); word += b3 } else { word += (1 << 24) } return word } function incCounter(counter) { if ((counter[0] = incWord(counter[0])) === 0) { counter[1] = incWord(counter[1]) } return counter } var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ processBlock: function(words, offset) { var cipher = this._cipher; var blockSize = cipher.blockSize; var iv = this._iv; var counter = this._counter; if (iv) { counter = this._counter = iv.slice(0); this._iv = undefined } incCounter(counter); var keystream = counter.slice(0); cipher.encryptBlock(keystream, 0); for (var i = 0; i < blockSize; i++) { words[offset + i] ^= keystream[i] } } }); CTRGladman.Decryptor = Encryptor; return CTRGladman }()); (function() { var C = CryptoJS; var C_lib = C.lib; var StreamCipher = C_lib.StreamCipher; var C_algo = C.algo; var S = []; var C_ = []; var G = []; var Rabbit = C_algo.Rabbit = StreamCipher.extend({ _doReset: function() { var K = this._key.words; var iv = this.cfg.iv; for (var i = 0; i < 4; i++) { K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 16711935) | (((K[i] << 24) | (K[i] >>> 8)) & 4278255360) } var X = this._X = [K[0], (K[3] << 16) | (K[2] >>> 16), K[1], (K[0] << 16) | (K[3] >>> 16), K[2], (K[1] << 16) | (K[0] >>> 16), K[3], (K[2] << 16) | (K[1] >>> 16)]; var C = this._C = [(K[2] << 16) | (K[2] >>> 16), (K[0] & 4294901760) | (K[1] & 65535), (K[3] << 16) | (K[3] >>> 16), (K[1] & 4294901760) | (K[2] & 65535), (K[0] << 16) | (K[0] >>> 16), (K[2] & 4294901760) | (K[3] & 65535), (K[1] << 16) | (K[1] >>> 16), (K[3] & 4294901760) | (K[0] & 65535)]; this._b = 0; for (var i = 0; i < 4; i++) { nextState.call(this) } for (var i = 0; i < 8; i++) { C[i] ^= X[(i + 4) & 7] } if (iv) { var IV = iv.words; var IV_0 = IV[0]; var IV_1 = IV[1]; var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 16711935) | (((IV_0 << 24) | (IV_0 >>> 8)) & 4278255360); var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 16711935) | (((IV_1 << 24) | (IV_1 >>> 8)) & 4278255360); var i1 = (i0 >>> 16) | (i2 & 4294901760); var i3 = (i2 << 16) | (i0 & 65535); C[0] ^= i0; C[1] ^= i1; C[2] ^= i2; C[3] ^= i3; C[4] ^= i0; C[5] ^= i1; C[6] ^= i2; C[7] ^= i3; for (var i = 0; i < 4; i++) { nextState.call(this) } } }, _doProcessBlock: function(M, offset) { var X = this._X; nextState.call(this); S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); for (var i = 0; i < 4; i++) { S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 16711935) | (((S[i] << 24) | (S[i] >>> 8)) & 4278255360); M[offset + i] ^= S[i] } }, blockSize: 128 / 32, ivSize: 64 / 32 }); function nextState() { var X = this._X; var C = this._C; for (var i = 0; i < 8; i++) { C_[i] = C[i] } C[0] = (C[0] + 1295307597 + this._b) | 0; C[1] = (C[1] + 3545052371 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; C[2] = (C[2] + 886263092 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; C[3] = (C[3] + 1295307597 + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; C[4] = (C[4] + 3545052371 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; C[5] = (C[5] + 886263092 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; C[6] = (C[6] + 1295307597 + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; C[7] = (C[7] + 3545052371 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; for (var i = 0; i < 8; i++) { var gx = X[i] + C[i]; var ga = gx & 65535; var gb = gx >>> 16; var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; var gl = (((gx & 4294901760) * gx) | 0) + (((gx & 65535) * gx) | 0); G[i] = gh ^ gl } X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0 } C.Rabbit = StreamCipher._createHelper(Rabbit) }()); CryptoJS.mode.CTR = (function() { var CTR = CryptoJS.lib.BlockCipherMode.extend(); var Encryptor = CTR.Encryptor = CTR.extend({ processBlock: function(words, offset) { var cipher = this._cipher; var blockSize = cipher.blockSize; var iv = this._iv; var counter = this._counter; if (iv) { counter = this._counter = iv.slice(0); this._iv = undefined } var keystream = counter.slice(0); cipher.encryptBlock(keystream, 0); counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0; for (var i = 0; i < blockSize; i++) { words[offset + i] ^= keystream[i] } } }); CTR.Decryptor = Encryptor; return CTR }()); (function() { var C = CryptoJS; var C_lib = C.lib; var StreamCipher = C_lib.StreamCipher; var C_algo = C.algo; var S = []; var C_ = []; var G = []; var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ _doReset: function() { var K = this._key.words; var iv = this.cfg.iv; var X = this._X = [K[0], (K[3] << 16) | (K[2] >>> 16), K[1], (K[0] << 16) | (K[3] >>> 16), K[2], (K[1] << 16) | (K[0] >>> 16), K[3], (K[2] << 16) | (K[1] >>> 16)]; var C = this._C = [(K[2] << 16) | (K[2] >>> 16), (K[0] & 4294901760) | (K[1] & 65535), (K[3] << 16) | (K[3] >>> 16), (K[1] & 4294901760) | (K[2] & 65535), (K[0] << 16) | (K[0] >>> 16), (K[2] & 4294901760) | (K[3] & 65535), (K[1] << 16) | (K[1] >>> 16), (K[3] & 4294901760) | (K[0] & 65535)]; this._b = 0; for (var i = 0; i < 4; i++) { nextState.call(this) } for (var i = 0; i < 8; i++) { C[i] ^= X[(i + 4) & 7] } if (iv) { var IV = iv.words; var IV_0 = IV[0]; var IV_1 = IV[1]; var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 16711935) | (((IV_0 << 24) | (IV_0 >>> 8)) & 4278255360); var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 16711935) | (((IV_1 << 24) | (IV_1 >>> 8)) & 4278255360); var i1 = (i0 >>> 16) | (i2 & 4294901760); var i3 = (i2 << 16) | (i0 & 65535); C[0] ^= i0; C[1] ^= i1; C[2] ^= i2; C[3] ^= i3; C[4] ^= i0; C[5] ^= i1; C[6] ^= i2; C[7] ^= i3; for (var i = 0; i < 4; i++) { nextState.call(this) } } }, _doProcessBlock: function(M, offset) { var X = this._X; nextState.call(this); S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); for (var i = 0; i < 4; i++) { S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 16711935) | (((S[i] << 24) | (S[i] >>> 8)) & 4278255360); M[offset + i] ^= S[i] } }, blockSize: 128 / 32, ivSize: 64 / 32 }); function nextState() { var X = this._X; var C = this._C; for (var i = 0; i < 8; i++) { C_[i] = C[i] } C[0] = (C[0] + 1295307597 + this._b) | 0; C[1] = (C[1] + 3545052371 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; C[2] = (C[2] + 886263092 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; C[3] = (C[3] + 1295307597 + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; C[4] = (C[4] + 3545052371 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; C[5] = (C[5] + 886263092 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; C[6] = (C[6] + 1295307597 + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; C[7] = (C[7] + 3545052371 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; for (var i = 0; i < 8; i++) { var gx = X[i] + C[i]; var ga = gx & 65535; var gb = gx >>> 16; var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; var gl = (((gx & 4294901760) * gx) | 0) + (((gx & 65535) * gx) | 0); G[i] = gh ^ gl } X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0 } C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy) }()); CryptoJS.pad.ZeroPadding = { pad: function(data, blockSize) { var blockSizeBytes = blockSize * 4; data.clamp(); data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes) }, unpad: function(data) { var dataWords = data.words; var i = data.sigBytes - 1; while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 255)) { i-- } data.sigBytes = i + 1 } }; function jslencode(text, aes_key) { var key = CryptoJS.enc.Utf8.parse(aes_key); var iv = CryptoJS.enc.Utf8.parse(""); var srcs = CryptoJS.enc.Utf8.parse(text); var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted.ciphertext.toString(CryptoJS.enc.Hex) } ================================================ FILE: datahub/jsl_login.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/7/26 15:59 # @File : jsl_login.py # @Author : Rocky C@www.30daydo.com import datetime import time import pandas as pd import execjs import os import requests import sys sys.path.append('..') from configure.settings import config filename = 'js_file/encode_jsl.js' path = os.path.dirname(os.path.abspath(__file__)) full_path = os.path.join(path, filename) headers = { 'Host': 'www.jisilu.cn', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Accept': 'application/json,text/javascript,*/*;q=0.01', 'Origin': 'https://www.jisilu.cn', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/67.0.3396.99Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'Referer': 'https://www.jisilu.cn/login/', 'Accept-Encoding': 'gzip,deflate,br', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8' } def decoder(text): with open(full_path, 'r', encoding='utf8') as f: source = f.read() ctx = execjs.compile(source) key = '397151C04723421F' return ctx.call('jslencode', text, key) def get_bond_info(session): ts = int(time.time() * 1000) url = 'https://www.jisilu.cn/data/cbnew/cb_list_new/?___jsl=LST___t={}'.format(ts) data = { "fprice": None, "tprice": None, "curr_iss_amt": None, "volume": None, "svolume": None, "premium_rt": None, "ytm_rt": None, "rating_cd": None, "is_search": "N", "btype": "C", "listed": "Y", "qflag": "N", "sw_cd": None, "bond_ids": None, "rp": 50, } r = session.post( url=url, headers=headers, data=data ) ret = r.json() result = [] for item in ret['rows']: result.append(item['cell']) return result def login(user, password): session = requests.Session() url = 'https://www.jisilu.cn/account/ajax/login_process/' username = decoder(user) jsl_password = decoder(password) data = { 'return_url': 'https://www.jisilu.cn/', 'user_name': username, 'password': jsl_password, 'net_auto_login': '1', '_post_type': 'ajax', } js = session.post( url=url, headers=headers, data=data, ) ret = js.json() if ret.get('errno') == 1: print('登录成功') return session else: print('登录失败') raise ValueError('登录失败') def main(): today = datetime.datetime.now().strftime('%Y%m%d') user = config['jsl_monitor']['JSL_USER'] password = config['jsl_monitor']['JSL_PASSWORD'] session = login(user, password) ret = get_bond_info(session) df = pd.DataFrame(ret) # print(df) return df if __name__ == '__main__': main() ================================================ FILE: datahub/jucao_announcement.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/4/21 0:35 # @File : jucao_announcement.py # @Author : Rocky C@www.30daydo.com # 巨潮公告 import datetime import re import sys sys.path.append('..') from common.BaseService import BaseService from configure.settings import DBSelector class JuCaoAnnouncement(BaseService): def __init__(self,param=None): super(JuCaoAnnouncement, self).__init__('../log/jucao.log') self.enableFilter=False # 不过滤关键标题 self.base_url = 'http://www.cninfo.com.cn/new/hisAnnouncement/query' self.params_dict={'季报':'category_jdbg_jjgg', '年报':'category_ndbg_jjgg', '申购赎回':'category_sgsh_jjgg', '其它':'category_qt_jjgg', '基本信息变更':'category_jbxxbg_jjgg', '招募设立':'category_jjzm_jjgg', '中报':'category_bndbg_jjgg', '分红':'category_fh_jjgg', '持有人大会':'category_fecyr_jjgg', '净值':'category_jzgg_jjgg', '组合投资':'category_zhtz_jjgg', '基金经理变更':'category_ggjjjl_jjgg' } if param is None: kw = ';'.join(list(self.params_dict.values())) else: kw=self.params_dict.get(param) self.params = { "pageNum": "1", "pageSize": "30", "column": "fund", "tabName": "fulltext", "plate": "", "stock": "", "searchkey": "", "secid": "", # 申购等数据 category_qt_jjgg 其他 ; 基本信息变更;申购赎回;持有人大会 ; 基金招募 # "category": "category_jbxxbg_jjgg;category_fecyr_jjgg;category_sgsh_jjgg;category_qt_jjgg;category_jjzm_jjgg", "category": kw, "trade": "", "seDate": self.gen_date_param(), "sortName": "", "sortType": "", "isHLtitle": "false", } self.pdf_base = 'http://static.cninfo.com.cn/{}' self.doc = DBSelector().mongo('qq')['db_stock']['jucao_announcement'] def gen_date_param(self): ''' 日期查询字符 ''' current = datetime.datetime.now() last_day = current + datetime.timedelta(days=1) current_str = self.time_str(current) last_day_str = self.time_str(last_day) # 可以自定义时间 # current_str='2021-04-01' # last_day_str='2021-04-14' x='{}~{}'.format(current_str,last_day_str) return x @property def headers(self): __headers = { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Cookie": "JSESSIONID=65041C569E0AB62716DE7A3E56D5D6DD; _sp_ses.2141=*; routeId=.uc2; SID=6db1a040-5ecc-4c43-b7ea-ad1fd3796c54; _sp_id.2141=65aeab49-b3df-4bc2-b54c-5e55ac099012.1617809813.2.1618936057.1617810063.81c5fd00-91e2-417e-beb7-b5277a3f8390", "Host": "www.cninfo.com.cn", "Origin": "http://www.cninfo.com.cn", "Referer": "http://www.cninfo.com.cn/new/commonUrl/pageOfSearch?url=disclosure/list/search&lastPage=index", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36", "X-Requested-With": "XMLHttpRequest", } return __headers def start(self): total_page = self.get_total_page self.logger.info(f'共有{total_page}页公告') self.fetch_all_page_data(total_page) @property def ignore_str_list(self): ''' 排除的标题字符 ''' filter_str = [ '(第\d+季度报告)','(季度报告)','(年度报告)','(说明书)','(销售机构的公告)','(费率优惠)','(流动性服务商)','(关联方承销证券)' ] return '|'.join(filter_str) def fetch_all_page_data(self,pages): for i in range(1,pages+1): # print(i) self.single_page_analysis(i) def single_page_analysis(self,i): post_data = self.params.copy() post_data['pageNum']=str(i) try: response = self.post( url=self.base_url, post_data=post_data, _json=True, ) except Exception as e: self.logger.error(e) self.logger.error(post_data) return announcements_list = response.get('announcements',None) if announcements_list is not None and len(announcements_list)>0: announcements_data = self.parse_item(response.get('announcements')) self.batch_mongodb(announcements_data) def batch_mongodb(self,announce_data): for item in announce_data: announcementId = item['announcementId'] try: ret = self.doc.update_one({'announcementId':announcementId},{'$setOnInsert':item},upsert=True) # self.logger.info(ret.matched_count,ret.modified_count) except Exception as e: self.logger.error(e) def parse_item(self,js_data): return_url_list = [] for item in js_data: title=item['announcementTitle'] pattern = re.compile(self.ignore_str_list) # pattern = re.compile('['+self.ignore_str_list+']') m=re.search(pattern,title) if m and self.enableFilter: # 过滤不想要的标题,不关心的 continue fund_info_dict ={} adjunctUrl=item['adjunctUrl'] fund_info_dict['code']=item['secCode'] fund_info_dict['title']=title fund_info_dict['announcementId']=item['announcementId'] fund_info_dict['secName']=item['secName'] fund_info_dict['announcementType']=item['announcementType'] fund_info_dict['announcementTime']=self.convert_timestamp(item['announcementTime']) #ts 转为 date str fund_info_dict['crawltime']=datetime.datetime.now() detail_url = self.pdf_base.format(adjunctUrl) fund_info_dict['url']=detail_url return_url_list.append(fund_info_dict) return return_url_list @property def get_total_page(self): post_data = self.params.copy() content = self.post( url=self.base_url, post_data=post_data, _json=True, ) return int(content.get('totalAnnouncement')/30) def main(): app = JuCaoAnnouncement() app.start() if __name__ == '__main__': main() ================================================ FILE: datahub/jucao_reits_notice.py ================================================ # 上交所 公告 import datetime import re import sys import os sys.path.append('..') from configure.settings import DBSelector import requests from loguru import logger logger.add('../log/jucao_retis_notice.log') ROOT = '/root/datahub/jucao/' class SHTradingAnnounce: def __init__(self): self.client = DBSelector().mongo('qq') def _crawl(self, kw, page): import requests cookies = { 'JSESSIONID': '76E27FF3E4AC2BAFBB469054B6F323A2', '_sp_ses.2141': '*', 'routeId': '.uc2', '_sp_id.2141': '12a4755f-69a7-43e9-826b-d425c0bb343f.1672993315.1.1672993426.1672993315.19f199ad-b61b-4e7e-84c0-b78d2bde6fec', } headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Accept': '*/*', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Origin': 'http://www.cninfo.com.cn', 'Referer': 'http://www.cninfo.com.cn/new/commonUrl/pageOfSearch?url=disclosure/list/search&lastPage=index', 'Accept-Language': 'zh-CN,zh;q=0.9', # 'Cookie': 'JSESSIONID=76E27FF3E4AC2BAFBB469054B6F323A2; _sp_ses.2141=*; routeId=.uc2; _sp_id.2141=12a4755f-69a7-43e9-826b-d425c0bb343f.1672993315.1.1672993426.1672993315.19f199ad-b61b-4e7e-84c0-b78d2bde6fec', } data = { 'pageNum': str(page), 'pageSize': '30', 'column': 'fund', 'tabName': 'fulltext', 'plate': '', 'stock': '', 'searchkey': kw, 'secid': '', 'category': '', 'trade': '', 'seDate': '', 'sortName': '', 'sortType': '', 'isHLtitle': 'true', } response = requests.post( 'http://www.cninfo.com.cn/new/hisAnnouncement/query', cookies=cookies, headers=headers, data=data, verify=False, ) return response.json() def parse(self): return self.content['announcements'] def total_count(self): return self.content['totalRecordNum'] def insert_item(self, doc): try: if not self.client['db_stock']['retis_notice'].find_one({'announcementId':doc['announcementId']}): logger.info('item not in mongodb, insert') self.client['db_stock']['retis_notice'].insert_one(doc) except Exception as e: logger.error(e) def filter_unname_char(self,name): return re.sub('[\/:*?"<>|]','',name) def download_pdf(self): if self.client['db_stock']['retis_notice'].count_documents({'downloaded':{'$exists':False}})>0: pdf_urls = self.client['db_stock']['retis_notice'].find({'downloaded':{'$exists':False}}) for item in pdf_urls: secName = item['secName'] announcementTitle = self.filter_unname_char(item['announcementTitle']) url = item['PDF_URL'] m = re.search('/(\d{4})-(\d{2})-(\d{2})/',url) if m: date = '{}-{}-{}'.format(m.group(1),m.group(2),m.group(3)) else: date= item['updated'].strftime('%Y-%m-%d') save_filename = '{}-{}-{}'.format(date,secName,announcementTitle) if len(save_filename)>=50: save_filename = save_filename[:50] save_filename+='.pdf' r = requests.get(url,headers={'User-Agent':'chrome firefox'}) full_path = os.path.join(ROOT, save_filename) with open(full_path,'wb') as fp: fp.write(r.content) self.client['db_stock']['retis_notice'].update_one({'announcementId':item['announcementId']},{'$set':{'downloaded':True,'filename':save_filename}}) def dumpmongo(self, announce_list): host = 'http://static.cninfo.com.cn/' for item in announce_list: item['PDF_URL'] = host + item['adjunctUrl'] item['updated'] = datetime.datetime.now() self.insert_item(item) def run(self): PAGE=3 for p in range(1,PAGE): self.content = self._crawl('基础设施', p) if self.total_count()>0: data = self.parse() self.dumpmongo(data) if __name__ == '__main__': app = SHTradingAnnounce() app.run() app.download_pdf() ================================================ FILE: datahub/ninwen.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/9/6 8:21 # @File : ninwen.py # @Author : Rocky C@www.30daydo.com # 宁稳网 import json import os import random import time from parsel import Selector import requests import warnings import datetime import re import pandas as pd import validate_key import pickle import loguru warnings.filterwarnings("ignore") logger = loguru.logger class NinwenSpider(): def __init__(self): super(NinwenSpider, self).__init__() self.session = requests.Session() self.today = datetime.datetime.now().strftime('%Y-%m-%d') logger.info(f'{self.today} start to crawl....') @property def headers(self): _header = { "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Host": "www.ninwin.cn", "Origin": "http://www.ninwin.cn", "Referer": "http://www.ninwin.cn/index.php?m=u&c=login", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36", "X-Requested-With": "XMLHttpRequest", } return _header @property def json_headers(self): headers = { "Host": "www.ninwin.cn", "Accept": "application/json, text/javascript, */*; q=0.01", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36", "Origin": "https://www.ninwin.cn", "Referer": "https://www.ninwin.cn/index.php?m=u&c=login", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", } return headers def get_image(self): rand = int(time.time()) url = f'http://www.ninwin.cn/index.php?m=verify&a=get&rand={rand}' _headers = {"Referer": "http://www.ninwin.cn/index.php?m=u&c=login", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"} r = self.session.get(url=url, headers=_headers) with open('code.png', 'wb') as fp: fp.write(r.content) return r.content def convert(self, float_str): try: return_float = float(float_str) except: return_float = None return return_float def login(self, code, csrf): url = 'https://www.ninwin.cn/index.php?m=u&c=login&a=dorun' data = { 'username': validate_key.username, 'password': validate_key.password, 'code': code, 'backurl': 'https://www.ninwin.cn/', 'invite': '', 'csrf_token': csrf } r = self.session.post(url=url, headers=self.json_headers, data=data ) ret_js = r.json() if ret_js.get('state') == 'success': return ret_js.get('referer') def get_csrf_token(self): url = 'http://www.ninwin.cn/index.php?m=u&c=login' content = self.visit_page(url) if re.search('value="(.*?)"', content): csrf = re.search('value="(.*?)"', content).group(1) return csrf return None def get_bond_data(self): url = 'http://www.ninwin.cn/index.php?m=cb&a=cb_all&show_cb_only=Y&show_listed_only=Y' content = self.visit_page(url) if '回售起始日' in content: logger.info("\n获取数据成功\n") return content else: logger.error('获取数据失败') return None def visit_page(self, url, _headers=None): if _headers is None: _headers = self.headers resp = self.session.get(url=url, headers=_headers) content = resp.text return content @property def columns_name(self): columns_name_ = [("转债代码", ".//td[2]/text()"), ("转债名称", ".//td[3]/a/text()"), ("满足", ".//td[3]/a/span/@title"), ("发行日期", ".//td[4]/text()"), ("股票代码", ".//td[5]/text()"), ("股票名称", ".//td[6]/text()"), ("行业", ".//td[7]/text()"), ("子行业", ".//td[8]/text()"), ("转债价格", ".//td[9]/text()"), ("本息", ".//td[9]/@title"), ("涨跌", ".//td[10]/spand/text()"), ("日内套利", ".//td[11]/spand/text()"), ("股价", ".//td[12]/text()"), ("正股涨跌", ".//td[13]/spand/text()"), ("剩余本息", ".//td[14]/text()"), ("转股价格", ".//td[15]/text()"), ("转股溢价率", ".//td[16]/text()"), # ("转股期", ".//td[18]/@title"), ("转股价值", ".//td[17]/text()"), ("距离转股日", ".//td[18]/text()"), ("剩余年限", ".//td[19]/text()"), ("回售年限", ".//td[20]/text()"), ("剩余余额", ".//td[21]/text()"), # ("余额", ".//td[20]/text()"), ("成交额(百万)", ".//td[22]/text()"), ("转债换手率", ".//td[23]/text()"), ("余额/市值", ".//td[24]/@title"), ("余额/股本", ".//td[25]/text()"), ("股票市值(亿)", ".//td[26]/text()"), ("P/B", ".//td[27]/text()"), ("税前收益率", ".//td[28]/text()"), ("税后收益率", ".//td[29]/text()"), ("税前回售收益", ".//td[30]/text()"), ("税后回售收益", ".//td[31]/text()"), ("回售价值", ".//td[32]/text()"), ("纯债价值", ".//td[33]/text()"), ("弹性", ".//td[34]/text()"), ("信用", ".//td[35]/text()"), ("折现率", ".//td[36]/text()"), ("老式双低", ".//td[37]/text()"), ("老式排名", ".//td[38]/text()"), ("新式双低", ".//td[39]/text()"), ("新式排名", ".//td[40]/text()"), ("热门度", ".//td[41]/text()"), ] return columns_name_ def patch_fix(self, name, v, node): if name == '转股价格' and v is None: return True, node.xpath('.//td[15]/a/text()').extract_first() return False, None def parse(self, content): resp = Selector(text=content) columns = resp.xpath('//table[@id="cb_hq"]/tbody/tr') bond_result_list = [] for col in columns: d = {} for item in self.columns_name: v = col.xpath(item[1]).extract_first() patch, _v = self.patch_fix(item[0], v, col) if patch: v = _v if isinstance(v, str): v = v.strip() d[item[0]] = v bond_result_list.append(d) return bond_result_list def dump_excel(self, bond_info_list): df = pd.DataFrame(bond_info_list) df.to_excel(f'../data/{self.today}_宁稳.xlsx', encoding="utf8") def image_recognize(self, img): files = {'file': img} data={'sign':validate_key.sign} url=validate_key.url r = requests.post(url=url, files=files, data=data,timeout=20) try: code = r.json().get('code') print(r.json()) except Exception as e: logger.error(e) raise e else: return code def check_name(self, csrf_token): url = 'https://www.ninwin.cn/index.php?m=u&c=login&a=checkname' data = {'csrf_token': csrf_token, 'username': validate_key.username} r = self.session.post(url=url, headers=self.json_headers, data=data) def check_cookies(self, csrf, code): url = f'https://www.ninwin.cn/index.php?m=verify&a=check&csrf_token={csrf}&code={code}' time.sleep(0.5) content = self.visit_page(url, _headers=self.json_headers) def run(self): csrf = self.get_csrf_token() while 1: img = self.get_image() code = self.image_recognize(img) print(code) self.check_name(csrf) self.check_cookies(csrf, code) time.sleep(0.5) ref_url = self.login(code, csrf) if ref_url is None: logger.info('识别错误或者密码错误,正在重试.....') time.sleep(random.randint(1, 5)) continue self.visit_page(ref_url) content = self.get_bond_data() bond_info_list = self.parse(content) self.dump_excel(bond_info_list) logger.info('获取结束') os.remove('code.png') break if __name__ == '__main__': app = NinwenSpider() app.run() ================================================ FILE: datahub/public_private_fund_members.py ================================================ # 公募私募人员数据获取 import math import sys sys.path.append('..') from configure.settings import DBSelector from common.BaseService import BaseService import requests import warnings import datetime warnings.filterwarnings("ignore") class FundMembers(BaseService): def __init__(self, kind, date, first_use=False): super(FundMembers, self).__init__(first_use) self.lof_url = 'http://query.sse.com.cn/commonQuery.do?=&jsonCallBack=jsonpCallback1681&sqlId=COMMON_SSE_FUND_LOF_SCALE_CX_S&pageHelp.pageSize=10000&FILEDATE={}&_=161146986468' self.etf_url = 'http://query.sse.com.cn/commonQuery.do?jsonCallBack=jsonpCallback28550&isPagination=true&pageHelp.pageSize=25&pageHelp.pageNo={}&pageHelp.cacheSize=1&sqlId=COMMON_SSE_ZQPZ_ETFZL_XXPL_ETFGM_SEARCH_L&STAT_DATE={}&pageHelp.beginPage={}&pageHelp.endPage=30&_=1611473902414' self.db = DBSelector() # self.today ='2021-01-22' # ETF self.today_='' # TODO failed self.ETF_COUNT_PER_PAGE = 25 self.url_option_dict = { 'ETF': {'url': self.etf_url, 'date': self.today}, 'LOF': {'url': self.lof_url, 'date': self.today_} } self.kind = kind.lower() self.session = requests.Session() self.logger.info('start...sh fund') self.LAST_TEXT = '' if first_use: self.create_table() self.db_session = self.get_session() self.sess = self.db_session() def crawl_lof(self): options = self.url_option_dict['LOF'] date = options.get('date') url = options.get('url') content = self.get(url.format(date), js=False) js_data = self.jsonp2json(content) self.process_lof(js_data) @property def headers(self): return { "Host": "query.sse.com.cn", "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Referer": "http://www.sse.com.cn/market/funddata/volumn/lofvolumn/", } def process_lof(self, js_data): result = js_data.get('result') for item in result: code = item['FUND_CODE'] name = item['FUND_ABBR'] date = item['TRADE_DATE'] try: share = float(item['INTERNAL_VOL'].replace(',', '')) except Exception as e: print(e) share = None self.process_model(code, name, date, share, 'LOF') def post(self, url, post_data, _josn=False, binary=False, retry=5): pass def crawl_etf(self): options = self.url_option_dict['ETF'] date = options.get('date') url = options.get('url') current_page = 1 while True: content = self.get(url.format(current_page, date, current_page), _json=False) js_data = self.jsonp2json(content) total_count = js_data.get('pageHelp').get('total') print(f'page : {current_page}') self.process_etf(js_data) max_page = math.ceil(total_count / self.ETF_COUNT_PER_PAGE) # 每页 10个 if current_page > max_page: break current_page += 1 def process_etf(self, js_data): result = js_data.get('result') for item in result: code = item['SEC_CODE'] name = item['SEC_NAME'] date = item['STAT_DATE'] share = item['TOT_VOL'] try: share = float(share) except Exception as e: print(e) self.process_model(code, name, date, share, 'ETF') def run(self): 'LOF 与 ETF' # for type_, options in self.url_option_dict.items(): if self.kind == 'etf': self.logger.info('crawling etf .....') self.crawl_etf() if self.kind == 'lof': self.logger.info('crawling lof .....') self.crawl_lof() def process_model(self, code, name, date, share, type_): obj = self.sess.query(FundBaseInfoModel).filter_by(code=code).first() if not obj: obj = FundBaseInfoModel( code=code, name=name, category=type_, invest_type=None, manager_name=None, issue_date=None, ) try: self.sess.add(obj) except Exception as e: print(e) else: self.sess.commit() print(f'插入一条记录{code},{date}') if not self.sess.query(ShareModel).filter_by(code=code, date=date).first(): share_info = ShareModel( code=code, date=date, share=share, crawltime=datetime.datetime.now(), ) try: self.sess.add(share_info) except Exception as e: print(e) else: print(f'插入一条记录{code},{date}') self.sess.commit() ================================================ FILE: datahub/repurchase.py ================================================ import os import sys import pandas as pd import numpy as np import xcsc_tushare as xc sys.path.append('..') from configure.settings import config_dict xc_server = config_dict()['xc_server'] xc_token_pro = config_dict()['xc_token_pro'] xc.set_token(xc_token_pro) pro = xc.pro_api(env='prd', server=xc_server) df = pro.repurchase(ann_date='', start_date='20210201', end_date='20210301') df['ts_code']=df['ts_code'].map(lambda x:x.split('.')[0]) ROOT_PATH = r'C:\git\stock\data' excel_file = os.path.join(ROOT_PATH, 'tb_bond_jisilu.xlsx') jsl_data = pd.read_excel(excel_file,dtype={'正股代码':np.str}) # print(jsl_data) # 这个接口失效了 # df = pro.stk_account(start_date='20210101', end_date='20211030') # print(df) merge_table = pd.merge(df,jsl_data,left_on='ts_code',right_on='正股代码') # print(merge_table.head()) print(len(merge_table)) print(merge_table) ================================================ FILE: datahub/store_news.py ================================================ # -*-coding=utf-8-*- import os, re import pymysql import setting db_name = 'db_news' conn = pymysql.connect(host=setting.MYSQL_REMOTE, port=3306, user=setting.MYSQL_REMOTE_USER, passwd=setting.MYSQL_PASSWORD, db=db_name, charset='utf8' ) cur = conn.cursor() def create_tb(): cmd = '''CREATE TABLE IF NOT EXISTS tb_cnstock(Date DATETIME ,Title VARCHAR (80),URL VARCHAR (80),PRIMARY KEY (URL)) charset=utf8;''' try: cur.execute(cmd) conn.commit() # conn.close() return True except Exception as e: print(e) conn.rollback() return False def save_sql(): if not create_tb(): return False files = os.listdir('.') for file in files: years = re.findall(r'StockNews-\[(.*?)\]-\[.*?\].log', file) if len(years): print(file) cur_year = years[0].split('-')[0] f = open(file).readlines() loop=4 count=1 for content in f: s = content.strip() # print(s) if count%loop==2: # if re.search(r'\d+-\d+ \d+:\d+', s): # print(s.split()[2]) # pass date_times = re.findall('(\d+-\d+ \d+:\d+)', s)[0] date_times=cur_year+'-'+date_times titles = re.findall(r'\d+-\d+ \d+:\d+(.*)', s)[0] # 03-06 16:53 titles=titles.strip() # print(title) # if title: # titles = title[0] # print('title', titles) # if date_time: # date_times = date_time[0] # print('date:', date_times) # print('new line') if count%loop==3: # if re.search(r'--->', s): # print(s) # pass url_link = re.findall(r'---> (.*)', s)[0] # if url_link: # print('stock_url', url_link[0]) # date_times='h' # titles='h' # url_link='h' if (count%loop==0) and (date_times) and (titles) and (url_link): cmd='''INSERT INTO tb_cnstock (Date,Title,URL ) VALUES(\'%s\',\'%s\',\'%s\');''' % (date_times, titles, url_link) print(cmd) try: cur.execute(cmd) conn.commit() except Exception as e: print(e) conn.rollback() count=count+1 conn.close() return True if __name__ == "__main__": # sub_folder = os.path.join(os.path.dirname(__file__), "data") sub_folder=r'C:\OneDrive\Python\all_in_one\data' if not os.path.exists(sub_folder): os.mkdir(sub_folder) os.chdir(sub_folder) save_sql() ================================================ FILE: datahub/ttjj_new_stock.py ================================================ import time import aiohttp import asyncio import execjs global pages global count import sys sys.path.append('..') from configure.util import read_web_headers_cookies from configure.settings import DBSelector headers,_ = read_web_headers_cookies('ttjj',headers=True,cookies=False) home_url = 'http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?type=XGSG_LB&token=70f12f2f4f091e459a279469fe49eca5&st=purchasedate,securitycode&sr=-1&p={}&ps=50&js=var%20hsEnHLwG={{pages:(tp),data:(x)}}&rt=53512217' loop = asyncio.get_event_loop() # lock = asyncio.Lock() mongo_client = DBSelector().mongo(location_type='qq',async_type=True) # mongo_client = DBSelector().mongo(location_type='qq',async_type=False) collection = mongo_client['db_stock']['new_stock_ttjj'] def parse_json(content): content += ';function getV(){return hsEnHLwG;}' ctx = execjs.compile(content) result = ctx.call('getV') return result async def Aupdate_data(data): code = data['securitycode'] found = await collection.find_one({'securitycode':code}) if not found: await collection.insert_one(data) print(code) def update_data(data): code = data['securitycode'] found = collection.find_one({'securitycode':code}) if not found: collection.insert_one(data) print('插入成功') print(code) async def fetch(session,page): # global pages # global count async with session.get(home_url.format(page),headers=headers) as resp: content = await resp.text() try: js_content = parse_json(content) for stock_info in js_content['data']: securityshortname = stock_info['securityshortname'] print(securityshortname) await Aupdate_data(stock_info) except Exception as e: print(e) # async with lock: # count=count+1 # print(f'count:{count}') # if count == pages: # await asyncio.sleep(20) # print('End of loop') # loop.stop() async def main(): # global pages # global count # count=0 start = time.time() async with aiohttp.ClientSession() as session: async with session.get(home_url.format(1), headers=headers) as resp: content = await resp.text() js_data = parse_json(content) pages = js_data['pages'] tasks =[] for page in range(1,pages+1): task = asyncio.create_task(fetch(session,page)) # tasks.append(fetch(session,page)) tasks.append(task) await asyncio.gather(*tasks) print(f'time used {time.time()-start}') # loop = asyncio.get_event_loop() loop.run_until_complete(main()) # asyncio.run(main()) # loop.run_forever() ================================================ FILE: datahub/xueqiu_group.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/11/2 23:25 # @File : xueqiu_group.py # @Author : Rocky C@www.30daydo.com import json import requests def main(): url = 'https://xueqiu.com/cubes/rebalancing/create.json' headers = { "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Cookie": "__utmz=1.1624412177.48.2.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; device_id=6aee0a85f5b48e54b1223eeb3178dac8; s=c0123vd16e; bid=a8ec0ec01035c8be5606c595aed718d4_ktd4c627; remember=1; xq_a_token=e4ca5c31b277a047685775b19d5fd3d2ab7b2f84; xqat=e4ca5c31b277a047685775b19d5fd3d2ab7b2f84; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjE3MzM0NzM0ODAsImlzcyI6InVjIiwiZXhwIjoxNjM4MDI2ODQwLCJjdG0iOjE2MzU3NDEwOTE2NzEsImNpZCI6ImQ5ZDBuNEFadXAifQ.mjHsfKoyP0Wrr_aWYWUp1_x2mtR-n_0uoIf7-PuZml5BsR8rOZDScdJ0BPiiuknreQsIFPl4k0h_tv3tXNVOwkZTYgaVoygikZrFS86DfHiCBLx1erhEPmn2KqXzm__eZBTys_f1Djh97Ue6w37em_2EeaP3LuVToxkPGhA45uFdHnf63SXQ8i6VSptjLAPMOcaZ6jCZvCVNHfCIJBvTow_kBMu8lbaucb9VspG26EdsXNLQvp61E7srNlRpZUEHuKezzFGWNtlrLtGsXfGRbHD6ZF7GK6aK72FMx1ouAnJzdCoxwqNIYjqycgBb1S0_GA4qq1PTXSAJwcYeRvDa2w; xq_r_token=b77291b9e64bbde68fe9a15d88f16bec2a004d26; xq_is_login=1; u=1733473480; Hm_lvt_fe218c11eab60b6ab1b6f84fb38bcc4a=1635746829; Hm_lvt_1db88642e346389874251b5a1eded6e3=1634120615,1635687700,1635741084,1635774204; snbim_minify=true; __utma=1.108610398.1599525840.1635746825.1635864334.64; __utmc=1; acw_tc=2760826c16358660203771708eb6350cdbef341a109ef5e615ee6850a612b1; __utmt=1; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1635866525; __utmb=1.14.10.1635864334", "Host": "xueqiu.com", "Origin": "https://xueqiu.com", "Pragma": "no-cache", "Referer": "https://xueqiu.com/p/update?action=holdings&symbol=ZH2333460", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36", "X-Requested-With": "XMLHttpRequest", } data = {"cube_symbol": "ZH2333460", "cash": 41.94-33, "segment": True, "holdings": [{"stock_id": 1027747, "weight": 1.06, "segment_name": "其他", "segment_id": 11097508, "stock_name": "港股通银行LOF", "stock_symbol": "SH501025", "segment_color": "#0055aa", "proactive": False, "volume": 0.01096467, "textname": "港股通银行LOF(SH501025)", "url": "/S/SH501025", "price": 0.953, "percent": -0.73, "flag": 1}, {"stock_id": 1032085, "weight": 13, "segment_name": "可转债", "segment_id": 13493397, "stock_name": "山鹰转债", "stock_symbol": "SH110047", "segment_color": "#e53e1e", "proactive": True, "volume": 0.00110456, "textname": "山鹰转债(SH110047)", "url": "/S/SH110047", "price": 116.02, "percent": -0.42, "flag": 1}, {"chg": -0.045, "code": "SZ127003", "current": 108.055, "flag": 1, "ind_color": "#0055aa", "ind_id": 0, "ind_name": "可转债", "name": "海印转债", "percent": -0.04, "stock_id": 1026908, "textname": "海印转债(SZ127003)", "segment_name": "可转债", "weight": 22, "url": "/S/SZ127003", "proactive": True, "price": 108.055}, # {"chg": -0.48, "code": "SZ128044", "current": 99.42, "flag": 1, "ind_color": "#0055aa", # "ind_id": 0, "ind_name": "可转债", "name": "岭南转债", "percent": -0.48, "stock_id": 1031329, # "textname": "岭南转债(SZ128044)", "segment_name": "可转债", "weight": 22, "url": "/S/SZ128044", # "proactive": True, "price": 99.42}, # {"chg": 1.94, "code": "SZ128046", "current": 143, "flag": 1, "ind_color": "#0055aa", # "ind_id": 0, "ind_name": "可转债", "name": "利尔转债", "percent": -0.48, "stock_id": 1031329, # "textname": "利尔转债(SZ128046)", "segment_name": "可转债", "weight": 33, "url": "/S/SZ128046", # "proactive": True, "price": 143} ], "comment": None} # r = requests.post(url, data=data,headers=headers) r = requests.post(url, json=data,headers=headers) r.encoding='utf8' print(r.text) if __name__ == '__main__': main() ================================================ FILE: datahub/xueqiu_sync_portfolio.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/11/2 22:36 # @File : xueqiu_sync_portfolio.py # @Author : Rocky C@www.30daydo.com # 自动同步券商持仓到雪球的组合 import pandas as pd import json import requests import warnings warnings.filterwarnings("ignore") cookie = 'device_id=6aee0a85f5b48e54b1223eeb3178dac8; s=c0123vd16e; bid=a8ec0ec01035c8be5606c595aed718d4_ktd4c627; remember=1; xq_a_token=e4ca5c31b277a047685775b19d5fd3d2ab7b2f84; xqat=e4ca5c31b277a047685775b19d5fd3d2ab7b2f84; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjE3MzM0NzM0ODAsImlzcyI6InVjIiwiZXhwIjoxNjM4MDI2ODQwLCJjdG0iOjE2MzU3NDEwOTE2NzEsImNpZCI6ImQ5ZDBuNEFadXAifQ.mjHsfKoyP0Wrr_aWYWUp1_x2mtR-n_0uoIf7-PuZml5BsR8rOZDScdJ0BPiiuknreQsIFPl4k0h_tv3tXNVOwkZTYgaVoygikZrFS86DfHiCBLx1erhEPmn2KqXzm__eZBTys_f1Djh97Ue6w37em_2EeaP3LuVToxkPGhA45uFdHnf63SXQ8i6VSptjLAPMOcaZ6jCZvCVNHfCIJBvTow_kBMu8lbaucb9VspG26EdsXNLQvp61E7srNlRpZUEHuKezzFGWNtlrLtGsXfGRbHD6ZF7GK6aK72FMx1ouAnJzdCoxwqNIYjqycgBb1S0_GA4qq1PTXSAJwcYeRvDa2w; xq_r_token=b77291b9e64bbde68fe9a15d88f16bec2a004d26; xq_is_login=1; u=1733473480; Hm_lvt_fe218c11eab60b6ab1b6f84fb38bcc4a=1635746829; Hm_lvt_1db88642e346389874251b5a1eded6e3=1634120615,1635687700,1635741084,1635774204; snbim_minify=true; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1635865829' gid = '4320844764546540' def trade_record(cookie, data): url = 'https://tc.xueqiu.com/tc/snowx/MONI/transaction/add.json' header = { 'accept': 'application/json, text/plain, */*', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'content-length': '104', 'content-type': 'application/x-www-form-urlencoded', 'cookie': cookie, 'origin': 'https://xueqiu.com', 'referer': 'https://xueqiu.com/performance', 'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"', 'sec-ch-ua-mobile': '?0', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-site', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } resp = requests.post(url, data=data, headers=header, verify=False) content = resp.content.decode(resp.encoding) data_dict = json.loads(content) success = data_dict['success'] name = data_dict['result_data']['name'] price = data_dict['result_data']['price'] direction = "卖出" if data_dict['result_data']['type'] == 2 else "买入" shares = data_dict['result_data']['shares'] msg = data_dict['msg'] # print(data_dict) print("{}:以 {} {} {},{}".format(name, price, direction, shares, msg)) return success def history_trade(se, cookie, tableid): trade_type = '2' if se['委托类别'] == '卖出' else '1' tradedate = str(se['成交日期']) date = '{}-{}-{}'.format(tradedate[:4], tradedate[4:6], tradedate[6:8]) symbol = 'SH' if se['股东代码'][0] == 'A' else 'SZ' symbol += str(se['证券代码']) price = se['成交价格'] shares = se['成交数量'] * 10 if se['股东代码'][0] == 'A' else se['成交数量'] commission = se['佣金'] data = { 'type': trade_type, # 1 买入 2 卖出 'date': date, 'gid': tableid, 'symbol': symbol, 'price': price, 'shares': shares, 'commission': commission } success = trade_record(cookie, data) return data def main(): history_trade_info_df = pd.read_excel('例子.xlsx') print(history_trade_info_df.head()) history_trade_info_df['success'] = history_trade_info_df.apply(lambda x: history_trade(x, cookie, gid), axis=1) print("失败个数:{}".format(len(history_trade_info_df[history_trade_info_df['success'] == False]))) print(history_trade_info_df[history_trade_info_df['success'] == False]) if __name__ == '__main__': main() ================================================ FILE: datahub/yanbao_crawl.py ================================================ # 研报下载 import requests import os from parsel import Selector import urllib.parse def main(): url = 'https://aigc.idigital.com.cn/djyanbao/' req = requests.get(url) resp = Selector(text=req.text) all_url = resp.xpath('//body//a/@href').getall() for sub_url in all_url: if sub_url.endswith('pdf'): full_url = url + sub_url # print(full_url) pdf_name = sub_url.split('/')[-1] pdf_name = urllib.parse.unquote(pdf_name) print(pdf_name) local_path = os.path.join(os.getcwd(), 'yanbao',pdf_name) if os.path.exists(local_path): print(f"File {pdf_name} already exists, skipping download.") continue try: pdf_resp = requests.get(full_url,headers={'User-Agent': 'Mozilla/5.0'}) with open(local_path, 'wb') as f: f.write(pdf_resp.content) except Exception as e: print(f"Error saving {pdf_name}: {e}") continue if __name__ == "__main__": main() ================================================ FILE: datahub/zdt.py ================================================ # -*- coding=utf-8 -*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' # 每天的涨跌停 import sys sys.path.append('..') import re import time import os # from configure.util import notify from configure.settings import config_dict import pandas as pd from configure.settings import DBSelector from configure.util import send_from_aliyun_ssl import requests import datetime from common.BaseService import BaseService class GetZDT(BaseService): def __init__(self, today=None): ''' TODAY 格式 20200701 :param today: ''' super(GetZDT, self).__init__('log/zdt.log') if today: self.today = today else: self.today = time.strftime("%Y%m%d") self.user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/64.0.3282.167 Chrome/64.0.3282.167 Safari/537.36" self.path = config_dict('data_path') self.zdt_url = f'http://home.flashdata2.jrj.com.cn/limitStatistic/ztForce/{self.today}.js' self.zrzt_url = 'http://hqdata.jrj.com.cn/zrztjrbx/limitup.js' self.host = "home.flashdata2.jrj.com.cn" self.reference = "http://stock.jrj.com.cn/tzzs/zdtwdj/zdforce.shtml" self.header_zdt = {"User-Agent": self.user_agent, "Host": self.host, "Referer": self.reference} self.zdt_indexx = ['代码', '名称', '最新价格', '涨跌幅', '封成比', '封流比', '封单金额', '最后一次涨停时间', '第一次涨停时间', '打开次数', '振幅', '涨停强度'] self.zrzt_indexx = ['序号', '代码', '名称', '昨日涨停时间', '最新价格', '今日涨幅', '最大涨幅', '最大跌幅', '是否连板', '连续涨停次数', '昨日涨停强度', '今日涨停强度', '是否停牌', '昨天的日期', '昨日涨停价', '今日开盘价格', '今日开盘涨幅'] self.header_zrzt = {"User-Agent": self.user_agent, "Host": "hqdata.jrj.com.cn", "Referer": "http://stock.jrj.com.cn/tzzs/zrztjrbx.shtml" } self.DB = DBSelector() def download(self, url, headers, retry=5): for i in range(retry): try: resp = requests.get(url=url, headers=headers) content = resp.text md_check = re.findall('summary|lasttradedate', content) if content and len(md_check) > 0: return content else: time.sleep(60) self.logger.info('failed to get content, retry: {}'.format(i)) continue except Exception as e: self.notify(title=f'{self.__class__}取涨跌停数据出错') self.logger.error(e) time.sleep(60) continue return None def convert_json(self, content): p = re.compile(r'"Data":(.*)};', re.S) if len(content) <= 0: self.logger.info('Content\'s length is 0') exit(0) result = p.findall(content) if result: try: t1 = result[0] t2 = re.sub('[\\r\\n]', '', t1) t2 = re.sub(',,', ',0,0', t2) t2 = re.sub('Infinity', '-1', t2) t2 = re.sub('NaN', '-1', t2) t2 = list(eval(t2)) return t2 except Exception as e: self.notify(title=f'{self.__class__}获取涨跌停数据出错') self.logger.info(e) return None else: return None def convert_dataframe(self, data, index, choice, post_fix): engine = self.DB.get_engine('db_zdt', 'qq') data_len = len(data) if choice == 1: for i in range(data_len): data[i][choice] = data[i][choice] df = pd.DataFrame(data, columns=index) # 今日涨停 if choice == 1: self.today_zt(df, post_fix, engine) # 昨日涨停 if choice == 2: self.yesterday_zt(df, post_fix, engine) # 今日涨停存储 def today_zt(self, df, post_fix, engine): filename = os.path.join( self.path, self.today + "_" + post_fix + ".xls") df['今天的日期'] = self.today df.to_excel(filename, encoding='gbk') try: df.to_sql(self.today + post_fix, engine, if_exists='fail') except Exception as e: self.logger.info(e) # 昨日涨停今日的状态,今日涨停 def yesterday_zt(self, df, post_fix, engine): df = df.set_index('序号') formula = lambda x: round(x * 100, 3) df['最大涨幅'] = df['最大涨幅'].map(formula) df['最大跌幅'] = df['最大跌幅'].map(formula) df['今日开盘涨幅'] = df['今日开盘涨幅'].map(formula) df['昨日涨停强度'] = df['昨日涨停强度'].map(lambda x: round(x, 0)) df['今日涨停强度'] = df['今日涨停强度'].map(lambda x: round(x, 0)) try: df.to_sql(self.today + post_fix, engine, if_exists='fail') except Exception as e: self.notify(f'{self.__class__} 出错') self.logger.info(e) title,content = self.generate_html(df) try: send_from_aliyun_ssl(title, content, types='html') except Exception as e: self.logger.error(e) def generate_html(self,df): avg = round(df['今日涨幅'].mean(), 2) median = round(df['今日涨幅'].median(), 2) min_v = round(df['今日涨幅'].min(), 2) min_index = df['今日涨幅'].argmin() min_percent_name = df.iloc[min_index]['名称'] current = datetime.datetime.now().strftime('%Y-%m-%d') title = '昨涨停今天{}平均涨{}\n'.format(current, avg) content = '

昨天涨停今天{}

' \ '

平均涨幅 {}

' \ '

涨幅中位数 {}

' \ '

涨幅最小 {}

' \ '

涨幅最小股 {}

'.format(current, avg, median, min_v, min_percent_name) return title,content def run(self): zdt_content = self.download(self.zdt_url, headers=self.header_zdt) zdt_js = self.convert_json(zdt_content) # self.convert_dataframe(zdt_js, self.zdt_indexx, 1, 'zdt') # 昨日涨停数据会如果不是当天获取会失效 zrzt_content = self.download(self.zrzt_url, headers=self.header_zrzt) zrzt_js = self.convert_json(zrzt_content) # self.convert_dataframe(zrzt_js, self.zrzt_indexx, 2, 'zrzt') if __name__ == '__main__': obj = GetZDT() obj.run() ================================================ FILE: fund/ETFShareDetection.py ================================================ # ETF 每周监控 from ShareDetection import FundDetection def main(): app = FundDetection() app.etf_start() if __name__ == '__main__': main() ================================================ FILE: fund/ETF_Finder.py ================================================ # -* coding=utf8 *- # 基金某个时间段的涨幅 import datetime import sys import loguru import fire import pandas as pd sys.path.append('..') from sqlhelper import SQLHelper logger = loguru.logger BUILT_DAY = 60 # 成立时间 MORE_THAN_DAY = 60 IGNORE_LIST = ['sz159001'] class ETFFinder(SQLHelper): def __init__(self, date=None): super(ETFFinder, self).__init__(host='tencent-1c', db_name='db_etf') if date is None: self.current_date = datetime.date.today().strftime('%Y-%m-%d') else: self.current_date = date self.etf_df = pd.read_sql('tb_{}'.format(self.current_date), con=self.conn) self.code_list = self.etf_df['代码'].tolist() for code in IGNORE_LIST: if code in self.code_list: self.code_list.remove(code) def range_increment(self): for code in self.code_list: if code.startswith('sz'): long_laid_down = self.long_bottom_down(code) if long_laid_down: logger.info('{}满足需求'.format(code)) def query_data(self, code, count): # 去当前时间往前推 BUILT_DAY 的数据 # volume 单位为股 , sql_str = 'select `close`,`date`,`volume` from `tb_{}_history` order by `date` desc limit {}'.format( code, count) return self.query(sql_str, args=None) def count(self, code): sql_str = 'select count(*) from `tb_{}_history`'.format(code) ret = self.query(sql_str, args=None) return ret[0][0] def high_low_count(self): day = 250 # 一年 # for code in self.code_list: # is_low,is_high = self.is_low_high(code,day) low_count = 0 high_count = 0 for code in self.code_list: low, high = self._low_high_process(code, day) if low: low_count += 1 if high: high_count += 1 logger.info('创新低数量{}'.format(low_count)) logger.info('创新高数量{}'.format(high_count)) def _low_high_process(self, code, day): low, high = self.is_low_high(code, day) current_price = self.latest(code) lowest = False highest = False if current_price <= low and self.count(code) > MORE_THAN_DAY: logger.info('{} 创新低'.format(code)) lowest = True if current_price >= high and self.count(code) > MORE_THAN_DAY: highest = True logger.info('{} 创新高'.format(code)) return lowest, highest def update_result(self,data): sql='insert into `` () values ()' def latest(self, code): sql_str = ''' SELECT `close` FROM `tb_{}_history` ORDER BY `date` DESC LIMIT 1'''.format(code) ret = self.query(sql_str, args=None) return ret[0][0] def is_low_high(self, code, day): ''' 创新低和创新高 ''' sql_str = '''SELECT MIN(high),MAX(high) FROM ( SELECT `high` FROM `tb_{}_history` ORDER BY `date` DESC LIMIT {} ) AS subquery;'''.format(code, day) ret = self.query(sql_str, args=None) _low = ret[0][0] _high = ret[0][1] return _low, _high def ma_line_up_factor(self, code, ret_data): # 均线上穿 因子 close_list = [] if len(ret_data) < BUILT_DAY: # 成立时间不够 logger.info('{} data lenght not meet {}, {}'.format(code, BUILT_DAY, len(ret_data))) return False for close, date, volume in ret_data: close_list.append(close) close_series = pd.Series(close_list) ma5 = close_series.rolling(5).mean().iloc[-1] ma10 = close_series.rolling(10).mean().iloc[-1] if (ma5 > ma10) and (close_list[-1] > ma5): return True else: return False def long_bottom_factor(self, code, ret_data): data = [i[0] for i in ret_data] s = pd.Series(data) volume = [i[2] for i in ret_data] v = pd.Series(volume[-5:]) avg_v = v.mean() avg = s.mean() current_price = data[-1] if abs((current_price - avg) / avg) < (5 / 100) and (avg_v / 100 > 1000000): return True else: return False def long_bottom_down(self, code): # 横盘很久的ETF LONG_DAY = 100 ret_data = self.query_data(code, LONG_DAY) meet_ma_up = self.long_bottom_factor(code, ret_data) if meet_ma_up: logger.info('{}满足需求'.format(code)) def get_increment(self): for code in self.code_list: long_laid_down = self.long_bottom_down(code) if long_laid_down: logger.info('{}满足需求'.format(code)) # TODO 有可能是新的ETF def main(opt=None, date=None): app = ETFFinder(date) print(type(opt)) func_dict = {0: app.range_increment, 1: app.high_low_count} func_dict.get(opt)() if __name__ == '__main__': fire.Fire(main) ================================================ FILE: fund/JJTool.py ================================================ # -*- coding: utf-8 -*- import sys from parsel import Selector sys.path.append('..') import requests import datetime import time import json import pandas as pd from configure.settings import DBSelector from common.BaseService import BaseService import loguru LOG = loguru.logger class TTFund(BaseService): def __init__(self, key='股票'): super(TTFund, self).__init__() self.ft_dict = {'混合': 'hh', # 类型 gp: 股票 hh: 混合 '股票': 'gp', 'qdii': 'qdii', 'lof': 'lof', 'fof': 'fof', '指数': 'zs', '债券': 'zq' } self.key = key self.date_format = datetime.datetime.now().strftime('%Y_%m_%d') # self.date_format = '2021_12_15' @property def headers(self): return { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Cache-Control": "no-cache", "Cookie": "AUTH_FUND.EASTMONEY.COM_GSJZ=AUTH*TTJJ*TOKEN; em_hq_fls=js; HAList=a-sh-603707-%u5065%u53CB%u80A1%u4EFD%2Ca-sz-300999-%u91D1%u9F99%u9C7C%2Ca-sh-605338-%u5DF4%u6BD4%u98DF%u54C1%2Ca-sh-600837-%u6D77%u901A%u8BC1%u5238%2Ca-sh-600030-%u4E2D%u4FE1%u8BC1%u5238%2Ca-sz-300059-%u4E1C%u65B9%u8D22%u5BCC%2Cd-hk-06185; EMFUND1=null; EMFUND2=null; EMFUND3=null; EMFUND4=null; qgqp_b_id=956b72f8de13e912a4fc731a7845a6f8; searchbar_code=163407_588080_501077_163406_001665_001664_007049_004433_005827_110011; EMFUND0=null; EMFUND5=02-24%2019%3A30%3A19@%23%24%u5357%u65B9%u6709%u8272%u91D1%u5C5EETF%u8054%u63A5C@%23%24004433; EMFUND6=02-24%2021%3A46%3A42@%23%24%u5357%u65B9%u4E2D%u8BC1%u7533%u4E07%u6709%u8272%u91D1%u5C5EETF@%23%24512400; EMFUND7=02-24%2021%3A58%3A27@%23%24%u6613%u65B9%u8FBE%u84DD%u7B79%u7CBE%u9009%u6DF7%u5408@%23%24005827; EMFUND8=03-05%2015%3A33%3A29@%23%24%u6613%u65B9%u8FBE%u4E2D%u5C0F%u76D8%u6DF7%u5408@%23%24110011; EMFUND9=03-05 23:47:41@#$%u5929%u5F18%u4F59%u989D%u5B9D%u8D27%u5E01@%23%24000198; ASP.NET_SessionId=ntwtbzdkb0vpkzvil2a3h1ip; st_si=44251094035925; st_asi=delete; st_pvi=77351447730109; st_sp=2020-08-16%2015%3A54%3A02; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=3; st_psi=20210309200219784-0-8081344721", "Host": "fund.eastmoney.com", "Pragma": "no-cache", "Proxy-Connection": "keep-alive", "Referer": "http://fund.eastmoney.com/data/fundranking.html", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36", } def rank(self): time_interval = 'jnzf' # jnzf:今年以来 3n: 3年 今年涨幅 # key='混合' # key='股票' self.category_rank(self.key, time_interval) def category_rank(self, key, time_interval): ft = self.ft_dict[key] td_str = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d') td_dt = datetime.datetime.strptime(td_str, '%Y-%m-%d') # 去年今日 last_dt = td_dt - datetime.timedelta(days=365) last_str = datetime.datetime.strftime(last_dt, '%Y-%m-%d') # rank_url = 'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft={0}&rs=&gs=0&sc={1}zf&st=desc&sd={2}&ed={3}&qdii=&tabSubtype=,,,,,&pi=1&pn=10000&dx=1'.format( # ft, time_interval, last_str, td_str) rank_url = 'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft={0}&rs=&gs=0&sc={1}&st=desc&sd={2}&ed={3}&qdii=&tabSubtype=,,,,,&pi=1&pn=10000&dx=1'.format( ft, time_interval, last_str, td_str) content = self.get(url=rank_url) # print(content) rank_data = self.parseMethod(content) # rank_data = self.parse(content) rank_list = self.key_remap(rank_data, key) self.save_data(rank_list) def save_data(self, rank_list): df = pd.DataFrame(rank_list) try: df.to_excel('{}排名.xlsx'.format(self.key),encoding='utf8') except Exception as e: LOG.error(e) def parseMethod(self,jquery_data): js_format = jquery_data[jquery_data.find('['):jquery_data.rfind(']') + 1] js_data = json.loads(js_format) return js_data def parse(self, content): js_content = execjs.compile(content) rank = js_content.eval("rankData") return rank.get('datas', []) def key_remap(self, rank_data, type_): ''' 映射key value ''' # print(rank_data) colums = ['基金代码', '基金简称', '缩写', '日期', '单位净值', '累计净值', '日增长率(%)', '近1周增幅', '近1月增幅', '近3月增幅', '近6月增幅', '近1年增幅', '近2年增幅', '近3年增幅', '今年来', '成立来', '成立日期', '购买手续费折扣', '自定义', '手续费原价?', '手续费折后?', '布吉岛1', '布吉岛2', '布吉岛3', '布吉岛4'] return_rank_data = [] for rank in rank_data: rand_dict = {} rand_dict['type'] = type_ rand_dict['crawl_date'] = self.today rank_ = rank.split(',') for index, colum in enumerate(colums): rand_dict[colum] = rank_[index] return_rank_data.append(rand_dict) return return_rank_data def turnover_rate(self): ''' 换手率 http://api.fund.eastmoney.com/f10/JJHSL/?callback=jQuery18301549281364854147_1639139836416&fundcode={}&pageindex=1&pagesize=20&_=1639139836475 ''' self.DB = self.get_turnover_db() for code in self.doc.find({'type': self.key}, {"_id": 0, '基金代码': 1}).sort([('_id', pymongo.ASCENDING)]): # print(code) if self.is_crawl(self.DB, code['基金代码']): continue print("爬取{}".format(code['基金代码'])) self.__turnover_rate(code['基金代码']) def is_crawl(self, db, code): return True if db.find_one({'code': code}) else False def __turnover_rate(self, code): url = 'http://api.fund.eastmoney.com/f10/JJHSL/?callback=jQuery18301549281364854147_1639139836416&fundcode={}&pageindex=1&pagesize=100&_=1639139836475'.format( code) ret_txt = self.get(url, _json=False) self.__parse_turnover_data(ret_txt, code) def get_turnover_db(self): return DBSelector().mongo('qq')['db_stock']['turnover_{}'.format(self.date_format)] def __parse_turnover_data(self, jquery_data, code): js_format = jquery_data[jquery_data.find('{'):jquery_data.rfind('}') + 1] js_data = json.loads(js_format) turnover_rate_dict = {} turnover_rate_dict['code'] = code turnover_rate_dict['kind'] = self.key turnover_rate_dict['turnover_rate'] = js_data['Data'] turnover_rate_dict['update'] = datetime.datetime.now() self.DB.insert(turnover_rate_dict) def fund_detail(self, db,code): url = 'http://fundf10.eastmoney.com/jbgk_{}.html'.format(code) def __get(url, headers,retry=5): start = 0 while start < retry: try: r = requests.get( url=url, headers=headers, ) except Exception as e: print('base class error', e) time.sleep(1) start += 1 continue else: return r.text return None headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7', 'Host': 'fundf10.eastmoney.com', 'Cookie': 'em_hq_fls=js; searchbar_code=005827; qgqp_b_id=98846d680cc781b1e4a70c935431c5c1; intellpositionL=1170.55px; intellpositionT=555px; HAList=a-sz-123030-%u4E5D%u6D32%u8F6C%u503A%2Ca-sz-300776-%u5E1D%u5C14%u6FC0%u5149%2Ca-sz-300130-%u65B0%u56FD%u90FD%2Ca-sz-300473-%u5FB7%u5C14%u80A1%u4EFD%2Ca-sz-300059-%u4E1C%u65B9%u8D22%u5BCC%2Ca-sz-000411-%u82F1%u7279%u96C6%u56E2%2Ca-sz-300587-%u5929%u94C1%u80A1%u4EFD%2Ca-sz-000060-%u4E2D%u91D1%u5CAD%u5357%2Ca-sz-002707-%u4F17%u4FE1%u65C5%u6E38%2Ca-sh-605080-%u6D59%u5927%u81EA%u7136%2Ca-sz-001201-%u4E1C%u745E%u80A1%u4EFD%2Ca-sz-300981-%u4E2D%u7EA2%u533B%u7597; em-quote-version=topspeed; st_si=90568564737268; st_asi=delete; ASP.NET_SessionId=otnhaxvqrwnmj4nuorygjua4; EMFUND0=11-29%2015%3A40%3A32@%23%24%u5DE5%u94F6%u4E0A%u8BC1%u592E%u4F01ETF@%23%24510060; EMFUND1=12-11%2000%3A51%3A58@%23%24%u524D%u6D77%u5F00%u6E90%u65B0%u7ECF%u6D4E%u6DF7%u5408A@%23%24000689; EMFUND2=12-11%2000%3A57%3A17@%23%24%u4E2D%u4FE1%u5EFA%u6295%u667A%u4FE1%u7269%u8054%u7F51A@%23%24001809; EMFUND3=12-11%2000%3A56%3A12@%23%24%u9E4F%u534E%u4E2D%u8BC1A%u80A1%u8D44%u6E90%u4EA7%u4E1A%u6307%u6570%28LOF%29A@%23%24160620; EMFUND4=12-11%2000%3A47%3A36@%23%24%u4E2D%u4FE1%u4FDD%u8BDA%u7A33%u9E3FA@%23%24006011; EMFUND5=12-11%2000%3A54%3A13@%23%24%u878D%u901A%u6DF1%u8BC1100%u6307%u6570A@%23%24161604; EMFUND6=12-11%2000%3A55%3A27@%23%24%u56FD%u6CF0%u7EB3%u65AF%u8FBE%u514B100%u6307%u6570@%23%24160213; EMFUND7=12-15%2023%3A05%3A04@%23%24%u534E%u5546%u65B0%u5174%u6D3B%u529B%u6DF7%u5408@%23%24001933; EMFUND8=12-15%2023%3A14%3A53@%23%24%u91D1%u4FE1%u6C11%u5174%u503A%u5238A@%23%24004400; EMFUND9=12-15 23:15:15@#$%u5929%u5F18%u4E2D%u8BC1%u5149%u4F0F%u4EA7%u4E1A%u6307%u6570A@%23%24011102; st_pvi=77351447730109; st_sp=2020-08-16%2015%3A54%3A02; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=10; st_psi=20211215231519394-112200305283-4710014236', 'Referer': 'http://fund.eastmoney.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'} content=__get(url,headers) built_date,scale = self.parse_detail_info(content) db.insert_one({'成立日期':built_date,'规模':scale,'基金代码':code,'type':self.key,'update':datetime.datetime.now()}) def parse_detail_info(self,content): resp=Selector(text=content) labels=resp.xpath('//div[@class="bs_gl"]/p/label') if len(labels)<5: print("解析报错") built_date = labels[0].xpath('./span/text()').extract_first() scale = labels[4].xpath('./span/text()').extract_first() return built_date,scale def update_basic_info(self): pass def get_basic_db(self): return DBSelector().mongo('qq')['db_stock']['ttjj_basic'] def basic_info(self): ''' 基本数据 ''' self.basic_DB = self.get_basic_db() for code in self.doc.find({'type': self.key}, {"_id": 0, '基金代码': 1}).sort([('_id', pymongo.ASCENDING)]): print(code['基金代码']) if self.is_crawl(self.basic_DB, code['基金代码']): continue print("爬取{}".format(code['基金代码'])) self.fund_detail(self.basic_DB,code['基金代码']) def main(kind, option): _dict = {1: '指数', 2: '股票', 3: '混合', 4: 'qdii', 5: 'lof', 6: 'fof', 7: '债券'} app = TTFund(key=_dict.get(kind, '股票')) # key 基金类型,股票,混合, if option == 'basic': LOG.info('获取{}排名'.format(_dict.get(kind))) app.rank() elif option == 'turnover': LOG.info('获取换手率') app.turnover_rate() elif option == 'info': LOG.info('获取基本信息') app.basic_info() else: LOG.error("请输入正确参数") def debug(): app=TTFund('股票') app.rank() if __name__ == '__main__': # fire.Fire(main) debug() ================================================ FILE: fund/LOFShareDetection.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/6/24 0:00 # @File : LOFShareDetection.py.py # @Author : Rocky C@www.30daydo.com from ShareDetection import FundDetection def main(): app = FundDetection() app.lof_start() if __name__ == '__main__': main() ================================================ FILE: fund/LOF_Model.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/3/29 22:30 # @File : LOF_Model.py # @Author : Rocky C@www.30daydo.com from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from sqlalchemy import Column, String, INTEGER, VARCHAR, DATE, DateTime, ForeignKey, FLOAT # 创建对象的基类: Base = declarative_base() class FundBaseInfoModel(Base): # 基本表 # 表的名字: __tablename__ = 'LOF_BaseInfo' # 表的结构: id = Column(INTEGER, primary_key=True, autoincrement=True) code = Column(VARCHAR(6), comment='基金代码', unique=True) name = Column(VARCHAR(40), comment='基金名称') category = Column(VARCHAR(8), comment='基金类别') invest_type = Column(VARCHAR(6), comment='投资类别') manager_name = Column(VARCHAR(48), comment='管理人呢名称') issue_date = Column(DATE, comment='上市日期') # child = relationship('ShareModel', back_populates='LOF_BaseInfo') child = relationship('ShareModel') def __str__(self): return f'<{self.code}><{self.name}>' class ShareModel(Base): # 详情表 不只是LOF,ETF,封基也被包含了 # 表的名字: __tablename__ = 'LOF_Share' # 表的结构: id = Column(INTEGER, primary_key=True, autoincrement=True) code = Column(VARCHAR(6), ForeignKey('LOF_BaseInfo.code'), comment='代码') date = Column(DATE, comment='份额日期') share = Column(FLOAT, comment='份额 单位:万份') parent = relationship('FundBaseInfoModel') # parent = relationship('FundBaseInfoModel', back_populates='LOF_Share') crawltime = Column(DateTime, comment='爬取日期') ================================================ FILE: fund/LOF_Purchase_limit.py ================================================ import akshare as ak import pandas as pd pd.read_excel('') fund_purchase_em_df = ak.fund_purchase_em() print(fund_purchase_em_df.info()) ================================================ FILE: fund/LOF_arbitrage.py ================================================ # LOF 折价套利 import datetime import demjson import fire import pandas as pd import requests import sys sys.path.append('..') from configure.settings import DBSelector from configure.util import send_message_via_wechat import akshare as ak from parsel import Selector TARGET_PREMIUM = 4 # 溢价率阈值 class LOF_arbitrage: def __init__(self, save): self.db = DBSelector().mongo() self.client = self.db['FUND_LOF'] self.save = save def update_premiun(self): date = datetime.datetime.now().strftime('%Y-%m-%d') doc = self.client[date] for fund in doc.find(): price = float(fund['trade']) try: netvalue = float(fund['单位净值']) discount = (price - netvalue) / netvalue * 100 doc.update_one({'symbol': fund['symbol']}, {'$set': {"溢价率": discount}}) except Exception as e: print(e) print(fund['symbol'], 'error') def get_realtime_time(self): result = [] for p in range(1, 11): fund_list = self.get_page(p) for fund in fund_list: symbol = fund['symbol'][2:] detail_dict = self.fund_detail(symbol) # if detail_dict is None: fund.update(detail_dict) fund['update_time'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') try: price = float(fund['trade']) netvalue = float(fund['单位净值']) discount = (price - netvalue) / netvalue * 100 fund['溢价率'] = discount # if self.save: # self.dump_mongodb(fund) result.append(fund) except Exception as e: print(e) print(fund['symbol'], 'error') return result def dump_mongodb(self, data): doc = datetime.datetime.now().strftime('%Y-%m-%d') self.client[doc].insert_many(data) # for d in data: # # print(d) # try: # self.client[doc].insert_one(d) # except Exception as e: # print(e) # print(d) def fund_detail(self, code): url = "https://finance.sina.com.cn/fund/quotes/{}/bc.shtml".format(code) payload = {} headers = { 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'accept-language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6', 'cache-control': 'max-age=0', 'cookie': 'U_TRS1=000000c2.925a2b81b.6558bdf3.97ea41e9; UOR=www.baidu.com,news.sina.com.cn,; SINAGLOBAL=120.241.117.235_1703000974.412329; vjuids=4c66e81c3.18cb039b64b.0.cef1458c27042; vjlast=1703763621; FSINAGLOBAL=120.241.117.235_1703000974.412329; SGUID=1703763634913_98154771; SCF=ArSVPydg8FhlTshG00H2EBHL6mTj5KvjUDue6NrOKUJta7f5nCXUBfgx6x6d513NYw6kT6IX8Unv1jxiIcmlWkE.; cna=7f96a3ef4a46413f825435c379c93489; SUB=_2AkMRvjPvf8NxqwFRmfoUzGLlbo1_zg7EieKn4sI0JRMyHRl-yD8XqmoltRB6Oj4dAM5tocrU5gzIUBNaPjqCghlRrMJS; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WFHrnxo4Wyz.jlo6OcrHRj3; U_TRS2=00000075.2af01df6.66ff7ec7.99627456; display=hidden; Apache=223.160.226.117_1728020174.788833; sinaH5EtagStatus=y; ULV=1728025220573:10:1:1:223.160.226.117_1728020174.788833:1721119235031; visited_funds=501001%7C160637', 'if-none-match': 'W/"66ff7689-3a07c"V=32179E4F', 'priority': 'u=0, i', 'referer': 'http://biz.finance.sina.com.cn/suggest/lookup_n.php?q=sh501001&country=fund', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36' } response = requests.request("GET", url, headers=headers, data=payload) if '' in response.text: response.encoding = 'utf-8' else: response.encoding = 'gb2312' result = self.parse(response.text) return result def parse(self, content): xpath_data = Selector(text=content) result = {} nodes = xpath_data.xpath('//div[@class="fund_data_item"]') for node in nodes: name = node.xpath('./span[@class="fund_data_tag"]/text()').extract_first() value = node.xpath('./span[@class="fund_data"]/text()').extract_first() if value is None: value = node.xpath('./span[@class="fund_data" or @class="fund_data_green"]/text()').extract_first() value = value.replace('%', '').replace('/', '') result[name] = value if len(result) == 0: # 额外解析 th_node = xpath_data.xpath('//div[@id="fund-hq"]//table//th') for node in th_node: name = node.xpath('./text()').extract_first() value = node.xpath('./span/text()').extract_first() name = name.replace(':', '').replace(':', '') # if len(td_node)>0: # value = td_node[0].xpath('./text()').extract_first() # result[name] = value value = value.replace('%', '') # print(name,value) if name == '基金简称' or name == '申购状态': continue result[name] = value return result def postfix(self, code): if code.startswith('5'): return 'SH' + code else: return 'SZ' + code def get_page(self, p): url = "https://vip.stock.finance.sina.com.cn/quotes_service/api/jsonp.php/IO.XSRV2.CallbackList['BwSgm6CTKGGEoOxP']/Market_Center.getHQNodeDataSimple?page={}&num=40&sort=symbol&asc=1&node=lof_hq_fund&%5Bobject%20HTMLDivElement%5D=etp68".format( p) payload = {} headers = {} response = requests.request("GET", url, headers=headers, data=payload) data = response.text start = data.index('[{') end = data.rindex(']') data = data[start:end + 1] py_object = demjson.decode(data) return py_object def run(self): result = self.get_realtime_time() df = pd.DataFrame(result) fund_purchase_em_df = ak.fund_purchase_em() merge_df = pd.merge(df, fund_purchase_em_df, left_on='code', right_on='基金代码', how='left') if self.save: merge_df['下一开放日'] = merge_df['下一开放日'].map(lambda x: str(x)) # merge_df['下一开放日'] = merge_df['下一开放日'].fillna('') merge_df['最新净值/万份收益-报告时间'] = merge_df['最新净值/万份收益-报告时间'].map(lambda x: str(x)) json_data = merge_df.to_dict(orient='records') try: self.dump_mongodb(json_data) except Exception as e: send_message_via_wechat('LOF溢价率数据存储失败') target_df = merge_df[merge_df['溢价率'] >= TARGET_PREMIUM] for index, row in target_df.iterrows(): code = row['code'] name = row['基金简称'] premium = round(float(row['溢价率']), 2) status = row['申购状态'] limit_amount = row['日累计限定金额'] if status == '暂停申购': continue _code = self.postfix(code) try: stock_individual_spot_xq_df = ak.stock_individual_spot_xq(symbol=_code) volume = stock_individual_spot_xq_df[stock_individual_spot_xq_df['item'] == '成交额']['value'].iloc[0] except Exception as e: msg = '{} {} 溢价率 {},{},{}'.format(code, name, premium, status, limit_amount) send_message_via_wechat(msg) else: if volume / 10000 >= 10: # 大于10万成交额 msg = '{} {} 溢价率 {},{},{},成交量{}'.format(code, name, premium, status, limit_amount, volume) send_message_via_wechat(msg) def main(save=False): today = datetime.datetime.now() weekday = today.weekday() if weekday == 5 or weekday == 6: return app = LOF_arbitrage(save) app.run() if __name__ == '__main__': fire.Fire(main) ================================================ FILE: fund/ShareDetection.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/3/29 22:33 # @File : LOFShareDetection.py # @Author : Rocky C@www.30daydo.com # LOF 份额变动 import sys sys.path.append('..') from sqlalchemy.orm import sessionmaker from common.TushareUtil import TushareBaseUtil from sqlalchemy import or_ import pandas as pd from configure.util import send_from_aliyun_ssl from common.BaseService import BaseService from configure.settings import DBSelector from LOF_Model import FundBaseInfoModel, ShareModel, Base LOF_PERCENT = 10 # 偏离 百分比 LOF_DIFF_MAX = 200 ETF_PERCENT = 10 # 偏离 百分比 ETF_DIFF_MAX = 100000 class FundDetection(BaseService): def __init__(self): super(FundDetection, self).__init__('../log/FundDetection.log') self.engine = self.get_engine() self.db_session = self.get_session() self.sess = self.db_session() self.ts_util = TushareBaseUtil() @staticmethod def get_engine(): return DBSelector().get_engine('db_stock') def create_table(self): # 初始化数据库连接: Base.metadata.create_all(self.engine) # 创建表结构 def get_session(self): return sessionmaker(bind=self.engine) def lof_start(self): category = "LOF" query_result_str, has_data = self.query_big_volatility_share(category) if has_data: title = f'{self.today} LOF 申购波动数据' print(title) print(query_result_str) send_from_aliyun_ssl(title=title, content=query_result_str) else: self.logger.info(f'今天{self.today}没有数据') def etf_start(self): category = "ETF" query_result_str, has_data = self.query_big_volatility_share(category) if has_data: title = f'{self.today} ETF 申购波动数据' # print(title) # print(query_result_str) send_from_aliyun_ssl(title, content=query_result_str) else: self.logger.info(f'今天{self.today}没有数据') def query_big_volatility_share(self, category): day = 0 # 前x天 ,天 ,0 即使昨天和前天的数据比较 yesterday = self.ts_util.get_last_trade_date() # 最新的一天 yesterday = self.ts_util.date_convertor(yesterday) lastday_of_yesterday = self.ts_util.get_trade_date()[-3 - day] # 上一天 lastday_of_yesterday = self.ts_util.date_convertor(lastday_of_yesterday) string_arg = '' has_data = False string_arg += f'\n############ {category} ###############\n\n' if category == 'LOF': lastest_lofs = self.sess.query(FundBaseInfoModel.name, FundBaseInfoModel.code, ShareModel.share, ShareModel.date).join(ShareModel).filter( FundBaseInfoModel.category == category).filter( or_(ShareModel.date == yesterday, ShareModel.date == lastday_of_yesterday)).all() PERCENT = LOF_PERCENT DIFF_MAX = LOF_DIFF_MAX else: # ETF data last_week = self.ts_util.get_last_week_trade_date() last_week = self.ts_util.date_convertor(last_week) lastest_lofs = self.sess.query(FundBaseInfoModel.name, FundBaseInfoModel.code, ShareModel.share, ShareModel.date).join(ShareModel).filter( FundBaseInfoModel.category == category).filter( ShareModel.date.between(last_week, yesterday)).all() PERCENT = ETF_PERCENT DIFF_MAX = ETF_DIFF_MAX # print(type(lastest_lofs)) current_df = pd.DataFrame(lastest_lofs,columns=['name','code','share','date']) current_df['date'] = current_df['date'].astype(str) current_df['share'] = current_df['share'].astype(float) current_df['code'] = current_df['code'].astype(str) current_df['name'] = current_df['name'].astype(str) for code, sub_df in current_df.groupby('code'): # 按照code分组,把前后两个值做差值 yesterday_share = sub_df[sub_df['date'] == yesterday] lastday_of_yesterday_share = sub_df[sub_df['date'] == lastday_of_yesterday] if len(yesterday_share) > 0 and len(lastday_of_yesterday_share) > 0: yesterday_share_num = yesterday_share['share'].to_list()[0] lastday_of_yesterday_num = lastday_of_yesterday_share['share'].to_list()[0] diff_part = yesterday_share_num - lastday_of_yesterday_num diff = diff_part * 1.00 / lastday_of_yesterday_num * 100.00 diff = round(diff, 2) if abs(diff) >= PERCENT or abs(diff_part) > DIFF_MAX: has_data = True # 有数据则发送邮件 print(yesterday_share['name'].to_list()[0], yesterday_share['code'].to_list()[0], yesterday_share_num, lastday_of_yesterday_num, lastday_of_yesterday, diff, round(diff_part, 0)) # yesterday_share_num 昨日份额 # lastday_of_yesterday_num 前日份额 string = self.formator(category, yesterday_share['name'].to_list()[0], yesterday_share['code'].to_list()[0], round(yesterday_share_num / 10000, 2), round(lastday_of_yesterday_num / 10000, 2), yesterday, diff, round(diff_part, 0)) string_arg += string + '\n' string_arg += '\n' return string_arg, has_data @staticmethod def formator(*args): string = '{} {} {} {}亿份 {}亿份 {} {}% 多出了{}万份\n'.format(*args) return string ================================================ FILE: fund/__init__.py ================================================ # -*- coding: utf-8 -*- # website: http://30daydo.com # @Time : 2020/8/3 19:00 # @File : __init__.py.py ================================================ FILE: fund/ark_funds.py ================================================ # Crawl ARK Fund holdings and parse pdf file with python # 获取ARK持仓数据 python解析pdf import sys sys.path.append('..') import datetime from parsel import Selector from common.BaseService import BaseService from configure.settings import DBSelector # maxium count to try on save data to mongodb MAX_COUNT = 5 class ARKFundSpider(BaseService): def __init__(self): super(ARKFundSpider, self).__init__('../log/ark.log') self.url = 'https://ark-funds.com/auto/gettopten.php' self.data = {'ticker': None} self.doc = self.mongodb() def mongodb(self): doc=DBSelector().mongo('qq')['db_stock']['ark_fund'] try: doc.create_index([('name',1),('type',1),('date',1)],unique=True) except Exception as e: print(e) return doc @property def headers(self): return {"accept-encoding": "gzip, deflate, br", "accept-language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "cache-control": "no-cache", # "content-length": "11", "content-type": "application/x-www-form-urlencoded; charset=UTF-8", "cookie":"__cfduid=d6d00b7e7c3e594db5594b2c4cdd024f81615176897; _ga=GA1.2.1513737719.1615176899; _gid=GA1.2.1327041807.1615176899; hubspotutk=0e00e2625f2068d6a36e915cd36c7b59; __hssrc=1; __hs_opt_out=no; __hs_initial_opt_in=true; PHPSESSID=i3i8bit64m9f4gtilt5qfpthmh; __hstc=6077420.0e00e2625f2068d6a36e915cd36c7b59.1615177010946.1615177010946.1615181523479.2; _gat=1; __hssc=6077420.5.1615181523479", # "cookie": "__cfduid=d6d00b7e7c3e594db5594b2c4cdd024f81615176897; _ga=GA1.2.1513737719.1615176899; _gid=GA1.2.1327041807.1615176899; __hstc=6077420.0e00e2625f2068d6a36e915cd36c7b59.1615177010946.1615177010946.1615177010946.1; hubspotutk=0e00e2625f2068d6a36e915cd36c7b59; __hssrc=1; __hssc=6077420.1.1615177010947; __hs_opt_out=no; __hs_initial_opt_in=true", "origin": "https://ark-funds.com", "pragma": "no-cache", "referer": "https://ark-funds.com/arkk", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36", "x-requested-with": "XMLHttpRequest", } def get_content(self, fund_name): post_data = self.data.copy() post_data['ticker'] = fund_name content = self.post(url=self.url, post_data=post_data) # print('content') # print(content) return content def parse(self, content,types): response = Selector(text=content) table = response.xpath('//table[@id="top10h"]/tr') holding_list = [] date = response.xpath( '//div[@class="asofdate floatleft"]/text()').extract_first() try: date = date.replace('As of ', '') date = datetime.datetime.strptime(date,'%m/%d/%Y').strftime('%Y-%m-%d') except Exception as e: print(e) t=response.xpath( '//div[@class="asofdate floatleft"]/text()').extract_first() print(t) for item in table[1:]: item_dict = {} percent = item.xpath('.//td[1]/text()').extract_first() name = item.xpath('.//td[2]/text()').extract_first() short_name = item.xpath('.//td[3]/text()').extract_first() price = item.xpath('.//td[4]/text()').extract_first() share_hold = item.xpath('.//td[5]/text()').extract_first() market_value = item.xpath('.//td[6]/text()').extract_first() item_dict['holding_percent'] = percent item_dict['name'] = name item_dict['short_name'] = short_name item_dict['price'] = price item_dict['share_hold'] = share_hold item_dict['market_value'] = market_value item_dict['date']=date item_dict['type']=types holding_list.append(item_dict) return holding_list def save_data(self,date_list): count=0 while count last_high: last_high = current continue if (last_high - current) / last_high > max_withdraw: # 找到一个最大值时,保存其位置 max_withdraw = (last_high - current) / last_high max_date_index = index return max_withdraw # 变成百分比 def daily_netvalue(self,df_copy,i,profit,date): ''' 非调仓阶段 获取持仓的收益率 ''' holding_list = list(self.Position.keys()) if i + self.interval - 1 >= len(df_copy): return for code in holding_list: fund_netvalue = df_copy.iloc[i + self.interval - 1][code] profit += self.Position[code] * fund_netvalue ratio = profit / self.origin_cash * 100 - 100 self.profit_list.append({'date': date, 'profit': ratio}) def backtrade(self): self.position_intialize() _df = self.app.get_data(self.source) _df['净值日期'] = _df['净值日期'].astype('datetime64[ns]') df_copy = _df.set_index(['净值日期', 'code']).unstack()['累计净值'] df = _df.set_index(['净值日期', 'code']).unstack()['日增长率'] df.index = pd.to_datetime(df.index, format='%Y-%m-%d') df_copy.index = pd.to_datetime(df_copy.index, format='%Y-%m-%d') df = df.loc[self.start:] df_copy = df_copy.loc[self.start:] final_profit = None for i in range(len(df)): profit = self.cash date = df.iloc[i].name.date() if i%self.interval!=0: self.daily_netvalue(df_copy,i,profit,date) continue t = df.iloc[i:i + self.interval].sum() top_netvalue_increase = t.nlargest(self.N) target = top_netvalue_increase.index if i + self.interval - 1 >= len(df): continue target_result = df_copy.iloc[i + self.interval - 1].loc[target] if all(target_result.isnull()): logger.error('empty value occur!') continue holding_list = list(self.Position.keys()) for code in holding_list: fund_netvalue = df_copy.iloc[i + self.interval - 1][code] profit += self.Position[code] * fund_netvalue # [Rocky]: 卖出 if code not in target: # 计算卖出的·金额 self.cash += self.Position[code] * fund_netvalue # 放入现金 # 移除仓位 del self.Position[code] msg = '{} 卖出{}'.format(date, code) logger.info(msg) ratio = profit / self.origin_cash * 100 - 100 logger.info(self.MSG.format(profit, ratio)) self.profit_list.append({'date': date, 'profit': ratio}) for code in target: if code not in self.Position and len(self.Position) <= self.N: if np.isnan(df_copy.iloc[i + self.interval - 1][code]): continue fund_netvalue = df_copy.iloc[i + self.interval - 1][code] self.Position[code] = self.cash / (self.N - len(self.Position)) / fund_netvalue self.cash -= self.Position[code] * fund_netvalue msg = '{} 买入{},基金当前净值 {},买入份额{:.2f}'.format(date, code, fund_netvalue, self.Position[code]) logger.info(msg) self.evaluate() def evaluate(self): _profit_list = [i.get('profit')/100+1 for i in self.profit_list] max_withdraw = self.get_max_withdraw(_profit_list) last_value = self.profit_list[-1].get('profit') logger.info('总收益率{:.2f}%'.format(last_value)) logger.info('策略最大回撤为{:.2f}%'.format(max_withdraw*100)) profit_df = pd.DataFrame(self.profit_list) profit_df = profit_df.dropna(axis=0) profit_df.to_excel('backtrade.xlsx',encoding='utf8') ax = profit_df.plot(x='date', y='profit', grid=True, title='closed fund profit', rot=45, figsize=(12, 8)) fig = ax.get_figure() fig.savefig('封基轮动收益率曲线.png') def each_fund_profit(self,row): row = row.dropna() # print(row) percent = (row[-1] - row[0]) / row[0] year = (row.index[-1]-row.index[0]).days/365 yiled_ratio = (1+percent)**(1/year)-1 return yiled_ratio*100 def compare_all_market(self): ''' 所有封基的中位数 ''' self.position_intialize() _df = self.app.get_data(self.source) _df['净值日期'] = _df['净值日期'].astype('datetime64[ns]') df_copy = _df.set_index(['净值日期', 'code']).unstack()['累计净值'] df_copy.index = pd.to_datetime(df_copy.index, format='%Y-%m-%d') df_copy = df_copy.loc[self.start:] result = df_copy.apply(self.each_fund_profit,axis=0) print(result) print('年化收益率中位数',np.median(result)) print('年化收益率平均',np.mean(result)) def run(self): self.func() ================================================ FILE: fund/closed_end_fund_backtrade/fund_code.json ================================================ { "184801": "鹏华前海", "169106": "东证创优", "501053": "东证目优", "501076": "科创基金", "501097": "科创国寿", "501073": "科创混合", "501070": "广发睿阳", "501202": "科创华泰", "501083": "科创银华", "501062": "南方瑞合", "160645": "鹏华回报", "501205": "鹏华创新", "501098": "科创建信", "501080": "科创中金", "501075": "科创主题", "501046": "财通福鑫", "160926": "创业大成", "501038": "银华明择", "166025": "中欧远见", "501095": "BOCI科创", "501081": "科创中欧", "501085": "科创财通", "501096": "科创国联", "501092": "交银瑞思", "169103": "东证睿轩", "161132": "易基科顺", "501200": "科创加银", "160143": "创业LOF", "506002": "易基科创", "169107": "东证恒阳", "160529": "创业博时", "501063": "添富悦享", "501206": "添富创新", "501079": "科创大成", "169102": "东证睿阳", "501093": "华夏翔阳", "501071": "泓德丰泽", "501099": "科创平安", "506001": "万家科创", "501082": "科创投资", "161729": "招商瑞利", "168207": "中融创业", "163418": "兴全合兴", "501065": "经典成长", "167508": "安信价值", "501049": "东证睿玺", "501088": "嘉实瑞虹", "506000": "科创板基", "501078": "科创配置", "161837": "银华大盘", "162720": "创业广发", "160526": "博时优势", "160325": "华夏创业", "501054": "东证睿泽", "501091": "嘉实瑞熙", "501203": "易基未来", "166027": "中欧创业", "161912": "社会责任", "501207": "华夏创新", "166024": "中欧恒利", "501087": "交银瑞丰", "160726": "嘉实瑞享", "161040": "创业富国", "501208": "中欧创新", "506006": "添富科创", "506005": "科创板BS", "160527": "研究优选", "161914": "万家创业", "501066": "东证恒元", "501201": "科创红土", "501077": "科创富国", "506003": "富国科创" } ================================================ FILE: fund/closed_end_fund_backtrade/fund_data_source.py ================================================ # 作者公众号:可转债量化分析 import json import sys import akshare as ak import pandas as pd from loguru import logger sys.path.append('../../') # 封基回撤 class DataSource(): def __init__(self): pass def get_fund_code(self): codes = [] for code in self.doc.find({}, {'fund_id': 1, '_id': 0}): codes.append(code['fund_id']) return codes def get_fund_code_local(self): codes = [] with open('fund_code.json','r') as fp: js_data = json.load(fp) for code in js_data.keys(): codes.append(code) return codes def get_data(self,source): if source=='mongo': return self.get_data_from_mongo() else: logger.info('正在获取数据,请耐心等待。。。。。。【预测需要1分钟】') return self.get_data_from_ak() def df_into_csv(self,df): try: df.to_csv('fund_netvalue.csv',mode='a') except Exception as e: print(e) def all_market_data(self,source='local'): ''' 获取数据 ''' if source=='local': for code in self.get_fund_code_local(): df = self.get_closed_fund_netvalue(code) df['code']=code df['净值日期']=df['净值日期'].astype(str) self.df_into_csv(df) else: for code in self.get_fund_code(): df = self.get_closed_fund_netvalue(code) df['code']=code df['净值日期']=df['净值日期'].astype(str) self.df_into_mongo(df) def df_into_mongo(self, df): data_list = df.to_json(orient='records', force_ascii=False) data_list = json.loads(data_list) try: self.bt_doc.insert_many(data_list) except Exception as e: print(e) def get_net_value(self,code): ''' 获取基金的净值 ''' fund_open_fund_info_em_df = ak.fund_open_fund_info_em(fund=code, indicator="单位净值走势") return fund_open_fund_info_em_df def get_closed_fund_netvalue(self,code): fund_etf_fund_info_em_df = ak.fund_etf_fund_info_em(fund=code) return fund_etf_fund_info_em_df def get_data_from_mongo(self): from configure.settings import DBSelector self.mongo_client = DBSelector().mongo('qq') self.doc = self.mongo_client['closed_end_fund']['2022-02-28'] self.bt_doc = self.mongo_client['db_stock']['closed_end_fund'] result = [] for item in self.bt_doc.find({'日增长率':{'$ne':None}},{'_id':0}): result.append(item) df= pd.DataFrame(result) return df def get_data_from_ak(self): result = [] for code in self.get_fund_code_local(): df = self.get_closed_fund_netvalue(code) df['code']=code df['净值日期']=df['净值日期'].astype(str) result.append(df) ret_df = pd.concat(result) return ret_df[~ret_df['日增长率'].isnull()] ================================================ FILE: fund/closed_end_fund_backtrade/main.py ================================================ # 作者公众号:可转债量化分析 import fire from backtrade_fund_weekly_share_increment import Runner def main(func): app = Runner(func) app.run() if __name__ == '__main__': fire.Fire(main) ================================================ FILE: fund/danjuan_fund.py ================================================ import datetime import sys import time from typing import Deque sys.path.append('..') from common.BaseService import BaseService from configure.settings import DBSelector class Danjuan(BaseService): def __init__(self) -> None: super(Danjuan, self).__init__('../log/danjuan.log') self.base_url = 'https://danjuanfunds.com/djapi/fundx/portfolio/v3/plan/united/page?tab=4&page={}&size=20&default_order=0&invest_strategy=&type=&manager_type=&yield_between=&mz_between=' self.detail_url = 'https://danjuanfunds.com/djapi/plan/position/detail?plan_code={}' self.plan_detail_url = 'https://danjuanfunds.com/djapi/plan/{}' self.__headers = { "Accept": "application/json, text/plain, */*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Host": "danjuanfunds.com", "Referer": "https://danjuanfunds.com/activity/GroupBigV", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36", } self.db = DBSelector().mongo(location_type='qq') date=datetime.datetime.now().strftime("%Y-%m-%d") self.main_doc = self.db['db_danjuan'][f'danjuan_fund_{date}'] self.mongo_init() def mongo_init(self): try: self.main_doc.ensure_index('plan_code', unique=True) except Exception as e: self.logger.error(e) @property def headers(self): return self.__headers def crawl(self, page): # page = 1 full_url = self.base_url.format(page) content = self.get(url=full_url, _json=True ) return content def parse(self, content): return content.get('data', {}).get('items', []) def save_data(self, data_list): for item in data_list: try: self.main_doc.insert_one(item) except Exception as e: self.logger.error(e) def get_plan_code(self): MAX_PAGE = 50 for page in range(1, MAX_PAGE): # 暂定 50页,实际数据很少 content = self.crawl(page) return_data = self.parse(content) self.save_data(return_data) time.sleep(1) @property def code_list(self): return self.main_doc.find({}, {'plan_code': 1}) def update_data(self, condition, data): try: self.main_doc.update_one(condition, {'$set': data}) except Exception as e: self.logger.error(e) else: print('update passed!') def plan_detail(self): for code in self.code_list: code = code.get('plan_code') url = self.plan_detail_url.format(code) content = self.get(url=url, _json=True) if content.get('data'): detail_info = content.get('data') detail_info = self.post_process(detail_info) self.update_data({'plan_code': code}, detail_info) else: self.logger.error('code {} is empty'.format(code)) def post_process(self, detail_info): ''' 移除无用字段 ''' keys = ['plan_name', 'plan_code', 'yield', 'type', 'yield_name', ] for key in keys: del detail_info[key] return detail_info def get_holding_fund_detail(self): ''' 持仓详情 ''' for code in self.code_list: code = code.get('plan_code') url = self.detail_url.format(code) content = self.get(url=url, _json=True) if content.get('data'): holdings = content.get('data').get('items') self.update_data({'plan_code': code}, {"holding": holdings}) else: self.logger.error('code {} is empty'.format(code)) def run(self): self.get_plan_code() # 获取plan code 并入库 self.get_holding_fund_detail() # 获取具体持仓 self.plan_detail() # 方案的持有信息,收益等 if __name__ == '__main__': app = Danjuan() app.run() ================================================ FILE: fund/danjuan_fund_data_analysis.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/4/20 12:54 # @File : danjuan_fund_data_analysis.py # @Author : Rocky C@www.30daydo.com # 蛋卷数据分析 import datetime import sys from collections import defaultdict sys.path.append('..') from configure.settings import DBSelector from common.BaseService import BaseService import pandas as pd WEEK_DAY = -7 # 上一周的价格 class DanjuanAnalyser(BaseService): def __init__(self): super(DanjuanAnalyser, self).__init__('../log/Danjuan_analysis.log') def select_collection(self,current_date): ''' 根据日期选择数据库 ''' self.db = DBSelector().mongo(location_type='qq') doc = self.db['db_danjuan'][f'danjuan_fund_{current_date}'] return doc def get_top_plan(self,collection,top=10): fund_dict = {} for item in collection.find({},{'holding':1}): plan_holding = item.get('holding',[]) # list for hold in plan_holding: name = hold['fd_name'] if hold['percent']>0: fund_dict.setdefault(name,0) fund_dict[name]+=1 fund_dict=list(sorted(fund_dict.items(),key=lambda x:x[1],reverse=True))[:top] return fund_dict def get_top_plan_percent(self,collection,top=10): fund_dict = {} for item in collection.find({},{'holding':1}): plan_holding = item.get('holding',[]) # list for hold in plan_holding: name = hold['fd_name'] percent =hold['percent'] fund_dict.setdefault(name,0) fund_dict[name]+=percent fund_dict=list(sorted(fund_dict.items(),key=lambda x:x[1],reverse=True))[:top] return fund_dict def start(self): today=datetime.datetime.now() last_week = today + datetime.timedelta(days=WEEK_DAY) last_week_str = last_week.strftime('%Y-%m-%d') # 因为没有执行上周的数据,用历史数据替代 last_week_str = '2021-04-20' # 需要已经保存的库 today_doc = self.select_collection(self.today) last_week_doc = self.select_collection(last_week_str) # 持有个数 fund_dict = self.get_top_plan(today_doc,20) self.pretty(fund_dict,self.today,'count') old_fund_dict = self.get_top_plan(last_week_doc,20) self.pretty(old_fund_dict,last_week_str,'count') diff_set = self.new_fund(fund_dict,old_fund_dict) print('新增的基金入围') print(diff_set) # 按持有比例 new_fund_percent = self.get_top_plan_percent(today_doc,20) old_fund_percent = self.get_top_plan_percent(last_week_doc,20) self.pretty(new_fund_percent,self.today,'percent') self.pretty(old_fund_percent,last_week_str,'percnet') # 清仓 clean_fund = self.clear_warehouse_fund(today_doc,200) self.simple_display(clean_fund,self.today) def simple_display(self,data,date): for i in data: print(i) df = pd.DataFrame(data,columns=['fund','clear_num']) print(df.head(100)) df.to_excel(f'clear_{date}.xlsx') def pretty(self,fund_dict,date,kind): df = pd.DataFrame(fund_dict,columns=['fund','holding_num']) print(df.head(100)) df.to_excel(f'{date}-{kind}.xlsx') def new_fund(self,new_fund_dict,old_fund_dict): new_fund_list = list(map(lambda x: x[0], new_fund_dict)) old_fund_list = list(map(lambda x: x[0], old_fund_dict)) diff_set= set(old_fund_list)-set(new_fund_list) return diff_set def clear_warehouse_fund(self,collection,top): ''' 清仓的基金 ''' fund_dict = {} for item in collection.find({},{'holding':1}): plan_holding = item.get('holding',[]) # list for hold in plan_holding: name = hold['fd_name'] percent =hold['percent'] if percent>0: continue fund_dict.setdefault(name,0) fund_dict[name]+=1 fund_dict=list(sorted(fund_dict.items(),key=lambda x:x[1],reverse=True))[:top] return fund_dict def main(): app = DanjuanAnalyser() app.start() if __name__ == '__main__': main() ================================================ FILE: fund/etf_info.py ================================================ # -*- coding: utf-8 -*- # website: http://30daydo.com # @Time : 2020/2/20 17:06 # @File : etf_info.py # 获取etf的成分股数据 # 重构 2021-01-21 import datetime import pymongo import re import requests import sys from parsel.selector import Selector from sqlalchemy.orm import sessionmaker from loguru import logger sys.path.append('..') from common.BaseService import BaseService from configure.settings import DBSelector from fund.etf_models import IndexObject, IndexObjectNew, Base TIMEOUT = 30 # 超时 class Fund(BaseService): def __init__(self, first_use=False): super(Fund, self).__init__(f'../log/{self.__class__.__name__}.log') self.first_use = first_use self.engine = self.get_engine() def get_engine(self): return DBSelector().get_engine('db_stock') def create_table(self): # 初始化数据库连接: Base.metadata.create_all(self.engine) # 创建表结构 def get_session(self): return sessionmaker(bind=self.engine) def get(self, url, retry=5, js=True): start = 0 while start < retry: try: response = self.session.get(url, headers=self.headers, verify=False) except Exception as e: self.logger.error(e) start += 1 else: if js: content = response.json() else: content = response.text return content if start == retry: self.logger.error('重试太多') return None class IndexSpider(Fund): def __init__(self, first_use=False): super(IndexSpider, self).__init__(first_use) if first_use: self.create_table() self.sess = self.get_session()() self.base_url = 'http://www.csindex.com.cn/zh-CN/indices/index-detail/{}' self.download_url = 'http://www.csindex.com.cn/uploads/file/autofile/cons/{}cons.xls' def basic_info(self): ''' 基本数据,没有仓位的 拿到的只是上证的数据, ??? 中证吧 :return: ''' r = requests.get(url='http://www.csindex.com.cn/zh-CN/search/indices?about=1', headers={'User-Agent': 'Molliza Firefox Chrome'}) response = Selector(text=r.text) table = response.xpath('//table[@class="table table-even table-bg tc p_table tablePage"]') index_list = table[0].xpath('.//tbody[@id="itemContainer"]/tr') for idx in index_list: code = idx.xpath('.//td[1]/a/text()').extract_first() detail_url = idx.xpath('.//td[1]/a/@href').extract_first() name = idx.xpath('.//td[2]/a/text()').extract_first() stock_count = idx.xpath('.//td[3]/text()').extract_first() price = idx.xpath('.//td[4]/text()').extract_first() month_ratio = idx.xpath('.//td[5]/text()').extract_first() month_ratio = month_ratio.replace('--', '') if len(month_ratio) == 0: month_ratio = 0 type_ = idx.xpath('.//td[6]/text()').extract_first() hot_pot = idx.xpath('.//td[7]/text()').extract_first() area = idx.xpath('.//td[8]/text()').extract_first() coin = idx.xpath('.//td[9]/text()').extract_first() specified = idx.xpath('.//td[10]/text()').extract_first() index_type = idx.xpath('.//td[11]/text()').extract_first() obj = IndexObject( 代码=code, 详细URL=detail_url, 指数名称=name, 股票数目=stock_count, 最新收盘=float(price), 一个月收益率=float(month_ratio), 资产类别=type_, 热点=hot_pot, 地区覆盖=area, 币种=coin, 定制=specified, 指数类别=index_type ) try: self.sess.add(obj) except Exception as e: logger.error(e) self.sess.rollback() else: self.sess.commit() def etf_detail_with_product_inuse(self): ''' 获取到所有的成分,不过没有权重 :return: ''' self.client = DBSelector().mongo() self.db = self.client['fund'] # self.doc = client['fund']['etf_info'] ret = self.sess.query(IndexObjectNew).all() sess = requests.Session() for i in ret: code = i.代码 name = i.指数名称 self.etf_detail_constituent_stock(sess, code, name) def full_market(self): ''' 勾选了 中证,上证,深证 :return: ''' total = 1797 # hard code page_size = 50 total_page = total // page_size + 1 url = 'http://www.csindex.com.cn/zh-CN/indices/index?page={}&page_size=50&by=asc&order=%E5%8F%91%E5%B8%83%E6%97%B6%E9%97%B4&data_type=json&class_1=1&class_2=2&class_3=3' for i in range(1, total_page + 1): r = requests.get(url.format(i), headers={'User-Agent': 'Molliza Firefox Chrome'}) ret = r.json() for item in ret.get('list'): index_id = item.get('index_id') index_code = item.get('index_code') index_sname = item.get('indx_sname') index_ename = item.get('index_ename') num = item.get('num') tclose = item.get('tclose') yld_1_mon = item.get('yld_1_mon') base_point = item.get('base_point') index_c_intro = item.get('index_c_intro') index_c_fullname = item.get('index_c_fullname') class_assets = item.get('class_assets') class_series = item.get('class_series') class_classify = item.get('class_classify') class_hot = item.get('class_hot') class_region = item.get('class_region') obj = IndexObjectNew( # id=index_id, 代码=index_code, 指数名称=index_sname, 指数英文名称=index_ename, 股票数目=num, 最新收盘=tclose, 一个月收益率=yld_1_mon, 基准点数=base_point, 指数介绍=index_c_intro, 指数全称=index_c_fullname, 资产类别=class_assets, 指数系列=class_series, 热点=class_hot, 地区覆盖=class_region, 指数类别=class_classify, 获取时间=datetime.datetime.now() ) try: self.sess.add(obj) except Exception as e: logger.error(e) self.sess.rollback() else: self.sess.commit() def download_excel_file(self, sess, code, name): s = sess.get(self.download_url.format(code), headers={'User-Agent': 'Molliza Firefox Chrome'},timeout=TIMEOUT) with open('../data/etf/{}_{}.xls'.format(code, name), 'wb') as f: f.write(s.content) def get_qz_page(self, sess, code): ''' 获取权重页面 :return: ''' # 获取权重 qz_url = 'http://www.csindex.com.cn/zh-CN/indices/index-detail/{}' s1 = sess.get(qz_url.format(code), headers={'User-Agent': 'Molliza Firefox Chrome'}) return Selector(text=s1.text) def parse_qz_data(self, resp, code, name): ''' 解析权重页面 :return: ''' logger.info(code) qz_stock_list = resp.xpath( '//div[@class="details_r fr"]//table[@class="table table-even table-bg p_table tc"]/tbody/tr') qz_list = [] for stock in qz_stock_list: s_code = stock.xpath('.//td[1]/text()').extract_first() s_name = stock.xpath('.//td[2]/text()').extract_first() s_area = stock.xpath('.//td[3]/text()').extract_first() s_qz = stock.xpath('.//td[4]/text()').extract_first() try: s_qz = float(s_qz) except: pass d = {} d['代码'] = s_code d['名称'] = s_name d['行业'] = s_area d['权重'] = s_qz qz_list.append(d) qz_dict = {} qz_dict['ETF代码'] = code qz_dict['ETF名称'] = name qz_dict['权重'] = qz_list return qz_dict def more_etf_product(self,resp): more_detail_url = resp.xpath('//div[@class="details_l fl"]/h2[@class="t_3 pr mb-10"]/a/@href').extract_first() r = requests.get(more_detail_url,headers={'User-Agent': 'Molliza Firefox Chrome'}) def etf_product_list(self, resp_selector): tables = resp_selector.xpath('//table[@class="table table-even table-bg p_table tc mb-20"]/tbody/tr') if len(tables) == 0: return [] product_list = [] for item in tables: product_list.append(item.xpath('.//td/text()').extract_first()) return product_list def store_product_list(self, code, name, products): if len(products) == 0: return [] return {'etf_code': code, 'etf_name': name, 'etf_product': products, 'crawltime': str(datetime.date.today())} def etf_detail_constituent_stock(self, sess, code, name): ''' 获取某个基金的权重数据 :param sess: :param code: :param name: :return: ''' self.download_excel_file(sess, code, name) resp = self.get_qz_page(sess, code) detail_data_json = self.parse_qz_data(resp, code, name) self.store_data(detail_data_json, collection_name='etf_quanzhong',key='ETF代码') product_list = self.etf_product_list(resp) if len(product_list)==5: product_list = self.store_product_list(code, name, product_list) self.store_data(product_list, collection_name='etf_product',key='etf_code') else: product_list = self.store_product_list(code, name, product_list) if product_list: self.store_data(product_list, collection_name='etf_product',key='etf_code') def store_data(self, detail_data_json, collection_name, key=''): try: if not self.db[collection_name].find_one({key: detail_data_json[key]}): self.db[collection_name].insert_one(detail_data_json) except Exception as e: logger.error(e) return False else: return True if __name__ == '__main__': app = IndexSpider(first_use=True) # app.basic_info() # app.full_market() app.etf_detail_with_product_inuse() ================================================ FILE: fund/etf_models.py ================================================ # -*- coding: UTF-8 -*- """ @author:xda @file:etf_models.py @time:2021/01/23 """ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, DateTime, FLOAT,TEXT Base = declarative_base() class IndexObject(Base): __tablename__ = 'tb_etf_info' id = Column(Integer, primary_key=True, autoincrement=True) 代码 = Column(String(10), unique=True) 详细URL = Column(String(100), unique=False) 指数名称 = Column(String(20), unique=True) 股票数目 = Column(String(10), unique=False) 最新收盘 = Column(FLOAT, unique=False) 一个月收益率 = Column(FLOAT, unique=False) 资产类别 = Column(String(20), unique=False) 热点 = Column(String(20), unique=False) 地区覆盖 = Column(String(20), unique=False) 币种 = Column(String(20), unique=False) 定制 = Column(String(20), unique=False) 指数类别 = Column(String(20), unique=False) class IndexObjectNew(Base): ''' 还用中文变量 ''' __tablename__ = 'etf_info' id = Column(Integer, primary_key=True, autoincrement=True) 代码 = Column(String(10), unique=True) # 详细URL = Column(String(100), unique=False) 指数名称 = Column(String(60), unique=False) 指数英文名称 = Column(String(100), unique=False) 股票数目 = Column(String(10), unique=False) 最新收盘 = Column(FLOAT, unique=False) 一个月收益率 = Column(FLOAT, unique=False) 基准点数 = Column(String(20), unique=False) 指数介绍 = Column(TEXT, unique=False) 指数全称 = Column(String(100), unique=False) 资产类别 = Column(String(20), unique=False) 指数系列 = Column(String(20), unique=False) 热点 = Column(String(20), unique=False) 地区覆盖 = Column(String(20), unique=False) 指数类别 = Column(String(20), unique=False) 获取时间 =Column(DateTime) class IndexObjectSZ(Base): __tablename__ = 'etf_info_sz' id = Column(Integer, primary_key=True, autoincrement=True) 代码 = Column(String(20), unique=True) 指数名称 = Column(String(100), unique=False) 详细URL = Column(String(200), unique=False) 基日 = Column(String(20), unique=False) 基日指数 = Column(String(20), unique=False) 起始计算日 = Column(String(20), unique=False) ================================================ FILE: fund/etf_range_increment.py ================================================ # -* coding=utf8 *- # 基金某个时间段的涨幅 import datetime import random import time import akshare as ak import sys import loguru import fire sys.path.append('..') DUMP_DB = False # 不写入数据库 logger = loguru.logger from sqlhelper import SQLHelper class ETFBase(SQLHelper): def __init__(self): super(ETFBase, self).__init__(host='tencent-1c', db_name='db_etf') self.etf_df = ak.fund_etf_category_sina(symbol="ETF基金") self.current_date = datetime.date.today().strftime('%Y-%m-%d') self.code_list = self.etf_df['代码'].tolist() if DUMP_DB: self.etf_df.to_sql('tb_{}'.format(self.current_date), con=self.conn, if_exists='replace', index_label='index', ) class ETFDataCrawler(ETFBase): def __init__(self, history_data): self.history_data = history_data super(ETFDataCrawler, self).__init__() def history_data_all(self): # 获取历史所有数据 for code in self.code_list: try: df = ak.fund_etf_hist_sina(symbol=code) except Exception as e: logger.error('{} error {}'.format(code,e)) else: df.to_sql('tb_{}_history'.format(code), con=self.conn) time.sleep(1 + random.random()) def update_current_data(self): for index, row in self.etf_df.iterrows(): code = row['代码'] open = float(row['今开']) high = float(row['最高']) low = float(row['最低']) close = float(row['最新价']) volume = float(row['成交量']) self._update_current_data(code, self.current_date, open, high, low, close, volume) def _update_current_data(self, code, date, open, high, low, close, volume): sql_str = 'insert into `tb_{}_history` (date,open,high,low,close,volume) values (%s,%s,%s,%s,%s,%s)'.format(code) args = (date, open, high, low, close, volume) if not self.update(sql_str, args): logger.error('{} 更新失败'.format(code)) def update_index(self): for code in self.code_list: # sql_str = 'drop index idx on `tb_{}_history`'.format(code) sql_str = 'create UNIQUE INDEX idx on `tb_{}_history`(`date`)'.format(code) if self.update(sql_str): logger.info('创建索引{}'.format(code)) def fix(self): for code in self.code_list: # sql_str = 'delete from tb_{}_history where `index` is null and `date`=%s'.format(code) # args = ('2023-02-10',) sql_str = 'alter table `tb_{}_history` drop column `index`'.format(code) # 删除某一列 args = None if not self.update(sql_str, args): logger.info('删除{} 失败'.format(code)) def run(self): if self.history_data: self.history_data_all() else: self.update_current_data() # TODO 有可能是新的ETF def main(history_data=False): app = ETFDataCrawler(history_data) app.run() # 获取数据 # app.fix() if __name__ == '__main__': fire.Fire(main) ================================================ FILE: fund/fund_annouce.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/3/19 0:04 # @File : fund_annouce.py # @Author : Rocky C@www.30daydo.com # 基金公告数据 # http://fund.szse.cn/api/disc/info/find/tannInfo?random=0.5044519418668192&type=2&pageSize=30&pageNum=3 import datetime import math import sys sys.path.append('..') from common.BaseService import BaseService class FundAnnouce(BaseService): def __init__(self): super(FundAnnouce, self).__init__('../log/fund_annouce.log') self.PAGE_SIZE=30 self.base_url = 'http://fund.szse.cn/api/disc/info/find/tannInfo?type=2&pageSize={}&pageNum={}' # def get(self, url, _json=False, binary=False, retry=5): @property def headers(self): _header = { "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Cache-Control": "no-cache", "Connection": "keep-alive", "Content-Type": "application/json", "Host": "fund.szse.cn", "Pragma": "no-cache", "Referer": "http://fund.szse.cn/disclosurelist/index.html", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36", "X-Request-Type": "ajax", "X-Requested-With": "XMLHttpRequest", } return _header def get_page(self): content = self.get(self.base_url.format(self.PAGE_SIZE,1), _json=True) announceCount=content['announceCount'] total_page = math.ceil(announceCount/self.PAGE_SIZE) return total_page def run(self): total_page=self.get_page() if total_page<1: self.logger.info('empty content') return for page in range(1,total_page): content = self.get(self.base_url.format(self.PAGE_SIZE, 1), _json=True) self.parse(content) def parse(self, content): for item in content.get('data'): item['crawltime']=datetime.datetime.now() def main(): app = FundAnnouce() app.run() if __name__ == '__main__': main() ================================================ FILE: fund/fund_holding_list_gen_dynamic_flourish.py ================================================ import sys sys.path.append('..') from configure.settings import DBSelector from configure.util import mongo_convert_df db_name='db_stock' doc_name='fund_component_159941' def get_df(): client = DBSelector().mongo('qq') doc = client[db_name][doc_name] df = mongo_convert_df(doc) return df def weight(df): df['weight']=df['weight'].map(lambda x:float(x.replace('%',''))) date_df = df.set_index(['chn_name','date']).unstack()['weight'].sort_index() date_df = date_df.fillna(0) date_df.to_excel('nsda1.xlsx',encoding='utf8') def scale(df): # 规模 pass def main(): df =get_df() # weight(df) scale(df) if __name__=='__main__': main() ================================================ FILE: fund/fund_holding_person.py ================================================ import datetime import time import akshare as ak import pandas as pd symbol_dict = {"股票型", "混合型", "指数型", "QDII", "LOF",} import sys sys.path.append('..') from configure.settings import DBSelector import pymongo def get_mongo_doc(): client = DBSelector().mongo('qq') doc = client['db_stock']['stock_holder_2023-04-14'] try: doc.create_index([("基金代码", pymongo.ASCENDING)],unique=True) except Exception as e: print(e) return doc def get_mongo_target_doc(): client = DBSelector().mongo('qq') doc = client['db_stock']['stock_holder_2023-04-14_top10'] # try: # doc.create_index([("基金代码", pymongo.ASCENDING)],unique=True) # except Exception as e: # print(e) return doc def insert_one(doc,data): code = data['基金代码'] if not doc.find_one({'基金代码':code}): doc.insert_one(data) def get_basic_info(): doc = get_mongo_doc() for item in symbol_dict: fund_open_fund_rank_em_df = ak.fund_open_fund_rank_em(symbol=item) print(fund_open_fund_rank_em_df.head()) print(item,len(fund_open_fund_rank_em_df)) obj_list = fund_open_fund_rank_em_df.to_dict('records') for item in obj_list: insert_one(doc,item) def find_top_holding_stock(code): import akshare as ak try: fund_portfolio_hold_em_df = ak.fund_portfolio_hold_em(symbol=code, date="2022") # print(fund_portfolio_hold_em_df) except Exception as e: return None else: return fund_portfolio_hold_em_df def latest_holding(code): four_season = '2022年4季度股票投资明细' three_season = '2022年3季度股票投资明细' df = find_top_holding_stock(code) if df is not None: if len(df) > 0: df['基金代码']=code tmp_df = df[df['季度'] == four_season] tmp2_df = df[df['季度'] == three_season] if len(tmp_df) > 0: return tmp_df elif len(tmp2_df) > 0: return tmp2_df else: return None def get_fund_code(): doc = get_mongo_doc() target = get_mongo_target_doc() all_code = doc.find({},{'基金代码':1}) df_list=[] for _code in all_code: if target.find_one({'基金代码':_code}): continue code=_code['基金代码'] df = latest_holding(code) if df is None: print('df is empty') continue df['updated']=datetime.datetime.now() obj_list = df.to_dict('records') target.insert_many(obj_list) df_fund = pd.concat(df_list) obj_list = df_fund.to_dict('records') for item in obj_list: target.insert_one(item) def run(): get_fund_code() if __name__ == '__main__': run() ================================================ FILE: fund/fund_info_spider.py ================================================ import random import re import datetime import demjson import requests import time import sys sys.path.append('..') from configure.settings import DBSelector from common.BaseService import BaseService from configure.util import send_from_aliyun_ssl import warnings warnings.filterwarnings("ignore") now = datetime.datetime.now() TODAY = now.strftime('%Y-%m-%d') _time = now.strftime('%H:%M:%S') if _time < '11:30:00': TODAY += 'morning' elif _time < '14:45:00': TODAY += 'noon' else: TODAY += 'close' # TODAY += 'noon' # 调试 NOTIFY_HOUR = 13 MAX_PAGE = 50 try: DB = DBSelector() conn = DB.get_mysql_conn('db_fund', 'qq') cursor = conn.cursor() except Exception as e: print(e) class TencentFundSpider(BaseService): # 腾讯 基金数据爬虫 套利使用 def __init__(self): super(TencentFundSpider, self).__init__(f'../log/{self.__class__.__name__}.log') self.create_table() self.session = requests.Session() self.logger.info('start...qq fund') self.LAST_TEXT = '' @property def headers(self): _headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36', 'Accept': '*/*', # 'Referer': 'http://stockapp.finance.qq.com/mstats/?id=fund_close', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8', } return _headers def create_table(self): create_table = 'create table if not EXISTS `{}` (`基金代码` varchar(20) PRIMARY KEY,`基金简称` ' \ 'varchar(100),`最新规模-万` float,' \ '`实时价格` float,`涨跌幅` float,`成交额-万` float,' \ '`净值日期` VARCHAR(10),`单位净值` float,`累计净值` ' \ 'float,`折溢价率` float ,`申购状态` VARCHAR(20),`申赎状态` varchar(20),' \ '`基金经理` VARCHAR(200),' \ '`成立日期` VARCHAR(20), `管理人名称` VARCHAR(200),' \ '`实时估值` INT,`更新时间` VARCHAR(20),`数据源` VARCHAR(20) );'.format( TODAY) self.execute(create_table, (), conn, self.logger) def crawl_fund_info_by_code_table(self): code_list = self.get_fund_code(valid=False) for code in code_list: self.get_info_by_code(code) def get_fund_code(self, valid=True): query_cmd = 'select code from fund_main_code' if valid: query_cmd = query_cmd + 'where valid=1' result = self.execute(query_cmd, (), conn, self.logger) code_list = [] for row in result: code_list.append(row[0]) return code_list def convert(self, float_str): try: return_float = float(float_str) except: return_float = None return return_float def insert_data(self, jjdm, jjjc, zxgm, zxjg, jgzffd, cj_total_amount, jzrq, dwjz, ljjz, zyjl, sgzt, shzt, jjjl, clrq, glrmc): update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') is_realtime = 1 zxgm = self.convert(zxgm) zxjg = self.convert(zxjg) jgzffd = self.convert(jgzffd) cj_total_amount = self.convert(cj_total_amount) dwjz = self.convert(dwjz) ljjz = self.convert(ljjz) zyjl = self.convert(zyjl) source = '腾讯基金' insert_data = 'insert into `{}` VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'.format(TODAY) if jjdm is None: # 部分没有数据的基金解析到的基金代码是空,跳过 return self.execute(insert_data, ( jjdm, jjjc, zxgm, zxjg, jgzffd, cj_total_amount, jzrq, dwjz, ljjz, zyjl, sgzt, shzt, jjjl, clrq, glrmc, is_realtime, update_time, source), conn, self.logger) def check_exist(self, code): check_code_exists = 'select count(*) from `{}` WHERE `基金代码`=%s'.format(TODAY) cursor.execute(check_code_exists, (code)) ret = cursor.fetchone() return ret def get(self, url, params, retry=5, js=False): start = 0 while start < retry: try: response = self.session.get(url, headers=self.headers, params=params, verify=False) except Exception as e: self.logger.error(e) start += 1 else: if js: content = response.json() else: content = response.text return content if start == retry: self.logger.error('重试太多') return None def crawl(self): ''' 废弃 网页内容不存在了 ''' url = 'http://stock.gtimg.cn/data/index.php' for p in range(1, MAX_PAGE): params = ( ('appn', 'rank'), ('t', 'ranklof/chr'), ('p', p), ('o', '0'), ('l', '40'), ('v', 'list_data'), ) content = self.get(url, params) if content is None: continue if content == self.LAST_TEXT: break self.LAST_TEXT = content ls_data = re.search('var list_data=(.*?);', content, re.S) if ls_data: ret = ls_data.group(1) else: self.logger.error('解析出错') continue js = demjson.decode(ret) # 解析json的库 query_string = js.get('data') time.sleep(5 * random.random()) for code in query_string.split(','): self.get_info_by_code(code) def get_info_by_code(self, code): code_set = set() if code not in code_set: code_set.add(code) else: return ret = self.check_exist(code) if ret[0] > 0: return detail_url = 'http://gu.qq.com/{}' content = self.get(url=detail_url.format(code), params=None) if content is None: self.logger.error('请求内容为空') return self.parse_content_and_save(content) def parse_content_and_save(self, content): jjdm, jjjc, zxgm, zxjg, jgzffd, cj_total_amount, jzrq, dwjz, ljjz, zyjl, sgzt, shzt, jjjl, clrq, glrmc = self.parse_html( content) self.insert_data(jjdm, jjjc, zxgm, zxjg, jgzffd, cj_total_amount, jzrq, dwjz, ljjz, zyjl, sgzt, shzt, jjjl, clrq, glrmc) def parse_html(self, content): search_str = re.search('', content) if search_str: s = search_str.group(1) js_ = demjson.decode(s) sub_js = js_.get('data').get('data').get('data') zxjg = sub_js.get('zxjg') jgzffd = sub_js.get('jgzffd') cj_total_amount = sub_js.get('cj_total_amount') zyjl = float(sub_js.get('zyjl', 0)) * 100 info = js_.get('data').get('data').get('info') jjdm = info.get('jjdm') jjjc = info.get('jjjc') zxgm = info.get('zxgm') dwjz = info.get('dwjz') ljjz = info.get('ljjz') sgzt = info.get('sgzt') shzt = info.get('shzt') jjjl = info.get('jjjl') clrq = info.get('clrq') glrmc = info.get('glrmc') jzrq = info.get('jzrq') return jjdm, jjjc, zxgm, zxjg, jgzffd, cj_total_amount, jzrq, dwjz, ljjz, zyjl, sgzt, shzt, jjjl, clrq, glrmc else: return [None] * 15 def change_table_field(self, table): add_column1 = 'alter table `{}` add column `实时净值` float'.format(table) add_column2 = 'alter table `{}` add column `溢价率` float'.format(table) self.execute(add_column1, (), conn, self.logger) self.execute(add_column2, (), conn, self.logger) def get_fund_info(self, table): query = 'select `基金代码`,`基金简称`,`实时价格` from `{}`'.format(table) return self.execute(query, (), conn, self.logger) def udpate_db(self, table, jz, yjl, is_realtime, code): update_sql = 'update `{}` set `实时净值`= %s,`溢价率`=%s ,`实时估值`=%s where `基金代码`=%s'.format(table) self.execute(update_sql, (jz, yjl, is_realtime, code), conn, self.logger) def update_netvalue(self): ''' 更新净值 :param table: :return: ''' # table='2020-02-25' # 用于获取code列 # TODAY=datetime.datetime.now().strftime('%Y-%m-%d') table = TODAY self.change_table_field(table) all_fund_info = self.get_fund_info(table) for item in all_fund_info: jz, yjl, is_realtime, code = self.get_netvalue(table, item) self.udpate_db(table, jz, yjl, is_realtime, code) # print(f'更新代码{code}') self.logger.info('更新成功') self.notice_me(TODAY) def get_netvalue(self, table, item): # 获取净值 code = item[0] is_realtime = 1 realtime_price = item[2] url = 'http://web.ifzq.gtimg.cn/fund/newfund/fundSsgz/getSsgz?app=web&symbol=jj{}' js = self.get(url=url.format(code), params=None, js=True) data = js.get('data') if data: try: data_list = data.get('data') except Exception as e: self.logger.error(e) jz = None yjl = None else: last_one = data_list[-1] jz = last_one[1] if js is None or realtime_price is None: yjl = 0 else: yjl = round((realtime_price - jz) / jz * 100, 2) else: is_realtime = 0 yjl, jz = self.get_fund(table, code) return jz, yjl, is_realtime, code def get_fund(self, table, code): query = f'select `折溢价率`,`单位净值` from `{table}` where `基金代码`=%s' cursor.execute(query, code) ret = cursor.fetchone() yjl, jz = ret[0], ret[1] yjl = round(yjl, 3) jz = round(jz, 3) return yjl, jz def query_fund_data(self, today, order): query_sql = '''select `基金代码`,`基金简称`,`实时价格`,`实时净值`,`溢价率`,`净值日期` from `{}` where `申购状态`='开放' and `申赎状态`='开放' and `基金简称` not like '%%债%%' and `溢价率` is not null and !(`实时价格`=1 and `涨跌幅`=0 and `成交额-万`=0) order by `溢价率` {} limit 10'''.format( today, order) return self.execute(query_sql, (), conn, self.logger) def html_formator(self, ret, html): for row in ret: html += f'{row[0]}{row[1].replace("(LOF)", "")}{row[2]}{row[3]}{row[4]}{row[5]}' html += '' return html def combine_html(self, html, today): body = '
' \ '' html += body result_asc = self.query_fund_data(today, 'asc') if self.check_content(result_asc): html = self.html_formator(result_asc, html) html += body result_desc = self.query_fund_data(today, 'desc') if self.check_content(result_desc): html = self.html_formator(result_desc, html) return html def check_content(self, content): if content is None: self.logger.error('获取内容为空') return False else: return True def notice_me(self, today): now = datetime.datetime.now() if now.hour > NOTIFY_HOUR: # 下午才会发通知 title = f'{today} 基金折溢价' html = '' html = self.combine_html(html, TODAY) try: send_from_aliyun_ssl(title, html, types='html') except Exception as e: self.logger.error(e) self.logger.info('发送失败') else: self.logger.info('发送成功') if __name__ == '__main__': now = datetime.datetime.now() TODAY = now.strftime('%Y-%m-%d') _time = now.strftime('%H:%M:%S') if _time < '11:30:00': TODAY += 'morning' elif _time < '14:45:00': TODAY += 'noon' else: TODAY += 'close' # TODAY += 'noon' app = TencentFundSpider() app.crawl_fund_info_by_code_table() # app.crawl() # app.update_netvalue(TODAY) # app.notice_me(TODAY) # app.get_info_by_code('160137') # print(app.get_fund_code()) app.update_netvalue() ================================================ FILE: fund/fund_jsl.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/8/24 6:06 # @File : fund_jsl.py # @Author : Rocky C@www.30daydo.com import random import re import datetime import demjson import requests import time import sys sys.path.append('..') from configure.settings import DBSelector from common.BaseService import BaseService # from configure.util import notify import warnings warnings.filterwarnings("ignore") now = datetime.datetime.now() TODAY = now.strftime('%Y-%m-%d') _time = now.strftime('%H:%M:%S') if _time < '11:30:00': TODAY += 'morning' elif _time < '14:45:00': TODAY += 'noon' else: TODAY += 'close' # TODAY += 'noon' # 调试 NOTIFY_HOUR = 13 MAX_PAGE = 50 try: DB = DBSelector() conn = DB.get_mysql_conn('db_fund', 'qq') cursor = conn.cursor() except Exception as e: print(e) ''' 集思录部分代码 ''' class JSLFund(BaseService): ''' 集思录的指数 ''' def __init__(self): super(JSLFund, self).__init__(f'../log/{self.__class__.__name__}.log') client = DB.mongo(location_type='qq', async_type=False) self.jsl_stock_lof = client['fund_daily'][f'jsl_stock_lof_{self.today}'] self.jsl_index_lof = client['fund_daily'][f'jsl_index_lof_{self.today}'] self.stock_url = 'https://www.jisilu.cn/data/lof/stock_lof_list/?___jsl=LST___t=1582355333844&rp=25' self.index_lof_url = 'https://www.jisilu.cn/data/lof/index_lof_list/?___jsl=LST___t=1582356112906&rp=25' self.logger.info(f'start JSL fund...') @property def headers(self): _headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'} return _headers def get(self, url, retry=5): start = 0 while start < retry: try: r = requests.get( url=url, headers=self.headers) except Exception as e: self.logger.error(e) start += 1 else: js = r.json() return js if start == retry: return None def crawl(self): for types in ['stock', 'index']: self.parse_json(types=types) def parse_json(self, types): if types == 'stock': url = self.stock_url mongo_doc = self.jsl_stock_lof else: url = self.index_lof_url mongo_doc = self.jsl_index_lof return_js = self.get(url=url) rows = return_js.get('rows') for item in rows: cell = item.get('cell') cell['crawltime'] = datetime.datetime.now() try: mongo_doc.insert_one(cell) except Exception as e: self.logger.error(e) self.notify(title=f'{self.__class__} 写入mongodb出错') def main(): pass if __name__ == '__main__': main() ================================================ FILE: fund/fund_profit_info.py ================================================ # 获取基金的基本信息 import akshare as ak import datetime import fire import re import numpy as np import pyecharts.options as opts from pyecharts.charts import Line from pyecharts import options as opts # 计算基金的收益率曲线 code_list = [{'code': '008331', 'name': '万家可转债债券A'}, {'code': '000297', 'name': '鹏华可转债'}, {'code': '006482', 'name': '广发可转债债券A'}, {'code': '000536', 'name': '前海开源可转债债券'}, {'code': '310518', 'name': '申万菱信可转债债券A'}, {'code': '240018', 'name': '华宝可转债债券'}, {'code': '340001', 'name': '兴全可转债混合'}, {'code': '005273', 'name': '华商可转债A'}, {'code': '470058', 'name': '汇添富可转换债券A'}, {'code': '110035', 'name': '易方达双债增强A'}, {'code': '008809', 'name': '安信民稳增长混合A'}, {'code': '005876', 'name': '易方达鑫转增利混合A'}, {'code': '006102', 'name': '浙商丰利增强债券'}, {'code': '003092', 'name': '华商丰利增强定开债A'}] def parse_fund_code_in_txt(filename): with open(filename,encoding='utf8') as fp: lines = fp.readlines() code_list = [] for line in lines: match = re.search('\(F(\d+)\)',line) if match: name_match = re.search('\$(.*?)\(',line).group(1) code_list.append({'code':match.group(1),'name':name_match}) return code_list def convert_time(x): return str(x).replace(' 00:00:00','') def get_net_value(code): ''' 获取基金的净值 ''' fund_open_fund_info_em_df = ak.fund_open_fund_info_em(fund=code, indicator="累计净值走势") return fund_open_fund_info_em_df def get_year(start,end): ''' 获取年份 ''' year = (datetime.datetime.strptime(end,'%Y-%m-%d')- datetime.datetime.strptime(start,'%Y-%m-%d')).days/365 return year def get_profit_rate(df): ''' 计算所有的收益率 ''' return round((df['累计净值'].iloc[-1]-df['累计净值'].iloc[0])/df['累计净值'].iloc[0],2) def get_yearly_profit_rate(df): ''' 计算年化收益率 ''' start = str(df['净值日期'].iloc[0]) end = str(df['净值日期'].iloc[-1]) year = get_year(start,end) print('开始时间:',start) print('成立年数:',round(year,2),'年') profit = get_profit_rate(df) print('成立以来累积收益率:',profit) year_profit = (1+profit)**(1/year)-1 return start,round(year,2),profit,round(year_profit,2) def fund_profit(code,name=''): ''' 生成字典 ''' df = get_net_value(code) max_withdraw,max_date_index = get_max_withdraw(df['累计净值'].tolist()) start,year,profit,year_profit = get_yearly_profit_rate(df) d={} d['代码']=code d['名称']=name d['发行日期']=start d['成立年数']=year d['累积收益率']=profit d['年化收益率']=year_profit d['最大回撤']=max_withdraw return d def automatic_investment_plan(code): ''' 定投收益 ''' df = get_net_value(code) money = 10000 total_share =0 interval = 22 length = len(df) sum_money=0 count=0 for i in range(0,length,interval): buy_date_df = df.iloc[i] share = money/buy_date_df['累计净值'] total_share+=share sum_money+=money count+=1 virtual_profit = (df.iloc[-1]['累计净值']*total_share-sum_money)/sum_money data=[] year,month,day=str(df.iloc[0]['净值日期']).split('-') for i in range(count): data.append((datetime.date(int(year), int(month), int(day))+datetime.timedelta(days=i*30), -1*money)) current_money = df.iloc[-1]['累计净值']*total_share data.append((datetime.date(int(year), int(month), int(day))+datetime.timedelta(days=i*30),current_money)) percent = xirr(data) every_round_profit = irr([money]*count+[-1*current_money]) real_profit = pow(every_round_profit+1,count)-1 return code,sum_money,round(current_money,2),round(percent,4),round(virtual_profit,4),round(real_profit,4) def xirr(cashflows): # 函数 years = [(ta[0] - cashflows[0][0]).days / 365. for ta in cashflows] residual = 1.0 step = 0.05 guess = 0.05 epsilon = 0.0001 limit = 10000 while abs(residual) > epsilon and limit > 0: limit -= 1 residual = 0.0 for i, trans in enumerate(cashflows): residual += trans[1] / pow(guess, years[i]) if abs(residual) > epsilon: if residual > 0: guess += step else: guess -= step step /= 2.0 return guess - 1 def irr(values): res = np.roots(values[::-1]) # 求根,对于n次多项式,p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n],传入p的列表参数[p[0],p[1],...p[n]]. mask = (res.imag == 0) & (res.real > 0) # 虚部为0,实部为非负数。 if not mask.any(): # 判断是否有满足条件的实根 return np.nan # 不满足,返回Not A Number res = res[mask].real # NPV(rate) = 0 can have more than one solution so we return # only the solution closest to zero. rate = 1/res - 1 # 这里解出的res,也就是符合条件的x,其实等于1/(1+r),因此要做一个变换回去,r=1/x-1 rate = rate.item(np.argmin(np.abs(rate))) # argmin()取最小值的下标,也就是说可能会计算出多个折现率,我们取最小那个 return rate def get_max_withdraw(indexs): max_withdraw = 0 start_date_index =0 max_date_index =0 last_high = indexs[0] for index,current in enumerate(indexs): # 遍历所有数据 if current>last_high: last_high=current # start_date_index=index continue if (last_high-current)/last_high>max_withdraw: # 找到一个最大值时,保存其位置 max_withdraw = (last_high-current)/last_high max_date_index=index return max_withdraw,max_date_index # 变成百分比 def plot_profit_line(df,code,name=""): title="{}-{}-基金收益率曲线".format(code,name) X=df['净值日期'].tolist() Y=list(map(lambda x:round(x,2),df['累计净值'].tolist())) c = ( Line() .add_xaxis(X) .add_yaxis('', Y, is_smooth=True, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=1,color='rgb(255, 0, 0)'), ).set_global_opts( title_opts=opts.TitleOpts(title=title), xaxis_opts=opts.AxisOpts( name='日期', # min_interval=5, splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(rotate=45), ), yaxis_opts=opts.AxisOpts( min_=round(min(Y),2), max_=round(max(Y),2), splitline_opts=opts.SplitLineOpts(is_show=True), ) ).set_colors(['green']) .render(f"../data/{title}-{name}.html") ) def draw_profit_curve(code,name): df = get_net_value(code) plot_profit_line(df,code,name) def automatic_investment_plan_result(code): code,sum_money,current_money,percent,virtual_profit,real_profit=automatic_investment_plan(code) print('每月定投{} 10000元,累计投入 {}, 当前累计本金与收入为{},定投年化收益率为{}%, xiir计算的累计收益率{}%'.format(code,sum_money,current_money,percent*100,real_profit*100)) def help(): print(''' Usage: 获取基金基本信息:python fund_profit_info.py --code=513050 绘制收益率曲线:python fund_profit_info.py --code=513050 --kind=draw 基金定投收益率 :python fund_profit_info.py --code=513050 --kind=plan ''') def main(code='513050',kind='profit'): if kind=='profit': result = fund_profit(code) print(result) elif kind=='draw': draw_profit_curve(code) print('收益率曲线绘制完成') elif kind=='plan': automatic_investment_plan_result(code) else: help() def batch_run_draw(): # 批量运行 import pandas as pd # df = pd.DataFrame(code_list) for _code in code_list: draw_profit_curve(_code['code'],_code['name']) print('收益率曲线绘制完成') def batch_run_profit(): # 批量运行 import pandas as pd # df = pd.DataFrame(code_list) result=[] for _code in code_list: result.append(fund_profit(_code['code'],_code['name'])) print('收益率') df = pd.DataFrame(result) df.to_excel('基金收益率.xlsx',encoding='utf8') if __name__=='__main__': # fire.Fire(main) # print(parse_fund_code_in_txt('xueqiu_content.txt')) # batch_run_profit() batch_run_draw() ================================================ FILE: fund/fund_raise_speed.py ================================================ # @Time : 2020/2/26 9:38 # @File : fund_raise_speed.py # 查看基金最后暴力拉伸的 import datetime import random import time from configure.settings import DBSelector import tushare as ts import sys sys.path.append('..') from common.BaseService import BaseService class MonitorFund(BaseService): def __init__(self): super(MonitorFund, self).__init__('../log/monitor_fund.log') self.conn = DBSelector().get_mysql_conn('db_stock','qq') def fast_speed_up(self): table = '2020-02-25' # 用于获取code列 today = datetime.datetime.now().strftime('%Y-%m-%d') print(today) logger = self.logger.info(f'{today}_fund_raise_monitor.log') query = 'select `基金代码`,`基金简称` from `2020-02-25`' # print(query) cursor = self.conn.cursor() cursor.execute(query) ret = cursor.fetchall() code_list = [] for item in ret: code = item[0] df = ts.get_realtime_quotes(code) close_p = float(df['pre_close'].values[0]) b1 = float(df['b1_p'].values[0]) a1 = float(df['a1_p'].values[0]) percent = (a1 - b1) / close_p * 100 if percent > 5: print(f'{item[0]} {item[1]} 有超过5%的委买卖的差距') logger.info(f'{item[0]} {item[1]} 有超过5%的委买卖的差距') time.sleep(random.random()) ================================================ FILE: fund/fund_share_crawl.py ================================================ """ @author:xda @file:fund_share_update.py @time:2021/01/20 """ # 基金份额 import sys import math import re sys.path.append('..') from configure.settings import DBSelector, config_dict from common.BaseService import BaseService import requests import warnings import datetime from fund.LOF_Model import Base, FundBaseInfoModel, ShareModel warnings.filterwarnings("ignore") from sqlalchemy.orm import sessionmaker class Fund(BaseService): def __init__(self, first_use=False): super(Fund, self).__init__(f'../log/{self.__class__.__name__}.log') self.first_use = first_use self.engine = self.get_engine() self.enableProxy = False @staticmethod def get_engine(): return DBSelector().get_engine('db_stock') def set_proxy_enable(self): self.enableProxy = True self.proxy_ip = config_dict('proxy_ip') self.set_proxy_param(self.proxy_ip) def create_table(self): # 初始化数据库连接: Base.metadata.create_all(self.engine) # 创建表结构 def get_session(self): return sessionmaker(bind=self.engine) def get(self, url, _json=False, binary=False, retry=5): start = 0 while start < retry: try: if self.enableProxy: proxy = self.get_proxy() else: proxy = None response = requests.get(url, headers=self.headers, proxies=proxy, # verify=False ) except Exception as e: self.logger.error(e) start += 1 else: if _json: content = response.json() else: content = response.text return content if start == retry: self.logger.error('重试太多') return None class SZFundShare(Fund): ''' doc URL地址 http://fund.szse.cn/marketdata/fundslist/index.html?catalogId=1000_lf&selectJjlb=LOF&r=1616062435559 ''' def __init__(self, first_use=False): super(SZFundShare, self).__init__(first_use) # self.url = 'http://fund.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=1000_lf&TABKEY=tab1&PAGENO={}&selectJjlb=LOF&random=0.019172632634173903' self.all_fund_url = 'http://fund.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=1000_lf&TABKEY=tab1&PAGENO={}&random=0.1292751130110099' self.session = requests.Session() self.logger.info('start...sz fund') self.LAST_TEXT = '' if self.first_use: self.create_table() self.db_session = self.get_session() self.sess = self.db_session() self.logger.info(f'{self.today} start to crawl....') self.set_proxy_enable() @property def headers(self): _header = { "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Cache-Control": "no-cache", "Connection": "keep-alive", "Content-Type": "application/json", "Host": "fund.szse.cn", "Pragma": "no-cache", "Referer": "http://fund.szse.cn/marketdata/fundslist/index.html?catalogId=1000_lf&selectJjlb=ETF", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36", "X-Request-Type": "ajax", "X-Requested-With": "XMLHttpRequest", } return _header @staticmethod def convert(float_str): try: return_float = float(float_str) except Exception as e: return_float = None return return_float def json_parse(self, js_data): # TODO 如果当前是周一怎么办? date = (datetime.date.today() + datetime.timedelta(days=-1)).strftime('%Y-%m-%d') # 手动算的前一天 ? if js_data is None: raise ValueError('数据为空') data = js_data[0].get('data', []) if not data: self.stop = True return None for item in data: jjlb = item['jjlb'] # 基金类别 tzlb = item['tzlb'] # 投资类别 ssrq = item['ssrq'] # 上市日期 name = self.extract_name(item['jjjcurl']) dqgm = self.convert_number(item['dqgm']) # 当前规模 glrmc = self.extract_glrmc(item['glrmc']) # 管理人名称 code = self.extract_code(item['sys_key']) yield (jjlb, tzlb, ssrq, dqgm, glrmc, code, name, date) def extract_name(self, name): return re.search('(.*?)', name).group(1) def extract_code(self, code): return re.search('(\d{6})', code).group(1) def extract_glrmc(self, glrmc): if re.search(('\(.*?)\'), glrmc): glrmc = re.search(('\(.*?)\'), glrmc).group(1).strip() return glrmc def model_process(self, jjlb, tzlb, ssrq, dqgm, glrmc, code, name, date): obj = self.sess.query(FundBaseInfoModel).filter_by(code=code).first() # 为的捕获新出的基金,避免遗漏 if not obj: base_info = FundBaseInfoModel( code=code, name=name, category=jjlb, invest_type=tzlb, manager_name=glrmc, issue_date=ssrq, ) try: self.sess.add(base_info) self.sess.commit() except Exception as e: print(e) # 更新份额表 if not self.sess.query(ShareModel).filter_by(code=code, date=date).first(): share_info = ShareModel( code=code, date=date, share=dqgm, crawltime=datetime.datetime.now(), ) try: self.sess.add(share_info) self.sess.commit() except Exception as e: print(e) @staticmethod def convert_number(s): return float(s.replace(',', '')) def run(self): page = 1 self.stop = False while not self.stop: content = self.get(self.all_fund_url.format(page), _json=True) for item in self.json_parse(content): self.model_process(*item) page += 1 class SHFundShare(Fund): ''' 上交所的基金LOF ''' def __init__(self, kind, date, first_use=False): super(SHFundShare, self).__init__(first_use) self.lof_url = 'http://query.sse.com.cn/commonQuery.do?=&jsonCallBack=jsonpCallback1681&sqlId=COMMON_SSE_FUND_LOF_SCALE_CX_S&pageHelp.pageSize=10000&FILEDATE={}&_=161146986468' self.etf_url = 'http://query.sse.com.cn/commonQuery.do?jsonCallBack=jsonpCallback28550&isPagination=true&pageHelp.pageSize=25&pageHelp.pageNo={}&pageHelp.cacheSize=1&sqlId=COMMON_SSE_ZQPZ_ETFZL_XXPL_ETFGM_SEARCH_L&STAT_DATE={}&pageHelp.beginPage={}&pageHelp.endPage=30&_=1611473902414' # self.today_ = '20210122' # LOF if date == 'now': last_day = datetime.datetime.now() + datetime.timedelta(days=-1) self.today_etf = last_day.strftime('%Y-%m-%d') self.today_lof = last_day.strftime('%Y%m%d') else: print('not now, history data') self.today_etf = date self.today_lof = date # self.today ='2021-01-22' # ETF self.ETF_COUNT_PER_PAGE = 25 self.url_option_dict = { 'ETF': {'url': self.etf_url, 'date': self.today_etf}, # 2021-03-17 ETF 'LOF': {'url': self.lof_url, 'date': self.today_lof} # 20210316 LOF } self.kind = kind.lower() self.session = requests.Session() self.logger.info('start...sh fund') self.LAST_TEXT = '' if self.first_use: self.create_table() self.db_session = self.get_session() self.sess = self.db_session() @property def headers(self): return { "Host": "query.sse.com.cn", "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Referer": "http://www.sse.com.cn/market/funddata/volumn/lofvolumn/", } def crawl_lof(self): options = self.url_option_dict['LOF'] date = options.get('date') url = options.get('url') content = self.get(url.format(date), _json=False) js_data = self.jsonp2json(content) self.process_lof(js_data) def process_lof(self, js_data): result = js_data.get('result') for item in result: code = item['FUND_CODE'] name = item['FUND_ABBR'] date = item['TRADE_DATE'] try: share = float(item['INTERNAL_VOL'].replace(',', '')) except Exception as e: print(e) share = None self.process_model(code, name, date, share, 'LOF') def crawl_etf(self): options = self.url_option_dict['ETF'] date = options.get('date') url = options.get('url') current_page = 1 while True: content = self.get(url.format(current_page, date, current_page), _json=False) js_data = self.jsonp2json(content) total_count = js_data.get('pageHelp').get('total') print(f'page : {current_page}') self.process_etf(js_data) max_page = math.ceil(total_count / self.ETF_COUNT_PER_PAGE) # 每页 10个 if current_page > max_page: break current_page += 1 def process_etf(self, js_data): result = js_data.get('result') for item in result: code = item['SEC_CODE'] name = item['SEC_NAME'] date = item['STAT_DATE'] share = item['TOT_VOL'] try: share = float(share) except Exception as e: print(e) self.process_model(code, name, date, share, 'ETF') def run(self): 'LOF 与 ETF' # for type_, options in self.url_option_dict.items(): if self.kind == 'etf': self.logger.info('crawling etf .....') self.crawl_etf() if self.kind == 'lof': self.logger.info('crawling lof .....') self.crawl_lof() def process_model(self, code, name, date, share, type_): obj = self.sess.query(FundBaseInfoModel).filter_by(code=code).first() if not obj: obj = FundBaseInfoModel( code=code, name=name, category=type_, invest_type='', manager_name='', issue_date=None, ) try: self.sess.add(obj) except Exception as e: print(e) else: self.sess.commit() print(f'插入一条记录{code},{date}') if not self.sess.query(ShareModel).filter_by(code=code, date=date).first(): share_info = ShareModel( code=code, date=date, share=share, crawltime=datetime.datetime.now(), ) try: self.sess.add(share_info) except Exception as e: print(e) else: print(f'插入一条记录{code},{date}') self.sess.commit() def patch_fix_missing_data(): ''' 补充丢失数据 ''' days = 90 for day in range(1, days): # etf # date=(datetime.datetime.now() + datetime.timedelta(days=-1*day)).strftime('%Y-%m-%d') # kind='ETF' date = (datetime.datetime.now() + datetime.timedelta(days=-1 * day)).strftime('%Y%m%d') kind = 'LOF' app = SHFundShare(first_use=False, kind=kind, date=date) app.run() if __name__ == '__main__': app = SZFundShare(first_use=False) app.run() # kind='LOF' # date='now' # app = SHFundShare(first_use=False,kind=kind,date=date) # app.run() # patch_fix_missing_data() ================================================ FILE: fund/fund_share_monitor.py ================================================ # -*- coding: UTF-8 -*- """ @author:xda @file:fund_share_monitor.py @time:2021/01/27 """ # 份额监控,对上一天额度出现较大申购进行监控 import sys sys.path.append('..') from configure.settings import DBSelector from common.BaseService import BaseService from fund.fund_share_crawl import ShareModel,FundBaseInfoModel,Fund from sqlalchemy import and_ class ShareMonitor(Fund): def __init__(self,): super(ShareMonitor, self).__init__() self.sess = self.get_session()() def query(self,code,date): # last_date = obj = self.sess.query(ShareModel).filter(and_(ShareModel.date<=date, ShareModel.code==code)).all() # print(obj) if obj: for i in obj: print(i.code) print(i.share) print(i.date) print('') if __name__ == '__main__': app = ShareMonitor() code = '167302' date = '2021-01-26' app.query(code=code,date=date) ================================================ FILE: fund/fund_share_update.py ================================================ "# -*- coding" """ @author:xda @file:fund_share_update.py @time:2021/01/20 """ # 基金份额 import sys sys.path.append('..') from configure.settings import DBSelector from common.BaseService import BaseService import requests import warnings import datetime import math import re warnings.filterwarnings("ignore") from sqlalchemy.orm import relationship from sqlalchemy import Column, INTEGER, VARCHAR, DATE, DateTime, ForeignKey, FLOAT from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base # 创建对象的基类: Base = declarative_base() class FundBaseInfoModel(Base): # 表的名字: __tablename__ = 'LOF_BaseInfo' # 表的结构: id = Column(INTEGER, primary_key=True, autoincrement=True) code = Column(VARCHAR(6), comment='基金代码', unique=True) name = Column(VARCHAR(40), comment='基金名称') category = Column(VARCHAR(8), comment='基金类别') invest_type = Column(VARCHAR(6), comment='投资类别') manager_name = Column(VARCHAR(48), comment='管理人呢名称') issue_date = Column(DATE, comment='上市日期') # child = relationship('ShareModel', back_populates='LOF_BaseInfo') child = relationship('ShareModel') def __str__(self): return f'<{self.code}><{self.name}>' class ShareModel(Base): # 表的名字: __tablename__ = 'LOF_Share' # 表的结构: id = Column(INTEGER, primary_key=True, autoincrement=True) code = Column(VARCHAR(6), ForeignKey('LOF_BaseInfo.code'), comment='代码') date = Column(DATE, comment='份额日期') share = Column(FLOAT, comment='份额 单位:万份') parent = relationship('FundBaseInfoModel') # parent = relationship('FundBaseInfoModel', back_populates='LOF_Share') crawltime = Column(DateTime, comment='爬取日期') class Fund(BaseService): def __init__(self, first_use=False): super(Fund, self).__init__(f'../log/{self.__class__.__name__}.log') self.first_use = first_use self.engine = self.get_engine() def get_engine(self): return DBSelector().get_engine('db_stock') def create_table(self): # 初始化数据库连接: Base.metadata.create_all(self.engine) # 创建表结构 def get_session(self): return sessionmaker(bind=self.engine) def get(self, url, retry=5, js=True): start = 0 while start < retry: try: response = self.session.get(url, headers=self.headers, verify=False) except Exception as e: self.logger.error(e) start += 1 else: if js: content = response.json() else: content = response.text return content if start == retry: self.logger.error('重试太多') return None class SZFundShare(Fund): def __init__(self, first_use=False): super(SZFundShare, self).__init__(first_use) # self.url = 'http://fund.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=1000_lf&TABKEY=tab1&PAGENO={}&selectJjlb=LOF&random=0.019172632634173903' self.all_fund_url = 'http://fund.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=1000_lf&TABKEY=tab1&PAGENO={}&random=0.1292751130110099' self.session = requests.Session() self.logger.info('start...sz fund') self.LAST_TEXT = '' if self.first_use: self.create_table() self.db_session = self.get_session() self.sess = self.db_session() self.logger.info(f'{self.today} start to crawl....') @property def headers(self): _header= { "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Cache-Control": "no-cache", "Connection": "keep-alive", "Content-Type": "application/json", "Host": "fund.szse.cn", "Pragma": "no-cache", "Referer": "http://fund.szse.cn/marketdata/fundslist/index.html?catalogId=1000_lf&selectJjlb=ETF", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36", "X-Request-Type": "ajax", "X-Requested-With": "XMLHttpRequest", } return _header def convert(self, float_str): try: return_float = float(float_str) except: return_float = None return return_float def json_parse(self, js_data): date = (datetime.date.today() + datetime.timedelta(days=-1)).strftime('%Y-%m-%d') # 手动算的前一天 ? data = js_data[0].get('data', []) if not data: self.stop = True return None for item in data: jjlb = item['jjlb'] tzlb = item['tzlb'] # ssrq = item['ssrq'] name = self.extract_name(item['jjjcurl']) dqgm = self.convert_number(item['dqgm']) # 当前规模 glrmc = self.extract_glrmc(item['glrmc']) # 管理人名称 code = self.extract_code(item['sys_key']) yield (jjlb, tzlb, ssrq, dqgm, glrmc, code, name, date) def extract_name(self, name): return re.search('(.*?)', name).group(1) def extract_code(self, code): return re.search('(\d{6})', code).group(1) def extract_glrmc(self, glrmc): if re.search(('\(.*?)\'), glrmc): glrmc = re.search(('\(.*?)\'), glrmc).group(1).strip() return glrmc def model_process(self, jjlb, tzlb, ssrq, dqgm, glrmc, code, name, date): obj = self.sess.query(FundBaseInfoModel).filter_by(code=code).first() if not obj: base_info = FundBaseInfoModel( code=code, name=name, category=jjlb, invest_type=tzlb, manager_name=glrmc, issue_date=ssrq, ) self.sess.add(base_info) self.sess.commit() share_info = ShareModel( code=code, date=date, share=dqgm, crawltime=datetime.datetime.now(), ) self.sess.add(share_info) self.sess.commit() def convert_number(self, s): return float(s.replace(',', '')) def run(self): page = 1 self.stop = False while not self.stop: content = self.get(self.all_fund_url.format(page)) for item in self.json_parse(content): self.model_process(*item) page += 1 class SHFundShare(Fund): def __init__(self, kind,date,first_use=False): super(SHFundShare, self).__init__(first_use) self.lof_url = 'http://query.sse.com.cn/commonQuery.do?=&jsonCallBack=jsonpCallback1681&sqlId=COMMON_SSE_FUND_LOF_SCALE_CX_S&pageHelp.pageSize=10000&FILEDATE={}&_=161146986468' self.etf_url = 'http://query.sse.com.cn/commonQuery.do?jsonCallBack=jsonpCallback28550&isPagination=true&pageHelp.pageSize=25&pageHelp.pageNo={}&pageHelp.cacheSize=1&sqlId=COMMON_SSE_ZQPZ_ETFZL_XXPL_ETFGM_SEARCH_L&STAT_DATE={}&pageHelp.beginPage={}&pageHelp.endPage=30&_=1611473902414' # self.today_ = '20210122' # LOF if date=='now': self.today_ = (datetime.datetime.now()+ datetime.timedelta(days=-1)).strftime('%Y%m%d') else: self.today_=self.today = date # self.today ='2021-01-22' # ETF self.ETF_COUNT_PER_PAGE = 25 self.url_option_dict = { 'ETF': {'url': self.etf_url, 'date': self.today}, 'LOF': {'url': self.lof_url, 'date': self.today_} } self.kind=kind.lower() self.session = requests.Session() self.logger.info('start...sh fund') self.LAST_TEXT = '' if self.first_use: self.create_table() self.db_session = self.get_session() self.sess = self.db_session() @property def headers(self): return { "Host": "query.sse.com.cn", "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Referer": "http://www.sse.com.cn/market/funddata/volumn/lofvolumn/", } def crawl_lof(self): options = self.url_option_dict['LOF'] date = options.get('date') url = options.get('url') content = self.get(url.format(date), js=False) js_data = self.jsonp2json(content) self.process_lof(js_data) def process_lof(self, js_data): result = js_data.get('result') for item in result: code = item['FUND_CODE'] name = item['FUND_ABBR'] date = item['TRADE_DATE'] try: share = float(item['INTERNAL_VOL'].replace(',','')) except Exception as e: print(e) share=None self.process_model(code, name, date, share, 'LOF') def crawl_etf(self): options = self.url_option_dict['ETF'] date = options.get('date') url = options.get('url') current_page = 1 while True: content = self.get(url.format(current_page, date, current_page), js=False) js_data = self.jsonp2json(content) total_count = js_data.get('pageHelp').get('total') print(f'page : {current_page}') self.process_etf(js_data) max_page = math.ceil(total_count / self.ETF_COUNT_PER_PAGE) # 每页 10个 if current_page > max_page: break current_page += 1 def process_etf(self, js_data): result = js_data.get('result') for item in result: code = item['SEC_CODE'] name = item['SEC_NAME'] date = item['STAT_DATE'] share = item['TOT_VOL'] try: share = float(share) except Exception as e: print(e) self.process_model(code, name, date, share, 'ETF') def run(self): 'LOF 与 ETF' # for type_, options in self.url_option_dict.items(): if self.kind=='etf': self.logger.info('crawling etf .....') self.crawl_etf() if self.kind=='lof': self.logger.info('crawling lof .....') self.crawl_lof() def process_model(self, code, name, date, share, type_): obj = self.sess.query(FundBaseInfoModel).filter_by(code=code).first() if not obj: obj = FundBaseInfoModel( code=code, name=name, category=type_, invest_type='', manager_name='', issue_date=None, ) try: self.sess.add(obj) except Exception as e: print(e) else: self.sess.commit() print(f'插入一条记录{code},{date}') if not self.sess.query(ShareModel).filter_by(code=code, date=date).first(): share_info = ShareModel( code=code, date=date, share=share, crawltime=datetime.datetime.now(), ) try: self.sess.add(share_info) except Exception as e: print(e) else: print(f'插入一条记录{code},{date}') self.sess.commit() if __name__ == '__main__': app = SZFundShare(first_use=False) app.run() app = SHFundShare(first_use=False) app.run() ================================================ FILE: fund/fund_tencent.py ================================================ # -*- coding: UTF-8 -*- """ @author:xda @file:fund_tencent.py @time:2021/01/20 """ from fund_info_spider import TencentFundSpider if __name__ == '__main__': app = TencentFundSpider() app.crawl_fund_info_by_code_table() app.update_netvalue() ================================================ FILE: fund/jsl_fund.py ================================================ # -*- coding: UTF-8 -*- """ @author:xda @file:jsl_fund.py @time:2021/01/20 """ from fund_jsl import JSLFund if __name__ == '__main__': jsl_spider = JSLFund() jsl_spider.crawl() ================================================ FILE: fund/ndx_index.py ================================================ import sys sys.path.append('..') from configure.settings import get_tushare_pro pro = get_tushare_pro() # pro = ts.pro_api() # df = pro.index_weight(index_code='399300.SZ', start_date='20180901', end_date='20180930') board df = pro.index_global(ts_code='XIN9', start_date='20200201', end_date='20200220') print(df) ================================================ FILE: fund/qdii_fund_analysis_5fund.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import akshare as ak\n", "import json\n", "import pandas as pd\n", "import sys\n", "import datetime\n", "import os\n", "import numpy as np\n", "import pandas as pd\n", "import pyecharts.options as opts\n", "from pyecharts.charts import Line\n", "from pyecharts.commons.utils import JsCode\n", "from pyecharts import options as opts\n", "from pyecharts.charts import Scatter\n", "from pyecharts.options import InitOpts\n", "from pyecharts import options as opts\n", "from pyecharts.charts import Bar, Grid, Line\n", "import matplotlib.pyplot as plt\n", "from pyecharts import options as opts\n", "from pyecharts.charts import Bar\n", "%matplotlib inline\n", "\n", "\n", "def convert_time(x):\n", " return str(x).replace(' 00:00:00','')\n", " \n", "import re\n", "sys.path.append('..')\n", "from configure.settings import DBSelector\n", "db = DBSelector()\n", "mongo = db.mongo('qq')\n", "fund = mongo['fund']" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def get_net_value(code):\n", " '''\n", " 获取基金的净值\n", " '''\n", " fund_open_fund_info_em_df = ak.fund_open_fund_info_em(fund=code, indicator=\"累计净值走势\")\n", " return fund_open_fund_info_em_df" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "df=get_net_value('001220')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "
基金代码基金简称实时价格实时净值溢价率净值日期
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
净值日期累计净值
18762023-02-221.639
18772023-02-231.633
18782023-02-241.624
18792023-02-271.615
18802023-02-281.627
\n", "
" ], "text/plain": [ " 净值日期 累计净值\n", "1876 2023-02-22 1.639\n", "1877 2023-02-23 1.633\n", "1878 2023-02-24 1.624\n", "1879 2023-02-27 1.615\n", "1880 2023-02-28 1.627" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def dump_mongo(df,code):\n", " js_str = df.to_json(orient='index')\n", " js_dict = json.loads(js_str)\n", " js_list = js_dict.values()\n", "\n", " fund.drop_collection(code)\n", " \n", " try:\n", " fund[code].insert_many(js_list)\n", " except Exception as e:\n", " print(e)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def start_crawl(code):\n", " df = get_net_value(code)\n", " df['净值日期']=df['净值日期'].astype(str)\n", " dump_mongo(df,code)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "txt='''\n", "1、$国泰大农业股票A(F001579)$ 基金经理程洲,今年以来回报-4.04%,近一年回报0.22%,近一年最大回撤-14.40%,二季度末规模12.87亿。\n", "\n", "2、$银华农业产业股票(F005106)$ 基金经理唐能,今年以来回报-6.90%,近一年回报1.01%,近一年最大回撤-22.40%,二季度末规模12.78亿。\n", "\n", "3、$前海开源沪港深农业混合(LOF)A(F164403)$ 基金经理吴国清,刘宏,今年以来回报2.97%,近一年回报8.20%,近一年最大回撤-21.68%,二季度末规模4.21亿\n", "\n", "4、$嘉实农业产业股票(F003634)$ 基金经理吴越,朱子君,今年以来回报-7.38%,近一年回报3.37%,近一年最大回撤-19.06%,二季度末规模26.71亿。\n", "\n", "5、$财通智慧成长混合A(F009062)$ 基金经理金梓才、钟俊,今年以来回报2.89%,近一年回报-21.17%,近一年最大回撤-30.49%,二季度末规模2.56亿。\n", "\n", "6、$天弘中证农业主题指数A(F010769)$ 跟踪中证农业主题指数,今年以来回报-4.32%,近一年回报2.76%,近一年最大回撤-16.96%,二季度末规模2.24亿。\n", "\n", "7、$国泰中证畜牧养殖ETF联接A(F012724)$ 跟踪中证畜牧养殖指数,今年以来回报-2.47%,近一年回报14.62%,近一年最大回撤-20.36%,二季度末规模2.38亿。\n", "\n", "8、$华宝中证全指农牧渔指数发起式A(F013471)$ 跟踪中证全指农牧渔指数,今年以来回报-2.81%,成立以来回报1.33%,近一年最大回撤-17.85%,二季度末规模0.21亿。\n", "\n", "9、$前海开源中证大农业指数增强A(F001027)$ 跟踪中证大农业指数,今年以来回报-10.06%,近一年回报-6.79%,近一年最大回撤-19.06%,二季度末规模6.82亿。(以上数据截至于2022年9月15日)\n", "\n", "'''" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "txt='[$南方转型混合A(F001667)$](http://xueqiu.com/S/F001667) [$易方达瑞恒混合(F001832)$](http://xueqiu.com/S/F001832) [$易方达新经济混合(F001018)$](http://xueqiu.com/S/F001018) [$华安安信消费混合(F519002)$](http://xueqiu.com/S/F519002) [$万家颐和灵活配置混合(F519198)$](http://xueqiu.com/S/F519198) [$国富深化价值混合(F450004)$](http://xueqiu.com/S/F450004) [$工银战略转型股票(F000991)$](http://xueqiu.com/S/F000991) [$招商制造业混合(F001869)$](http://xueqiu.com/S/F001869) [$易方达行业领先企业(F110015)$](http://xueqiu.com/S/F110015) [$民生加银研究精选混合(F001220)$](http://xueqiu.com/S/F001220) '" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "code_txt = '''\n", "118002\t易方达标普消费品\n", "486002\t工银全球精选股票\n", "006373\t国富全球科技互联\n", "000369\t广发全球医疗保健\n", "100055\t富国全球科技互联\n", "160416\t华安标普全球石油\n", "320013\t诺安全球黄金\n", "161815\t银华抗通胀主题\n", "'''\n", "re_pattern = re.findall('(\\d+)\\s+(\\w+)',code_txt)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "code_list =[]\n", "fund_dict ={}\n", "for code,name in re_pattern:\n", " code_list.append(code)\n", " fund_dict[code]=name" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "code_list = re.findall('\\(F(\\d+)\\)',txt)\n", "fund_name = re.findall('\\$(.*?)\\$',txt)\n", "fund_dict = dict(zip(code_list,fund_name))\n", "name_list = list(fund_dict.values())\n", "simple_name = [i.split('(')[0] for i in name_list]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(code_list)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['001667',\n", " '001832',\n", " '001018',\n", " '519002',\n", " '519198',\n", " '450004',\n", " '000991',\n", " '001869',\n", " '110015',\n", " '001220']" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "code_list" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "for code in code_list:\n", " start_crawl(code)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'001667': '南方转型混合A(F001667)',\n", " '001832': '易方达瑞恒混合(F001832)',\n", " '001018': '易方达新经济混合(F001018)',\n", " '519002': '华安安信消费混合(F519002)',\n", " '519198': '万家颐和灵活配置混合(F519198)',\n", " '450004': '国富深化价值混合(F450004)',\n", " '000991': '工银战略转型股票(F000991)',\n", " '001869': '招商制造业混合(F001869)',\n", " '110015': '易方达行业领先企业(F110015)',\n", " '001220': '民生加银研究精选混合(F001220)'}" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fund_dict" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "# after fetch data" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def plot_profit_line(df,code):\n", " title=\"{}基金收益率曲线\".format(code)\n", " X=df['净值日期'].tolist()\n", " Y=list(map(lambda x:round(x,2),df['累计净值'].tolist()))\n", " c = (\n", " Line()\n", " .add_xaxis(X)\n", " .add_yaxis('', Y, is_smooth=True,\n", " label_opts=opts.LabelOpts(is_show=False),\n", " linestyle_opts=opts.LineStyleOpts(width=1,color='rgb(255, 0, 0)'),\n", " ).set_global_opts(\n", " title_opts=opts.TitleOpts(title=title),\n", " xaxis_opts=opts.AxisOpts(\n", " name='日期',\n", " # min_interval=5,\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " axislabel_opts=opts.LabelOpts(rotate=45),\n", "\n", " ),\n", " yaxis_opts=opts.AxisOpts(\n", " min_=min(Y),\n", " max_=max(Y),\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " )\n", " ).set_colors(['green'])\n", " .render(f\"../plot_image/{title}.html\")\n", " )" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "for code,name in fund_dict.items():\n", " result = []\n", " for item in fund[code].find({},{'_id':0}):\n", " result.append(item)\n", " df = pd.DataFrame(result)\n", " plot_profit_line(df,name)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "W=10000\n", "focus_num = [\n", "3.98*W,\n", "7519,\n", "72,\n", "309,\n", "]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "c = (\n", " Scatter(InitOpts(width='800px',height='500px'))\n", " .add_xaxis(simple_name)\n", " .add_yaxis('A',focus_num,label_opts=opts.LabelOpts(is_show=True))\n", " .set_global_opts(\n", " xaxis_opts=opts.AxisOpts(\n", " # name='日期',\n", " # min_interval=5,\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " axislabel_opts=opts.LabelOpts(rotate=-45),\n", "\n", " ),\n", " yaxis_opts=opts.AxisOpts( \n", " min_=0,\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " ),\n", " title_opts=opts.TitleOpts(title=\"welcome\"),\n", " visualmap_opts=opts.VisualMapOpts(type_=\"size\",max_=150000, min_=2000),\n", " )\n", " .render(\"5fund.html\")\n", ")" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "grid = (\n", " Grid(init_opts=opts.InitOpts())\n", " .add(c, grid_opts=opts.GridOpts(pos_bottom=\"40%\"))\n", " .render(\"grid_verticalfund.html\")\n", ")" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "\n", "c = (\n", " Bar()\n", " .add_xaxis(\n", " new_name\n", " )\n", " .add_yaxis(\"基金关注度\", focus_num,label_opts=opts.LabelOpts(is_show=True))\n", " .set_global_opts(\n", " xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),\n", " title_opts=opts.TitleOpts(title=\"基金关注度\"),\n", " )\n", " # .render(\"基金关注度.html\")\n", ")" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "new_name = []\n", "for name in simple_name:\n", " new_name.append('\\n'.join(list(name)))" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['华\\n安\\n纳\\n斯\\n达\\n克\\n1\\n0\\n0\\n指\\n数',\n", " '博\\n时\\n标\\n普\\n5\\n0\\n0\\nE\\nT\\nF\\n联\\n接',\n", " '天\\n弘\\n恒\\n生\\n科\\n技\\n指\\n数\\nA',\n", " '嘉\\n实\\n港\\n股\\n通\\n新\\n经\\n济\\n指\\n数\\nA',\n", " '华\\n夏\\n恒\\n生\\nE\\nT\\nF\\n联\\n接',\n", " '易\\n方\\n达\\n中\\n概\\n互\\n联\\n5\\n0\\nE\\nT\\nF\\n联\\n接\\n人\\n民\\n币\\nA',\n", " '交\\n银\\n中\\n证\\n海\\n外\\n中\\n国\\n互\\n联\\n网\\n指\\n数',\n", " '华\\n安\\n香\\n港\\n精\\n选',\n", " '中\\n欧\\n丰\\n泓\\n沪\\n港\\n深\\nA']" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_name" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def get_net_value_df(code):\n", " '''\n", " 从mongodb获取数据\n", " '''\n", " result=[]\n", " for item in fund[code].find({},{'_id':0}):\n", " result.append(item)\n", " df = pd.DataFrame(result)\n", " return df" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "def get_year(start,end):\n", " '''\n", " 获取年份\n", " '''\n", " year = (datetime.datetime.strptime(end,'%Y-%m-%d')- datetime.datetime.strptime(start,'%Y-%m-%d')).days/365\n", " return year" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "def get_profit_rate(df):\n", " '''\n", " 计算所有的收益率\n", " '''\n", " return round((df['累计净值'].iloc[-1]-df['累计净值'].iloc[0])/df['累计净值'].iloc[0],4)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "def get_yearly_profit_rate(df):\n", " '''\n", " 计算年化收益率\n", " '''\n", " \n", " start = df['净值日期'].iloc[0]\n", " end = df['净值日期'].iloc[-1]\n", " year = get_year(start,end)\n", " print('开始时间:',start)\n", " print('成立年数:',round(year,2),'年')\n", " profit = get_profit_rate(df)\n", " print('成立以来累积收益率:',profit)\n", " year_profit = (1+profit)**(1/year)-1\n", " return start,round(year,4),profit,round(year_profit,4)\n", "\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "\n", "def fund_profit(code):\n", " '''\n", " 生成字典\n", " '''\n", "\n", " df = get_net_value_df(code)\n", " max_withdraw,max_date_index = get_max_withdraw(df['累计净值'].tolist())\n", " start,year,profit,year_profit = get_yearly_profit_rate(df)\n", " d={}\n", " d['代码']=code\n", " d['名称']=fund_dict.get(code)\n", " d['发行日期']=start\n", " d['成立年数']=year\n", " d['累积收益率']=profit\n", " d['年化收益率']=year_profit\n", " d['最大回撤']=max_withdraw\n", " return d" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def get_max_withdraw(indexs):\n", " max_withdraw = 0\n", " start_date_index =0\n", " max_date_index =0\n", " last_high = indexs[0]\n", " \n", " for index,current in enumerate(indexs):\n", " # 遍历所有数据\n", " if current>last_high:\n", " last_high=current\n", " # start_date_index=index\n", " continue\n", "\n", " if (last_high-current)/last_high>max_withdraw:\n", " # 找到一个最大值时,保存其位置\n", " max_withdraw = (last_high-current)/last_high\n", " max_date_index=index\n", "\n", " return max_withdraw,max_date_index # 变成百分比" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "开始时间: 2016-08-17\n", "成立年数: 6.54 年\n", "成立以来累积收益率: 1.045\n", "开始时间: 2018-01-10\n", "成立年数: 5.14 年\n", "成立以来累积收益率: 1.651\n", "开始时间: 2015-02-12\n", "成立年数: 8.05 年\n", "成立以来累积收益率: 3.065\n", "开始时间: 2013-06-24\n", "成立年数: 9.69 年\n", "成立以来累积收益率: 3.8348\n", "开始时间: 2016-06-23\n", "成立年数: 6.69 年\n", "成立以来累积收益率: 1.2263\n", "开始时间: 2008-07-03\n", "成立年数: 14.67 年\n", "成立以来累积收益率: 2.1763\n", "开始时间: 2015-02-16\n", "成立年数: 8.04 年\n", "成立以来累积收益率: 2.926\n", "开始时间: 2015-12-02\n", "成立年数: 7.25 年\n", "成立以来累积收益率: 1.551\n", "开始时间: 2009-03-26\n", "成立年数: 13.94 年\n", "成立以来累积收益率: 3.652\n", "开始时间: 2015-05-27\n", "成立年数: 7.76 年\n", "成立以来累积收益率: 0.627\n" ] } ], "source": [ "result = []\n", "for code in code_list:\n", " d = fund_profit(code)\n", " result.append(d)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
代码名称发行日期成立年数累积收益率年化收益率最大回撤
0001667南方转型混合A(F001667)2016-08-176.53701.04500.11570.379942
1001832易方达瑞恒混合(F001832)2018-01-105.13701.65100.20900.318008
2001018易方达新经济混合(F001018)2015-02-128.04933.06500.19030.530127
3519002华安安信消费混合(F519002)2013-06-249.68773.83480.17660.553866
4519198万家颐和灵活配置混合(F519198)2016-06-236.68771.22630.12710.215814
5450004国富深化价值混合(F450004)2008-07-0314.66582.17630.08200.563310
6000991工银战略转型股票(F000991)2015-02-168.03842.92600.18550.525873
7001869招商制造业混合(F001869)2015-12-027.24661.55100.13800.280000
8110015易方达行业领先企业(F110015)2009-03-2613.93703.65200.11660.512736
9001220民生加银研究精选混合(F001220)2015-05-277.76440.62700.06470.401180
\n", "
" ], "text/plain": [ " 代码 名称 发行日期 成立年数 累积收益率 年化收益率 最大回撤\n", "0 001667 南方转型混合A(F001667) 2016-08-17 6.5370 1.0450 0.1157 0.379942\n", "1 001832 易方达瑞恒混合(F001832) 2018-01-10 5.1370 1.6510 0.2090 0.318008\n", "2 001018 易方达新经济混合(F001018) 2015-02-12 8.0493 3.0650 0.1903 0.530127\n", "3 519002 华安安信消费混合(F519002) 2013-06-24 9.6877 3.8348 0.1766 0.553866\n", "4 519198 万家颐和灵活配置混合(F519198) 2016-06-23 6.6877 1.2263 0.1271 0.215814\n", "5 450004 国富深化价值混合(F450004) 2008-07-03 14.6658 2.1763 0.0820 0.563310\n", "6 000991 工银战略转型股票(F000991) 2015-02-16 8.0384 2.9260 0.1855 0.525873\n", "7 001869 招商制造业混合(F001869) 2015-12-02 7.2466 1.5510 0.1380 0.280000\n", "8 110015 易方达行业领先企业(F110015) 2009-03-26 13.9370 3.6520 0.1166 0.512736\n", "9 001220 民生加银研究精选混合(F001220) 2015-05-27 7.7644 0.6270 0.0647 0.401180" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(20)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "df['累积收益率']=df['累积收益率'].map(lambda x:x*100)\n", "df['年化收益率']=df['年化收益率'].map(lambda x:x*100)\n", "df['最大回撤']=df['最大回撤'].map(lambda x:x*100)\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "df.sort_values('年化收益率',ascending=False).head(10).to_excel('大盘.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "result = pd.DataFrame()\n", "\n", "for code in code_list:\n", " df_ = get_net_value_df(code)\n", " df_=df_.rename(columns={'累计净值':code})\n", " # del df_['日增长率']\n", " df_['净值日期']=pd.to_datetime(df_['净值日期'],format='%Y-%m-%d')\n", " df_=df_.set_index('净值日期',drop=True)\n", " # result.append(df)\n", " if len(result)==0:\n", " result=df_\n", "\n", " else:\n", " result = pd.merge(result,df_,how='outer',left_index=True,right_index=True)\n", "\n", " " ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "index_info = result.index.tolist()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "index_date = list(set(index_info))\n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "date_list = []\n", "for i in index_date:\n", " date_list.append(i.strftime('%Y-%m-%d'))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "new_date_list = list(sorted(date_list))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2010-05-25'" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_date_list[0]" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "recent_result = result['2020-07-01':]" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
001667001832001018519002519198450004000991001869110015001220
净值日期
2018-05-110.8400.9821.6661.7591.03061.68601.2881.3052.6170.782
2018-05-140.8411.0011.6751.7611.03041.69101.2811.3052.6440.787
2018-05-150.8481.0071.7021.7681.03021.70201.2971.3182.6610.790
2018-05-160.8481.0081.6861.7591.02901.69701.2931.3152.6500.789
2018-05-170.8420.9851.6641.7481.02841.68501.2821.3052.6200.784
.................................
2023-02-222.0592.6724.0614.9322.21833.19723.9512.5674.6701.639
2023-02-232.0612.6744.0584.9182.22313.19783.9412.5744.6851.633
2023-02-242.0452.6444.0424.8812.21243.17763.9122.5534.6321.624
2023-02-272.0382.6564.0474.8852.20763.17213.9122.5394.6461.615
2023-02-282.0452.6514.0654.9172.22633.17633.9262.5514.6521.627
\n", "

1172 rows × 10 columns

\n", "
" ], "text/plain": [ " 001667 001832 001018 519002 519198 450004 000991 001869 \\\n", "净值日期 \n", "2018-05-11 0.840 0.982 1.666 1.759 1.0306 1.6860 1.288 1.305 \n", "2018-05-14 0.841 1.001 1.675 1.761 1.0304 1.6910 1.281 1.305 \n", "2018-05-15 0.848 1.007 1.702 1.768 1.0302 1.7020 1.297 1.318 \n", "2018-05-16 0.848 1.008 1.686 1.759 1.0290 1.6970 1.293 1.315 \n", "2018-05-17 0.842 0.985 1.664 1.748 1.0284 1.6850 1.282 1.305 \n", "... ... ... ... ... ... ... ... ... \n", "2023-02-22 2.059 2.672 4.061 4.932 2.2183 3.1972 3.951 2.567 \n", "2023-02-23 2.061 2.674 4.058 4.918 2.2231 3.1978 3.941 2.574 \n", "2023-02-24 2.045 2.644 4.042 4.881 2.2124 3.1776 3.912 2.553 \n", "2023-02-27 2.038 2.656 4.047 4.885 2.2076 3.1721 3.912 2.539 \n", "2023-02-28 2.045 2.651 4.065 4.917 2.2263 3.1763 3.926 2.551 \n", "\n", " 110015 001220 \n", "净值日期 \n", "2018-05-11 2.617 0.782 \n", "2018-05-14 2.644 0.787 \n", "2018-05-15 2.661 0.790 \n", "2018-05-16 2.650 0.789 \n", "2018-05-17 2.620 0.784 \n", "... ... ... \n", "2023-02-22 4.670 1.639 \n", "2023-02-23 4.685 1.633 \n", "2023-02-24 4.632 1.624 \n", "2023-02-27 4.646 1.615 \n", "2023-02-28 4.652 1.627 \n", "\n", "[1172 rows x 10 columns]" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "recent_result" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "recent_result1=recent_result*100" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
001667001832001018519002519198450004000991001869110015001220
0016671.000.980.990.990.931.000.990.990.980.99
0018320.981.000.960.950.920.970.970.970.980.96
0010180.990.961.000.990.940.990.980.980.960.99
5190020.990.950.991.000.940.980.990.970.950.98
5191980.930.920.940.941.000.910.960.880.860.91
4500041.000.970.990.980.911.000.980.990.980.99
0009910.990.970.980.990.960.981.000.960.940.97
0018690.990.970.980.970.880.990.961.000.990.99
1100150.980.980.960.950.860.980.940.991.000.97
0012200.990.960.990.980.910.990.970.990.971.00
\n", "
" ], "text/plain": [ " 001667 001832 001018 519002 519198 450004 000991 001869 \\\n", "001667 1.00 0.98 0.99 0.99 0.93 1.00 0.99 0.99 \n", "001832 0.98 1.00 0.96 0.95 0.92 0.97 0.97 0.97 \n", "001018 0.99 0.96 1.00 0.99 0.94 0.99 0.98 0.98 \n", "519002 0.99 0.95 0.99 1.00 0.94 0.98 0.99 0.97 \n", "519198 0.93 0.92 0.94 0.94 1.00 0.91 0.96 0.88 \n", "450004 1.00 0.97 0.99 0.98 0.91 1.00 0.98 0.99 \n", "000991 0.99 0.97 0.98 0.99 0.96 0.98 1.00 0.96 \n", "001869 0.99 0.97 0.98 0.97 0.88 0.99 0.96 1.00 \n", "110015 0.98 0.98 0.96 0.95 0.86 0.98 0.94 0.99 \n", "001220 0.99 0.96 0.99 0.98 0.91 0.99 0.97 0.99 \n", "\n", " 110015 001220 \n", "001667 0.98 0.99 \n", "001832 0.98 0.96 \n", "001018 0.96 0.99 \n", "519002 0.95 0.98 \n", "519198 0.86 0.91 \n", "450004 0.98 0.99 \n", "000991 0.94 0.97 \n", "001869 0.99 0.99 \n", "110015 1.00 0.97 \n", "001220 0.97 1.00 " ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "np.round(recent_result1.corr(),2)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "X=np.round(recent_result.corr(),2)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "import seaborn as sns\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(6,6),dpi=100)\n", "sns.heatmap(X,annot=True)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "result_na = result.dropna(axis=0)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "recent_na= result_na['2020-07-01':]" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
118002486002006373000369100055160416320013161815
净值日期
2020-07-022.0662.6781.80351.8462.16760.8761.1950.419
2020-07-062.1152.7261.85221.8642.22870.8791.2010.423
2020-07-072.0982.6901.81691.8402.18580.8601.2020.420
2020-07-082.0932.7141.85671.8352.25110.8561.2100.423
2020-07-092.0992.7121.90921.8212.30730.8331.2020.418
...........................
2023-06-273.0913.0172.40522.3192.06261.5271.2420.674
2023-06-283.1223.0222.40192.3172.04751.5361.2370.671
2023-06-293.1433.0282.40482.3302.03811.5491.2380.673
2023-06-303.1743.0622.44012.3522.06541.5571.2430.678
2023-07-033.1663.0572.44622.3282.08511.5661.2470.678
\n", "

687 rows × 8 columns

\n", "
" ], "text/plain": [ " 118002 486002 006373 000369 100055 160416 320013 161815\n", "净值日期 \n", "2020-07-02 2.066 2.678 1.8035 1.846 2.1676 0.876 1.195 0.419\n", "2020-07-06 2.115 2.726 1.8522 1.864 2.2287 0.879 1.201 0.423\n", "2020-07-07 2.098 2.690 1.8169 1.840 2.1858 0.860 1.202 0.420\n", "2020-07-08 2.093 2.714 1.8567 1.835 2.2511 0.856 1.210 0.423\n", "2020-07-09 2.099 2.712 1.9092 1.821 2.3073 0.833 1.202 0.418\n", "... ... ... ... ... ... ... ... ...\n", "2023-06-27 3.091 3.017 2.4052 2.319 2.0626 1.527 1.242 0.674\n", "2023-06-28 3.122 3.022 2.4019 2.317 2.0475 1.536 1.237 0.671\n", "2023-06-29 3.143 3.028 2.4048 2.330 2.0381 1.549 1.238 0.673\n", "2023-06-30 3.174 3.062 2.4401 2.352 2.0654 1.557 1.243 0.678\n", "2023-07-03 3.166 3.057 2.4462 2.328 2.0851 1.566 1.247 0.678\n", "\n", "[687 rows x 8 columns]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "recent_na" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [], "source": [ "profit_df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [], "source": [ "profit_df['最大回撤']=profit_df['最大回撤'].map(lambda x:round(x*100,2))\n", "profit_df['累积收益率']=profit_df['累积收益率'].map(lambda x:round(x*100,2))\n", "profit_df['年化收益率']=profit_df['年化收益率'].map(lambda x:round(x*100,2))\n" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
代码名称发行日期成立年数累积收益率年化收益率最大回撤
0501059西部利得国企红利指数增强A(F501059)2018-07-114.18115.020.019.28
1005561创金合信中证红利低波动指数A(F005561)2018-04-264.3965.012.019.74
2161907万家中证红利指数(LOF)A(F161907)2011-03-1711.50136.08.046.84
3501029华宝红利基金(F501029)2017-01-185.6640.06.028.74
4008928泰达消费红利指数A(F008928)2020-03-262.4776.026.018.13
5004814中欧红利优享混合A(F004814)2018-04-194.4169.013.025.26
6005618融通红利机会混合A(F005618)2018-03-274.4798.017.015.30
7080005长盛量化红利混合(F080005)2009-11-2512.81238.010.053.00
8008163南方大盘红利低波50ETF联接A(F008163)2020-01-212.6523.08.012.26
9006658财通中证香港红利等权指数A(F006658)2019-04-263.39-21.0-7.029.02
10007751景顺长城中证沪港深红利低波A(F007751)2019-09-063.0214.04.019.54
\n", "
" ], "text/plain": [ " 代码 名称 发行日期 成立年数 累积收益率 年化收益率 最大回撤\n", "0 501059 西部利得国企红利指数增强A(F501059) 2018-07-11 4.18 115.0 20.0 19.28\n", "1 005561 创金合信中证红利低波动指数A(F005561) 2018-04-26 4.39 65.0 12.0 19.74\n", "2 161907 万家中证红利指数(LOF)A(F161907) 2011-03-17 11.50 136.0 8.0 46.84\n", "3 501029 华宝红利基金(F501029) 2017-01-18 5.66 40.0 6.0 28.74\n", "4 008928 泰达消费红利指数A(F008928) 2020-03-26 2.47 76.0 26.0 18.13\n", "5 004814 中欧红利优享混合A(F004814) 2018-04-19 4.41 69.0 13.0 25.26\n", "6 005618 融通红利机会混合A(F005618) 2018-03-27 4.47 98.0 17.0 15.30\n", "7 080005 长盛量化红利混合(F080005) 2009-11-25 12.81 238.0 10.0 53.00\n", "8 008163 南方大盘红利低波50ETF联接A(F008163) 2020-01-21 2.65 23.0 8.0 12.26\n", "9 006658 财通中证香港红利等权指数A(F006658) 2019-04-26 3.39 -21.0 -7.0 29.02\n", "10 007751 景顺长城中证沪港深红利低波A(F007751) 2019-09-06 3.02 14.0 4.0 19.54" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profit_df.head(20)" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
代码名称发行日期成立年数累积收益率年化收益率最大回撤
4008928泰达消费红利指数A(F008928)2020-03-262.4776.026.018.13
0501059西部利得国企红利指数增强A(F501059)2018-07-114.18115.020.019.28
6005618融通红利机会混合A(F005618)2018-03-274.4798.017.015.30
5004814中欧红利优享混合A(F004814)2018-04-194.4169.013.025.26
1005561创金合信中证红利低波动指数A(F005561)2018-04-264.3965.012.019.74
7080005长盛量化红利混合(F080005)2009-11-2512.81238.010.053.00
2161907万家中证红利指数(LOF)A(F161907)2011-03-1711.50136.08.046.84
8008163南方大盘红利低波50ETF联接A(F008163)2020-01-212.6523.08.012.26
3501029华宝红利基金(F501029)2017-01-185.6640.06.028.74
10007751景顺长城中证沪港深红利低波A(F007751)2019-09-063.0214.04.019.54
9006658财通中证香港红利等权指数A(F006658)2019-04-263.39-21.0-7.029.02
\n", "
" ], "text/plain": [ " 代码 名称 发行日期 成立年数 累积收益率 年化收益率 最大回撤\n", "4 008928 泰达消费红利指数A(F008928) 2020-03-26 2.47 76.0 26.0 18.13\n", "0 501059 西部利得国企红利指数增强A(F501059) 2018-07-11 4.18 115.0 20.0 19.28\n", "6 005618 融通红利机会混合A(F005618) 2018-03-27 4.47 98.0 17.0 15.30\n", "5 004814 中欧红利优享混合A(F004814) 2018-04-19 4.41 69.0 13.0 25.26\n", "1 005561 创金合信中证红利低波动指数A(F005561) 2018-04-26 4.39 65.0 12.0 19.74\n", "7 080005 长盛量化红利混合(F080005) 2009-11-25 12.81 238.0 10.0 53.00\n", "2 161907 万家中证红利指数(LOF)A(F161907) 2011-03-17 11.50 136.0 8.0 46.84\n", "8 008163 南方大盘红利低波50ETF联接A(F008163) 2020-01-21 2.65 23.0 8.0 12.26\n", "3 501029 华宝红利基金(F501029) 2017-01-18 5.66 40.0 6.0 28.74\n", "10 007751 景顺长城中证沪港深红利低波A(F007751) 2019-09-06 3.02 14.0 4.0 19.54\n", "9 006658 财通中证香港红利等权指数A(F006658) 2019-04-26 3.39 -21.0 -7.0 29.02" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "profit_df.sort_values(by='年化收益率',ascending=False).head(20)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "profit_df.to_excel('fund红利.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'001594'" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "code_list[0]" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [], "source": [ "def automatic_investment_plan(code):\n", " '''\n", " 定投收益\n", " '''\n", " df = get_net_value_df(code)\n", "\n", " money = 10000\n", " total_share =0 \n", " interval = 22\n", " length = len(df)\n", " sum_money=0\n", " count=0\n", " for i in range(0,length,interval):\n", " buy_date_df = df.iloc[i]\n", " share = money/buy_date_df['单位净值']\n", " total_share+=share\n", " sum_money+=money\n", " count+=1\n", " virtual_profit = (df.iloc[-1]['单位净值']*total_share-sum_money)/sum_money\n", " data=[]\n", " year,month,day=df.iloc[0]['净值日期'].split('-')\n", " for i in range(count):\n", " data.append((datetime.date(int(year), int(month), int(day))+datetime.timedelta(days=i*30), -1*money))\n", " current_money = df.iloc[-1]['单位净值']*total_share\n", " data.append((datetime.date(int(year), int(month), int(day))+datetime.timedelta(days=i*30),current_money))\n", " percent = xirr(data)\n", " every_round_profit = irr([money]*count+[-1*current_money])\n", " real_profit = pow(every_round_profit+1,count)-1\n", " return code,sum_money,round(current_money,2),round(percent,4),round(virtual_profit,4),round(real_profit,4)" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "def xirr(cashflows):\n", " # 函数\n", " years = [(ta[0] - cashflows[0][0]).days / 365. for ta in cashflows]\n", " residual = 1.0\n", " step = 0.05\n", " guess = 0.05\n", " epsilon = 0.0001\n", " limit = 10000\n", " while abs(residual) > epsilon and limit > 0:\n", " limit -= 1\n", " residual = 0.0\n", " for i, trans in enumerate(cashflows):\n", " residual += trans[1] / pow(guess, years[i])\n", " if abs(residual) > epsilon:\n", " if residual > 0:\n", " guess += step\n", " else:\n", " guess -= step\n", " step /= 2.0\n", " return guess - 1\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 测试\n", "data = [(datetime.date(2006, 1, 24), -39967), (datetime.date(2008, 2, 6), -19866), (datetime.date(2010, 10, 18), 245706), (datetime.date(2013, 9, 14), 52142)]\n", "xirr(data)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "740000 891983.51\n", "001594 0.06 0.21 0.43\n", "740000 838011.42\n", "502010 0.04 0.13 0.27\n", "730000 548702.23\n", "167301 -0.1 -0.25 -0.45\n", "60000 62541.56\n", "013273 0.22 0.04 0.07\n", "140000 138765.67\n", "010696 -0.02 -0.01 -0.02\n" ] } ], "source": [ "result =[]\n", "for code in code_list:\n", " d={}\n", " code,sum_money,current_money,percent,virtual_profit,real_profit=automatic_investment_plan(code)\n", " d['代码']=code\n", " d['投入总金额']=sum_money\n", " d['目前总金额']=current_money\n", " d['总收益']=percent\n", " d['简单收益率']=virtual_profit\n", " d['irr收益率']=real_profit\n", " result.append(d)\n", "df = pd.DataFrame(result)\n" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
代码投入总金额目前总金额总收益简单收益率irr收益率
0001594740000891983.510.0620.540.43
1502010740000838011.420.0413.240.27
2167301730000548702.23-0.10-24.84-0.45
30132736000062541.560.224.240.07
4010696140000138765.67-0.02-0.88-0.02
\n", "
" ], "text/plain": [ " 代码 投入总金额 目前总金额 总收益 简单收益率 irr收益率\n", "0 001594 740000 891983.51 0.06 20.54 0.43\n", "1 502010 740000 838011.42 0.04 13.24 0.27\n", "2 167301 730000 548702.23 -0.10 -24.84 -0.45\n", "3 013273 60000 62541.56 0.22 4.24 0.07\n", "4 010696 140000 138765.67 -0.02 -0.88 -0.02" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "df.to_excel('定投.xlsx',encoding='utf8')" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "def irr(values):\n", " \"\"\"\n", " Return the Internal Rate of Return (IRR).\n", " .. deprecated:: 1.18\n", " `irr` is deprecated; for details, see NEP 32 [1]_.\n", " Use the corresponding function in the numpy-financial library,\n", " https://pypi.org/project/numpy-financial.\n", " This is the \"average\" periodically compounded rate of return\n", " that gives a net present value of 0.0; for a more complete explanation,\n", " see Notes below.\n", " :class:`decimal.Decimal` type is not supported.\n", " Parameters\n", " ----------\n", " values : array_like, shape(N,)\n", " Input cash flows per time period. By convention, net \"deposits\"\n", " are negative and net \"withdrawals\" are positive. Thus, for\n", " example, at least the first element of `values`, which represents\n", " the initial investment, will typically be negative.\n", " Returns\n", " -------\n", " out : float\n", " Internal Rate of Return for periodic input values.\n", " Notes\n", " -----\n", " The IRR is perhaps best understood through an example (illustrated\n", " using np.irr in the Examples section below). Suppose one invests 100\n", " units and then makes the following withdrawals at regular (fixed)\n", " intervals: 39, 59, 55, 20. Assuming the ending value is 0, one's 100\n", " unit investment yields 173 units; however, due to the combination of\n", " compounding and the periodic withdrawals, the \"average\" rate of return\n", " is neither simply 0.73/4 nor (1.73)^0.25-1. Rather, it is the solution\n", " (for :math:`r`) of the equation:\n", " .. math:: -100 + \\\\frac{39}{1+r} + \\\\frac{59}{(1+r)^2}\n", " + \\\\frac{55}{(1+r)^3} + \\\\frac{20}{(1+r)^4} = 0\n", " In general, for `values` :math:`= [v_0, v_1, ... v_M]`,\n", " irr is the solution of the equation: [2]_\n", " .. math:: \\\\sum_{t=0}^M{\\\\frac{v_t}{(1+irr)^{t}}} = 0\n", " References\n", " ----------\n", " .. [1] NumPy Enhancement Proposal (NEP) 32,\n", " https://numpy.org/neps/nep-0032-remove-financial-functions.html\n", " .. [2] L. J. Gitman, \"Principles of Managerial Finance, Brief,\" 3rd ed.,\n", " Addison-Wesley, 2003, pg. 348.\n", " Examples\n", " --------\n", " >>> round(np.irr([-100, 39, 59, 55, 20]), 5)\n", " 0.28095\n", " >>> round(np.irr([-100, 0, 0, 74]), 5)\n", " -0.0955\n", " >>> round(np.irr([-100, 100, 0, -7]), 5)\n", " -0.0833\n", " >>> round(np.irr([-100, 100, 0, 7]), 5)\n", " 0.06206\n", " >>> round(np.irr([-5, 10.5, 1, -8, 1]), 5)\n", " 0.0886\n", " \"\"\"\n", " # `np.roots` call is why this function does not support Decimal type.\n", " #\n", " # Ultimately Decimal support needs to be added to np.roots, which has\n", " # greater implications on the entire linear algebra module and how it does\n", " # eigenvalue computations.\n", " res = np.roots(values[::-1]) # 求根,对于n次多项式,p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n],传入p的列表参数[p[0],p[1],...p[n]].\n", " mask = (res.imag == 0) & (res.real > 0) # 虚部为0,实部为非负数。\n", " if not mask.any(): # 判断是否有满足条件的实根\n", " return np.nan # 不满足,返回Not A Number\n", " res = res[mask].real\n", " # NPV(rate) = 0 can have more than one solution so we return\n", " # only the solution closest to zero.\n", " rate = 1/res - 1 # 这里解出的res,也就是符合条件的x,其实等于1/(1+r),因此要做一个变换回去,r=1/x-1\n", " rate = rate.item(np.argmin(np.abs(rate))) # argmin()取最小值的下标,也就是说可能会计算出多个折现率,我们取最小那个\n", " return rate" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests\n", "\n", "headers = {\n", " 'authority': 'api.jiucaishuo.com',\n", " 'sec-ch-ua': '\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"98\", \"Google Chrome\";v=\"98\"',\n", " 'accept': 'application/json, text/plain, */*',\n", " 'content-type': 'application/json;charset=UTF-8',\n", " 'sec-ch-ua-mobile': '?0',\n", " 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',\n", " 'sec-ch-ua-platform': '\"Linux\"',\n", " 'origin': 'https://www.funddb.cn',\n", " 'sec-fetch-site': 'cross-site',\n", " 'sec-fetch-mode': 'cors',\n", " 'sec-fetch-dest': 'empty',\n", " 'accept-language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7',\n", "}\n", "\n", "data = '{\"code\":\"013273\",\"category\":\"wind_category\",\"date\":\"\",\"type\":\"pc\",\"data_source\":\"xichou\",\"version\":\"1.8.9\",\"authtoken\":\"\",\"act_time\":1645634683356,\"tirgkjfs\":\"fb\",\"abiokytke\":\"52\",\"u54rg5d\":\"76\",\"kf54ge7\":\"f\",\"tiklsktr4\":\"b\",\"lksytkjh\":\"0ba1\",\"sbnoywr\":\"27\",\"bgd7h8tyu54\":\"46\",\"y654b5fs3tr\":\"d\",\"bioduytlw\":\"6\",\"bd4uy742\":\"4\",\"h67456y\":\"70b\",\"bvytikwqjk\":\"46\",\"ngd4uy551\":\"0b\",\"bgiuytkw\":\"bc\",\"nd354uy4752\":\"4\",\"ghtoiutkmlg\":\"db8\",\"bd24y6421f\":\"7e\",\"tbvdiuytk\":\"7\",\"ibvytiqjek\":\"1d\",\"jnhf8u5231\":\"bc\",\"fjlkatj\":\"760\",\"hy5641d321t\":\"e4\",\"iogojti\":\"e\",\"ngd4yut78\":\"b8\",\"nkjhrew\":\"4\",\"yt447e13f\":\"1\",\"n3bf4uj7y7\":\"b\",\"nbf4uj7y432\":\"52\",\"yi854tew\":\"54\",\"h13ey474\":\"54f\",\"quikgdky\":\"c3\"}'\n", "\n", "response = requests.post('https://api.jiucaishuo.com/v2/fund-lists/fundinvest', headers=headers, data=data)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "result = response.json()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result['data']['gp']['list']" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "def read_data_from_mongo(code):\n", " result=[]\n", " for item in fund[code].find():\n", " result.append(item)\n", "\n", " df = pd.DataFrame(result)\n", " return df" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "df = read_data_from_mongo(code_list[0])" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
_id净值日期单位净值日增长率
0621659cc28d482b10a0e5c052015-07-081.00000.0000
1621659cc28d482b10a0e5c062015-07-101.08150.0000
2621659cc28d482b10a0e5c072015-07-131.0514-2.7832
3621659cc28d482b10a0e5c082015-07-141.0324-1.8071
4621659cc28d482b10a0e5c092015-07-151.04981.6854
\n", "
" ], "text/plain": [ " _id 净值日期 单位净值 日增长率\n", "0 621659cc28d482b10a0e5c05 2015-07-08 1.0000 0.0000\n", "1 621659cc28d482b10a0e5c06 2015-07-10 1.0815 0.0000\n", "2 621659cc28d482b10a0e5c07 2015-07-13 1.0514 -2.7832\n", "3 621659cc28d482b10a0e5c08 2015-07-14 1.0324 -1.8071\n", "4 621659cc28d482b10a0e5c09 2015-07-15 1.0498 1.6854" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c = (\n", " Scatter(InitOpts(width='800px',height='500px'))\n", " .add_xaxis(simple_name)\n", " .add_yaxis('A',focus_num,label_opts=opts.LabelOpts(is_show=True))\n", " .set_global_opts(\n", " xaxis_opts=opts.AxisOpts(\n", " # name='日期',\n", " # min_interval=5,\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " axislabel_opts=opts.LabelOpts(rotate=-45),\n", "\n", " ),\n", " yaxis_opts=opts.AxisOpts( \n", " min_=0,\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " ),\n", " title_opts=opts.TitleOpts(title=\"红利基金收益率曲线\"),\n", " visualmap_opts=opts.VisualMapOpts(type_=\"size\",max_=150000, min_=2000),\n", " )\n", " .render(\"../plot_image/红利.html\")\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c = (\n", " Line()\n", " .add_xaxis(X)\n", " .add_yaxis(title, Y, is_smooth=True,\n", " label_opts=opts.LabelOpts(is_show=False),\n", "linestyle_opts=opts.LineStyleOpts(width=2,color='rgb(255, 0, 0)'),\n", " ).add_yaxis(title2, Y2, is_smooth=True,\n", "linestyle_opts=opts.LineStyleOpts(width=2,color='rgb(0, 0, 255)'),\n", "label_opts=opts.LabelOpts(is_show=False),\n", " ).add_yaxis(title3, Y3, is_smooth=True,\n", "linestyle_opts=opts.LineStyleOpts(width=2,color='rgb(0, 255, 0)'),\n", "label_opts=opts.LabelOpts(is_show=False),\n", " ).set_global_opts(\n", " title_opts=opts.TitleOpts(title=full_title),\n", " xaxis_opts=opts.AxisOpts(\n", " name='日期',\n", " min_interval=1,\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " axislabel_opts=opts.LabelOpts(rotate=55),\n", " ),\n", " yaxis_opts=opts.AxisOpts(name='收益率%',\n", " interval=3,\n", " min_=y_min-2,\n", " max_=y_max+2,\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " )\n", " )\n", " .set_colors(['red','blue','green']) # 点的颜色\n", " .render(f\"../plot_image/多曲线plot_line_{name}_{types}_{date}_{rotation_rate}.html\")\n", ")" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [], "source": [ "c=Line()" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [], "source": [ "X=result_na.index.tolist()\n", "X=list(map(lambda x:x.strftime('%Y-%m-%d'),X))\n", "c=c.add_xaxis(X)" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [], "source": [ "\n", "for code,name in fund_dict.items():\n", " Y=result_na[code].tolist()\n", " c=c.add_yaxis(name, Y, is_smooth=True,\n", " label_opts=opts.LabelOpts(is_show=False),\n", "linestyle_opts=opts.LineStyleOpts(width=1,color='rgb(255, 0, 0)'),\n", " )" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.set_global_opts(\n", " title_opts=opts.TitleOpts(title='ddddd'),\n", " xaxis_opts=opts.AxisOpts(\n", " name='日期',\n", " # min_interval=1,\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " axislabel_opts=opts.LabelOpts(rotate=55),\n", " ),\n", " yaxis_opts=opts.AxisOpts(name='收益率%',\n", " # interval=3,\n", " min_=0.6,\n", " max_=2.8,\n", " splitline_opts=opts.SplitLineOpts(is_show=True),\n", " )\n", " ).set_colors(['red','blue','green']) # 点的颜色\n" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'/home/xda/github/stock/plot_image/多曲线plot_line_1111223.html'" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.render(f\"../plot_image/多曲线plot_line_1111223.html\")\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import matplotlib\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
118002486002006373000369100055160416320013161815
净值日期
2018-11-201.7022.0581.00001.6011.36841.0520.8670.468
2018-11-231.7172.0631.00011.5991.37951.0350.8670.458
2018-11-301.7262.1581.00031.6581.39081.0590.8660.454
2018-12-071.6682.0531.00021.5751.33831.0310.8740.456
2018-12-141.6752.0431.00031.5531.32551.0080.8690.454
\n", "
" ], "text/plain": [ " 118002 486002 006373 000369 100055 160416 320013 161815\n", "净值日期 \n", "2018-11-20 1.702 2.058 1.0000 1.601 1.3684 1.052 0.867 0.468\n", "2018-11-23 1.717 2.063 1.0001 1.599 1.3795 1.035 0.867 0.458\n", "2018-11-30 1.726 2.158 1.0003 1.658 1.3908 1.059 0.866 0.454\n", "2018-12-07 1.668 2.053 1.0002 1.575 1.3383 1.031 0.874 0.456\n", "2018-12-14 1.675 2.043 1.0003 1.553 1.3255 1.008 0.869 0.454" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_na.head()\n" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "# new_df = result_na.copy()\n", "new_df=recent_na" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "base=new_df.iloc[0]" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "118002 2.0660\n", "486002 2.6780\n", "006373 1.8035\n", "000369 1.8460\n", "100055 2.1676\n", "160416 0.8760\n", "320013 1.1950\n", "161815 0.4190\n", "Name: 2020-07-02 00:00:00, dtype: float64" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "base" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.1887" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "base['501059']" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "def convert(x,code):\n", " b=base[code]\n", " return x/b" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_51200/2552348715.py:2: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " new_df['{}'.format(code)]=new_df[code].apply(convert,args=(code,))\n" ] } ], "source": [ "for code,name in fund_dict.items():\n", " new_df['{}'.format(code)]=new_df[code].apply(convert,args=(code,))\n" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
501059005561161907501029008928004814005618080005008163006658007751
净值日期
2020-03-261.0000001.0000001.0000001.0000001.00001.0000001.0000001.0000001.0000001.0000001.000000
2020-03-271.0078241.0059511.0068911.0069411.00000.9984621.0014991.0048691.0069631.0137021.006048
2020-04-031.0031130.9976620.9956210.9981071.00090.9875911.0100950.9982290.9971521.0132371.003360
2020-04-101.0159841.0075451.0049591.0075721.00201.0180491.0360441.0039841.0010551.0478401.025874
2020-04-171.0303691.0153031.0093381.0092540.99521.0246131.0656201.0075251.0075961.0535301.029794
\n", "
" ], "text/plain": [ " 501059 005561 161907 501029 008928 004814 \\\n", "净值日期 \n", "2020-03-26 1.000000 1.000000 1.000000 1.000000 1.0000 1.000000 \n", "2020-03-27 1.007824 1.005951 1.006891 1.006941 1.0000 0.998462 \n", "2020-04-03 1.003113 0.997662 0.995621 0.998107 1.0009 0.987591 \n", "2020-04-10 1.015984 1.007545 1.004959 1.007572 1.0020 1.018049 \n", "2020-04-17 1.030369 1.015303 1.009338 1.009254 0.9952 1.024613 \n", "\n", " 005618 080005 008163 006658 007751 \n", "净值日期 \n", "2020-03-26 1.000000 1.000000 1.000000 1.000000 1.000000 \n", "2020-03-27 1.001499 1.004869 1.006963 1.013702 1.006048 \n", "2020-04-03 1.010095 0.998229 0.997152 1.013237 1.003360 \n", "2020-04-10 1.036044 1.003984 1.001055 1.047840 1.025874 \n", "2020-04-17 1.065620 1.007525 1.007596 1.053530 1.029794 " ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_df.head()" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "result_na1=new_df.rename(columns=fund_dict)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "result_na1.to_pickle('obj_test.pkl')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "result_na1 = pd.read_pickle('obj_test.pkl')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
易方达标普消费品工银全球精选股票国富全球科技互联广发全球医疗保健富国全球科技互联华安标普全球石油诺安全球黄金银华抗通胀主题
净值日期
2020-07-021.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000000
2020-07-061.0237171.0179241.0270031.0097511.0281881.0034251.0050211.009547
2020-07-071.0154891.0044811.0074300.9967501.0083960.9817351.0058581.002387
2020-07-081.0130691.0134431.0294980.9940411.0385220.9771691.0125521.009547
2020-07-091.0159731.0126961.0586080.9864571.0644490.9509131.0058580.997613
\n", "
" ], "text/plain": [ " 易方达标普消费品 工银全球精选股票 国富全球科技互联 广发全球医疗保健 富国全球科技互联 华安标普全球石油 \\\n", "净值日期 \n", "2020-07-02 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 \n", "2020-07-06 1.023717 1.017924 1.027003 1.009751 1.028188 1.003425 \n", "2020-07-07 1.015489 1.004481 1.007430 0.996750 1.008396 0.981735 \n", "2020-07-08 1.013069 1.013443 1.029498 0.994041 1.038522 0.977169 \n", "2020-07-09 1.015973 1.012696 1.058608 0.986457 1.064449 0.950913 \n", "\n", " 诺安全球黄金 银华抗通胀主题 \n", "净值日期 \n", "2020-07-02 1.000000 1.000000 \n", "2020-07-06 1.005021 1.009547 \n", "2020-07-07 1.005858 1.002387 \n", "2020-07-08 1.012552 1.009547 \n", "2020-07-09 1.005858 0.997613 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_na1.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result_na1.to_csv('test.csv')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['df-obj']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import joblib\n", "joblib.dump(result_na1,'df-obj')\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "plt.rcParams['figure.figsize'] = (16.0, 10)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "name": "stderr", "output_type": "stream", "text": [ "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 20928 (\\N{CJK UNIFIED IDEOGRAPH-51C0}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 20540 (\\N{CJK UNIFIED IDEOGRAPH-503C}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26085 (\\N{CJK UNIFIED IDEOGRAPH-65E5}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26399 (\\N{CJK UNIFIED IDEOGRAPH-671F}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26131 (\\N{CJK UNIFIED IDEOGRAPH-6613}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26041 (\\N{CJK UNIFIED IDEOGRAPH-65B9}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 36798 (\\N{CJK UNIFIED IDEOGRAPH-8FBE}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26631 (\\N{CJK UNIFIED IDEOGRAPH-6807}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26222 (\\N{CJK UNIFIED IDEOGRAPH-666E}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 28040 (\\N{CJK UNIFIED IDEOGRAPH-6D88}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 36153 (\\N{CJK UNIFIED IDEOGRAPH-8D39}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 21697 (\\N{CJK UNIFIED IDEOGRAPH-54C1}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 24037 (\\N{CJK UNIFIED IDEOGRAPH-5DE5}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 38134 (\\N{CJK UNIFIED IDEOGRAPH-94F6}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 20840 (\\N{CJK UNIFIED IDEOGRAPH-5168}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 29699 (\\N{CJK UNIFIED IDEOGRAPH-7403}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 31934 (\\N{CJK UNIFIED IDEOGRAPH-7CBE}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 36873 (\\N{CJK UNIFIED IDEOGRAPH-9009}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 32929 (\\N{CJK UNIFIED IDEOGRAPH-80A1}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 31080 (\\N{CJK UNIFIED IDEOGRAPH-7968}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 22269 (\\N{CJK UNIFIED IDEOGRAPH-56FD}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 23500 (\\N{CJK UNIFIED IDEOGRAPH-5BCC}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 31185 (\\N{CJK UNIFIED IDEOGRAPH-79D1}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 25216 (\\N{CJK UNIFIED IDEOGRAPH-6280}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 20114 (\\N{CJK UNIFIED IDEOGRAPH-4E92}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 32852 (\\N{CJK UNIFIED IDEOGRAPH-8054}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 24191 (\\N{CJK UNIFIED IDEOGRAPH-5E7F}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 21457 (\\N{CJK UNIFIED IDEOGRAPH-53D1}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 21307 (\\N{CJK UNIFIED IDEOGRAPH-533B}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 30103 (\\N{CJK UNIFIED IDEOGRAPH-7597}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 20445 (\\N{CJK UNIFIED IDEOGRAPH-4FDD}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 20581 (\\N{CJK UNIFIED IDEOGRAPH-5065}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 21326 (\\N{CJK UNIFIED IDEOGRAPH-534E}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 23433 (\\N{CJK UNIFIED IDEOGRAPH-5B89}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 30707 (\\N{CJK UNIFIED IDEOGRAPH-77F3}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 27833 (\\N{CJK UNIFIED IDEOGRAPH-6CB9}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 35834 (\\N{CJK UNIFIED IDEOGRAPH-8BFA}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 40644 (\\N{CJK UNIFIED IDEOGRAPH-9EC4}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 37329 (\\N{CJK UNIFIED IDEOGRAPH-91D1}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 25239 (\\N{CJK UNIFIED IDEOGRAPH-6297}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 36890 (\\N{CJK UNIFIED IDEOGRAPH-901A}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 32960 (\\N{CJK UNIFIED IDEOGRAPH-80C0}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 20027 (\\N{CJK UNIFIED IDEOGRAPH-4E3B}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n", "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 39064 (\\N{CJK UNIFIED IDEOGRAPH-9898}) missing from current font.\n", " fig.canvas.print_figure(bytes_io, **kw)\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# plt.figure(figsize=(8,8))\n", "\n", "result_na1.plot(grid=True,)\n", "# plt.show()\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "for code,name in fund_dict.items():\n", " result = []\n", " for item in fund[code].find({},{'_id':0}):\n", " result.append(item)\n", " df = pd.DataFrame(result)\n", " plot_profit_line(df,name)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'fund_dict' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m/home/xda/github/stock/fund/qdii_fund_analysis_5fund.ipynb Cell 89'\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0m fund_dict\n", "\u001b[0;31mNameError\u001b[0m: name 'fund_dict' is not defined" ] } ], "source": [ "fund_dict" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "ename": "KeyError", "evalue": "'占净值比例'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/core/indexes/base.py:3621\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3620\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m-> 3621\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_engine\u001b[39m.\u001b[39;49mget_loc(casted_key)\n\u001b[1;32m 3622\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mKeyError\u001b[39;00m \u001b[39mas\u001b[39;00m err:\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/_libs/index.pyx:136\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/_libs/index.pyx:163\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:5198\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:5206\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", "\u001b[0;31mKeyError\u001b[0m: '占净值比例'", "\nThe above exception was the direct cause of the following exception:\n", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m/home/xda/github/stock/fund/qdii_fund_analysis_5fund.ipynb Cell 90'\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0m fund_portfolio_hold_em_df \u001b[39m=\u001b[39m ak\u001b[39m.\u001b[39;49mfund_portfolio_hold_em(code\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39m000001\u001b[39;49m\u001b[39m\"\u001b[39;49m, year\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39m2023\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/akshare/fund/fund_em_portfolio.py:63\u001b[0m, in \u001b[0;36mfund_portfolio_hold_em\u001b[0;34m(code, year)\u001b[0m\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/core/frame.py:3505\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3503\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcolumns\u001b[39m.\u001b[39mnlevels \u001b[39m>\u001b[39m \u001b[39m1\u001b[39m:\n\u001b[1;32m 3504\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_getitem_multilevel(key)\n\u001b[0;32m-> 3505\u001b[0m indexer \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcolumns\u001b[39m.\u001b[39;49mget_loc(key)\n\u001b[1;32m 3506\u001b[0m \u001b[39mif\u001b[39;00m is_integer(indexer):\n\u001b[1;32m 3507\u001b[0m indexer \u001b[39m=\u001b[39m [indexer]\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/core/indexes/base.py:3623\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3621\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_engine\u001b[39m.\u001b[39mget_loc(casted_key)\n\u001b[1;32m 3622\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mKeyError\u001b[39;00m \u001b[39mas\u001b[39;00m err:\n\u001b[0;32m-> 3623\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mKeyError\u001b[39;00m(key) \u001b[39mfrom\u001b[39;00m \u001b[39merr\u001b[39;00m\n\u001b[1;32m 3624\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mTypeError\u001b[39;00m:\n\u001b[1;32m 3625\u001b[0m \u001b[39m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[1;32m 3626\u001b[0m \u001b[39m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[1;32m 3627\u001b[0m \u001b[39m# the TypeError.\u001b[39;00m\n\u001b[1;32m 3628\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_check_indexing_error(key)\n", "\u001b[0;31mKeyError\u001b[0m: '占净值比例'" ] } ], "source": [ "fund_portfolio_hold_em_df = ak.fund_portfolio_hold_em(code=\"000001\", year=\"2023\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import akshare as ak\n", "def get_holding_list(code,year):\n", " fund_portfolio_hold_em_df = ak.fund_portfolio_hold_em(symbol=code, date=year)\n", " return fund_portfolio_hold_em_df[fund_portfolio_hold_em_df['季度']=='2022年4季度股票投资明细']" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "\n", "code='501059'\n", "holding_dict[code] = get_holding_list(code,2022)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "stock_list = holding_dict[code]['股票名称'].tolist()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "holding_dict={}\n", "for code,name in fund_dict.items():\n", " holding_dict[code] = get_holding_list(code,2022)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
序号股票代码股票名称占净值比例持股数持仓市值季度
01600438通威股份6.50140.008380.402022年2季度股票投资明细
12300498温氏股份6.29380.858108.402022年2季度股票投资明细
23000902新洋丰5.44415.007009.352022年2季度股票投资明细
34002714牧原股份5.43126.556994.322022年2季度股票投资明细
45002250联化科技5.08400.006548.002022年2季度股票投资明细
........................
123124001268联合精密0.000.041.132022年2季度股票投资明细
124125301111粤万年青0.000.041.042022年2季度股票投资明细
125126301138华研精机0.000.030.882022年2季度股票投资明细
126127301158德石股份0.000.040.772022年2季度股票投资明细
127128301198喜悦智行0.000.030.772022年2季度股票投资明细
\n", "

128 rows × 7 columns

\n", "
" ], "text/plain": [ " 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", "0 1 600438 通威股份 6.50 140.00 8380.40 2022年2季度股票投资明细\n", "1 2 300498 温氏股份 6.29 380.85 8108.40 2022年2季度股票投资明细\n", "2 3 000902 新洋丰 5.44 415.00 7009.35 2022年2季度股票投资明细\n", "3 4 002714 牧原股份 5.43 126.55 6994.32 2022年2季度股票投资明细\n", "4 5 002250 联化科技 5.08 400.00 6548.00 2022年2季度股票投资明细\n", ".. ... ... ... ... ... ... ...\n", "123 124 001268 联合精密 0.00 0.04 1.13 2022年2季度股票投资明细\n", "124 125 301111 粤万年青 0.00 0.04 1.04 2022年2季度股票投资明细\n", "125 126 301138 华研精机 0.00 0.03 0.88 2022年2季度股票投资明细\n", "126 127 301158 德石股份 0.00 0.04 0.77 2022年2季度股票投资明细\n", "127 128 301198 喜悦智行 0.00 0.03 0.77 2022年2季度股票投资明细\n", "\n", "[128 rows x 7 columns]" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "holding_dict['001579']" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "stock_lists = []\n", "for code,holding in holding_dict.items():\n", " stock_list = holding['股票名称'].tolist()\n", " stock_lists.extend(stock_list)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "519198\n", "000991\n", "001869\n", "001220\n" ] } ], "source": [ "for code,holding in holding_dict.items():\n", " x=holding['股票名称'].tolist()\n", " \n", " if '贵州茅台' not in x:\n", " print(code)\n" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'001667': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600519 贵州茅台 2.73 7.51 12964.59 2022年4季度股票投资明细\n", " 1 2 601166 兴业银行 2.52 680.01 11961.32 2022年4季度股票投资明细\n", " 2 3 002531 天顺风能 2.20 690.00 10439.70 2022年4季度股票投资明细\n", " 3 4 688599 天合光能 2.15 160.00 10201.60 2022年4季度股票投资明细\n", " 4 5 000001 平安银行 2.11 760.00 10001.61 2022年4季度股票投资明细\n", " 5 6 600176 中国巨石 2.02 700.00 9597.01 2022年4季度股票投资明细\n", " 6 7 600660 福耀玻璃 2.00 270.01 9469.18 2022年4季度股票投资明细\n", " 7 8 601877 正泰电器 1.93 330.00 9141.00 2022年4季度股票投资明细\n", " 8 9 600346 恒力石化 1.83 560.01 8696.90 2022年4季度股票投资明细\n", " 9 10 600887 伊利股份 1.83 280.00 8680.00 2022年4季度股票投资明细,\n", " '001832': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 000596 古井贡酒 9.42 131.99 35229.17 2022年4季度股票投资明细\n", " 1 2 000933 神火股份 7.90 1975.90 29559.46 2022年4季度股票投资明细\n", " 2 3 600519 贵州茅台 7.84 16.99 29344.49 2022年4季度股票投资明细\n", " 3 4 601899 紫金矿业 7.23 2705.50 27055.03 2022年4季度股票投资明细\n", " 4 5 600188 兖矿能源 7.17 798.74 26821.74 2022年4季度股票投资明细\n", " 5 6 601699 潞安环能 5.66 1255.95 21162.77 2022年4季度股票投资明细\n", " 6 7 600546 山煤国际 5.47 1412.31 20464.44 2022年4季度股票投资明细\n", " 7 8 000858 五粮液 5.42 112.25 20283.34 2022年4季度股票投资明细\n", " 8 9 600685 中船防务 4.29 773.11 16049.76 2022年4季度股票投资明细\n", " 9 10 000983 山西焦煤 3.74 1201.88 14001.86 2022年4季度股票投资明细,\n", " '001018': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 002180 纳思达 5.62 801.95 41613.09 2022年4季度股票投资明细\n", " 1 2 600519 贵州茅台 5.49 23.55 40675.17 2022年4季度股票投资明细\n", " 2 3 300068 南都电源 4.94 1717.92 36591.78 2022年4季度股票投资明细\n", " 3 4 000858 五粮液 3.92 160.78 29051.95 2022年4季度股票投资明细\n", " 4 5 002594 比亚迪 3.87 111.68 28699.21 2022年4季度股票投资明细\n", " 5 6 600845 宝信软件 3.52 582.29 26086.65 2022年4季度股票投资明细\n", " 6 7 002049 紫光国微 2.71 152.36 20084.40 2022年4季度股票投资明细\n", " 7 8 688066 航天宏图 2.63 228.60 19477.66 2022年4季度股票投资明细\n", " 8 9 002756 永兴材料 2.47 198.87 18329.59 2022年4季度股票投资明细\n", " 9 10 300750 宁德时代 2.37 44.68 17577.22 2022年4季度股票投资明细,\n", " '519002': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600519 贵州茅台 5.83 24.54 42384.38 2022年4季度股票投资明细\n", " 1 2 600027 华电国际 3.38 4178.88 24571.82 2022年4季度股票投资明细\n", " 2 3 600754 锦江酒店 3.14 390.43 22781.59 2022年4季度股票投资明细\n", " 3 4 601816 京沪高铁 2.97 4381.34 21556.19 2022年4季度股票投资明细\n", " 4 5 600559 老白干酒 2.86 755.13 20788.73 2022年4季度股票投资明细\n", " 5 6 600029 南方航空 2.47 2360.01 17936.09 2022年4季度股票投资明细\n", " 6 7 600690 海尔智家 2.25 669.56 16377.35 2022年4季度股票投资明细\n", " 7 8 300026 红日药业 2.21 2828.60 16066.47 2022年4季度股票投资明细\n", " 8 9 600583 海油工程 2.17 2603.20 15775.39 2022年4季度股票投资明细\n", " 9 10 601628 中国人寿 2.17 424.53 15758.55 2022年4季度股票投资明细,\n", " '519198': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 601225 陕西煤业 9.10 504.82 9379.62 2022年4季度股票投资明细\n", " 1 2 600021 上海电力 8.68 893.48 8943.71 2022年4季度股票投资明细\n", " 2 3 601088 中国神华 8.59 320.52 8852.74 2022年4季度股票投资明细\n", " 3 4 601898 中煤能源 8.31 993.48 8563.80 2022年4季度股票投资明细\n", " 4 5 000776 广发证券 7.34 488.23 7562.68 2022年4季度股票投资明细\n", " 5 6 600999 招商证券 6.28 487.15 6479.14 2022年4季度股票投资明细\n", " 6 7 600030 中信证券 5.89 305.20 6076.49 2022年4季度股票投资明细\n", " 7 8 601001 晋控煤业 5.70 491.09 5873.44 2022年4季度股票投资明细\n", " 8 9 600985 淮北矿业 4.94 397.94 5093.63 2022年4季度股票投资明细\n", " 9 10 600905 三峡能源 3.95 721.01 4073.71 2022年4季度股票投资明细,\n", " '450004': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600256 广汇能源 3.00 2194.03 19790.16 2022年4季度股票投资明细\n", " 1 2 300274 阳光电源 2.96 175.00 19565.23 2022年4季度股票投资明细\n", " 2 3 002142 宁波银行 2.89 587.71 19071.19 2022年4季度股票投资明细\n", " 3 4 002050 三花智控 2.83 879.03 18652.99 2022年4季度股票投资明细\n", " 4 5 002648 卫星化学 2.73 1160.77 17991.94 2022年4季度股票投资明细\n", " 5 6 600519 贵州茅台 2.72 10.41 17979.62 2022年4季度股票投资明细\n", " 6 7 601100 恒立液压 2.34 244.30 15427.64 2022年4季度股票投资明细\n", " 7 8 002475 立讯精密 2.31 479.19 15214.25 2022年4季度股票投资明细\n", " 8 9 601658 邮储银行 2.28 3258.53 15054.41 2022年4季度股票投资明细\n", " 9 10 600309 万华化学 2.18 155.33 14391.07 2022年4季度股票投资明细,\n", " '000991': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 601668 中国建筑 9.71 6598.42 35829.41 2022年4季度股票投资明细\n", " 1 2 600048 保利发展 8.00 1951.56 29527.10 2022年4季度股票投资明细\n", " 2 3 601166 兴业银行 7.85 1647.94 28987.28 2022年4季度股票投资明细\n", " 3 4 601009 南京银行 5.74 2034.70 21201.56 2022年4季度股票投资明细\n", " 4 5 001979 招商蛇口 5.23 1529.03 19311.65 2022年4季度股票投资明细\n", " 5 6 601818 光大银行 4.65 5596.75 17182.02 2022年4季度股票投资明细\n", " 6 7 600383 金地集团 4.55 1643.47 16812.70 2022年4季度股票投资明细\n", " 7 8 601838 成都银行 4.17 1007.35 15412.51 2022年4季度股票投资明细\n", " 8 9 600926 杭州银行 4.10 1155.98 15120.22 2022年4季度股票投资明细\n", " 9 10 600919 江苏银行 3.58 1811.77 13207.84 2022年4季度股票投资明细,\n", " '001869': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600438 通威股份 7.75 569.56 21973.64 2022年4季度股票投资明细\n", " 1 2 300496 中科创达 6.09 172.24 17275.93 2022年4季度股票投资明细\n", " 2 3 300122 智飞生物 6.07 196.06 17219.68 2022年4季度股票投资明细\n", " 3 4 000963 华东医药 5.38 326.17 15264.85 2022年4季度股票投资明细\n", " 4 5 600426 华鲁恒升 5.24 448.60 14871.09 2022年4季度股票投资明细\n", " 5 6 002475 立讯精密 4.99 445.72 14151.59 2022年4季度股票投资明细\n", " 6 7 002223 鱼跃医疗 4.19 373.41 11896.87 2022年4季度股票投资明细\n", " 7 8 601888 中国中免 4.08 53.51 11559.53 2022年4季度股票投资明细\n", " 8 9 300450 先导智能 4.07 286.97 11550.59 2022年4季度股票投资明细\n", " 9 10 000733 振华科技 3.86 95.86 10950.60 2022年4季度股票投资明细,\n", " '110015': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600519 贵州茅台 7.30 8.01 13832.06 2022年4季度股票投资明细\n", " 1 2 601012 隆基绿能 7.15 320.87 13559.86 2022年4季度股票投资明细\n", " 2 3 600809 山西汾酒 5.84 38.81 11060.35 2022年4季度股票投资明细\n", " 3 4 000568 泸州老窖 5.34 45.12 10119.24 2022年4季度股票投资明细\n", " 4 5 688639 华恒生物 4.45 54.27 8425.50 2022年4季度股票投资明细\n", " 5 6 002049 紫光国微 4.16 59.85 7889.41 2022年4季度股票投资明细\n", " 6 7 600233 圆通速递 4.10 386.35 7761.78 2022年4季度股票投资明细\n", " 7 8 000858 五粮液 3.75 39.38 7116.35 2022年4季度股票投资明细\n", " 8 9 603806 福斯特 3.36 95.85 6368.41 2022年4季度股票投资明细\n", " 9 10 300628 亿联网络 3.20 100.22 6072.44 2022年4季度股票投资明细,\n", " '001220': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 688363 华熙生物 4.89 37.49 5071.17 2022年4季度股票投资明细\n", " 1 2 300015 爱尔眼科 4.62 154.23 4791.93 2022年4季度股票投资明细\n", " 2 3 300957 贝泰妮 4.58 31.86 4754.79 2022年4季度股票投资明细\n", " 3 4 600763 通策医疗 4.54 30.83 4716.68 2022年4季度股票投资明细\n", " 4 5 300896 爱美客 4.44 8.14 4610.09 2022年4季度股票投资明细\n", " 5 6 600298 安琪酵母 4.30 98.79 4467.28 2022年4季度股票投资明细\n", " 6 7 603288 海天味业 3.81 49.74 3959.44 2022年4季度股票投资明细\n", " 7 8 603345 安井食品 3.81 24.42 3953.11 2022年4季度股票投资明细\n", " 8 9 600887 伊利股份 3.57 119.44 3702.64 2022年4季度股票投资明细\n", " 9 10 603605 珀莱雅 3.38 20.94 3506.53 2022年4季度股票投资明细}" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "holding_dict" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "count_dict ={}\n", "for i in stock_lists:\n", " count_dict.setdefault(i,0)\n", " count_dict[i]+=1" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "holding_ordered = sorted(count_dict.items(),key=lambda x:x[1],reverse=True)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "724" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(stock_lists)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "贵州茅台 6\n", "五粮液 3\n", "兴业银行 2\n", "伊利股份 2\n", "紫光国微 2\n", "立讯精密 2\n" ] } ], "source": [ "for i in holding_ordered:\n", " if i[1]>=2:\n", " print(i[0],i[1])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 排名 板块名称 板块代码 最新价 涨跌额 涨跌幅 总市值 换手率 上涨家数 \\\n", "0 1 通信服务 BK0736 925.33 37.86 4.27 2808561568000 4.29 41 \n", "1 2 互联网服务 BK0447 19736.87 756.98 3.99 1616366112000 5.21 131 \n", "2 3 软件开发 BK0737 849.00 29.68 3.62 2121979408000 5.25 164 \n", "3 4 游戏 BK1046 1047.38 33.53 3.31 340843664000 5.21 30 \n", "4 5 计算机设备 BK0735 984.85 27.21 2.84 920453120000 4.70 38 \n", ".. .. ... ... ... ... ... ... ... ... \n", "81 82 医药商业 BK1042 1170.64 -4.06 -0.35 422802976000 1.19 10 \n", "82 83 医疗器械 BK1041 986.08 -3.78 -0.38 1846142608000 1.21 48 \n", "83 84 生物制品 BK1044 943.65 -4.47 -0.47 1327821648000 0.99 17 \n", "84 85 风电设备 BK1032 1372.86 -7.07 -0.51 397853920000 0.96 6 \n", "85 86 光伏设备 BK1031 2035.92 -33.97 -1.64 2203307024000 1.40 14 \n", "\n", " 下跌家数 领涨股票 领涨股票-涨跌幅 \n", "0 0 中通国脉 10.02 \n", "1 11 金桥信息 10.00 \n", "2 11 网达软件 10.01 \n", "3 0 神州泰岳 9.74 \n", "4 10 苏州科达 9.98 \n", ".. ... ... ... \n", "81 17 柳药集团 3.71 \n", "82 65 康众医疗 10.35 \n", "83 49 英诺特 7.50 \n", "84 14 三一重能 3.44 \n", "85 32 芯能科技 1.43 \n", "\n", "[86 rows x 12 columns]\n" ] } ], "source": [ "import akshare as ak\n", "stock_board_industry_name_em_df = ak.stock_board_industry_name_em()\n", "print(stock_board_industry_name_em_df)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "bk_name = stock_board_industry_name_em_df['板块名称'].tolist()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'通信服务'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bk_name[0]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import akshare as ak\n", "bk_result ={}\n", "for bk in bk_name:\n", " stock_board_industry_cons_em_df = ak.stock_board_industry_cons_em(symbol=bk)\n", " st_name =stock_board_industry_cons_em_df['名称'].tolist()\n", " # st=['']\n", " bk_result[bk]=st_name" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
序号代码名称最新价涨跌幅涨跌额成交量成交额振幅最高最低今开昨收换手率市盈率-动态市净率
01603105芯能科技17.721.430.251387962.432346e+082.5817.7517.3017.5017.472.7841.325.11
12300393中来股份17.181.120.192708844.590574e+082.8317.2016.7216.9916.992.8440.924.93
23002129TCL中环44.121.080.472582741.135493e+091.9544.3843.5343.8643.650.8021.383.94
34835985海泰新能8.941.020.09122331.082701e+072.718.958.718.898.850.9129.372.19
45301046能辉科技40.700.740.30292621.179232e+082.2040.8039.9140.4640.404.96311.928.05
56300029ST天龙8.290.480.04195481.617148e+071.708.338.198.258.250.9735.2232.47
67300317珈伟新能6.250.480.032285601.415638e+081.936.256.136.206.222.9541.432.82
78600207安彩高科6.720.450.03645374.306403e+071.646.736.626.706.690.7553.122.32
89002610爱康科技2.850.350.014314861.225051e+081.412.862.822.852.840.98-35.173.84
910603628清源股份16.750.300.05207643.453946e+071.2616.7516.5416.6716.700.7650.364.29
1011688303大全能源48.070.290.14724103.477293e+080.8648.1747.7647.9547.931.435.372.26
1112603185上机数控111.270.180.20280523.115888e+081.46111.80110.18111.00111.070.6912.114.50
1213002617露笑科技8.920.110.012055561.829574e+080.678.938.878.928.911.27-217.242.80
1314688516奥特维196.100.100.2064251.248727e+082.14196.78192.59195.99195.900.8543.4011.88
1415600151航天机电10.000.000.00782117.790840e+071.1010.029.919.9510.000.55-1160.062.68
1516002506协鑫集成3.170.000.004278411.349946e+081.263.183.143.153.170.73-137.448.63
1617600438通威股份41.88-0.05-0.024259091.783328e+091.4142.2441.6541.9541.900.956.513.44
1718601012隆基绿能44.14-0.23-0.104818042.126099e+091.2744.4443.8844.2444.240.6422.875.80
1819002218拓日新能6.04-0.49-0.034471112.680567e+081.656.055.956.056.073.2260.242.00
1920301278快可电子97.36-0.66-0.6560035.817504e+071.8998.0596.2098.0198.013.7553.566.39
2021600537亿晶光电8.49-1.05-0.092330971.982891e+081.758.608.458.548.581.98158.254.24
2122603396金辰股份79.45-1.13-0.91163731.299424e+082.0980.7879.1079.9880.361.41125.916.38
2223002623亚玛顿35.39-1.15-0.41841352.955642e+083.4435.9334.7035.9135.804.2489.292.15
2324688560明冠新材37.43-1.19-0.45962273.609724e+082.8038.1037.0437.3937.8810.6572.782.40
2425300842帝科股份47.61-1.31-0.63176988.423682e+072.4348.3647.1948.2048.242.55252.365.01
2526002309ST中利5.08-1.36-0.071285716.517071e+072.145.125.015.125.151.72-16.762.88
2627300316晶盛机电67.62-1.43-0.98519213.507813e+082.5168.7867.0668.6868.600.4233.049.01
2728301168通灵股份66.55-1.70-1.15167471.118620e+084.8669.1965.9068.0067.703.3763.494.15
2829603806福斯特67.50-1.73-1.19644274.333333e+082.9468.7066.6868.6968.690.4843.966.73
2930688599天合光能60.61-1.77-1.091121116.814908e+082.6961.8860.2261.8061.700.8435.495.00
3031603212赛伍技术28.34-1.77-0.511185633.348826e+082.5628.7428.0028.7428.854.0540.964.16
3132688556高测股份72.15-2.37-1.75327152.371296e+082.9674.0071.8173.7073.901.9320.857.96
3233300763锦浪科技155.00-2.38-3.78369215.755402e+082.18158.30154.84158.30158.781.2365.569.05
3334300827上能电气67.97-2.50-1.74620644.209149e+084.7970.3066.9669.8069.715.76266.7417.51
3435688348昱能科技445.58-2.61-11.92107384.803970e+083.57458.00441.66457.50457.505.41103.099.67
3536688598金博股份209.81-2.98-6.45113982.401117e+082.88215.10208.88215.03216.261.4435.813.30
3637600732爱旭股份35.44-3.14-1.152758049.739928e+083.1436.2535.1036.2536.592.9924.905.67
3738688408中信博102.64-3.17-3.36250732.579798e+085.58107.10101.18106.20106.003.43318.405.58
3839688223晶科能源15.04-3.28-0.516971621.060185e+094.0515.6415.0115.6015.553.5651.035.63
3940300274阳光电源115.40-3.51-4.202257692.606848e+094.70119.80114.18119.09119.602.0062.3810.03
4041002459晶澳科技58.85-3.71-2.271969031.162909e+094.4361.2158.5061.1561.120.8431.605.51
4142002865钧达股份181.85-4.33-8.24580201.061024e+094.80189.20180.08189.14190.094.2047.0436.25
4243688680海优新材193.00-4.46-9.00149072.891351e+083.42199.01192.10199.00202.002.86324.916.54
4344300118东方日升29.94-4.65-1.464387911.322037e+094.6231.2629.8131.1531.406.3434.252.41
4445688390固德威367.38-5.43-21.11203057.526198e+084.89385.00366.00384.12388.492.5169.3920.02
4546001269欧晶科技112.60-5.81-6.95706017.841430e+0810.70120.39107.60119.11119.5520.5575.0614.63
4647688032禾迈股份796.01-6.46-54.9997417.950700e+086.87852.50794.00843.50851.003.4983.766.96
4748834770艾能聚7.98-9.11-0.801591131.295688e+087.638.537.868.308.7825.7416.421.96
\n", "
" ], "text/plain": [ " 序号 代码 名称 最新价 涨跌幅 涨跌额 成交量 成交额 振幅 \\\n", "0 1 603105 芯能科技 17.72 1.43 0.25 138796 2.432346e+08 2.58 \n", "1 2 300393 中来股份 17.18 1.12 0.19 270884 4.590574e+08 2.83 \n", "2 3 002129 TCL中环 44.12 1.08 0.47 258274 1.135493e+09 1.95 \n", "3 4 835985 海泰新能 8.94 1.02 0.09 12233 1.082701e+07 2.71 \n", "4 5 301046 能辉科技 40.70 0.74 0.30 29262 1.179232e+08 2.20 \n", "5 6 300029 ST天龙 8.29 0.48 0.04 19548 1.617148e+07 1.70 \n", "6 7 300317 珈伟新能 6.25 0.48 0.03 228560 1.415638e+08 1.93 \n", "7 8 600207 安彩高科 6.72 0.45 0.03 64537 4.306403e+07 1.64 \n", "8 9 002610 爱康科技 2.85 0.35 0.01 431486 1.225051e+08 1.41 \n", "9 10 603628 清源股份 16.75 0.30 0.05 20764 3.453946e+07 1.26 \n", "10 11 688303 大全能源 48.07 0.29 0.14 72410 3.477293e+08 0.86 \n", "11 12 603185 上机数控 111.27 0.18 0.20 28052 3.115888e+08 1.46 \n", "12 13 002617 露笑科技 8.92 0.11 0.01 205556 1.829574e+08 0.67 \n", "13 14 688516 奥特维 196.10 0.10 0.20 6425 1.248727e+08 2.14 \n", "14 15 600151 航天机电 10.00 0.00 0.00 78211 7.790840e+07 1.10 \n", "15 16 002506 协鑫集成 3.17 0.00 0.00 427841 1.349946e+08 1.26 \n", "16 17 600438 通威股份 41.88 -0.05 -0.02 425909 1.783328e+09 1.41 \n", "17 18 601012 隆基绿能 44.14 -0.23 -0.10 481804 2.126099e+09 1.27 \n", "18 19 002218 拓日新能 6.04 -0.49 -0.03 447111 2.680567e+08 1.65 \n", "19 20 301278 快可电子 97.36 -0.66 -0.65 6003 5.817504e+07 1.89 \n", "20 21 600537 亿晶光电 8.49 -1.05 -0.09 233097 1.982891e+08 1.75 \n", "21 22 603396 金辰股份 79.45 -1.13 -0.91 16373 1.299424e+08 2.09 \n", "22 23 002623 亚玛顿 35.39 -1.15 -0.41 84135 2.955642e+08 3.44 \n", "23 24 688560 明冠新材 37.43 -1.19 -0.45 96227 3.609724e+08 2.80 \n", "24 25 300842 帝科股份 47.61 -1.31 -0.63 17698 8.423682e+07 2.43 \n", "25 26 002309 ST中利 5.08 -1.36 -0.07 128571 6.517071e+07 2.14 \n", "26 27 300316 晶盛机电 67.62 -1.43 -0.98 51921 3.507813e+08 2.51 \n", "27 28 301168 通灵股份 66.55 -1.70 -1.15 16747 1.118620e+08 4.86 \n", "28 29 603806 福斯特 67.50 -1.73 -1.19 64427 4.333333e+08 2.94 \n", "29 30 688599 天合光能 60.61 -1.77 -1.09 112111 6.814908e+08 2.69 \n", "30 31 603212 赛伍技术 28.34 -1.77 -0.51 118563 3.348826e+08 2.56 \n", "31 32 688556 高测股份 72.15 -2.37 -1.75 32715 2.371296e+08 2.96 \n", "32 33 300763 锦浪科技 155.00 -2.38 -3.78 36921 5.755402e+08 2.18 \n", "33 34 300827 上能电气 67.97 -2.50 -1.74 62064 4.209149e+08 4.79 \n", "34 35 688348 昱能科技 445.58 -2.61 -11.92 10738 4.803970e+08 3.57 \n", "35 36 688598 金博股份 209.81 -2.98 -6.45 11398 2.401117e+08 2.88 \n", "36 37 600732 爱旭股份 35.44 -3.14 -1.15 275804 9.739928e+08 3.14 \n", "37 38 688408 中信博 102.64 -3.17 -3.36 25073 2.579798e+08 5.58 \n", "38 39 688223 晶科能源 15.04 -3.28 -0.51 697162 1.060185e+09 4.05 \n", "39 40 300274 阳光电源 115.40 -3.51 -4.20 225769 2.606848e+09 4.70 \n", "40 41 002459 晶澳科技 58.85 -3.71 -2.27 196903 1.162909e+09 4.43 \n", "41 42 002865 钧达股份 181.85 -4.33 -8.24 58020 1.061024e+09 4.80 \n", "42 43 688680 海优新材 193.00 -4.46 -9.00 14907 2.891351e+08 3.42 \n", "43 44 300118 东方日升 29.94 -4.65 -1.46 438791 1.322037e+09 4.62 \n", "44 45 688390 固德威 367.38 -5.43 -21.11 20305 7.526198e+08 4.89 \n", "45 46 001269 欧晶科技 112.60 -5.81 -6.95 70601 7.841430e+08 10.70 \n", "46 47 688032 禾迈股份 796.01 -6.46 -54.99 9741 7.950700e+08 6.87 \n", "47 48 834770 艾能聚 7.98 -9.11 -0.80 159113 1.295688e+08 7.63 \n", "\n", " 最高 最低 今开 昨收 换手率 市盈率-动态 市净率 \n", "0 17.75 17.30 17.50 17.47 2.78 41.32 5.11 \n", "1 17.20 16.72 16.99 16.99 2.84 40.92 4.93 \n", "2 44.38 43.53 43.86 43.65 0.80 21.38 3.94 \n", "3 8.95 8.71 8.89 8.85 0.91 29.37 2.19 \n", "4 40.80 39.91 40.46 40.40 4.96 311.92 8.05 \n", "5 8.33 8.19 8.25 8.25 0.97 35.22 32.47 \n", "6 6.25 6.13 6.20 6.22 2.95 41.43 2.82 \n", "7 6.73 6.62 6.70 6.69 0.75 53.12 2.32 \n", "8 2.86 2.82 2.85 2.84 0.98 -35.17 3.84 \n", "9 16.75 16.54 16.67 16.70 0.76 50.36 4.29 \n", "10 48.17 47.76 47.95 47.93 1.43 5.37 2.26 \n", "11 111.80 110.18 111.00 111.07 0.69 12.11 4.50 \n", "12 8.93 8.87 8.92 8.91 1.27 -217.24 2.80 \n", "13 196.78 192.59 195.99 195.90 0.85 43.40 11.88 \n", "14 10.02 9.91 9.95 10.00 0.55 -1160.06 2.68 \n", "15 3.18 3.14 3.15 3.17 0.73 -137.44 8.63 \n", "16 42.24 41.65 41.95 41.90 0.95 6.51 3.44 \n", "17 44.44 43.88 44.24 44.24 0.64 22.87 5.80 \n", "18 6.05 5.95 6.05 6.07 3.22 60.24 2.00 \n", "19 98.05 96.20 98.01 98.01 3.75 53.56 6.39 \n", "20 8.60 8.45 8.54 8.58 1.98 158.25 4.24 \n", "21 80.78 79.10 79.98 80.36 1.41 125.91 6.38 \n", "22 35.93 34.70 35.91 35.80 4.24 89.29 2.15 \n", "23 38.10 37.04 37.39 37.88 10.65 72.78 2.40 \n", "24 48.36 47.19 48.20 48.24 2.55 252.36 5.01 \n", "25 5.12 5.01 5.12 5.15 1.72 -16.76 2.88 \n", "26 68.78 67.06 68.68 68.60 0.42 33.04 9.01 \n", "27 69.19 65.90 68.00 67.70 3.37 63.49 4.15 \n", "28 68.70 66.68 68.69 68.69 0.48 43.96 6.73 \n", "29 61.88 60.22 61.80 61.70 0.84 35.49 5.00 \n", "30 28.74 28.00 28.74 28.85 4.05 40.96 4.16 \n", "31 74.00 71.81 73.70 73.90 1.93 20.85 7.96 \n", "32 158.30 154.84 158.30 158.78 1.23 65.56 9.05 \n", "33 70.30 66.96 69.80 69.71 5.76 266.74 17.51 \n", "34 458.00 441.66 457.50 457.50 5.41 103.09 9.67 \n", "35 215.10 208.88 215.03 216.26 1.44 35.81 3.30 \n", "36 36.25 35.10 36.25 36.59 2.99 24.90 5.67 \n", "37 107.10 101.18 106.20 106.00 3.43 318.40 5.58 \n", "38 15.64 15.01 15.60 15.55 3.56 51.03 5.63 \n", "39 119.80 114.18 119.09 119.60 2.00 62.38 10.03 \n", "40 61.21 58.50 61.15 61.12 0.84 31.60 5.51 \n", "41 189.20 180.08 189.14 190.09 4.20 47.04 36.25 \n", "42 199.01 192.10 199.00 202.00 2.86 324.91 6.54 \n", "43 31.26 29.81 31.15 31.40 6.34 34.25 2.41 \n", "44 385.00 366.00 384.12 388.49 2.51 69.39 20.02 \n", "45 120.39 107.60 119.11 119.55 20.55 75.06 14.63 \n", "46 852.50 794.00 843.50 851.00 3.49 83.76 6.96 \n", "47 8.53 7.86 8.30 8.78 25.74 16.42 1.96 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stock_board_industry_cons_em_df" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "belongs={}\n", "for i in holding_ordered:\n", " for k,v in bk_result.items():\n", " if i[0] in v:\n", " belongs[i[0]]=k\n", " break\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'贵州茅台': '酿酒行业',\n", " '兴业银行': '银行',\n", " '伊利股份': '食品饮料',\n", " '紫光国微': '半导体',\n", " '立讯精密': '消费电子',\n", " '天顺风能': '风电设备',\n", " '天合光能': '光伏设备',\n", " '平安银行': '银行',\n", " '中国巨石': '玻璃玻纤',\n", " '福耀玻璃': '玻璃玻纤',\n", " '正泰电器': '电网设备',\n", " '恒力石化': '化纤行业',\n", " '古井贡酒': '酿酒行业',\n", " '神火股份': '有色金属',\n", " '紫金矿业': '贵金属',\n", " '兖矿能源': '煤炭行业',\n", " '潞安环能': '煤炭行业',\n", " '山煤国际': '煤炭行业',\n", " '中船防务': '船舶制造',\n", " '山西焦煤': '煤炭行业',\n", " '纳思达': '计算机设备',\n", " '南都电源': '电池',\n", " '比亚迪': '汽车整车',\n", " '宝信软件': '互联网服务',\n", " '航天宏图': '互联网服务',\n", " '永兴材料': '钢铁行业',\n", " '宁德时代': '电池',\n", " '华电国际': '电力行业',\n", " '锦江酒店': '旅游酒店',\n", " '京沪高铁': '物流行业',\n", " '老白干酒': '酿酒行业',\n", " '南方航空': '航空机场',\n", " '海尔智家': '家电行业',\n", " '红日药业': '中药',\n", " '海油工程': '采掘行业',\n", " '中国人寿': '保险',\n", " '陕西煤业': '煤炭行业',\n", " '上海电力': '电力行业',\n", " '中国神华': '煤炭行业',\n", " '中煤能源': '煤炭行业',\n", " '广发证券': '证券',\n", " '招商证券': '证券',\n", " '中信证券': '证券',\n", " '晋控煤业': '煤炭行业',\n", " '淮北矿业': '煤炭行业',\n", " '三峡能源': '电力行业',\n", " '广汇能源': '石油行业',\n", " '阳光电源': '光伏设备',\n", " '宁波银行': '银行',\n", " '三花智控': '家电行业',\n", " '卫星化学': '化学原料',\n", " '恒立液压': '工程机械',\n", " '邮储银行': '银行',\n", " '万华化学': '化学制品',\n", " '中国建筑': '工程建设',\n", " '保利发展': '房地产开发',\n", " '南京银行': '银行',\n", " '招商蛇口': '房地产开发',\n", " '光大银行': '银行',\n", " '金地集团': '房地产开发',\n", " '成都银行': '银行',\n", " '杭州银行': '银行',\n", " '江苏银行': '银行',\n", " '通威股份': '光伏设备',\n", " '中科创达': '互联网服务',\n", " '智飞生物': '生物制品',\n", " '华东医药': '化学制药',\n", " '华鲁恒升': '化学原料',\n", " '鱼跃医疗': '医疗器械',\n", " '中国中免': '旅游酒店',\n", " '先导智能': '电池',\n", " '振华科技': '电子元件',\n", " '隆基绿能': '光伏设备',\n", " '山西汾酒': '酿酒行业',\n", " '泸州老窖': '酿酒行业',\n", " '华恒生物': '化学制品',\n", " '圆通速递': '物流行业',\n", " '福斯特': '光伏设备',\n", " '亿联网络': '通信设备',\n", " '华熙生物': '美容护理',\n", " '爱尔眼科': '医疗服务',\n", " '贝泰妮': '美容护理',\n", " '通策医疗': '医疗服务',\n", " '爱美客': '美容护理',\n", " '安琪酵母': '食品饮料',\n", " '海天味业': '食品饮料',\n", " '安井食品': '食品饮料',\n", " '珀莱雅': '美容护理'}" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "belongs" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "result_={}\n", "result__={}\n", "for k,v in belongs.items():\n", " result_.setdefault(v,0)\n", " result_[v]+=1\n", " if v not in result__:\n", " result__[v]=[]\n", " result__[v].append(k)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "酿酒行业 ['贵州茅台', '古井贡酒', '老白干酒', '山西汾酒', '泸州老窖']\n", "银行 ['兴业银行', '平安银行', '宁波银行', '邮储银行', '南京银行', '光大银行', '成都银行', '杭州银行', '江苏银行']\n", "食品饮料 ['伊利股份', '安琪酵母', '海天味业', '安井食品']\n", "光伏设备 ['天合光能', '阳光电源', '通威股份', '隆基绿能', '福斯特']\n", "煤炭行业 ['兖矿能源', '潞安环能', '山煤国际', '山西焦煤', '陕西煤业', '中国神华', '中煤能源', '晋控煤业', '淮北矿业']\n", "美容护理 ['华熙生物', '贝泰妮', '爱美客', '珀莱雅']\n" ] } ], "source": [ "for name,item in result__.items():\n", " if len(item)>3:\n", " print(name,item)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "\n", "industry_dict={}\n", "for code,df in holding_dict.items():\n", " h_list = df['股票名称'].tolist()\n", " for i in h_list:\n", " industry = belongs.get(i)\n", " industry_dict.setdefault(industry,0)\n", " industry_dict[industry]+=1" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'酿酒行业': 10,\n", " '银行': 10,\n", " '风电设备': 1,\n", " '光伏设备': 5,\n", " '玻璃玻纤': 2,\n", " '电网设备': 1,\n", " '化纤行业': 1,\n", " '食品饮料': 5,\n", " '有色金属': 1,\n", " '贵金属': 1,\n", " '煤炭行业': 9,\n", " None: 3,\n", " '船舶制造': 1,\n", " '计算机设备': 1,\n", " '电池': 3,\n", " '汽车整车': 1,\n", " '互联网服务': 3,\n", " '半导体': 2,\n", " '钢铁行业': 1,\n", " '电力行业': 3,\n", " '旅游酒店': 2,\n", " '物流行业': 2,\n", " '航空机场': 1,\n", " '家电行业': 2,\n", " '中药': 1,\n", " '采掘行业': 1,\n", " '保险': 1,\n", " '证券': 3,\n", " '石油行业': 1,\n", " '化学原料': 2,\n", " '工程机械': 1,\n", " '消费电子': 2,\n", " '化学制品': 2,\n", " '工程建设': 1,\n", " '房地产开发': 3,\n", " '生物制品': 1,\n", " '化学制药': 1,\n", " '医疗器械': 1,\n", " '电子元件': 1,\n", " '通信设备': 1,\n", " '美容护理': 4,\n", " '医疗服务': 2}" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "industry_dict" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "酿酒行业 10\n", "银行 10\n", "煤炭行业 9\n", "光伏设备 5\n", "食品饮料 5\n", "美容护理 4\n", "None 3\n", "电池 3\n", "互联网服务 3\n", "电力行业 3\n", "证券 3\n", "房地产开发 3\n", "玻璃玻纤 2\n", "半导体 2\n", "旅游酒店 2\n", "物流行业 2\n", "家电行业 2\n", "化学原料 2\n", "消费电子 2\n", "化学制品 2\n", "医疗服务 2\n", "风电设备 1\n", "电网设备 1\n", "化纤行业 1\n", "有色金属 1\n", "贵金属 1\n", "船舶制造 1\n", "计算机设备 1\n", "汽车整车 1\n", "钢铁行业 1\n", "航空机场 1\n", "中药 1\n", "采掘行业 1\n", "保险 1\n", "石油行业 1\n", "工程机械 1\n", "工程建设 1\n", "生物制品 1\n", "化学制药 1\n", "医疗器械 1\n", "电子元件 1\n", "通信设备 1\n" ] } ], "source": [ "ret = list(sorted(industry_dict.items(),key=lambda x:x[1],reverse=True))\n", "for name,count in ret:\n", " print(name,count)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'酿酒行业': ['贵州茅台', '古井贡酒', '老白干酒', '山西汾酒', '泸州老窖'],\n", " '银行': ['兴业银行',\n", " '平安银行',\n", " '宁波银行',\n", " '邮储银行',\n", " '南京银行',\n", " '光大银行',\n", " '成都银行',\n", " '杭州银行',\n", " '江苏银行'],\n", " '食品饮料': ['伊利股份', '安琪酵母', '海天味业', '安井食品'],\n", " '半导体': ['紫光国微'],\n", " '消费电子': ['立讯精密'],\n", " '风电设备': ['天顺风能'],\n", " '光伏设备': ['天合光能', '阳光电源', '通威股份', '隆基绿能', '福斯特'],\n", " '玻璃玻纤': ['中国巨石', '福耀玻璃'],\n", " '电网设备': ['正泰电器'],\n", " '化纤行业': ['恒力石化'],\n", " '有色金属': ['神火股份'],\n", " '贵金属': ['紫金矿业'],\n", " '煤炭行业': ['兖矿能源',\n", " '潞安环能',\n", " '山煤国际',\n", " '山西焦煤',\n", " '陕西煤业',\n", " '中国神华',\n", " '中煤能源',\n", " '晋控煤业',\n", " '淮北矿业'],\n", " '船舶制造': ['中船防务'],\n", " '计算机设备': ['纳思达'],\n", " '电池': ['南都电源', '宁德时代', '先导智能'],\n", " '汽车整车': ['比亚迪'],\n", " '互联网服务': ['宝信软件', '航天宏图', '中科创达'],\n", " '钢铁行业': ['永兴材料'],\n", " '电力行业': ['华电国际', '上海电力', '三峡能源'],\n", " '旅游酒店': ['锦江酒店', '中国中免'],\n", " '物流行业': ['京沪高铁', '圆通速递'],\n", " '航空机场': ['南方航空'],\n", " '家电行业': ['海尔智家', '三花智控'],\n", " '中药': ['红日药业'],\n", " '采掘行业': ['海油工程'],\n", " '保险': ['中国人寿'],\n", " '证券': ['广发证券', '招商证券', '中信证券'],\n", " '石油行业': ['广汇能源'],\n", " '化学原料': ['卫星化学', '华鲁恒升'],\n", " '工程机械': ['恒立液压'],\n", " '化学制品': ['万华化学', '华恒生物'],\n", " '工程建设': ['中国建筑'],\n", " '房地产开发': ['保利发展', '招商蛇口', '金地集团'],\n", " '生物制品': ['智飞生物'],\n", " '化学制药': ['华东医药'],\n", " '医疗器械': ['鱼跃医疗'],\n", " '电子元件': ['振华科技'],\n", " '通信设备': ['亿联网络'],\n", " '美容护理': ['华熙生物', '贝泰妮', '爱美客', '珀莱雅'],\n", " '医疗服务': ['爱尔眼科', '通策医疗']}" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'酿酒行业': 5,\n", " '银行': 9,\n", " '食品饮料': 4,\n", " '半导体': 1,\n", " '消费电子': 1,\n", " '风电设备': 1,\n", " '光伏设备': 5,\n", " '玻璃玻纤': 2,\n", " '电网设备': 1,\n", " '化纤行业': 1,\n", " '有色金属': 1,\n", " '贵金属': 1,\n", " '煤炭行业': 9,\n", " '船舶制造': 1,\n", " '计算机设备': 1,\n", " '电池': 3,\n", " '汽车整车': 1,\n", " '互联网服务': 3,\n", " '钢铁行业': 1,\n", " '电力行业': 3,\n", " '旅游酒店': 2,\n", " '物流行业': 2,\n", " '航空机场': 1,\n", " '家电行业': 2,\n", " '中药': 1,\n", " '采掘行业': 1,\n", " '保险': 1,\n", " '证券': 3,\n", " '石油行业': 1,\n", " '化学原料': 2,\n", " '工程机械': 1,\n", " '化学制品': 2,\n", " '工程建设': 1,\n", " '房地产开发': 3,\n", " '生物制品': 1,\n", " '化学制药': 1,\n", " '医疗器械': 1,\n", " '电子元件': 1,\n", " '通信设备': 1,\n", " '美容护理': 4,\n", " '医疗服务': 2}" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "result_industry = sorted(result_.items(),key=lambda x:x[1],reverse=True)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "银行 9\n", "['兴业银行', '平安银行', '宁波银行', '邮储银行', '南京银行', '光大银行', '成都银行', '杭州银行', '江苏银行']\n", "煤炭行业 9\n", "['兖矿能源', '潞安环能', '山煤国际', '山西焦煤', '陕西煤业', '中国神华', '中煤能源', '晋控煤业', '淮北矿业']\n", "酿酒行业 5\n", "['贵州茅台', '古井贡酒', '老白干酒', '山西汾酒', '泸州老窖']\n", "光伏设备 5\n", "['天合光能', '阳光电源', '通威股份', '隆基绿能', '福斯特']\n", "食品饮料 4\n", "['伊利股份', '安琪酵母', '海天味业', '安井食品']\n", "美容护理 4\n", "['华熙生物', '贝泰妮', '爱美客', '珀莱雅']\n", "电池 3\n", "['南都电源', '宁德时代', '先导智能']\n", "互联网服务 3\n", "['宝信软件', '航天宏图', '中科创达']\n", "电力行业 3\n", "['华电国际', '上海电力', '三峡能源']\n", "证券 3\n", "['广发证券', '招商证券', '中信证券']\n", "房地产开发 3\n", "['保利发展', '招商蛇口', '金地集团']\n", "玻璃玻纤 2\n", "['中国巨石', '福耀玻璃']\n", "旅游酒店 2\n", "['锦江酒店', '中国中免']\n", "物流行业 2\n", "['京沪高铁', '圆通速递']\n", "家电行业 2\n", "['海尔智家', '三花智控']\n", "化学原料 2\n", "['卫星化学', '华鲁恒升']\n", "化学制品 2\n", "['万华化学', '华恒生物']\n", "医疗服务 2\n", "['爱尔眼科', '通策医疗']\n", "半导体 1\n", "['紫光国微']\n", "消费电子 1\n", "['立讯精密']\n", "风电设备 1\n", "['天顺风能']\n", "电网设备 1\n", "['正泰电器']\n", "化纤行业 1\n", "['恒力石化']\n", "有色金属 1\n", "['神火股份']\n", "贵金属 1\n", "['紫金矿业']\n", "船舶制造 1\n", "['中船防务']\n", "计算机设备 1\n", "['纳思达']\n", "汽车整车 1\n", "['比亚迪']\n", "钢铁行业 1\n", "['永兴材料']\n", "航空机场 1\n", "['南方航空']\n", "中药 1\n", "['红日药业']\n", "采掘行业 1\n", "['海油工程']\n", "保险 1\n", "['中国人寿']\n", "石油行业 1\n", "['广汇能源']\n", "工程机械 1\n", "['恒立液压']\n", "工程建设 1\n", "['中国建筑']\n", "生物制品 1\n", "['智飞生物']\n", "化学制药 1\n", "['华东医药']\n", "医疗器械 1\n", "['鱼跃医疗']\n", "电子元件 1\n", "['振华科技']\n", "通信设备 1\n", "['亿联网络']\n" ] } ], "source": [ "for i in result_industry:\n", " print(i[0],i[1])\n", " print(result__[i[0]])" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(holding_dict)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(holding_dict)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'001667': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600519 贵州茅台 2.73 7.51 12964.59 2022年4季度股票投资明细\n", " 1 2 601166 兴业银行 2.52 680.01 11961.32 2022年4季度股票投资明细\n", " 2 3 002531 天顺风能 2.20 690.00 10439.70 2022年4季度股票投资明细\n", " 3 4 688599 天合光能 2.15 160.00 10201.60 2022年4季度股票投资明细\n", " 4 5 000001 平安银行 2.11 760.00 10001.61 2022年4季度股票投资明细\n", " 5 6 600176 中国巨石 2.02 700.00 9597.01 2022年4季度股票投资明细\n", " 6 7 600660 福耀玻璃 2.00 270.01 9469.18 2022年4季度股票投资明细\n", " 7 8 601877 正泰电器 1.93 330.00 9141.00 2022年4季度股票投资明细\n", " 8 9 600346 恒力石化 1.83 560.01 8696.90 2022年4季度股票投资明细\n", " 9 10 600887 伊利股份 1.83 280.00 8680.00 2022年4季度股票投资明细,\n", " '001832': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 000596 古井贡酒 9.42 131.99 35229.17 2022年4季度股票投资明细\n", " 1 2 000933 神火股份 7.90 1975.90 29559.46 2022年4季度股票投资明细\n", " 2 3 600519 贵州茅台 7.84 16.99 29344.49 2022年4季度股票投资明细\n", " 3 4 601899 紫金矿业 7.23 2705.50 27055.03 2022年4季度股票投资明细\n", " 4 5 600188 兖矿能源 7.17 798.74 26821.74 2022年4季度股票投资明细\n", " 5 6 601699 潞安环能 5.66 1255.95 21162.77 2022年4季度股票投资明细\n", " 6 7 600546 山煤国际 5.47 1412.31 20464.44 2022年4季度股票投资明细\n", " 7 8 000858 五粮液 5.42 112.25 20283.34 2022年4季度股票投资明细\n", " 8 9 600685 中船防务 4.29 773.11 16049.76 2022年4季度股票投资明细\n", " 9 10 000983 山西焦煤 3.74 1201.88 14001.86 2022年4季度股票投资明细,\n", " '001018': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 002180 纳思达 5.62 801.95 41613.09 2022年4季度股票投资明细\n", " 1 2 600519 贵州茅台 5.49 23.55 40675.17 2022年4季度股票投资明细\n", " 2 3 300068 南都电源 4.94 1717.92 36591.78 2022年4季度股票投资明细\n", " 3 4 000858 五粮液 3.92 160.78 29051.95 2022年4季度股票投资明细\n", " 4 5 002594 比亚迪 3.87 111.68 28699.21 2022年4季度股票投资明细\n", " 5 6 600845 宝信软件 3.52 582.29 26086.65 2022年4季度股票投资明细\n", " 6 7 002049 紫光国微 2.71 152.36 20084.40 2022年4季度股票投资明细\n", " 7 8 688066 航天宏图 2.63 228.60 19477.66 2022年4季度股票投资明细\n", " 8 9 002756 永兴材料 2.47 198.87 18329.59 2022年4季度股票投资明细\n", " 9 10 300750 宁德时代 2.37 44.68 17577.22 2022年4季度股票投资明细,\n", " '519002': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600519 贵州茅台 5.83 24.54 42384.38 2022年4季度股票投资明细\n", " 1 2 600027 华电国际 3.38 4178.88 24571.82 2022年4季度股票投资明细\n", " 2 3 600754 锦江酒店 3.14 390.43 22781.59 2022年4季度股票投资明细\n", " 3 4 601816 京沪高铁 2.97 4381.34 21556.19 2022年4季度股票投资明细\n", " 4 5 600559 老白干酒 2.86 755.13 20788.73 2022年4季度股票投资明细\n", " 5 6 600029 南方航空 2.47 2360.01 17936.09 2022年4季度股票投资明细\n", " 6 7 600690 海尔智家 2.25 669.56 16377.35 2022年4季度股票投资明细\n", " 7 8 300026 红日药业 2.21 2828.60 16066.47 2022年4季度股票投资明细\n", " 8 9 600583 海油工程 2.17 2603.20 15775.39 2022年4季度股票投资明细\n", " 9 10 601628 中国人寿 2.17 424.53 15758.55 2022年4季度股票投资明细,\n", " '519198': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 601225 陕西煤业 9.10 504.82 9379.62 2022年4季度股票投资明细\n", " 1 2 600021 上海电力 8.68 893.48 8943.71 2022年4季度股票投资明细\n", " 2 3 601088 中国神华 8.59 320.52 8852.74 2022年4季度股票投资明细\n", " 3 4 601898 中煤能源 8.31 993.48 8563.80 2022年4季度股票投资明细\n", " 4 5 000776 广发证券 7.34 488.23 7562.68 2022年4季度股票投资明细\n", " 5 6 600999 招商证券 6.28 487.15 6479.14 2022年4季度股票投资明细\n", " 6 7 600030 中信证券 5.89 305.20 6076.49 2022年4季度股票投资明细\n", " 7 8 601001 晋控煤业 5.70 491.09 5873.44 2022年4季度股票投资明细\n", " 8 9 600985 淮北矿业 4.94 397.94 5093.63 2022年4季度股票投资明细\n", " 9 10 600905 三峡能源 3.95 721.01 4073.71 2022年4季度股票投资明细,\n", " '450004': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600256 广汇能源 3.00 2194.03 19790.16 2022年4季度股票投资明细\n", " 1 2 300274 阳光电源 2.96 175.00 19565.23 2022年4季度股票投资明细\n", " 2 3 002142 宁波银行 2.89 587.71 19071.19 2022年4季度股票投资明细\n", " 3 4 002050 三花智控 2.83 879.03 18652.99 2022年4季度股票投资明细\n", " 4 5 002648 卫星化学 2.73 1160.77 17991.94 2022年4季度股票投资明细\n", " 5 6 600519 贵州茅台 2.72 10.41 17979.62 2022年4季度股票投资明细\n", " 6 7 601100 恒立液压 2.34 244.30 15427.64 2022年4季度股票投资明细\n", " 7 8 002475 立讯精密 2.31 479.19 15214.25 2022年4季度股票投资明细\n", " 8 9 601658 邮储银行 2.28 3258.53 15054.41 2022年4季度股票投资明细\n", " 9 10 600309 万华化学 2.18 155.33 14391.07 2022年4季度股票投资明细,\n", " '000991': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 601668 中国建筑 9.71 6598.42 35829.41 2022年4季度股票投资明细\n", " 1 2 600048 保利发展 8.00 1951.56 29527.10 2022年4季度股票投资明细\n", " 2 3 601166 兴业银行 7.85 1647.94 28987.28 2022年4季度股票投资明细\n", " 3 4 601009 南京银行 5.74 2034.70 21201.56 2022年4季度股票投资明细\n", " 4 5 001979 招商蛇口 5.23 1529.03 19311.65 2022年4季度股票投资明细\n", " 5 6 601818 光大银行 4.65 5596.75 17182.02 2022年4季度股票投资明细\n", " 6 7 600383 金地集团 4.55 1643.47 16812.70 2022年4季度股票投资明细\n", " 7 8 601838 成都银行 4.17 1007.35 15412.51 2022年4季度股票投资明细\n", " 8 9 600926 杭州银行 4.10 1155.98 15120.22 2022年4季度股票投资明细\n", " 9 10 600919 江苏银行 3.58 1811.77 13207.84 2022年4季度股票投资明细,\n", " '001869': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600438 通威股份 7.75 569.56 21973.64 2022年4季度股票投资明细\n", " 1 2 300496 中科创达 6.09 172.24 17275.93 2022年4季度股票投资明细\n", " 2 3 300122 智飞生物 6.07 196.06 17219.68 2022年4季度股票投资明细\n", " 3 4 000963 华东医药 5.38 326.17 15264.85 2022年4季度股票投资明细\n", " 4 5 600426 华鲁恒升 5.24 448.60 14871.09 2022年4季度股票投资明细\n", " 5 6 002475 立讯精密 4.99 445.72 14151.59 2022年4季度股票投资明细\n", " 6 7 002223 鱼跃医疗 4.19 373.41 11896.87 2022年4季度股票投资明细\n", " 7 8 601888 中国中免 4.08 53.51 11559.53 2022年4季度股票投资明细\n", " 8 9 300450 先导智能 4.07 286.97 11550.59 2022年4季度股票投资明细\n", " 9 10 000733 振华科技 3.86 95.86 10950.60 2022年4季度股票投资明细,\n", " '110015': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 600519 贵州茅台 7.30 8.01 13832.06 2022年4季度股票投资明细\n", " 1 2 601012 隆基绿能 7.15 320.87 13559.86 2022年4季度股票投资明细\n", " 2 3 600809 山西汾酒 5.84 38.81 11060.35 2022年4季度股票投资明细\n", " 3 4 000568 泸州老窖 5.34 45.12 10119.24 2022年4季度股票投资明细\n", " 4 5 688639 华恒生物 4.45 54.27 8425.50 2022年4季度股票投资明细\n", " 5 6 002049 紫光国微 4.16 59.85 7889.41 2022年4季度股票投资明细\n", " 6 7 600233 圆通速递 4.10 386.35 7761.78 2022年4季度股票投资明细\n", " 7 8 000858 五粮液 3.75 39.38 7116.35 2022年4季度股票投资明细\n", " 8 9 603806 福斯特 3.36 95.85 6368.41 2022年4季度股票投资明细\n", " 9 10 300628 亿联网络 3.20 100.22 6072.44 2022年4季度股票投资明细,\n", " '001220': 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", " 0 1 688363 华熙生物 4.89 37.49 5071.17 2022年4季度股票投资明细\n", " 1 2 300015 爱尔眼科 4.62 154.23 4791.93 2022年4季度股票投资明细\n", " 2 3 300957 贝泰妮 4.58 31.86 4754.79 2022年4季度股票投资明细\n", " 3 4 600763 通策医疗 4.54 30.83 4716.68 2022年4季度股票投资明细\n", " 4 5 300896 爱美客 4.44 8.14 4610.09 2022年4季度股票投资明细\n", " 5 6 600298 安琪酵母 4.30 98.79 4467.28 2022年4季度股票投资明细\n", " 6 7 603288 海天味业 3.81 49.74 3959.44 2022年4季度股票投资明细\n", " 7 8 603345 安井食品 3.81 24.42 3953.11 2022年4季度股票投资明细\n", " 8 9 600887 伊利股份 3.57 119.44 3702.64 2022年4季度股票投资明细\n", " 9 10 603605 珀莱雅 3.38 20.94 3506.53 2022年4季度股票投资明细}" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "holding_dict" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "001667\n", "001832\n", "001018\n", "519002\n", "519198\n", "450004\n", "000991\n", "001869\n", "110015\n", "001220\n" ] } ], "source": [ "ratio={}\n", "for k,v in holding_dict.items():\n", " print(k)\n", " ratio[fund_dict[k]]=round(v.iloc[:10]['占净值比例'].sum(),2)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "南方转型混合A(F001667) 21.32\n", "易方达瑞恒混合(F001832) 64.14\n", "易方达新经济混合(F001018) 37.54\n", "华安安信消费混合(F519002) 29.45\n", "万家颐和灵活配置混合(F519198) 68.78\n", "国富深化价值混合(F450004) 26.24\n", "工银战略转型股票(F000991) 57.58\n", "招商制造业混合(F001869) 51.72\n", "易方达行业领先企业(F110015) 48.65\n", "民生加银研究精选混合(F001220) 41.94\n" ] } ], "source": [ "for k ,v in ratio.items():\n", " print(k,v)" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "\n", "ratio_ = sorted(ratio.items(),key=lambda x:x[1],reverse=True)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "ename": "KeyError", "evalue": "\"['基金代码', '基金简称', '单位净值', '总募集规模', '最近总份额', '成立日期', '基金经理', '更新日期'] not in index\"", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m/home/xda/github/stock/fund/qdii_fund_analysis_5fund.ipynb Cell 119'\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0m fund_scale_open_sina_df \u001b[39m=\u001b[39m ak\u001b[39m.\u001b[39;49mfund_scale_open_sina(symbol\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m股票型基金\u001b[39;49m\u001b[39m'\u001b[39;49m)\n\u001b[1;32m 2\u001b[0m \u001b[39mprint\u001b[39m(fund_scale_open_sina_df)\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/akshare/fund/fund_scale_sina.py:70\u001b[0m, in \u001b[0;36mfund_scale_open_sina\u001b[0;34m(symbol)\u001b[0m\n\u001b[1;32m 45\u001b[0m temp_df[\u001b[39m\"\u001b[39m\u001b[39mindex\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m \u001b[39mrange\u001b[39m(\u001b[39m1\u001b[39m, \u001b[39mlen\u001b[39m(temp_df) \u001b[39m+\u001b[39m \u001b[39m1\u001b[39m)\n\u001b[1;32m 46\u001b[0m temp_df\u001b[39m.\u001b[39mrename(\n\u001b[1;32m 47\u001b[0m columns\u001b[39m=\u001b[39m{\n\u001b[1;32m 48\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mindex\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39m\"\u001b[39m\u001b[39m序号\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 68\u001b[0m inplace\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m,\n\u001b[1;32m 69\u001b[0m )\n\u001b[0;32m---> 70\u001b[0m temp_df \u001b[39m=\u001b[39m temp_df[\n\u001b[1;32m 71\u001b[0m [\n\u001b[1;32m 72\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39m序号\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 73\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39m基金代码\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 74\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39m基金简称\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 75\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39m单位净值\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 76\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39m总募集规模\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 77\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39m最近总份额\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 78\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39m成立日期\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 79\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39m基金经理\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 80\u001b[0m \u001b[39m\"\u001b[39;49m\u001b[39m更新日期\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m 81\u001b[0m ]\n\u001b[1;32m 82\u001b[0m ]\n\u001b[1;32m 83\u001b[0m temp_df[\u001b[39m\"\u001b[39m\u001b[39m成立日期\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m pd\u001b[39m.\u001b[39mto_datetime(temp_df[\u001b[39m\"\u001b[39m\u001b[39m成立日期\u001b[39m\u001b[39m\"\u001b[39m])\u001b[39m.\u001b[39mdt\u001b[39m.\u001b[39mdate\n\u001b[1;32m 84\u001b[0m temp_df[\u001b[39m\"\u001b[39m\u001b[39m更新日期\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m pd\u001b[39m.\u001b[39mto_datetime(temp_df[\u001b[39m\"\u001b[39m\u001b[39m更新日期\u001b[39m\u001b[39m\"\u001b[39m])\u001b[39m.\u001b[39mdt\u001b[39m.\u001b[39mdate\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/core/frame.py:3511\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3509\u001b[0m \u001b[39mif\u001b[39;00m is_iterator(key):\n\u001b[1;32m 3510\u001b[0m key \u001b[39m=\u001b[39m \u001b[39mlist\u001b[39m(key)\n\u001b[0;32m-> 3511\u001b[0m indexer \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcolumns\u001b[39m.\u001b[39;49m_get_indexer_strict(key, \u001b[39m\"\u001b[39;49m\u001b[39mcolumns\u001b[39;49m\u001b[39m\"\u001b[39;49m)[\u001b[39m1\u001b[39m]\n\u001b[1;32m 3513\u001b[0m \u001b[39m# take() does not accept boolean indexers\u001b[39;00m\n\u001b[1;32m 3514\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mgetattr\u001b[39m(indexer, \u001b[39m\"\u001b[39m\u001b[39mdtype\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mNone\u001b[39;00m) \u001b[39m==\u001b[39m \u001b[39mbool\u001b[39m:\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/core/indexes/base.py:5782\u001b[0m, in \u001b[0;36mIndex._get_indexer_strict\u001b[0;34m(self, key, axis_name)\u001b[0m\n\u001b[1;32m 5779\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 5780\u001b[0m keyarr, indexer, new_indexer \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_reindex_non_unique(keyarr)\n\u001b[0;32m-> 5782\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_raise_if_missing(keyarr, indexer, axis_name)\n\u001b[1;32m 5784\u001b[0m keyarr \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtake(indexer)\n\u001b[1;32m 5785\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(key, Index):\n\u001b[1;32m 5786\u001b[0m \u001b[39m# GH 42790 - Preserve name from an Index\u001b[39;00m\n", "File \u001b[0;32m~/miniconda3/envs/cpy/lib/python3.9/site-packages/pandas/core/indexes/base.py:5845\u001b[0m, in \u001b[0;36mIndex._raise_if_missing\u001b[0;34m(self, key, indexer, axis_name)\u001b[0m\n\u001b[1;32m 5842\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mKeyError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mNone of [\u001b[39m\u001b[39m{\u001b[39;00mkey\u001b[39m}\u001b[39;00m\u001b[39m] are in the [\u001b[39m\u001b[39m{\u001b[39;00maxis_name\u001b[39m}\u001b[39;00m\u001b[39m]\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 5844\u001b[0m not_found \u001b[39m=\u001b[39m \u001b[39mlist\u001b[39m(ensure_index(key)[missing_mask\u001b[39m.\u001b[39mnonzero()[\u001b[39m0\u001b[39m]]\u001b[39m.\u001b[39munique())\n\u001b[0;32m-> 5845\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mKeyError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00mnot_found\u001b[39m}\u001b[39;00m\u001b[39m not in index\u001b[39m\u001b[39m\"\u001b[39m)\n", "\u001b[0;31mKeyError\u001b[0m: \"['基金代码', '基金简称', '单位净值', '总募集规模', '最近总份额', '成立日期', '基金经理', '更新日期'] not in index\"" ] } ], "source": [ "# 无法使用\n", "fund_scale_open_sina_df = ak.fund_scale_open_sina(symbol='股票型基金')\n", "print(fund_scale_open_sina_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "3317d8e3644028c2868e82f28dd88c90f6239ea0f73e118ac78e96e8cc46cfd5" }, "kernelspec": { "display_name": "Python 3.9.1 ('base')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: fund/reits.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/xda/miniconda3/envs/cpy/lib/python3.9/site-packages/akshare/__init__.py:2714: UserWarning: 为了支持更多特性,请将 Pandas 升级到 2.1.0 及以上版本!\n", " warnings.warn(\n" ] } ], "source": [ "import akshare as ak" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "reits_info = ak.reits_realtime_em()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
序号代码名称最新价涨跌额涨跌幅成交量成交额开盘价最高价最低价昨收
01508096中航京能光伏REIT10.3990.1701.6613241.01.368326e+0710.21310.40010.21310.229
12180501红土创新深圳安居REIT2.5910.0321.2542845.01.099559e+072.5722.5932.5342.559
23508021国泰君安临港创新产业园REIT4.4100.0370.8543551.01.908618e+074.3534.4144.3204.373
34180801中航首钢绿能REIT13.5800.0990.7316392.02.214851e+0713.48113.62213.37013.481
45508088国泰君安东久新经济REIT3.1810.0230.7326466.08.406602e+063.1193.1993.1193.158
56508008国金中国铁建REIT9.5150.0620.6643029.04.096097e+079.4679.5559.3759.453
67508031国泰君安城投宽庭保租房REIT3.0530.0150.4917253.05.254575e+063.0373.0583.0243.038
78508028中信建投国家电投新能源REIT10.1840.0190.1927912.02.838312e+0710.16510.19510.11510.165
89508006富国首创水务REIT3.7520.0070.1924728.09.280578e+063.7303.7613.7293.745
910180301红土创新盐田港REIT2.3510.0010.0437960.08.937926e+062.3372.3682.3102.350
1011508068华夏北京保障房REIT2.8670.0010.0359046.01.693628e+072.8662.8762.8502.866
1112508001浙商沪杭甬REIT8.2410.0020.0216561.01.364811e+078.2068.2498.2058.239
1213180201平安广州广河REIT9.7180.0020.0219948.01.938464e+079.6169.8149.6169.716
1314508077华夏基金华润有巢REIT2.4500.0000.0078508.01.930020e+072.4502.4802.4312.450
1415508033深高REITNaNNaNNaNNaNNaNNaNNaNNaN6.825
1516508026电建清源NaNNaNNaNNaNNaNNaNNaNNaN2.675
1617508017金茂商业NaNNaNNaNNaNNaNNaNNaNNaN2.670
1718508011物美消费NaNNaNNaNNaNNaNNaNNaNNaN2.383
1819180601华夏华润商业REITNaNNaNNaNNaNNaNNaNNaNNaN6.902
1920508000华安张江产业园REIT2.713-0.001-0.0450262.01.363384e+072.6872.7302.6752.714
2021508058中金厦门安居REIT2.767-0.002-0.0778526.02.166828e+072.7562.7982.7512.769
2122180103华夏和达高科REIT2.353-0.003-0.1334246.08.039953e+062.3412.3612.3002.356
2223508007中金山东高速REIT7.150-0.012-0.1717998.01.286335e+077.1857.2507.1007.162
2324508099建信中关村REIT2.338-0.006-0.2681281.01.885344e+072.3292.3442.2902.344
2425180202华夏越秀高速REIT7.141-0.019-0.2715670.01.118705e+077.1597.1747.1177.160
2526508009中金安徽交控REIT8.129-0.030-0.3733995.02.763976e+078.1548.1598.1198.159
2627508056中金普洛斯REIT3.580-0.016-0.4464546.02.305100e+073.6093.6093.5213.596
2728508066华泰江苏交控REIT6.923-0.033-0.4718390.01.274584e+076.9166.9516.9166.956
2829508027东吴苏园产业REIT3.180-0.018-0.5666290.02.111244e+073.1943.2183.1413.198
2930180101博时蛇口产园REIT1.947-0.013-0.66149296.02.898595e+071.9581.9641.9001.960
3031180102华夏合肥高新REIT1.909-0.016-0.8356777.01.081247e+071.8981.9201.8781.925
3132180401鹏华深圳能源REIT6.885-0.062-0.8982062.05.664325e+076.9406.9656.8706.947
3233508019中金湖北科投光谷REIT2.228-0.021-0.9326232.05.858946e+062.2462.2842.2152.249
3334508018华夏中国交建REIT5.461-0.076-1.37111468.06.084459e+075.5345.5345.4015.537
3435508098嘉实京东仓储基础设施REIT2.999-0.083-2.6977957.02.353497e+073.0723.0722.9903.082
\n", "
" ], "text/plain": [ " 序号 代码 名称 最新价 涨跌额 涨跌幅 成交量 成交额 \\\n", "0 1 508096 中航京能光伏REIT 10.399 0.170 1.66 13241.0 1.368326e+07 \n", "1 2 180501 红土创新深圳安居REIT 2.591 0.032 1.25 42845.0 1.099559e+07 \n", "2 3 508021 国泰君安临港创新产业园REIT 4.410 0.037 0.85 43551.0 1.908618e+07 \n", "3 4 180801 中航首钢绿能REIT 13.580 0.099 0.73 16392.0 2.214851e+07 \n", "4 5 508088 国泰君安东久新经济REIT 3.181 0.023 0.73 26466.0 8.406602e+06 \n", "5 6 508008 国金中国铁建REIT 9.515 0.062 0.66 43029.0 4.096097e+07 \n", "6 7 508031 国泰君安城投宽庭保租房REIT 3.053 0.015 0.49 17253.0 5.254575e+06 \n", "7 8 508028 中信建投国家电投新能源REIT 10.184 0.019 0.19 27912.0 2.838312e+07 \n", "8 9 508006 富国首创水务REIT 3.752 0.007 0.19 24728.0 9.280578e+06 \n", "9 10 180301 红土创新盐田港REIT 2.351 0.001 0.04 37960.0 8.937926e+06 \n", "10 11 508068 华夏北京保障房REIT 2.867 0.001 0.03 59046.0 1.693628e+07 \n", "11 12 508001 浙商沪杭甬REIT 8.241 0.002 0.02 16561.0 1.364811e+07 \n", "12 13 180201 平安广州广河REIT 9.718 0.002 0.02 19948.0 1.938464e+07 \n", "13 14 508077 华夏基金华润有巢REIT 2.450 0.000 0.00 78508.0 1.930020e+07 \n", "14 15 508033 深高REIT NaN NaN NaN NaN NaN \n", "15 16 508026 电建清源 NaN NaN NaN NaN NaN \n", "16 17 508017 金茂商业 NaN NaN NaN NaN NaN \n", "17 18 508011 物美消费 NaN NaN NaN NaN NaN \n", "18 19 180601 华夏华润商业REIT NaN NaN NaN NaN NaN \n", "19 20 508000 华安张江产业园REIT 2.713 -0.001 -0.04 50262.0 1.363384e+07 \n", "20 21 508058 中金厦门安居REIT 2.767 -0.002 -0.07 78526.0 2.166828e+07 \n", "21 22 180103 华夏和达高科REIT 2.353 -0.003 -0.13 34246.0 8.039953e+06 \n", "22 23 508007 中金山东高速REIT 7.150 -0.012 -0.17 17998.0 1.286335e+07 \n", "23 24 508099 建信中关村REIT 2.338 -0.006 -0.26 81281.0 1.885344e+07 \n", "24 25 180202 华夏越秀高速REIT 7.141 -0.019 -0.27 15670.0 1.118705e+07 \n", "25 26 508009 中金安徽交控REIT 8.129 -0.030 -0.37 33995.0 2.763976e+07 \n", "26 27 508056 中金普洛斯REIT 3.580 -0.016 -0.44 64546.0 2.305100e+07 \n", "27 28 508066 华泰江苏交控REIT 6.923 -0.033 -0.47 18390.0 1.274584e+07 \n", "28 29 508027 东吴苏园产业REIT 3.180 -0.018 -0.56 66290.0 2.111244e+07 \n", "29 30 180101 博时蛇口产园REIT 1.947 -0.013 -0.66 149296.0 2.898595e+07 \n", "30 31 180102 华夏合肥高新REIT 1.909 -0.016 -0.83 56777.0 1.081247e+07 \n", "31 32 180401 鹏华深圳能源REIT 6.885 -0.062 -0.89 82062.0 5.664325e+07 \n", "32 33 508019 中金湖北科投光谷REIT 2.228 -0.021 -0.93 26232.0 5.858946e+06 \n", "33 34 508018 华夏中国交建REIT 5.461 -0.076 -1.37 111468.0 6.084459e+07 \n", "34 35 508098 嘉实京东仓储基础设施REIT 2.999 -0.083 -2.69 77957.0 2.353497e+07 \n", "\n", " 开盘价 最高价 最低价 昨收 \n", "0 10.213 10.400 10.213 10.229 \n", "1 2.572 2.593 2.534 2.559 \n", "2 4.353 4.414 4.320 4.373 \n", "3 13.481 13.622 13.370 13.481 \n", "4 3.119 3.199 3.119 3.158 \n", "5 9.467 9.555 9.375 9.453 \n", "6 3.037 3.058 3.024 3.038 \n", "7 10.165 10.195 10.115 10.165 \n", "8 3.730 3.761 3.729 3.745 \n", "9 2.337 2.368 2.310 2.350 \n", "10 2.866 2.876 2.850 2.866 \n", "11 8.206 8.249 8.205 8.239 \n", "12 9.616 9.814 9.616 9.716 \n", "13 2.450 2.480 2.431 2.450 \n", "14 NaN NaN NaN 6.825 \n", "15 NaN NaN NaN 2.675 \n", "16 NaN NaN NaN 2.670 \n", "17 NaN NaN NaN 2.383 \n", "18 NaN NaN NaN 6.902 \n", "19 2.687 2.730 2.675 2.714 \n", "20 2.756 2.798 2.751 2.769 \n", "21 2.341 2.361 2.300 2.356 \n", "22 7.185 7.250 7.100 7.162 \n", "23 2.329 2.344 2.290 2.344 \n", "24 7.159 7.174 7.117 7.160 \n", "25 8.154 8.159 8.119 8.159 \n", "26 3.609 3.609 3.521 3.596 \n", "27 6.916 6.951 6.916 6.956 \n", "28 3.194 3.218 3.141 3.198 \n", "29 1.958 1.964 1.900 1.960 \n", "30 1.898 1.920 1.878 1.925 \n", "31 6.940 6.965 6.870 6.947 \n", "32 2.246 2.284 2.215 2.249 \n", "33 5.534 5.534 5.401 5.537 \n", "34 3.072 3.072 2.990 3.082 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reits_info.head(50)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "reits_info.dropna(inplace=True)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
序号代码名称最新价涨跌额涨跌幅成交量成交额开盘价最高价最低价昨收
01508096中航京能光伏REIT10.3990.1701.6613241.01.368326e+0710.21310.40010.21310.229
12180501红土创新深圳安居REIT2.5910.0321.2542845.01.099559e+072.5722.5932.5342.559
23508021国泰君安临港创新产业园REIT4.4100.0370.8543551.01.908618e+074.3534.4144.3204.373
34180801中航首钢绿能REIT13.5800.0990.7316392.02.214851e+0713.48113.62213.37013.481
45508088国泰君安东久新经济REIT3.1810.0230.7326466.08.406602e+063.1193.1993.1193.158
56508008国金中国铁建REIT9.5150.0620.6643029.04.096097e+079.4679.5559.3759.453
67508031国泰君安城投宽庭保租房REIT3.0530.0150.4917253.05.254575e+063.0373.0583.0243.038
78508028中信建投国家电投新能源REIT10.1840.0190.1927912.02.838312e+0710.16510.19510.11510.165
89508006富国首创水务REIT3.7520.0070.1924728.09.280578e+063.7303.7613.7293.745
910180301红土创新盐田港REIT2.3510.0010.0437960.08.937926e+062.3372.3682.3102.350
1011508068华夏北京保障房REIT2.8670.0010.0359046.01.693628e+072.8662.8762.8502.866
1112508001浙商沪杭甬REIT8.2410.0020.0216561.01.364811e+078.2068.2498.2058.239
1213180201平安广州广河REIT9.7180.0020.0219948.01.938464e+079.6169.8149.6169.716
1314508077华夏基金华润有巢REIT2.4500.0000.0078508.01.930020e+072.4502.4802.4312.450
1920508000华安张江产业园REIT2.713-0.001-0.0450262.01.363384e+072.6872.7302.6752.714
2021508058中金厦门安居REIT2.767-0.002-0.0778526.02.166828e+072.7562.7982.7512.769
2122180103华夏和达高科REIT2.353-0.003-0.1334246.08.039953e+062.3412.3612.3002.356
2223508007中金山东高速REIT7.150-0.012-0.1717998.01.286335e+077.1857.2507.1007.162
2324508099建信中关村REIT2.338-0.006-0.2681281.01.885344e+072.3292.3442.2902.344
2425180202华夏越秀高速REIT7.141-0.019-0.2715670.01.118705e+077.1597.1747.1177.160
2526508009中金安徽交控REIT8.129-0.030-0.3733995.02.763976e+078.1548.1598.1198.159
2627508056中金普洛斯REIT3.580-0.016-0.4464546.02.305100e+073.6093.6093.5213.596
2728508066华泰江苏交控REIT6.923-0.033-0.4718390.01.274584e+076.9166.9516.9166.956
2829508027东吴苏园产业REIT3.180-0.018-0.5666290.02.111244e+073.1943.2183.1413.198
2930180101博时蛇口产园REIT1.947-0.013-0.66149296.02.898595e+071.9581.9641.9001.960
3031180102华夏合肥高新REIT1.909-0.016-0.8356777.01.081247e+071.8981.9201.8781.925
3132180401鹏华深圳能源REIT6.885-0.062-0.8982062.05.664325e+076.9406.9656.8706.947
3233508019中金湖北科投光谷REIT2.228-0.021-0.9326232.05.858946e+062.2462.2842.2152.249
3334508018华夏中国交建REIT5.461-0.076-1.37111468.06.084459e+075.5345.5345.4015.537
3435508098嘉实京东仓储基础设施REIT2.999-0.083-2.6977957.02.353497e+073.0723.0722.9903.082
\n", "
" ], "text/plain": [ " 序号 代码 名称 最新价 涨跌额 涨跌幅 成交量 成交额 \\\n", "0 1 508096 中航京能光伏REIT 10.399 0.170 1.66 13241.0 1.368326e+07 \n", "1 2 180501 红土创新深圳安居REIT 2.591 0.032 1.25 42845.0 1.099559e+07 \n", "2 3 508021 国泰君安临港创新产业园REIT 4.410 0.037 0.85 43551.0 1.908618e+07 \n", "3 4 180801 中航首钢绿能REIT 13.580 0.099 0.73 16392.0 2.214851e+07 \n", "4 5 508088 国泰君安东久新经济REIT 3.181 0.023 0.73 26466.0 8.406602e+06 \n", "5 6 508008 国金中国铁建REIT 9.515 0.062 0.66 43029.0 4.096097e+07 \n", "6 7 508031 国泰君安城投宽庭保租房REIT 3.053 0.015 0.49 17253.0 5.254575e+06 \n", "7 8 508028 中信建投国家电投新能源REIT 10.184 0.019 0.19 27912.0 2.838312e+07 \n", "8 9 508006 富国首创水务REIT 3.752 0.007 0.19 24728.0 9.280578e+06 \n", "9 10 180301 红土创新盐田港REIT 2.351 0.001 0.04 37960.0 8.937926e+06 \n", "10 11 508068 华夏北京保障房REIT 2.867 0.001 0.03 59046.0 1.693628e+07 \n", "11 12 508001 浙商沪杭甬REIT 8.241 0.002 0.02 16561.0 1.364811e+07 \n", "12 13 180201 平安广州广河REIT 9.718 0.002 0.02 19948.0 1.938464e+07 \n", "13 14 508077 华夏基金华润有巢REIT 2.450 0.000 0.00 78508.0 1.930020e+07 \n", "19 20 508000 华安张江产业园REIT 2.713 -0.001 -0.04 50262.0 1.363384e+07 \n", "20 21 508058 中金厦门安居REIT 2.767 -0.002 -0.07 78526.0 2.166828e+07 \n", "21 22 180103 华夏和达高科REIT 2.353 -0.003 -0.13 34246.0 8.039953e+06 \n", "22 23 508007 中金山东高速REIT 7.150 -0.012 -0.17 17998.0 1.286335e+07 \n", "23 24 508099 建信中关村REIT 2.338 -0.006 -0.26 81281.0 1.885344e+07 \n", "24 25 180202 华夏越秀高速REIT 7.141 -0.019 -0.27 15670.0 1.118705e+07 \n", "25 26 508009 中金安徽交控REIT 8.129 -0.030 -0.37 33995.0 2.763976e+07 \n", "26 27 508056 中金普洛斯REIT 3.580 -0.016 -0.44 64546.0 2.305100e+07 \n", "27 28 508066 华泰江苏交控REIT 6.923 -0.033 -0.47 18390.0 1.274584e+07 \n", "28 29 508027 东吴苏园产业REIT 3.180 -0.018 -0.56 66290.0 2.111244e+07 \n", "29 30 180101 博时蛇口产园REIT 1.947 -0.013 -0.66 149296.0 2.898595e+07 \n", "30 31 180102 华夏合肥高新REIT 1.909 -0.016 -0.83 56777.0 1.081247e+07 \n", "31 32 180401 鹏华深圳能源REIT 6.885 -0.062 -0.89 82062.0 5.664325e+07 \n", "32 33 508019 中金湖北科投光谷REIT 2.228 -0.021 -0.93 26232.0 5.858946e+06 \n", "33 34 508018 华夏中国交建REIT 5.461 -0.076 -1.37 111468.0 6.084459e+07 \n", "34 35 508098 嘉实京东仓储基础设施REIT 2.999 -0.083 -2.69 77957.0 2.353497e+07 \n", "\n", " 开盘价 最高价 最低价 昨收 \n", "0 10.213 10.400 10.213 10.229 \n", "1 2.572 2.593 2.534 2.559 \n", "2 4.353 4.414 4.320 4.373 \n", "3 13.481 13.622 13.370 13.481 \n", "4 3.119 3.199 3.119 3.158 \n", "5 9.467 9.555 9.375 9.453 \n", "6 3.037 3.058 3.024 3.038 \n", "7 10.165 10.195 10.115 10.165 \n", "8 3.730 3.761 3.729 3.745 \n", "9 2.337 2.368 2.310 2.350 \n", "10 2.866 2.876 2.850 2.866 \n", "11 8.206 8.249 8.205 8.239 \n", "12 9.616 9.814 9.616 9.716 \n", "13 2.450 2.480 2.431 2.450 \n", "19 2.687 2.730 2.675 2.714 \n", "20 2.756 2.798 2.751 2.769 \n", "21 2.341 2.361 2.300 2.356 \n", "22 7.185 7.250 7.100 7.162 \n", "23 2.329 2.344 2.290 2.344 \n", "24 7.159 7.174 7.117 7.160 \n", "25 8.154 8.159 8.119 8.159 \n", "26 3.609 3.609 3.521 3.596 \n", "27 6.916 6.951 6.916 6.956 \n", "28 3.194 3.218 3.141 3.198 \n", "29 1.958 1.964 1.900 1.960 \n", "30 1.898 1.920 1.878 1.925 \n", "31 6.940 6.965 6.870 6.947 \n", "32 2.246 2.284 2.215 2.249 \n", "33 5.534 5.534 5.401 5.537 \n", "34 3.072 3.072 2.990 3.082 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reits_info" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "fund_etf_hist_sina_df = ak.fund_etf_hist_sina(symbol=\"sh508098\")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dateopenhighlowclosevolume
02023-02-083.8624.0003.8453.92349620561
12023-02-093.9173.9523.8903.9428262884
22023-02-103.9454.0763.9454.02512434506
32023-02-134.0254.0824.0184.0396037981
42023-02-144.0414.1174.0414.1047165664
.....................
2582024-03-043.0243.1933.0153.1707469505
2592024-03-053.1703.2493.1133.1798498419
2602024-03-063.1793.1793.0733.1376094697
2612024-03-073.1173.1933.0603.0827446161
2622024-03-083.0723.0722.9902.9997795668
\n", "

263 rows × 6 columns

\n", "
" ], "text/plain": [ " date open high low close volume\n", "0 2023-02-08 3.862 4.000 3.845 3.923 49620561\n", "1 2023-02-09 3.917 3.952 3.890 3.942 8262884\n", "2 2023-02-10 3.945 4.076 3.945 4.025 12434506\n", "3 2023-02-13 4.025 4.082 4.018 4.039 6037981\n", "4 2023-02-14 4.041 4.117 4.041 4.104 7165664\n", ".. ... ... ... ... ... ...\n", "258 2024-03-04 3.024 3.193 3.015 3.170 7469505\n", "259 2024-03-05 3.170 3.249 3.113 3.179 8498419\n", "260 2024-03-06 3.179 3.179 3.073 3.137 6094697\n", "261 2024-03-07 3.117 3.193 3.060 3.082 7446161\n", "262 2024-03-08 3.072 3.072 2.990 2.999 7795668\n", "\n", "[263 rows x 6 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fund_etf_hist_sina_df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "import datetime" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "fund_etf_hist_sina_df.set_index('date', inplace=True)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dateopenhighlowclosevolume
2212024-01-023.3783.4003.2663.2744370645
2222024-01-033.2733.2733.1853.1984955584
2232024-01-043.1963.1963.0803.1175018988
2242024-01-053.1163.1162.8312.8816792637
2252024-01-082.6812.8602.6202.6326159474
\n", "
" ], "text/plain": [ " date open high low close volume\n", "221 2024-01-02 3.378 3.400 3.266 3.274 4370645\n", "222 2024-01-03 3.273 3.273 3.185 3.198 4955584\n", "223 2024-01-04 3.196 3.196 3.080 3.117 5018988\n", "224 2024-01-05 3.116 3.116 2.831 2.881 6792637\n", "225 2024-01-08 2.681 2.860 2.620 2.632 6159474" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "this_year.head()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "def Percent(a,b):\n", " return (a-b)/b*100" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "\n" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-8.399511301160658" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "reits_list = reits_info['代码'].tolist()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "add_prefix_code = list(map(lambda x:'sh'+x if x.startswith('5') else 'sz'+x,reits_list))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['sh508096',\n", " 'sz180501',\n", " 'sh508021',\n", " 'sz180801',\n", " 'sh508088',\n", " 'sh508008',\n", " 'sh508031',\n", " 'sh508028',\n", " 'sh508006',\n", " 'sz180301',\n", " 'sh508068',\n", " 'sh508001',\n", " 'sz180201',\n", " 'sh508077',\n", " 'sh508000',\n", " 'sh508058',\n", " 'sz180103',\n", " 'sh508007',\n", " 'sh508099',\n", " 'sz180202',\n", " 'sh508009',\n", " 'sh508056',\n", " 'sh508066',\n", " 'sh508027',\n", " 'sz180101',\n", " 'sz180102',\n", " 'sz180401',\n", " 'sh508019',\n", " 'sh508018',\n", " 'sh508098']" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "add_prefix_code" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "result_dict = {}\n", "\n", "def analisys_reits(code):\n", " fund_etf_hist_sina_df = ak.fund_etf_hist_sina(symbol=code)\n", " fund_etf_hist_sina_df['date']=fund_etf_hist_sina_df['date'].astype(str)\n", " this_year = fund_etf_hist_sina_df[fund_etf_hist_sina_df['date']>='2024-01-01']\n", " p = Percent(this_year['close'].iloc[-1],this_year['close'].iloc[0])\n", " result_dict[code] = p\n" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "for code in add_prefix_code:\n", " analisys_reits(code)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'sh508096': 9.13002413684541,\n", " 'sz180501': 4.983792544570512,\n", " 'sh508021': -2.325581395348827,\n", " 'sz180801': 10.415480933409226,\n", " 'sh508088': -0.282131661442003,\n", " 'sh508008': 13.856647122173044,\n", " 'sh508031': 0.16404199475065268,\n", " 'sh508028': 9.153269024651653,\n", " 'sh508006': 15.268817204301072,\n", " 'sz180301': 1.8189692507578958,\n", " 'sh508068': 13.769841269841269,\n", " 'sh508001': 6.130070830650354,\n", " 'sz180201': 11.675476901861641,\n", " 'sh508077': 3.9016115351993252,\n", " 'sh508000': 9.21900161030596,\n", " 'sh508058': 6.87524140594824,\n", " 'sz180103': 6.470588235294128,\n", " 'sh508007': 10.852713178294577,\n", " 'sh508099': 12.08053691275169,\n", " 'sz180202': 17.469978614903773,\n", " 'sh508009': 10.613688937270368,\n", " 'sh508056': 8.649468892261005,\n", " 'sh508066': 4.989384288747342,\n", " 'sh508027': 4.502136049950707,\n", " 'sz180101': 20.931677018633536,\n", " 'sz180102': 6.707657909446625,\n", " 'sz180401': 11.951219512195111,\n", " 'sh508019': 3.4354688950789365,\n", " 'sh508018': 6.41075604053002,\n", " 'sh508098': -8.399511301160658}" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_dict" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "reits_info['代码'] = reits_info['代码'].astype(str)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "name_mapper = dict(zip(reits_info['代码'].tolist(),reits_info['名称'].tolist()))" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "new_dict = {}\n", "for code,percent in result_dict.items():\n", " # print(name_mapper[code],percent)\n", " # if code.startswith('sh'):\n", " new_dict[name_mapper[code[2:]]] = percent" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'中航京能光伏REIT': 9.13002413684541,\n", " '红土创新深圳安居REIT': 4.983792544570512,\n", " '国泰君安临港创新产业园REIT': -2.325581395348827,\n", " '中航首钢绿能REIT': 10.415480933409226,\n", " '国泰君安东久新经济REIT': -0.282131661442003,\n", " '国金中国铁建REIT': 13.856647122173044,\n", " '国泰君安城投宽庭保租房REIT': 0.16404199475065268,\n", " '中信建投国家电投新能源REIT': 9.153269024651653,\n", " '富国首创水务REIT': 15.268817204301072,\n", " '红土创新盐田港REIT': 1.8189692507578958,\n", " '华夏北京保障房REIT': 13.769841269841269,\n", " '浙商沪杭甬REIT': 6.130070830650354,\n", " '平安广州广河REIT': 11.675476901861641,\n", " '华夏基金华润有巢REIT': 3.9016115351993252,\n", " '华安张江产业园REIT': 9.21900161030596,\n", " '中金厦门安居REIT': 6.87524140594824,\n", " '华夏和达高科REIT': 6.470588235294128,\n", " '中金山东高速REIT': 10.852713178294577,\n", " '建信中关村REIT': 12.08053691275169,\n", " '华夏越秀高速REIT': 17.469978614903773,\n", " '中金安徽交控REIT': 10.613688937270368,\n", " '中金普洛斯REIT': 8.649468892261005,\n", " '华泰江苏交控REIT': 4.989384288747342,\n", " '东吴苏园产业REIT': 4.502136049950707,\n", " '博时蛇口产园REIT': 20.931677018633536,\n", " '华夏合肥高新REIT': 6.707657909446625,\n", " '鹏华深圳能源REIT': 11.951219512195111,\n", " '中金湖北科投光谷REIT': 3.4354688950789365,\n", " '华夏中国交建REIT': 6.41075604053002,\n", " '嘉实京东仓储基础设施REIT': -8.399511301160658}" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_dict" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [], "source": [ "result_dict_month = {}\n", "\n", "def analisys_reits_month(code):\n", " fund_etf_hist_sina_df = ak.fund_etf_hist_sina(symbol=code)\n", " fund_etf_hist_sina_df['date']=fund_etf_hist_sina_df['date'].astype(str)\n", " this_year = fund_etf_hist_sina_df[(fund_etf_hist_sina_df['date']>='2024-02-01') & (fund_etf_hist_sina_df['date']<'2024-03-01')]\n", " p = Percent(this_year['close'].iloc[-1],this_year['close'].iloc[0])\n", " result_dict_month[code] = p" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "for code in add_prefix_code:\n", " analisys_reits_month(code)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'sh508096': 7.546556951061056,\n", " 'sz180501': 9.913793103448276,\n", " 'sh508021': 11.80061037639878,\n", " 'sz180801': 7.579034941763724,\n", " 'sh508088': 15.38175046554934,\n", " 'sh508008': 8.956276445698172,\n", " 'sh508031': 7.392857142857154,\n", " 'sh508028': 5.582102519548212,\n", " 'sh508006': 9.875417806137959,\n", " 'sz180301': 13.636363636363628,\n", " 'sh508068': 8.71053632559909,\n", " 'sh508001': 5.688238315356954,\n", " 'sz180201': 8.82790165809034,\n", " 'sh508077': 13.96751740139212,\n", " 'sh508000': 17.52767527675276,\n", " 'sh508058': 8.476609356257505,\n", " 'sz180103': 10.498046874999993,\n", " 'sh508007': 3.8052434456928905,\n", " 'sh508099': 15.10015408320493,\n", " 'sz180202': 16.06175069797996,\n", " 'sh508009': 9.306397306397304,\n", " 'sh508056': 18.236272878535775,\n", " 'sh508066': 6.552044609665414,\n", " 'sh508027': 12.128801431127012,\n", " 'sz180101': 28.148657949070888,\n", " 'sz180102': 16.63527934714376,\n", " 'sz180401': 9.800664451827256,\n", " 'sh508019': 16.87898089171975,\n", " 'sh508018': 15.58139534883719,\n", " 'sh508098': 21.27659574468085}" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_dict_month" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [], "source": [ "fund_open_fund_info_em_df = ak.fund_open_fund_info_em(symbol=\"sz180101\", indicator=\"单位净值走势\")" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: []\n", "Index: []" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fund_open_fund_info_em_df" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 基金代码 基金简称 2024-03-08-单位净值 2024-03-08-累计净值 \\\n", "0 013852 中信建投低碳成长混合C 0.6083 0.6083 \n", "1 013851 中信建投低碳成长混合A 0.6137 0.6137 \n", "2 006887 诺德新生活混合A 0.9517 0.9517 \n", "3 006888 诺德新生活混合C 0.951 0.951 \n", "4 007731 民生加银持续成长混合A 1.1876 1.1876 \n", "... ... ... ... ... \n", "18391 020340 华泰柏瑞祥泰稳健养老目标偏债一年(FOF)Y \n", "18392 019247 鹏华易选积极3个月持有期混合(FOF)A \n", "18393 019657 万家优选积极三个月持有期混合发起式(FOF)A \n", "18394 020859 华富泰合平衡3个月持有混合发起式(FOF)A \n", "18395 020860 华富泰合平衡3个月持有混合发起式(FOF)C \n", "\n", " 2024-03-07-单位净值 2024-03-07-累计净值 日增长值 日增长率 申购状态 赎回状态 手续费 \n", "0 0.5727 0.5727 0.0356 6.22 开放申购 开放赎回 0.00% \n", "1 0.5778 0.5778 0.0359 6.21 开放申购 开放赎回 0.15% \n", "2 0.8977 0.8977 0.054 6.02 开放申购 开放赎回 0.12% \n", "3 0.8971 0.8971 0.0539 6.01 开放申购 开放赎回 0.00% \n", "4 1.1235 1.1235 0.0641 5.71 限大额 开放赎回 0.15% \n", "... ... ... ... ... ... ... ... \n", "18391 开放申购 开放赎回 0.00% \n", "18392 开放申购 开放赎回 0.12% \n", "18393 开放申购 开放赎回 0.15% \n", "18394 暂停申购 暂停赎回 0.10% \n", "18395 暂停申购 暂停赎回 0.00% \n", "\n", "[18396 rows x 11 columns]\n" ] } ], "source": [ "fund_open_fund_daily_em_df = ak.fund_open_fund_daily_em()\n", "print(fund_open_fund_daily_em_df)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
基金代码基金简称2024-03-08-单位净值2024-03-08-累计净值2024-03-07-单位净值2024-03-07-累计净值日增长值日增长率申购状态赎回状态手续费
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [基金代码, 基金简称, 2024-03-08-单位净值, 2024-03-08-累计净值, 2024-03-07-单位净值, 2024-03-07-累计净值, 日增长值, 日增长率, 申购状态, 赎回状态, 手续费]\n", "Index: []" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fund_open_fund_daily_em_df[fund_open_fund_daily_em_df['基金代码']=='180101']" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "def get_reits_netvalue(code):\n", " import requests\n", "\n", " cookies = {\n", " 'device_id': '21693126f9ffeff99cfca99835e6d54e',\n", " 's': 'bn11gfbify',\n", " 'bid': '4a7809eff12dfb426fecf9028b9a8727_ljgntwcu',\n", " 'cookiesu': '621702237077740',\n", " 'remember': '1',\n", " 'u': '2339396598',\n", " 'xq_a_token': 'b630b67d5eb6a5363b9a4578dcd11b6ead33a73a',\n", " 'xqat': 'b630b67d5eb6a5363b9a4578dcd11b6ead33a73a',\n", " 'xq_r_token': '1dccabeabdb33674556d8e93363cb496d1ac032b',\n", " 'xq_is_login': '1',\n", " 'xq_id_token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjIzMzkzOTY1OTgsImlzcyI6InVjIiwiZXhwIjoxNzExOTY4NDYwLCJjdG0iOjE3MDk5MTMxNzE4NDQsImNpZCI6ImQ5ZDBuNEFadXAifQ.cciFilp8cpclmG3DTDd6sdZFwZ4Byh-zEsxg68Rmxa-ADCH9feN9dq9XRKw8p6fgs0jpsPQm_7CZorxGNk5mTcW12z4dmZuhoC8RfiJ3kI0_gS_Ez78q1R3nPkDx4A5nPql_atHwYKz7gS0srfvS1JokpdPSYoCTRUiA4ZyVmyh1VSKwzvVBil4UFgPyLyM7jGPgpL_kJBXxUrl65zTZ5tFbMheYXVMQruTPG-O4r17oRIg8RasZu8kG1Ru6Ljs95F6NF8MEqc1Fzzc13QYdoIaNHRAzG9MBi4VFrNq4zvqOxBf_KqJCDwV1w6SDtKMOb9PtCrvvzwoGdr71Cq-Wng',\n", " 'Hm_lvt_1db88642e346389874251b5a1eded6e3': '1709912478,1709944327,1709999363,1710077952',\n", " 'Hm_lpvt_1db88642e346389874251b5a1eded6e3': '1710084129',\n", " 'is_overseas': '0',\n", " }\n", "\n", " headers = {\n", " 'authority': 'stock.xueqiu.com',\n", " 'accept': '*/*',\n", " 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',\n", " 'cache-control': 'no-cache',\n", " # 'cookie': 'device_id=21693126f9ffeff99cfca99835e6d54e; s=bn11gfbify; bid=4a7809eff12dfb426fecf9028b9a8727_ljgntwcu; cookiesu=621702237077740; remember=1; u=2339396598; xq_a_token=b630b67d5eb6a5363b9a4578dcd11b6ead33a73a; xqat=b630b67d5eb6a5363b9a4578dcd11b6ead33a73a; xq_r_token=1dccabeabdb33674556d8e93363cb496d1ac032b; xq_is_login=1; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjIzMzkzOTY1OTgsImlzcyI6InVjIiwiZXhwIjoxNzExOTY4NDYwLCJjdG0iOjE3MDk5MTMxNzE4NDQsImNpZCI6ImQ5ZDBuNEFadXAifQ.cciFilp8cpclmG3DTDd6sdZFwZ4Byh-zEsxg68Rmxa-ADCH9feN9dq9XRKw8p6fgs0jpsPQm_7CZorxGNk5mTcW12z4dmZuhoC8RfiJ3kI0_gS_Ez78q1R3nPkDx4A5nPql_atHwYKz7gS0srfvS1JokpdPSYoCTRUiA4ZyVmyh1VSKwzvVBil4UFgPyLyM7jGPgpL_kJBXxUrl65zTZ5tFbMheYXVMQruTPG-O4r17oRIg8RasZu8kG1Ru6Ljs95F6NF8MEqc1Fzzc13QYdoIaNHRAzG9MBi4VFrNq4zvqOxBf_KqJCDwV1w6SDtKMOb9PtCrvvzwoGdr71Cq-Wng; Hm_lvt_1db88642e346389874251b5a1eded6e3=1709912478,1709944327,1709999363,1710077952; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1710084129; is_overseas=0',\n", " 'origin': 'https://xueqiu.com',\n", " 'pragma': 'no-cache',\n", " 'referer': 'https://xueqiu.com/S/SZ180101',\n", " 'sec-ch-ua': '\"Chromium\";v=\"110\", \"Not A(Brand\";v=\"24\", \"Google Chrome\";v=\"110\"',\n", " 'sec-ch-ua-mobile': '?0',\n", " 'sec-ch-ua-platform': '\"Linux\"',\n", " 'sec-fetch-dest': 'empty',\n", " 'sec-fetch-mode': 'cors',\n", " 'sec-fetch-site': 'same-site',\n", " 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',\n", " }\n", "\n", " params = {\n", " 'symbol': code,\n", " 'extend': 'detail',\n", " }\n", "\n", " response = requests.get('https://stock.xueqiu.com/v5/stock/quote.json', params=params, cookies=cookies, headers=headers)\n", " res = response.json()\n", " premium_rate = res['data']['quote']['premium_rate']\n", " print(premium_rate)\n", " return premium_rate" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-15.45\n" ] }, { "data": { "text/plain": [ "-15.45" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_reits_netvalue('SH508098')" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.93\n", "3.72\n", "5.53\n", "34.04\n", "3.62\n", "6.25\n", "0.1\n", "2.71\n", "14.85\n", "1.47\n", "13.36\n", "20.2\n", "-19.73\n", "0.62\n", "-9.08\n", "7.08\n", "-16.91\n", "2.85\n", "-25.35\n", "7.14\n", "-15.99\n", "-2.19\n", "30.97\n", "-15.43\n", "-15.82\n", "-13.58\n", "13.54\n", "-15.73\n", "-40.42\n", "-15.45\n" ] } ], "source": [ "premium_rate_dict = {}\n", "for code in add_prefix_code:\n", " premium_rate = get_reits_netvalue(code)\n", " premium_rate_dict[code] = premium_rate\n" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'sh508096': 4.93,\n", " 'sz180501': 3.72,\n", " 'sh508021': 5.53,\n", " 'sz180801': 34.04,\n", " 'sh508088': 3.62,\n", " 'sh508008': 6.25,\n", " 'sh508031': 0.1,\n", " 'sh508028': 2.71,\n", " 'sh508006': 14.85,\n", " 'sz180301': 1.47,\n", " 'sh508068': 13.36,\n", " 'sh508001': 20.2,\n", " 'sz180201': -19.73,\n", " 'sh508077': 0.62,\n", " 'sh508000': -9.08,\n", " 'sh508058': 7.08,\n", " 'sz180103': -16.91,\n", " 'sh508007': 2.85,\n", " 'sh508099': -25.35,\n", " 'sz180202': 7.14,\n", " 'sh508009': -15.99,\n", " 'sh508056': -2.19,\n", " 'sh508066': 30.97,\n", " 'sh508027': -15.43,\n", " 'sz180101': -15.82,\n", " 'sz180102': -13.58,\n", " 'sz180401': 13.54,\n", " 'sh508019': -15.73,\n", " 'sh508018': -40.42,\n", " 'sh508098': -15.45}" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "premium_rate_dict" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "508096 中航京能光伏REIT 4.93\n", "180501 红土创新深圳安居REIT 3.72\n", "508021 国泰君安临港创新产业园REIT 5.53\n", "180801 中航首钢绿能REIT 34.04\n", "508088 国泰君安东久新经济REIT 3.62\n", "508008 国金中国铁建REIT 6.25\n", "508031 国泰君安城投宽庭保租房REIT 0.1\n", "508028 中信建投国家电投新能源REIT 2.71\n", "508006 富国首创水务REIT 14.85\n", "180301 红土创新盐田港REIT 1.47\n", "508068 华夏北京保障房REIT 13.36\n", "508001 浙商沪杭甬REIT 20.2\n", "180201 平安广州广河REIT -19.73\n", "508077 华夏基金华润有巢REIT 0.62\n", "508000 华安张江产业园REIT -9.08\n", "508058 中金厦门安居REIT 7.08\n", "180103 华夏和达高科REIT -16.91\n", "508007 中金山东高速REIT 2.85\n", "508099 建信中关村REIT -25.35\n", "180202 华夏越秀高速REIT 7.14\n", "508009 中金安徽交控REIT -15.99\n", "508056 中金普洛斯REIT -2.19\n", "508066 华泰江苏交控REIT 30.97\n", "508027 东吴苏园产业REIT -15.43\n", "180101 博时蛇口产园REIT -15.82\n", "180102 华夏合肥高新REIT -13.58\n", "180401 鹏华深圳能源REIT 13.54\n", "508019 中金湖北科投光谷REIT -15.73\n", "508018 华夏中国交建REIT -40.42\n", "508098 嘉实京东仓储基础设施REIT -15.45\n" ] } ], "source": [ "for code,premium_rate in premium_rate_dict.items():\n", " print(code[2:],name_mapper[code[2:]],premium_rate)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "508096 中航京能光伏REIT 4.93\n", "180501 红土创新深圳安居REIT 3.72\n", "508021 国泰君安临港创新产业园REIT 5.53\n", "180801 中航首钢绿能REIT 34.04\n", "508088 国泰君安东久新经济REIT 3.62\n", "508008 国金中国铁建REIT 6.25\n", "508031 国泰君安城投宽庭保租房REIT 0.1\n", "508028 中信建投国家电投新能源REIT 2.71\n", "508006 富国首创水务REIT 14.85\n", "180301 红土创新盐田港REIT 1.47\n", "508068 华夏北京保障房REIT 13.36\n", "508001 浙商沪杭甬REIT 20.2\n", "180201 平安广州广河REIT -19.73\n", "508077 华夏基金华润有巢REIT 0.62\n", "508000 华安张江产业园REIT -9.08\n", "508058 中金厦门安居REIT 7.08\n", "180103 华夏和达高科REIT -16.91\n", "508007 中金山东高速REIT 2.85\n", "508099 建信中关村REIT -25.35\n", "180202 华夏越秀高速REIT 7.14\n", "508009 中金安徽交控REIT -15.99\n", "508056 中金普洛斯REIT -2.19\n", "508066 华泰江苏交控REIT 30.97\n", "508027 东吴苏园产业REIT -15.43\n", "180101 博时蛇口产园REIT -15.82\n", "180102 华夏合肥高新REIT -13.58\n", "180401 鹏华深圳能源REIT 13.54\n", "508019 中金湖北科投光谷REIT -15.73\n", "508018 华夏中国交建REIT -40.42\n", "508098 嘉实京东仓储基础设施REIT -15.45\n" ] } ], "source": [ "for code,premium_rate in premium_rate_dict.items():\n", " print(code[2:],name_mapper[code[2:]],premium_rate)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "cpy", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: fund/reits_data_crawler.py ================================================ import datetime import requests import pandas as pd import sys sys.path.append('..') from configure.util import send_message_via_wechat today = datetime.datetime.now().strftime('%Y-%m-%d') def reits_realtime_em() -> pd.DataFrame: """ 东方财富网-行情中心-REITs-沪深 REITs http://quote.eastmoney.com/center/gridlist.html#fund_reits_all :return: 沪深 REITs-实时行情 :rtype: pandas.DataFrame """ url = "http://95.push2.eastmoney.com/api/qt/clist/get" params = { "pn": "1", "pz": "80", "po": "1", "np": "1", "ut": "bd1d9ddb04089700cf9c27f6f7426281", "fltt": "2", "invt": "2", "fid": "f3", "fs": "m:1 t:9 e:97,m:0 t:10 e:97", "fields": "f2,f3,f4,f5,f6,f12,f14,f15,f16,f17,f18", "_": "1630048369992", } r = requests.get(url, params=params) data_json = r.json() temp_df = pd.DataFrame(data_json["data"]["diff"]) temp_df.reset_index(inplace=True) temp_df["index"] = range(1, len(temp_df) + 1) temp_df.rename( { "index": "序号", "f2": "最新价", "f3": "涨跌幅", "f4": "涨跌额", "f5": "成交量", "f6": "成交额", "f12": "代码", "f14": "名称", "f15": "最高价", "f16": "最低价", "f17": "开盘价", "f18": "昨收", }, axis=1, inplace=True, ) temp_df = temp_df[ [ "序号", "代码", "名称", "最新价", "涨跌额", "涨跌幅", "成交量", "成交额", "开盘价", "最高价", "最低价", "昨收", ] ] return temp_df def get_reits_data(): msg = '从ak获取reits出错' try: reits_realtime_em_df = reits_realtime_em() except Exception as e: send_message_via_wechat(msg) else: if len(reits_realtime_em_df)==0: send_message_via_wechat(msg) else: from configure.settings import DBSelector engine = DBSelector().get_engine('db_reits','tencent-1c') reits_realtime_em_df.to_sql('reits-{}'.format(today),con=engine) if __name__=='__main__': get_reits_data() ================================================ FILE: fund/reits_history.py ================================================ import datetime import time import sys sys.path.append('..') import requests class ReitsHistoryData: def __init__(self): self.db = SQLCls() def crawl(self, code, ts): cookies = { 'device_id': '30c150d8bba6b59a776c2e783ab3baf4', 's': 'by1hv4ciih', '__utmz': '1.1645204918.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', 'bid': 'a8ec0ec01035c8be5606c595aed718d4_kztd4jue', 'xq_is_login': '1', 'u': '1733473480', 'Hm_lvt_fe218c11eab60b6ab1b6f84fb38bcc4a': '1666192921,1667440399', '__utma': '1.1751771128.1645204918.1667539442.1667824918.36', 'xq_a_token': '2cb229cbb333f6f67f87f92d753ac51667d886ba', 'xqat': '2cb229cbb333f6f67f87f92d753ac51667d886ba', 'xq_id_token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjE3MzM0NzM0ODAsImlzcyI6InVjIiwiZXhwIjoxNjcwNDY2MjIwLCJjdG0iOjE2Njc4NzQyMjA2ODMsImNpZCI6ImQ5ZDBuNEFadXAifQ.IeeTTZxq_6DL314VZn74eUBpyOSJ_rwajC1kA52oouGd1-RyVqVd8SEtLlTWr99f87BA1MC5djZlMQ4lyZVYUf4Jj8P2lEZl4MuP9_rRkpQs47Z7_ey0RhAGtP8Frcv3SSjz11gl_nqSaVTarCuocFGXtaET7DLjlWZeeDvdfyXE0iUXkH28N5l5PBhVhEUZUFI6zQDSubgW252JERVkoJNa3tQaDEbPfRAvDIFjpGkM9kBAPZYVi7LSlAzTzGEuBUodiVmMmeiD9xv3VpjCpfpQv6AbK4NPe8HfwIMulA8y5M3hYdAILBqqCz6D1iensibnWXZo0xnobnpGAQzp8A', 'xq_r_token': 'a5d6827d5621ceaac46ad8a5334c2210ba66952f', 'Hm_lvt_1db88642e346389874251b5a1eded6e3': '1667437811,1667531174,1667791869,1667874222', 'Hm_lpvt_1db88642e346389874251b5a1eded6e3': '1667889958', 'acw_tc': '2760779716678949087306123e2da0f6e6088fa3c13cf0f5b08312a995a828', } headers = { 'authority': 'stock.xueqiu.com', 'pragma': 'no-cache', 'cache-control': 'no-cache', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Linux"', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1', 'sec-fetch-dest': 'document', 'accept-language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6', # Requests sorts cookies= alphabetically # 'cookie': 'device_id=30c150d8bba6b59a776c2e783ab3baf4; s=by1hv4ciih; bid=a8ec0ec01035c8be5606c595aed718d4_kztd4jue; xq_is_login=1; u=1733473480; xq_a_token=ee50e61d2d5bebb8ad32b99f14979d990978f4f4; xqat=ee50e61d2d5bebb8ad32b99f14979d990978f4f4; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjE3MzM0NzM0ODAsImlzcyI6InVjIiwiZXhwIjoxNjY5MTY4NDQ4LCJjdG0iOjE2NjY1NzY0NDgyMTQsImNpZCI6ImQ5ZDBuNEFadXAifQ.c5zk94qs5IdvVRcFQCRBL4bsu5lPr1LaE61F2uxL6gZyoTsSWnwrcVwMYE3IasMMuqzhrU0GdPT76OQTCyv_tAV5-fOyOwrWtGAMqcSFeMtQcnhWKjNJS-oBNiR1hHEEBSYNdbg9tqoCyd6SymQnS2tJ6G_xBwSkGzEjL3ktNyKsEB0MbXrnrGQ0T8vwzNaT7DP1FNZisQeJF5pdYY-yU6fMAOtExO7P5GkBONxjf3f75c4hGpg-aFqAqKhMcvaQKSsJ2nmmBdrxg3p8bb7uuIXD9mOTiAGYTNB5fHk5uTbOUM0nt2KxKwvRnbfGMhTPb9a_igbFWfo7yzpyVEUV7g; xq_r_token=7e8d0a30f7c5b1e4f8d78dbdcc54460f423ef8b3; Hm_lvt_fe218c11eab60b6ab1b6f84fb38bcc4a=1666192921,1667440399; Hm_lvt_1db88642e346389874251b5a1eded6e3=1667371086,1667437811,1667531174,1667791869; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1667829976', } response = requests.get( 'https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol={}&begin={}&period=day&type=before&count=-100&indicator=kline,pe,pb,ps,pcf,market_capital,agt,ggt,balance'.format( code, ts), cookies=cookies, headers=headers) return response.json() def gen_params(self): fmt = "%Y-%m-%d %H:%M:%S" current = "2021-05-30 00:00:00" now = "2023-05-08 00:00:00" delta = 100 result = [] while current < now: current = datetime.datetime.strptime(current, fmt) current = (current + datetime.timedelta(days=delta)).strftime(fmt) b = time.strptime(current, fmt) arg = int(time.mktime(b)) * 1000 print(arg) result.append(arg) return result def convert_int(self, t): try: t = int(t) except Exception as e: return None else: return t def convert_float(self, f): try: f = float(f) except Exception as e: return None else: return f def parse(self, js_data, code): items = js_data.get('data', {}).get('item', []) for item in items: date = time.strftime('%Y-%m-%d', time.localtime(int(item[0] / 1000))) print(date) volume = self.convert_int(item[1]) open_p = self.convert_float(item[2]) high = self.convert_float(item[3]) low = self.convert_float(item[4]) close = self.convert_float(item[5]) chg = self.convert_float(item[6]) percent = self.convert_float(item[7]) turnoverrate = self.convert_float(item[8]) amount = self.convert_float(item[9]) data = (date, volume, open_p, high, low, close, chg, percent, turnoverrate, amount, code) self.db.insert_data(data) def run(self): # code_list ='SZ180101' code_list = [ 'SZ180501', 'SH508018', # 'SZ180301', # 'SH508099', # 'SZ180801', # 'SZ180101', # 'SH508088', # 'SH508066', # 'SH508009', # # "SZ180102", # "SH508001", # "SZ180401", # "SH508058", # "SH508068", # "SH508000", # "SH508006", # "SZ180201", # "SH508021", # "SH508027", # "SZ180202", # "SZ180301", # "SH508008", # "SH508099", # "SH508056", ] for code in code_list: print('crawling code {}'.format(code)) ts_list = self.gen_params() for ts in ts_list: js = self.crawl(code, ts) # print(js) self.parse(js, code) class SQLCls: def __init__(self): from configure.settings import DBSelector self.conn = DBSelector().get_mysql_conn('db_reits', 'tencent-1c') self.cursor = self.conn.cursor() def insert_data(self, item): sql = 'insert into `reits_history` (date,volume,open,high,low,close,chg,percent,turnoverrate,amount,code) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)' try: self.cursor.execute(sql, item) except Exception as e: print(e) self.conn.rollback() else: self.conn.commit() def main(): app = ReitsHistoryData() app.run() if __name__ == '__main__': main() ================================================ FILE: fund/reits_netvalue.py ================================================ # 获取REITS净值 import datetime import requests import sys import re sys.path.append('..') from configure.util import jsonp2json, send_message_via_wechat from configure.settings import DBSelector use_xq = True # 数据源 class ReitsNetValue: def __init__(self): self.today = datetime.datetime.now().strftime('%Y-%m-%d') self.conn = DBSelector().get_mysql_conn('db_reits', 'tencent-1c') self.init_db() def parse(self, js, code): history_netvalue = js.get('Data').get('LSJZList') if history_netvalue is None: send_message_via_wechat('{}净值为空'.format(code)) return for v in history_netvalue: value = v.get('DWJZ') # 单位净值 value = float(value) # 只取一个 return value def _crawl(self, code): cookies = { 'qgqp_b_id': '332e88303d7106e94890d3f5092fefe0', 'em_hq_fls': 'js', 'em-quote-version': 'topspeed', 'AUTH_FUND.EASTMONEY.COM_GSJZ': 'AUTH*TTJJ*TOKEN', 'mtp': '1', 'sid': '122139003', 'vtpst': '|', 'ct': 'j1dOTKvx0n34erwykWJT-LkDgtdqlgpIKqhaHBuGQoVYs-5dMUpIvnSlPVAXyHn4fqWREcXeNAsmo50J5F84BlVtjsHslZipCIVHjhGT1hUIH0F08toeazXUD3-sc0kjkjWruaRlT80EiY-WGnjbS_kRAk-68Aht9mATkPn2V7w', 'ut': 'FobyicMgeV52Ad4fCxim_J6Hiu_4oWVEmHIb_3mK_yBtSzU4NYwbb1XsCEwlNgravTA1WEhUxX_plWYgcyvv6uREyRhSEJuEk97vKkA83wkmUHbFQ5IH-6Q8zf0BJRewneTV1hKCWAkQ-bvJwMFO7btMLv0YgycBzupPDDp5bqEOOMxP3i_DMBHVmI1xPqxHRiyLqep9LNlZu9WrFc_KKG6gSKmTzs9-eEDRQ0JKMRVyqSxwRgsVJCurEHqL2hM6E7q-GPjcqA-Q6h5Re2GNkmQfnW5cLygQ', 'pi': '6590645210394316%3bk6590645210394316%3b%e5%8f%af%e8%bd%ac%e5%80%ba%e9%87%8f%e5%8c%96%e5%88%86%e6%9e%90%3bs5KvmCIggz%2byOz%2fkj9QXhelbHbq4%2fBnASP5ql16GcFwxOUB8j%2fYmyJpy0HxykvZMKc5LL0tbIPYL8FHmCEIjY%2b0j%2bWIh3o8AGcg6kfGdJGERRU1dSm9fAaO4aEeHqJC8gXGDXkMaREsjWIZhbT9%2fa8mP5d0klCVoQtE0IBoAM0tQR%2bqtK8ot5FKkxw%2bnHSfjSrYdRm%2ft%3bCknGIwcEf88zLcToJmOXWQLq3GYVRzB%2bCVwDf2BaM4K%2bYW1mbDF5PmMJFwER7bwAmz%2buYfOkCRn4I17Nx4d%2fowe0ifes6eR8JbieW0X2zFpqLgn3jQ%2feaRn6R3ifly8t9Sc%2fa7lgoFlFV5JCtjI3f0u5Zzus9A%3d%3d', 'uidal': '6590645210394316%e5%8f%af%e8%bd%ac%e5%80%ba%e9%87%8f%e5%8c%96%e5%88%86%e6%9e%90', 'isCoverBgSelectCrop': 'true', 'EmFundFavorVersion2': '0', 'st_si': '64325209590844', 'st_asi': 'delete', 'HAList': 'ty-1-508099-%u5EFA%u4FE1%u4E2D%u5173%u6751REIT%2Cty-0-180501-%u7EA2%u571F%u6DF1%u5733%u5B89%u5C45REIT%2Cty-90-BK0528-%u8F6C%u503A%u6807%u7684%2Ca-sh-124290-PR%u957F%u8F68%u4EA4%2Cty-1-508066-%u82CF%u4EA4REIT%2Cty-1-508009-%u5B89%u5FBD%u4EA4%u63A7%2Cty-1-508018-%u534E%u590F%u4E2D%u56FD%u4EA4%u5EFAREIT%2Cty-0-180801-%u4E2D%u822A%u9996%u94A2%u7EFF%u80FDREIT%2Cty-0-300498-%u6E29%u6C0F%u80A1%u4EFD%2Cty-1-600754-%u9526%u6C5F%u9152%u5E97', 'guba_blackUserList': '2546376295120552', 'st_pvi': '30849193689390', 'st_sp': '2022-02-19%2022%3A30%3A59', 'st_inirUrl': 'https%3A%2F%2Ffund.eastmoney.com%2F', 'st_sn': '11', 'st_psi': '20230105113427388-113200301327-1659036638', } headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"', 'sec-ch-ua-mobile': '?0', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36', 'sec-ch-ua-platform': '"Linux"', 'Accept': '*/*', 'Sec-Fetch-Site': 'same-site', 'Sec-Fetch-Mode': 'no-cors', 'Sec-Fetch-Dest': 'script', 'Referer': 'https://fundf10.eastmoney.com/', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6', # 'Cookie': 'qgqp_b_id=332e88303d7106e94890d3f5092fefe0; em_hq_fls=js; em-quote-version=topspeed; AUTH_FUND.EASTMONEY.COM_GSJZ=AUTH*TTJJ*TOKEN; mtp=1; sid=122139003; vtpst=|; ct=j1dOTKvx0n34erwykWJT-LkDgtdqlgpIKqhaHBuGQoVYs-5dMUpIvnSlPVAXyHn4fqWREcXeNAsmo50J5F84BlVtjsHslZipCIVHjhGT1hUIH0F08toeazXUD3-sc0kjkjWruaRlT80EiY-WGnjbS_kRAk-68Aht9mATkPn2V7w; ut=FobyicMgeV52Ad4fCxim_J6Hiu_4oWVEmHIb_3mK_yBtSzU4NYwbb1XsCEwlNgravTA1WEhUxX_plWYgcyvv6uREyRhSEJuEk97vKkA83wkmUHbFQ5IH-6Q8zf0BJRewneTV1hKCWAkQ-bvJwMFO7btMLv0YgycBzupPDDp5bqEOOMxP3i_DMBHVmI1xPqxHRiyLqep9LNlZu9WrFc_KKG6gSKmTzs9-eEDRQ0JKMRVyqSxwRgsVJCurEHqL2hM6E7q-GPjcqA-Q6h5Re2GNkmQfnW5cLygQ; pi=6590645210394316%3bk6590645210394316%3b%e5%8f%af%e8%bd%ac%e5%80%ba%e9%87%8f%e5%8c%96%e5%88%86%e6%9e%90%3bs5KvmCIggz%2byOz%2fkj9QXhelbHbq4%2fBnASP5ql16GcFwxOUB8j%2fYmyJpy0HxykvZMKc5LL0tbIPYL8FHmCEIjY%2b0j%2bWIh3o8AGcg6kfGdJGERRU1dSm9fAaO4aEeHqJC8gXGDXkMaREsjWIZhbT9%2fa8mP5d0klCVoQtE0IBoAM0tQR%2bqtK8ot5FKkxw%2bnHSfjSrYdRm%2ft%3bCknGIwcEf88zLcToJmOXWQLq3GYVRzB%2bCVwDf2BaM4K%2bYW1mbDF5PmMJFwER7bwAmz%2buYfOkCRn4I17Nx4d%2fowe0ifes6eR8JbieW0X2zFpqLgn3jQ%2feaRn6R3ifly8t9Sc%2fa7lgoFlFV5JCtjI3f0u5Zzus9A%3d%3d; uidal=6590645210394316%e5%8f%af%e8%bd%ac%e5%80%ba%e9%87%8f%e5%8c%96%e5%88%86%e6%9e%90; isCoverBgSelectCrop=true; EmFundFavorVersion2=0; st_si=64325209590844; st_asi=delete; HAList=ty-1-508099-%u5EFA%u4FE1%u4E2D%u5173%u6751REIT%2Cty-0-180501-%u7EA2%u571F%u6DF1%u5733%u5B89%u5C45REIT%2Cty-90-BK0528-%u8F6C%u503A%u6807%u7684%2Ca-sh-124290-PR%u957F%u8F68%u4EA4%2Cty-1-508066-%u82CF%u4EA4REIT%2Cty-1-508009-%u5B89%u5FBD%u4EA4%u63A7%2Cty-1-508018-%u534E%u590F%u4E2D%u56FD%u4EA4%u5EFAREIT%2Cty-0-180801-%u4E2D%u822A%u9996%u94A2%u7EFF%u80FDREIT%2Cty-0-300498-%u6E29%u6C0F%u80A1%u4EFD%2Cty-1-600754-%u9526%u6C5F%u9152%u5E97; guba_blackUserList=2546376295120552; st_pvi=30849193689390; st_sp=2022-02-19%2022%3A30%3A59; st_inirUrl=https%3A%2F%2Ffund.eastmoney.com%2F; st_sn=11; st_psi=20230105113427388-113200301327-1659036638', } params = { 'callback': 'jQuery1830021091296784611746_1672888084129', 'fundCode': code, 'pageIndex': '1', 'pageSize': '20', 'startDate': '', 'endDate': '', '_': '1672889709799', } response = requests.get('https://api.fund.eastmoney.com/f10/lsjz', params=params, cookies=cookies, headers=headers) # print(response.text) return response.text def _crawl_xueqiu(self, code): cookies = { 'device_id': 'a17524517d64d99ddef6e4461172f193', 's': 'bm121wffjs', 'bid': '4a7809eff12dfb426fecf9028b9a8727_l4uxvrvc', '__utmz': '1.1656225474.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', 'Hm_lvt_fe218c11eab60b6ab1b6f84fb38bcc4a': '1665024572', '__utma': '1.1419494795.1656225474.1664588616.1666267539.5', 'acw_tc': '2760826416729018198398134e73095176de6c11cfdc2253bd48f682437a5a', 'xq_a_token': '140b9d69cb9f100ad486013ceeb783e9bb0696f5', 'xqat': '140b9d69cb9f100ad486013ceeb783e9bb0696f5', 'xq_r_token': '51944912a96da76eef33a19d179cbfa8812d17e8', 'xq_id_token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTY3NDc3ODgwNiwiY3RtIjoxNjcyOTAxNzg3NjM3LCJjaWQiOiJkOWQwbjRBWnVwIn0.Kxgsb_pvhnfJi_TYN7kZMPNa6coextiPeuuoJxw59h7JHVIW9SgxeCreaB3RVEb0lXhJN7F38J19fovrDCm7pLYKGQZIVKtwaRdpoxc25jveiLtX8Mv4wKCPiaSYe4Fn1uUHIUUogbfcWKS1-TNO5d9d_Bp-qISwUfzITJfk6z3jgiiO6v4pEtXpI1URCYpp0fBFHSh4zdF9gPYUL2_tt2rM6z4x9shdisFhC0pcMyOllrMY-UnpqEYXo1arfh4SuPvQjFTM0PF2-fviOXWQTicuFHuVVreThAtsklEki0qu1Hzo2NDmlF3TxT1oCZkRVDSwigweB-EYxSnQjRT0Cw', 'u': '741672901819844', 'is_overseas': '0', 'Hm_lvt_1db88642e346389874251b5a1eded6e3': '1670512071,1670995961,1672799893,1672901824', 'Hm_lpvt_1db88642e346389874251b5a1eded6e3': '1672901824', } headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Linux"', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Accept-Language': 'zh-CN,zh;q=0.9', # 'Cookie': 'device_id=a17524517d64d99ddef6e4461172f193; s=bm121wffjs; bid=4a7809eff12dfb426fecf9028b9a8727_l4uxvrvc; __utmz=1.1656225474.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); Hm_lvt_fe218c11eab60b6ab1b6f84fb38bcc4a=1665024572; __utma=1.1419494795.1656225474.1664588616.1666267539.5; acw_tc=2760826416729018198398134e73095176de6c11cfdc2253bd48f682437a5a; xq_a_token=140b9d69cb9f100ad486013ceeb783e9bb0696f5; xqat=140b9d69cb9f100ad486013ceeb783e9bb0696f5; xq_r_token=51944912a96da76eef33a19d179cbfa8812d17e8; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTY3NDc3ODgwNiwiY3RtIjoxNjcyOTAxNzg3NjM3LCJjaWQiOiJkOWQwbjRBWnVwIn0.Kxgsb_pvhnfJi_TYN7kZMPNa6coextiPeuuoJxw59h7JHVIW9SgxeCreaB3RVEb0lXhJN7F38J19fovrDCm7pLYKGQZIVKtwaRdpoxc25jveiLtX8Mv4wKCPiaSYe4Fn1uUHIUUogbfcWKS1-TNO5d9d_Bp-qISwUfzITJfk6z3jgiiO6v4pEtXpI1URCYpp0fBFHSh4zdF9gPYUL2_tt2rM6z4x9shdisFhC0pcMyOllrMY-UnpqEYXo1arfh4SuPvQjFTM0PF2-fviOXWQTicuFHuVVreThAtsklEki0qu1Hzo2NDmlF3TxT1oCZkRVDSwigweB-EYxSnQjRT0Cw; u=741672901819844; is_overseas=0; Hm_lvt_1db88642e346389874251b5a1eded6e3=1670512071,1670995961,1672799893,1672901824; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1672901824', } if code.startswith('5'): code = 'SH' + code else: code = 'SZ' + code response = requests.get('https://xueqiu.com/S/{}'.format(code), cookies=cookies, headers=headers) return response.text def update_sql(self, sql_str, data): cursor = self.conn.cursor() try: cursor.execute(sql_str, args=data) except Exception as e: send_message_via_wechat('更新数据错误 {}'.format(e)) self.conn.rollback() else: self.conn.commit() def dump_mysql(self, code, name, netvalue, updated): sql_str = 'insert into `tb-reits-netvalue` (code,name,netvalue,updated) values (%s,%s,%s,%s) on duplicate key update `netvalue`=%s,updated=%s' self.update_sql(sql_str, (code, name, netvalue, updated, netvalue,updated)) def parse_xueqiu(self, content): m = re.search('"acc_unit_nav":(.*?),', content) if m: return float(m.group(1)) return 0 def get_netvalue_by_code(self, code, name): if use_xq: text = self._crawl_xueqiu(code) netvalue = self.parse_xueqiu(text) else: text = self._crawl(code) js = jsonp2json(text) netvalue = self.parse(js,code) updated_time = datetime.datetime.now() self.dump_mysql(code, name, netvalue, updated_time) def read_sql(self, sql_str, data): cursor = self.conn.cursor() try: cursor.execute(sql_str, data) except Exception as e: send_message_via_wechat('{}'.format(e)) raise ValueError(e) else: result = cursor.fetchall() return result def get_all_codes(self): sql_str = 'select `代码`,`名称` from `reits-{}` where `最新价`<>%s'.format('2023-01-04') result = self.read_sql(sql_str, ('-',)) code_list = [] for item in result: code_list.append((item[0], item[1])) return code_list def init_db(self): sql_str = 'create table if not exists `tb-reits-netvalue` (code varchar(6) ,name varchar(128),netvalue float,updated datetime,primary key(code)) engine=InnoDB default charset=utf8mb4' self.update_sql(sql_str, None) def run(self): all_reits_code = self.get_all_codes() for code, name in all_reits_code: self.get_netvalue_by_code(code, name) if __name__ == '__main__': app = ReitsNetValue() app.run() ================================================ FILE: fund/run_sh_fundshare.py ================================================ # -*- coding: UTF-8 -*- """ @author:xda @file:run_sh_fundshare.py @time:2021/01/24 """ from fund_share_crawl import SHFundShare import fire def main(kind,date='now'): ''' LOF 20210101 ETF 2021-01-01 :param kind: :param date: :return: ''' # date='2021-03-17' # print('data ', date) app = SHFundShare(first_use=False,kind=kind,date=date) app.run() if __name__ == '__main__': ''' --kind=ETF --date=now # ''' fire.Fire(main) ================================================ FILE: fund/run_sz_fundshare.py ================================================ # -*- coding: UTF-8 -*- """ @author:xda @file:run_sz_fundshare.py @time:2021/01/24 """ from fund_share_crawl import SZFundShare if __name__ == '__main__': app = SZFundShare(first_use=False) app.run() ================================================ FILE: fund/sqlhelper.py ================================================ from configure.settings import DBSelector import loguru logger = loguru.logger class SQLHelper(): def __init__(self,host,db_name): self.conn = DBSelector().get_engine(db_name, host) self.db = DBSelector().get_mysql_conn(db_name, host) self.cursor = self.db.cursor() def query(self, sql_str, args): try: self.cursor.execute(sql_str,args=args) except Exception as e: logger.error(e) self.db.rollback() return None else: ret= self.cursor.fetchall() return ret def update(self, sql_str, args=None): try: self.cursor.execute(sql_str, args=args) except Exception as e: logger.error(e) self.db.rollback() return False else: self.db.commit() return True ================================================ FILE: fund/stop_purchase_lof_fund.py ================================================ # 暂停申购的基金 import datetime import sys sys.path.append('..') from configure.util import send_message_via_wechat,is_weekday_today from configure.settings import DBSelector import pandas as pd import requests import demjson headers = { 'Accept': '*/*', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6', 'Referer': 'http://fund.eastmoney.com/HH_jzzzl.html', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', } mapper = {'lof':8,'qdii':6} cookies = { 'qgqp_b_id': '613083479b0a0e85cff3fc668cfd26ea', 'mtp': '1', 'ct': 'AAg2I3p6vBNVbq9JXnqvYYNJnSSTtLmlB_L3-rt4gW7nTU2nNJRVgRd-bmzw0xqTyTiO64OpbJ0ytLSgLAlkg6pFla3UGEuIAlqZbY7U9lJ2l-tlQ62uRRf08x8ObnhgW2Gecs-xS74dNFza2NUQHQe21nAwVxC3KSa2TTTfA9k', 'ut': 'FobyicMgeV52Ad4fCxim_H1USOAH2Xm1YM92wqcPQxLzEfFPyFgALYPBNjAWe11vwFJMDDUgbUeakhrr5gkoHiMO9BHZpsgY0PM4ZE67fDEFx_5Sol0sbtwFlqqb1mwGSqt9Tg7H6EXBbmb4nHyFdQnQXrjIXbqYckVu6-tPdGioP8WnUZtF6iIgiBphOYuGyg5g83iA3KQzZIcJBbocRLgwbJUY5TRbRsL_EwEd_pbc0eQWFFSli-yKuYFXnezjcnHZBV4ig4uP4yQs-WNnoBE1Y2AqA1gk', 'pi': '6590645210394316%3bk6590645210394316%3b%e5%8f%af%e8%bd%ac%e5%80%ba%e9%87%8f%e5%8c%96%e5%88%86%e6%9e%90%3bv2fMOy74x0b0%2fP%2b1n8jNmRRko8sGBLDXRAPZzqn7zdwseSdYB%2bHgLI1Qwtldp5xlFXYj8RlzrWy7XLL4Jgrtx7gDjCcmCG%2bwwB09Jkf6n3dbGfm4eHEQpYA%2b46tj0jUL3UfHRfr1c3wWFFdITTvk6M6qaLzHo1IJT0jnl2IEomTj6KgRZbq8ffXyCSJhaoJuP3CBuYo4%3b1dpLFwCAxxJm9AfI8kFhD0ECSrD234b2cXEDviN9FfkFNNONh7Bq%2bnJQ8Ki1skgnKHD2A9RQ0PoqhCkLKHzACpdk%2b2XmzIPuG9YXz9pNo9wOstx41mYli70dYnbgMM3sKm0bn0WzYrIIZXWyrMtlcMr3y1R%2bzA%3d%3d', 'uidal': '6590645210394316%e5%8f%af%e8%bd%ac%e5%80%ba%e9%87%8f%e5%8c%96%e5%88%86%e6%9e%90', 'sid': '122139003', 'vtpst': '|', 'EmFundFavorVersion2': '0', 'st_si': '67006181870113', 'emshistory': '%5B%22161128%22%5D', 'HAList': 'ty-0-161128-%u6807%u666E%u4FE1%u606F%u79D1%u6280LOF%2Cty-0-123096-%u601D%u521B%u8F6C%u503A%2Cty-1-688570-%u5929%u739B%u667A%u63A7%2Cty-116-00293-%u56FD%u6CF0%u822A%u7A7A%2Cty-105-WLGS-%u5B8F%u5229%u8425%u9020%2Cty-105-NIU-%u5C0F%u725B%u7535%u52A8%2Cty-0-000070-%u7279%u53D1%u4FE1%u606F', 'ASP.NET_SessionId': '5xsk0luksl1mxpthkcmmhfms', 'st_asi': 'delete', 'st_pvi': '30849193689390', 'st_sp': '2022-02-19%2022%3A30%3A59', 'st_inirUrl': 'https%3A%2F%2Ffund.eastmoney.com%2F', 'st_sn': '32', 'st_psi': '20230628184744669-118000300904-1111826291', } class FundPurchaseEm: today = datetime.datetime.today().strftime('%Y-%m-%d') def fund_purchase_em(self,types) -> pd.DataFrame: """ 东方财富网站-天天基金网-基金数据-基金申购状态 https://fund.eastmoney.com/Fund_sgzt_bzdm.html#fcode,asc_1 :return: 基金申购状态 :rtype: pandas.DataFrame """ url = "http://fund.eastmoney.com/Data/Fund_JJJZ_Data.aspx" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" } args = mapper.get(types,1) params = { "t": "1", "lx": str(args), "page": "1,50000", "js": "db", "sort": "fcode,asc", "_": "1641528557742", } MAX_COUNT = 10 for i in range(MAX_COUNT): try: r = requests.get(url, params=params, headers=headers,cookies=cookies) except Exception as e: print(e) continue else: break if i == MAX_COUNT - 1: send_message_via_wechat("{} 获取基金申购失败!".format(self.today)) raise ValueError('MAX_COUNT times retry failed') data_text = r.text # print(data_text) try: data_json = demjson.decode(data_text.strip("var db=")) except Exception as e: print(data_text) send_message_via_wechat("{} 获取基金申购失败! 解析出错".format(self.today)) raise ValueError('MAX_COUNT times retry failed') temp_df = pd.DataFrame(data_json["datas"]) temp_df.reset_index(inplace=True) temp_df["index"] = temp_df.index + 1 temp_df.columns = [ "序号", "基金代码", "基金简称", "拼音", "今日单位净值", "今日累计净值", "昨日单位净值", "昨日累计净值", "日增长值", "日增长率", "申购状态", "赎回状态", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" ] temp_df = temp_df[ [ "基金代码", "基金简称", "拼音", "今日单位净值", "今日累计净值", "昨日单位净值", "昨日累计净值", "日增长值", "日增长率", "申购状态", "赎回状态", ] ] temp_df['类别']=types temp_df['更新时间']=datetime.datetime.now() return temp_df def run(self): if not is_weekday_today(): return for k,v in mapper.items(): data = self.fund_purchase_em(k) data.to_excel('../data/{}-基金申购状态-{}.xlsx'.format(self.today,k), encoding='utf8') engine = DBSelector().get_engine('db_fund_purchase','qq') data.to_sql('fund_purchase_{}'.format(self.today), engine, index=False, if_exists='append') if __name__ == '__main__': app = FundPurchaseEm() app.run() ================================================ FILE: fund/sz_etf.py ================================================ # -*- coding: UTF-8 -*- """ @author:xda @file:sz_etf.py @time:2021/01/24 """ # 后续废弃 def szse_etf(): Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() sess = requests.Session() url = 'http://www.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=1812_zs&TABKEY=tab1&PAGENO={}&random=0.4572618756063547' for i in range(1, 10): s = sess.get(url=url.format(i), headers={'User-Agent': 'Molliza Firefox Chrome'}) ret = s.json() if len(ret) > 0: data = ret[0].get('data') for d in data: zsdm = d.get('zsdm') zsmc = d.get('zsmc') code = re.search('(.*?)', zsdm).group(1) detail_url = re.search('href=\'(.*?)\'', zsdm).group(1) name = re.search('(.*?)', zsmc).group(1) jrnew = d.get('jrnew') jrzs = d.get('jrzs') qsrnew = d.get('qsrnew') obj = IndexObjectSZ( 代码=code, 指数名称=name, 详细URL=detail_url, 基日=jrnew, 基日指数=jrzs, 起始计算日=qsrnew, ) session.add(obj) session.commit() def szse_etf_detail(): client = pymongo.MongoClient() doc = client['fund']['etf_info_sz'] Session = sessionmaker(bind=engine) session = Session() ret = session.query(IndexObjectSZ).all() sess = requests.Session() url = 'http://www.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=1747_zs&TABKEY=tab1&ZSDM={}&random=0.5790989240667317' sub_url = 'http://www.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=1747_zs&TABKEY=tab1&PAGENO={}&ZSDM={}&random=0.29981446895718666' for item in ret: code = item.代码 name = item.指数名称 r = sess.get(url.format(code), headers={'User-Agent': 'Molliza Firefox Chrome'}) js = r.json() t = {} t['指数代码'] = code t['指数名称'] = name t_list = [] if js is not None and len(js) > 0: data = js[0] page = data.get('metadata', {}).get('pagecount', 0) for i in range(1, page + 1): s1 = sess.get(url=sub_url.format(i, code), headers={'User-Agent': 'Molliza Firefox Chrome'}) r1 = s1.json() if r1 is not None and len(r1) > 0: stock_list = r1[0].get('data') for st in stock_list: zqdm = st.get('zqdm') zqjc = st.get('zqjc') zgb = st.get('zgb') # 总股本 ltgb = st.get('ltgb') # 流通股本 hylb = st.get('hylb') # nrzsjs = st.get('nrzsjs') d = {} d['证券代码'] = zqdm d['证券简称'] = zqjc d['总股本'] = zgb d['流通股本'] = ltgb d['行业列表'] = hylb d['nrzsjs'] = nrzsjs t_list.append(d) t['成分股数据'] = t_list try: doc.insert_one(t) except Exception as e: logger.error(e) ================================================ FILE: fund/ttfund_etf_holding.py ================================================ import time import datetime import fire import requests import sys sys.path.append('..') from configure.settings import DBSelector from configure.util import js2json # code = '270042' # name = '广发纳指100ETF联接人民币(QDII)C' # year = '2016' headers = { "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6", "Cookie": "qgqp_b_id=332e88303d7106e94890d3f5092fefe0; em_hq_fls=js; HAList=a-sz-300636-%u540C%u548C%u836F%u4E1A%2Cty-107-XOP-%u6CB9%u6C14%u5F00%u91C7ETF-SPDR%20S%26P%2Cty-105-SQQQ-%u4E09%u500D%u505A%u7A7A%u7EB3%u65AF%u8FBE%u514B100ETF%2Ca-sh-603876-%u9F0E%u80DC%u65B0%u6750%2Ca-sz-000599-%u9752%u5C9B%u53CC%u661F%2Cty-1-113534-%u9F0E%u80DC%u8F6C%u503A%2Cty-0-160143-%u521B%u4E1A%u677F%u5B9A%u5F00%u5357%u65B9%2Ca-sz-002455-%u767E%u5DDD%u80A1%u4EFD%2Cty-116-00700-%u817E%u8BAF%u63A7%u80A1; em-quote-version=topspeed; st_si=77333725236219; st_asi=delete; EMFUND1=null; EMFUND2=null; EMFUND3=null; EMFUND4=null; EMFUND5=null; ASP.NET_SessionId=yionbf3rvyddx1kplfv4jo3a; EMFUND0=null; EMFUND7=06-06%2018%3A11%3A09@%23%24%u5E7F%u53D1%u7EB3%u65AF%u8FBE%u514B100ETF@%23%24159941; EMFUND8=06-06%2018%3A14%3A07@%23%24%u5E7F%u53D1%u7EB3%u6307100ETF%u8054%u63A5%u4EBA%u6C11%u5E01%28QDII%29C@%23%24006479; EMFUND9=06-06%2018%3A23%3A04@%23%24%u5E7F%u53D1%u7EB3%u6307100ETF%u8054%u63A5%u4EBA%u6C11%u5E01%28QDII%29A@%23%24270042; EMFUND6=06-06 18:23:27@#$%u56FD%u6CF0%u7EB3%u65AF%u8FBE%u514B100ETF@%23%24513100; st_pvi=30849193689390; st_sp=2022-02-19%2022%3A30%3A59; st_inirUrl=https%3A%2F%2Ffund.eastmoney.com%2F; st_sn=21; st_psi=20220606182327258-112200305282-6535572517", "Host": "fundf10.eastmoney.com", "Referer": "http://fundf10.eastmoney.com/ccmx_159941.html", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36", } class FundHolding(): def __init__(self, code, year,is_stock=True) -> None: self.current_year = year self.code = code client = DBSelector().mongo('qq') self.doc = client['db_stock']['fund_component_{}'.format(code)] self.is_stock= is_stock # 股还是债 @property def FLAG(self): return '股' if self.is_stock else '债' def get_content(self, code, year): print('year ========== ', year) if self.is_stock: url = 'http://fundf10.eastmoney.com/FundArchivesDatas.aspx?type=jjcc&code={}&topline=10&year={}&month=&rt=0.7286081766586014'.format( code, year) else: url = 'http://fundf10.eastmoney.com/FundArchivesDatas.aspx?type=zqcc&code={}&topline=10&year={}&month=&rt=0.7286081766586014'.format( code, year) resp = requests.get(url, headers=headers) data = js2json(resp.text) return data['content'], data['arryear'] def insert_mongodb(self, item): try: self.doc.update_one({'name':item['name'],'date':item['date']},{'$set':item},upsert=True) except Exception as e: print(e) def parse(self, content): from parsel import Selector resp = Selector(text=content) boxes = resp.xpath('//div[@class="box"]') for box in boxes: date = box.xpath( './/div[@class="boxitem w790"]/h4/label[@class="right lab2 xq505"]/font/text()').extract_first() rows = box.xpath( './/div[@class="boxitem w790"]/table[@class="w782 comm tzxq t2"]/tbody/tr') if len(rows) == 0: rows = box.xpath( './/div[@class="boxitem w790"]/table[@class="w782 comm tzxq"]/tbody/tr') for _row in rows: item = {} row = _row.xpath('.//td') if len(row) == 9: name = row[1].xpath('.//a/text()').extract_first() chn_name = row[2].xpath('.//a/text()').extract_first() weight = row[6].xpath('.//text()').extract_first() holding_share = row[7].xpath('.//text()').extract_first() holding_mount = row[8].xpath('.//text()').extract_first() else: if self.is_stock: name = row[1].xpath('.//a/text()').extract_first() chn_name = row[2].xpath('.//a/text()').extract_first() weight = row[4].xpath('.//text()').extract_first() holding_share = row[5].xpath('.//text()').extract_first() holding_mount = row[6].xpath('.//text()').extract_first() else: # 债 if len(row)==5: name = row[1].xpath('.//text()').extract_first() chn_name = row[2].xpath('.//text()').extract_first() weight = row[3].xpath('.//text()').extract_first() holding_mount = row[4].xpath('.//text()').extract_first() holding_share=None item['name'] = name item['chn_name'] = chn_name item['weight'] = weight item['holding_mount'] = holding_mount item['holding_share'] = holding_share item['date'] = date item['type']=self.FLAG item['crawltime'] = datetime.datetime.now() self.insert_mongodb(item) print('====') def run(self): _, years = self.get_content(self.code, self.current_year) for year in years: content, _year = self.get_content(self.code, year) self.parse(content) time.sleep(3) def main(year='2022', code='008331',is_stock=False): app = FundHolding(code, year,is_stock) app.run() def paralle_run(): code_list = [{'code': '008331', 'name': '万家可转债债券A'}, {'code': '000297', 'name': '鹏华可转债'}, {'code': '006482', 'name': '广发可转债债券A'}, {'code': '000536', 'name': '前海开源可转债债券'}, {'code': '310518', 'name': '申万菱信可转债债券A'}, {'code': '240018', 'name': '华宝可转债债券'}, {'code': '340001', 'name': '兴全可转债混合'}, {'code': '005273', 'name': '华商可转债A'}, {'code': '470058', 'name': '汇添富可转换债券A'}, {'code': '110035', 'name': '易方达双债增强A'}, {'code': '008809', 'name': '安信民稳增长混合A'}, {'code': '005876', 'name': '易方达鑫转增利混合A'}, {'code': '006102', 'name': '浙商丰利增强债券'}, {'code': '003092', 'name': '华商丰利增强定开债A'}] for code in code_list: code_=code['code'] name=code['name'] app = FundHolding(code_,'2022',False) app.run() if __name__ == '__main__': # fire.Fire(main) paralle_run() ================================================ FILE: fund/ttjj.py ================================================ # -*- coding: utf-8 -*- # website: http://30daydo.com # @Time : 2020/8/26 19:58 # @File : ttjj.py import sys # import execjs import fire import pymongo from parsel import Selector import demjson sys.path.append('..') import requests import datetime import time import json from configure.settings import DBSelector from common.BaseService import BaseService import loguru import re LOG = loguru.logger class TTFund(BaseService): '''' 爬取天天基金网的排名数据 ''' def __init__(self, key='股票'): super(TTFund, self).__init__() self.ft_dict = {'混合': 'hh', # 类型 gp: 股票 hh: 混合 '股票': 'gp', 'qdii': 'qdii', 'lof': 'lof', # not working now 'fof': 'fof', '指数': 'zs', '债券': 'zq', 'etf': 'etf', } self.key = key self.date_format = datetime.datetime.now().strftime('%Y_%m_%d') # self.date_format = '2021_12_15' self.doc = self.mongo()['db_stock']['ttjj_rank_{}'.format(self.date_format)] @property def headers(self): return { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Cache-Control": "no-cache", "Cookie": "AUTH_FUND.EASTMONEY.COM_GSJZ=AUTH*TTJJ*TOKEN; em_hq_fls=js; HAList=a-sh-603707-%u5065%u53CB%u80A1%u4EFD%2Ca-sz-300999-%u91D1%u9F99%u9C7C%2Ca-sh-605338-%u5DF4%u6BD4%u98DF%u54C1%2Ca-sh-600837-%u6D77%u901A%u8BC1%u5238%2Ca-sh-600030-%u4E2D%u4FE1%u8BC1%u5238%2Ca-sz-300059-%u4E1C%u65B9%u8D22%u5BCC%2Cd-hk-06185; EMFUND1=null; EMFUND2=null; EMFUND3=null; EMFUND4=null; qgqp_b_id=956b72f8de13e912a4fc731a7845a6f8; searchbar_code=163407_588080_501077_163406_001665_001664_007049_004433_005827_110011; EMFUND0=null; EMFUND5=02-24%2019%3A30%3A19@%23%24%u5357%u65B9%u6709%u8272%u91D1%u5C5EETF%u8054%u63A5C@%23%24004433; EMFUND6=02-24%2021%3A46%3A42@%23%24%u5357%u65B9%u4E2D%u8BC1%u7533%u4E07%u6709%u8272%u91D1%u5C5EETF@%23%24512400; EMFUND7=02-24%2021%3A58%3A27@%23%24%u6613%u65B9%u8FBE%u84DD%u7B79%u7CBE%u9009%u6DF7%u5408@%23%24005827; EMFUND8=03-05%2015%3A33%3A29@%23%24%u6613%u65B9%u8FBE%u4E2D%u5C0F%u76D8%u6DF7%u5408@%23%24110011; EMFUND9=03-05 23:47:41@#$%u5929%u5F18%u4F59%u989D%u5B9D%u8D27%u5E01@%23%24000198; ASP.NET_SessionId=ntwtbzdkb0vpkzvil2a3h1ip; st_si=44251094035925; st_asi=delete; st_pvi=77351447730109; st_sp=2020-08-16%2015%3A54%3A02; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=3; st_psi=20210309200219784-0-8081344721", "Host": "fund.eastmoney.com", "Pragma": "no-cache", "Proxy-Connection": "keep-alive", "Referer": "http://fund.eastmoney.com/data/fundranking.html", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36", } def mongo(self): return DBSelector().mongo('qq') def rank(self): time_interval = 'jnzf' # jnzf:今年以来 3n: 3年 # key='混合' # key='股票' self.category_rank(self.key, time_interval) def category_rank(self, key, time_interval): ft = self.ft_dict[key] td_str = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d') td_dt = datetime.datetime.strptime(td_str, '%Y-%m-%d') # 去年今日 last_dt = td_dt - datetime.timedelta(days=365) last_str = datetime.datetime.strftime(last_dt, '%Y-%m-%d') # rank_url = 'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft={0}&rs=&gs=0&sc={1}zf&st=desc&sd={2}&ed={3}&qdii=&tabSubtype=,,,,,&pi=1&pn=10000&dx=1'.format( # ft, time_interval, last_str, td_str) rank_url = 'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft={0}&rs=&gs=0&sc={1}&st=desc&sd={2}&ed={3}&qdii=&tabSubtype=,,,,,&pi=1&pn=10000&dx=1'.format( ft, time_interval, last_str, td_str) content = self.get(url=rank_url) rank_data = self.parse(content) rank_list = self.key_remap(rank_data, key) self.save_data(rank_list) def save_data(self, rank_list): try: self.doc.insert_many(rank_list) except Exception as e: print(e) def parse(self, rp): # print(content) # js_content = execjs.compile(content) # rank = js_content.eval("rankData") rank_txt = rp[rp.find('=') + 2:rp.rfind(';')] rank_rawdata = demjson.decode(rank_txt) return rank_rawdata['datas'] def key_remap(self, rank_data, type_): ''' 映射key value ''' # print(rank_data) colums = ['基金代码', '基金简称', '缩写', '日期', '单位净值', '累计净值', '日增长率(%)', '近1周增幅', '近1月增幅', '近3月增幅', '近6月增幅', '近1年增幅', '近2年增幅', '近3年增幅', '今年来', '成立来', '成立日期', '购买手续费折扣', '自定义', '手续费原价?', '手续费折后?', '布吉岛1', '布吉岛2', '布吉岛3', '布吉岛4'] return_rank_data = [] for rank in rank_data: rand_dict = {} rand_dict['type'] = type_ rand_dict['crawl_date'] = self.today rank_ = rank.split(',') for index, colum in enumerate(colums): rand_dict[colum] = rank_[index] return_rank_data.append(rand_dict) return return_rank_data def turnover_rate(self): ''' 换手率 http://api.fund.eastmoney.com/f10/JJHSL/?callback=jQuery18301549281364854147_1639139836416&fundcode={}&pageindex=1&pagesize=20&_=1639139836475 ''' self.DB = self.get_turnover_db() for code in self.doc.find({'type': self.key}, {"_id": 0, '基金代码': 1}).sort([('_id', pymongo.ASCENDING)]): # print(code) if self.is_crawl(self.DB, code['基金代码'], 'code'): continue print("爬取{}".format(code['基金代码'])) self.__turnover_rate(code['基金代码']) def is_crawl(self, db, code, cond): return True if db.find_one({cond: code}) else False def __turnover_rate(self, code): url = 'http://api.fund.eastmoney.com/f10/JJHSL/?callback=jQuery18301549281364854147_1639139836416&fundcode={}&pageindex=1&pagesize=100&_=1639139836475'.format( code) ret_txt = self.get(url, _json=False) self.__parse_turnover_data(ret_txt, code) def get_turnover_db(self): return DBSelector().mongo('qq')['db_stock']['turnover_{}'.format(self.date_format)] def __parse_turnover_data(self, jquery_data, code): js_format = jquery_data[jquery_data.find('{'):jquery_data.rfind('}') + 1] js_data = json.loads(js_format) turnover_rate_dict = {} turnover_rate_dict['code'] = code turnover_rate_dict['kind'] = self.key turnover_rate_dict['turnover_rate'] = js_data['Data'] turnover_rate_dict['update'] = datetime.datetime.now() self.DB.insert(turnover_rate_dict) def fund_detail(self, db, code): url = 'http://fundf10.eastmoney.com/jbgk_{}.html'.format(code) def __get(url, headers, retry=5): start = 0 while start < retry: try: r = requests.get( url=url, headers=headers, ) except Exception as e: print('base class error', e) time.sleep(1) start += 1 continue else: return r.text return None headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7', 'Host': 'fundf10.eastmoney.com', 'Cookie': 'em_hq_fls=js; searchbar_code=005827; qgqp_b_id=98846d680cc781b1e4a70c935431c5c1; intellpositionL=1170.55px; intellpositionT=555px; HAList=a-sz-123030-%u4E5D%u6D32%u8F6C%u503A%2Ca-sz-300776-%u5E1D%u5C14%u6FC0%u5149%2Ca-sz-300130-%u65B0%u56FD%u90FD%2Ca-sz-300473-%u5FB7%u5C14%u80A1%u4EFD%2Ca-sz-300059-%u4E1C%u65B9%u8D22%u5BCC%2Ca-sz-000411-%u82F1%u7279%u96C6%u56E2%2Ca-sz-300587-%u5929%u94C1%u80A1%u4EFD%2Ca-sz-000060-%u4E2D%u91D1%u5CAD%u5357%2Ca-sz-002707-%u4F17%u4FE1%u65C5%u6E38%2Ca-sh-605080-%u6D59%u5927%u81EA%u7136%2Ca-sz-001201-%u4E1C%u745E%u80A1%u4EFD%2Ca-sz-300981-%u4E2D%u7EA2%u533B%u7597; em-quote-version=topspeed; st_si=90568564737268; st_asi=delete; ASP.NET_SessionId=otnhaxvqrwnmj4nuorygjua4; EMFUND0=11-29%2015%3A40%3A32@%23%24%u5DE5%u94F6%u4E0A%u8BC1%u592E%u4F01ETF@%23%24510060; EMFUND1=12-11%2000%3A51%3A58@%23%24%u524D%u6D77%u5F00%u6E90%u65B0%u7ECF%u6D4E%u6DF7%u5408A@%23%24000689; EMFUND2=12-11%2000%3A57%3A17@%23%24%u4E2D%u4FE1%u5EFA%u6295%u667A%u4FE1%u7269%u8054%u7F51A@%23%24001809; EMFUND3=12-11%2000%3A56%3A12@%23%24%u9E4F%u534E%u4E2D%u8BC1A%u80A1%u8D44%u6E90%u4EA7%u4E1A%u6307%u6570%28LOF%29A@%23%24160620; EMFUND4=12-11%2000%3A47%3A36@%23%24%u4E2D%u4FE1%u4FDD%u8BDA%u7A33%u9E3FA@%23%24006011; EMFUND5=12-11%2000%3A54%3A13@%23%24%u878D%u901A%u6DF1%u8BC1100%u6307%u6570A@%23%24161604; EMFUND6=12-11%2000%3A55%3A27@%23%24%u56FD%u6CF0%u7EB3%u65AF%u8FBE%u514B100%u6307%u6570@%23%24160213; EMFUND7=12-15%2023%3A05%3A04@%23%24%u534E%u5546%u65B0%u5174%u6D3B%u529B%u6DF7%u5408@%23%24001933; EMFUND8=12-15%2023%3A14%3A53@%23%24%u91D1%u4FE1%u6C11%u5174%u503A%u5238A@%23%24004400; EMFUND9=12-15 23:15:15@#$%u5929%u5F18%u4E2D%u8BC1%u5149%u4F0F%u4EA7%u4E1A%u6307%u6570A@%23%24011102; st_pvi=77351447730109; st_sp=2020-08-16%2015%3A54%3A02; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=10; st_psi=20211215231519394-112200305283-4710014236', 'Referer': 'http://fund.eastmoney.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'} content = __get(url, headers) built_date, scale = self.parse_detail_info(content) db.insert_one( {'成立日期': built_date, '规模': scale, '基金代码': code, 'type': self.key, 'update': datetime.datetime.now()}) def parse_detail_info(self, content): resp = Selector(text=content) labels = resp.xpath('//div[@class="bs_gl"]/p/label') if len(labels) < 5: print("解析报错") return '', '' built_date = labels[0].xpath('./span/text()').extract_first() scale = labels[4].xpath('./span/text()').extract_first() scale = scale.strip() return built_date, scale def update_basic_info(self): pass def get_basic_db(self): return DBSelector().mongo('qq')['db_stock']['ttjj_basic'] def basic_info(self): ''' 基本数据 ''' self.basic_DB = self.get_basic_db() for code in self.doc.find({'type': self.key}, {"_id": 0, '基金代码': 1}).sort([('_id', pymongo.ASCENDING)]): if self.is_crawl(self.basic_DB, code['基金代码'], '基金代码'): continue LOG.info("爬取{}".format(code['基金代码'])) self.fund_detail(self.basic_DB, code['基金代码']) def convert_data_type(self): ''' 转换mongodb的字段 ''' for item in self.doc.find({},{'成立来':1}): try: p1=float(item['成立来']) except: p1=None self.doc.update_one({'_id':item['_id']},{'$set':{'成立来':p1}}) def get_fund(self,page): # 获取所有的基金代码 查找定增基金 # http://fund.eastmoney.com/Data/Fund_JJJZ_Data.aspx?t=1&lx=1&letter=&gsid=&text=&sort=zdf,desc&page=5,200&dt=1640059130666&atfc=&onlySale=0 url='http://fund.eastmoney.com/Data/Fund_JJJZ_Data.aspx?t=1&lx=1&letter=&gsid=&text=&sort=zdf,desc&page={},200&dt=1640059130666&atfc=&onlySale=0' content = self.get(url.format(page),_json=False) print(content) js_content = execjs.compile(content) db = js_content.eval("db") fund_list = db.get('datas', []) # print(fund_list) for item in fund_list: name = item[1] if re.search('定增',name): print(name) def get_funds(self): for i in range(66): self.get_fund(i) time.sleep(1) def main(kind, option): _dict = {1: '指数', 2: '股票', 3: '混合', 4: 'qdii', 5: 'lof', 6: 'fof', 7: '债券',8:'etf'} app = TTFund(key=_dict.get(kind, '股票')) # key 基金类型,股票,混合, if option == 'basic': LOG.info('获取{}排名'.format(_dict.get(kind))) app.rank() elif option == 'turnover': LOG.info('获取换手率') app.turnover_rate() elif option == 'info': LOG.info('获取基本信息') app.basic_info() else: LOG.error("请输入正确参数") if __name__ == '__main__': fire.Fire(main) # app=TTFund() # app.convert_data_type() # main(kind=1,option='basic') ================================================ FILE: fund/ttjj_others.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/12/16 11:40 # @File : ttjj_others.py # @Author : Rocky C@www.30daydo.com import requests import datetime import demjson def rank_data_crawl(time_interval='3n', ft='all'): # 当前日期 td_str = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d') td_dt = datetime.datetime.strptime(td_str, '%Y-%m-%d') # 去年今日 last_dt = td_dt - datetime.timedelta(days=365) last_str = datetime.datetime.strftime(last_dt, '%Y-%m-%d') rank_url = 'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft={0}&rs=&gs=0&sc={1}zf&st=desc&sd={2}&ed={3}&qdii=&tabSubtype=,,,,,&pi=1&pn=10000&dx=1'.format( ft, time_interval, last_str, td_str) # print(rank_url) headers = {} # 需要配置 rp = requests.get(rank_url, headers=headers) rank_txt = rp.text[rp.text.find('=') + 2:rp.text.rfind(';')] # print(rank_txt) # 数据 rank_rawdata = demjson.decode(rank_txt) # rawdata_allNum = rank_rawdata['allNum'] rank_list = [] for i in rank_rawdata['datas']: rank_list.append(i.split(',')) # print(rank_url, 'rawdata_allNum:{}'.format(rawdata_allNum), sep='\n') return rank_list # 详情页面的抓取 def get_allFund_content(single_fund_url): try: # print(single_fund_url) # if infromation[3] !='理财型' and infromation[3] !='货币型' and infromation[2].endswith('(后端)')==False: # code = infromation[0] headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'} r = requests.get(single_fund_url, headers=headers) r.encoding = r.apparent_encoding # 避免中文乱码 soup = BeautifulSoup(r.text, 'lxml') # # 判断交易状态 # staticItem = soup.select('.staticItem')[0].get_text() # if '终止' in staticItem or '认购' in staticItem: # pass # else: # 各项指标 # 基金名、基金类型、单位净值、累计净值、基金规模、成立日、评级、基金涨幅及排名 # (近1周、近1月、近3月、近6月、今年来、近1年、近2年、近3年) fund_code = single_fund_url[26:32] # fund_name = re.match('[\u4e00-\u9fffA-Za-z]+', soup.select('.fundDetail-tit > div')[0].get_text()).group() fund_name = soup.select('.SitePath > a')[2].get_text() unit_netValue = soup.select('.dataItem02 > .dataNums > span.ui-font-large')[0].get_text() accumulative_netValue = soup.select('.dataItem03 > .dataNums > span.ui-font-large')[0].get_text() fund_info = [i for i in soup.select('div.infoOfFund tr > td')] # fund_type1 = fund_info[0].get_text().split(':')[1].strip() fund_type = re.search(':[DQI\-\u4e00-\u9fffA]+', fund_info[0].get_text()).group()[1:] fund_scale = fund_info[1].get_text().split(':')[1].strip() fund_establishmentDate = fund_info[3].get_text().split(':')[1].strip() # fund_grade = fund_info[5].get_text().split(':')[1].strip() fund_Rdata = soup.select('#increaseAmount_stage > .ui-table-hover div.Rdata ') # 指数基金多一排,考虑re或者排名倒着写 fund_1weekAmount = fund_Rdata[0].get_text() fund_1monthAmount = fund_Rdata[1].get_text() fund_3monthAmount = fund_Rdata[2].get_text() fund_6monthAmount = fund_Rdata[3].get_text() fund_thisYearAmount = fund_Rdata[4].get_text() fund_1yearAmount = fund_Rdata[5].get_text() fund_2yearAmount = fund_Rdata[6].get_text() fund_3yearAmount = fund_Rdata[7].get_text() fund_1weekRank = fund_Rdata[-8].get_text() fund_1monthRank = fund_Rdata[-7].get_text() fund_3monthRank = fund_Rdata[-6].get_text() fund_6monthRank = fund_Rdata[-5].get_text() fund_thisYearRank = fund_Rdata[-4].get_text() fund_1yearRank = fund_Rdata[-3].get_text() fund_2yearRank = fund_Rdata[-2].get_text() fund_3yearRank = fund_Rdata[-1].get_text() Fund_data = [fund_code, fund_name, fund_type, unit_netValue, accumulative_netValue, fund_scale, fund_establishmentDate, fund_1weekAmount, fund_1monthAmount, fund_3monthAmount, fund_6monthAmount, fund_thisYearAmount, fund_1yearAmount, fund_2yearAmount, fund_3yearAmount, fund_1weekRank, fund_1monthRank, fund_3monthRank, fund_6monthRank, fund_thisYearRank, fund_1yearRank, fund_2yearRank, fund_3yearRank] print(Fund_data) return Fund_data except Exception as e: # print('Error:', single_fund_url, str(e)) logging.exception('Error:', single_fund_url, str(e)) def old_main(): # 初始化区域 main1_name = ['基金代码', '基金简称', '缩写', '日期', '单位净值', '累计净值', '日增长率(%)', '近1周增幅', '近1月增幅', '近3月增幅', '近6月增幅', '近1年增幅', '近2年增幅', '近3年增幅', '今年来', '成立来', '成立日期', '购买手续费折扣', '自定义', '手续费原价?', '手续费折后?', '布吉岛', '布吉岛', '布吉岛', '布吉岛'] # main1_name = ['基金代码', '基金简称', '日期', '单位净值', '累计净值', # '日增长率(%)', '近1周增幅', '近1月增幅', '近3月增幅', '近6月增幅', '近1年增幅', '近2年增幅', '近3年增幅', # '今年来', '成立来', '成立日期'] main2_name = ['基金代码', '基金简称', '基金类型', '单位净值', '累计净值', '基金规模', '成立日期', \ '近1周增幅', '近1月增幅', '近3月增幅', '近6月增幅', '今年来增幅', '近1年增幅', '近2年增幅', '近3年增幅', \ '近1周排名', '近1月排名', '近3月排名', '近6月排名', '今年来排名', '近1年排名', '近2年排名', '近3年排名'] # ########################## 先爬API接口 ################################### rawData = rank_data_crawl() # 数据清洗 # 未满三年剔除 rawData = DataFrame(rawData, columns=main1_name) rawData = rawData.loc[rawData['近3年增幅'] != ''] # 去除无用列 # # rawData.drop(rawData.columns(['缩写', '购买手续费折扣', '自定义', '手续费原价?', '手续费折后?', '布吉岛'], axis=1)) # rawData.drop(['缩写', '购买手续费折扣', '自定义', '手续费原价?', '手续费折后?', '布吉岛'], axis=1, inplace=True) rawData1 = rawData.iloc[1:15, [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] # main1_name = main1_name[0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] # ########################## 单页面抓取 ################################### # 获取抓取的detail网址 detail_urls_list = ['http://fund.eastmoney.com/{}.html'.format(i) for i in rawData1['基金代码']] print('#详情页面的抓取#启动时间:', time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) middle = datetime.datetime.now() # 多线程 p = Pool(4) all_fund_data = p.map(get_allFund_content, detail_urls_list) p.close() p.join() while None in all_fund_data: all_fund_data.remove(None) end = datetime.datetime.now() print('#详情页面的抓取#用时:', str(end - middle)) print('程序结束时间:', time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) all_fund_data = DataFrame(all_fund_data, columns=main2_name) # 表合并 data_merge = pd.merge(rawData1, all_fund_data, how='left', on='基金代码') # 文件储存 file_content = pd.DataFrame(columns=main1_name, data=rawData) file_content.to_csv('rawDATA-{}.csv'.format(time.strftime("%Y-%m-%d", time.localtime())), encoding='gbk') ================================================ FILE: fund/xueqiu_content.txt ================================================ 1、$万家可转债债券A(F008331)$ :基金经理陈佳昀,今年以来回报-5.42%,近一年回报12.10%,近三年回报19.29%,近一年最大回撤-9.34%,最新规模0.65亿。 2、$鹏华可转债(F000297)$ :基金经理王石千,今年以来回报-15.11%,近一年回报3.65%,近三年回报80.30%,近一年最大回撤-22.72%,最新规模38.23亿。 3、$广发可转债债券A(F006482)$ :基金经理吴敌,今年以来回报-17.24%,近一年回报8.28%,近三年回报71.72%,近一年最大回撤-24.73%,最新规模19.87亿。 4、$前海开源可转债债券(F000536)$ :基金经理曾健飞,今年以来回报-13.44%,近一年回报20.16%,近三年回报72.58%,近一年最大回撤-25.43%,最新规模23.11亿。 5、$申万菱信可转债债券A(F310518)$ :基金经理范磊,今年以来回报-13.57%,近一年回报0.16%,近三年回报47.61%,近一年最大回撤-18.70%,最新规模3.33亿。 6、$华宝可转债债券(F240018)$ :基金经理李栋梁,今年以来回报-13.34%,近一年回报10.57%,近三年回报63.95%,近一年最大回撤-19.40%,最新规模6.75亿。 7、$兴全可转债混合(F340001)$:基金经理虞淼,今年以来回报-10.98%,近一年回报2.31%,近三年回报41.57%,近一年最大回撤-15.69%,最新规模43.74亿。 8、$华商可转债A(F005273)$:基金经理张永志,今年以来回报-6.05%,近一年回报2.55%,近三年回报69.05%,近一年最大回撤-26.19%,最新规模6.27亿。 9、$汇添富可转换债券A(F470058)$ :基金经理吴江宏、胡奕,今年以来回报-14.21%,近一年回报-1.34%,近三年回报44.52%,近一年最大回撤-20.67%,最新规模68.40亿。 10、$易方达双债增强A(F110035)$ :基金经理王晓晨、胡文伯,今年以来回报-0.84%,近一年回报10.63%,近三年回报54.64%,近一年最大回撤-5.58%,最新规模75.45亿。 11、$安信民稳增长混合A(F008809)$ :基金经理张翼飞、黄琬舒,今年以来回报7.85%,近一年回报16.38%,近三年回报33.76%,近一年最大回撤-10.36%,最新规模8.33亿。 12、$易方达鑫转增利混合A(F005876)$ :基金经理杨康,今年以来回报-9.75%,近一年回报21.01%,近三年回报108.61%,近一年最大回撤-17.12%,最新规模6.55亿。 13、$浙商丰利增强债券(F006102)$ :基金经理周锦程、贾腾、陈亚芳,今年以来回报-1.06%,近一年回报14.45%,近三年回报96.79%,近一年最大回撤-20.50%,最新规模64.17亿。 14、$华商丰利增强定开债A(F003092)$ :基金经理厉骞,今年以来回报-6.76%,近一年回报27.01%,近三年回报89.05%,近一年最大回撤-31.80%,最新规模1.38亿 ================================================ FILE: fund/xueqiu_private_fund.py ================================================ import datetime import sys import re import requests sys.path.append('..') from configure.settings import DBSelector, config from common.BaseService import BaseService from parsel import Selector # 雪球私募数据获取 # 需要用cookies class PrivateFund(BaseService): def __init__(self): super(PrivateFund, self).__init__('../log/privatefund.log') self.db = None self.init_db() self.today_str = datetime.date.today().strftime("%Y-%m-%d") self.doc = self.db['xueqiu_private_{}'.format(self.today_str)] self.logger.info("========") def get_cookies(self): return config.get("xueqiu_cookies", "") # 在configure文件夹中的config.json 加入 “xueqiu_cookies”:"xxxxxxxxxxxxxx" @property def headers(self): return { "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "Host": "xueqiu.com", "Cookie": self.get_cookies(), "Pragma": "no-cache", "Referer": "https://xueqiu.com/f/rank", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36", "X-Requested-With": "XMLHttpRequest", } def update_with_missing_data(self): # 按默认列表排序,失去部分数据,使用不同条件合并数据 order_option = ['PROFIT', 'DRAWDOWN', 'SHARP'] url = "https://xueqiu.com/private_fund/v3/rank/list.json?order_by={}&typical=&strategy=&fund_type=&period=all&annual_period=0&launch_date=&max_drawdown_range=0&match_risk=false&fund_status=" for option in order_option: url_ = url.format(option) content = self.get(url=url_, _json=True) data = self.parse(content) self.update_db(data) def update_db(self, data): for item in data: if self.isExist(item['symbol']): continue self.doc.insert_one(item) def isExist(self, code): return True if self.doc.find_one({'symbol': code}) else False def run(self): import warnings warnings.warn("using update_with_missing_data function") # 不需要登录即可拿到数据, 复制cookies数据 单个数据 url = "https://xueqiu.com/private_fund/v3/rank/list.json?order_by=PROFIT&typical=&strategy=&fund_type=&period=all&annual_period=0&launch_date=&max_drawdown_range=0&match_risk=false&fund_status=" content = self.get(url=url, _json=True) data = self.parse(content) self.store_db(data) def init_db(self): self.db = DBSelector().mongo('qq')['db_stock'] def parse(self, content): print(content) data = content['data'] or [] for item in data: item['crawltime'] = datetime.datetime.now() return data def store_db(self, data): self.doc.insert_many(data) def debug(self): # result=doc.find_one() result = self.doc.find_one( {'crawltime': {'$gt': datetime.datetime.strptime('2021-12-26 13:00:00', "%Y-%m-%d %H:%M:%S")}}) # print(result) def get_details(self): for code in self.get_all_code(): self.get_detail(code) def get_detail(self, code): # 获取日期 url = "https://xueqiu.com/S/{}" content = self.get(url=url.format(code)) create_date, publish_date = self.parse_detail(content) print(create_date, publish_date) self.update_create_publish_date(code, create_date, publish_date) def update_create_publish_date(self, code, create_date, publish_date): self.doc.update_one({'symbol': code}, {"$set": {"create_date": create_date, "netvalue_date": publish_date}}) def parse_detail(self, content): # print(content) resp = Selector(text=content) date = resp.xpath('//span[@class="date"]/text()').extract_first() publish_date = resp.xpath('//div[@class="values-date period"]/text()').extract_first() # "values-date period" # print(date) match = re.search("( 成立于 (.*?) )", date) if match: create_date = match.group(1) else: create_date = None netvalue_date_match = re.search(" 净值日期:(.*)", publish_date) if netvalue_date_match: publish_date = netvalue_date_match.group(1) else: publish_date = None return create_date, publish_date def this_year_vshs300(self,code): url='https://xueqiu.com/private_fund/product/interval_index.json?symbol={}&benchmark_index=SH000300' resp = requests.get(url.format(code),headers=self.headers) js_data = resp.json() normal_item = js_data['data'][0]['part_index_list'][0] return normal_item def isCrawl(self, symbol): if self.db['xueqiu_private_process_{}'.format(self.today_str)].find_one({'symbol': symbol}): return True else: return False def checkValid(self, content): return False if re.search("服务器出错了", content) else True def get_(self, url, _json=False, binary=False, retry=5): cookies = { 'device_id': '30c150d8bba6b59a776c2e783ab3baf4', 's': 'by1hv4ciih', '__utmz': '1.1645204918.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', 'bid': 'a8ec0ec01035c8be5606c595aed718d4_kztd4jue', 'xq_is_login': '1', 'u': '1733473480', 'xq_a_token': 'b5d4b0bb48c361274af3657413be877434c6b846', 'xqat': 'b5d4b0bb48c361274af3657413be877434c6b846', 'xq_id_token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjE3MzM0NzM0ODAsImlzcyI6InVjIiwiZXhwIjoxNjYyMzU3NTczLCJjdG0iOjE2NTk3NjU1NzM3NDgsImNpZCI6ImQ5ZDBuNEFadXAifQ.FYBLTo0xn2AftqnYRhqrpEk6a_09l4vZVQS4k5f4k7rbIYSVAYCULq-WvsifcjiRYalF7C2Dje8_JnoI3fg7C0EuvLOh1DmqfDUSmnSUj3SbGW_Ht1X8q656BZrCE7fqIeNgEmMO8cO1IwW64kU_821jIgWfVUl62Nb9uSzlI_RzpH5DjM1D6XVvV0W-iH9JqddgPHLc4NykMF5AO_q_vqmeQe2k-wC2hUbryBtZiSyx187E0YLUVulkMKXScvODFeYzSkZ7sPW4idfA4dlrVhD5rY2J8drSJGnOif5siDsEHFMCloXrORaHysSys-pdvoxJVuV3aUzpunpf9fuGIg', 'xq_r_token': 'de0c71fb63884746aabd6a37fe13a40ce56196cc', '__utma': '1.1751771128.1645204918.1659977612.1660301449.14', 'acw_tc': '2760825c16607935161586753e9c4bcdd770c342a15d6a1e565c8bc39f2ab4', 'Hm_lvt_1db88642e346389874251b5a1eded6e3': '1660708494,1660727447,1660735985,1660793521', 'Hm_lvt_fe218c11eab60b6ab1b6f84fb38bcc4a': '1659978973,1660318981,1660793586', 'Hm_lpvt_1db88642e346389874251b5a1eded6e3': '1660793631', 'Hm_lpvt_fe218c11eab60b6ab1b6f84fb38bcc4a': '1660794474', } headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Linux"', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7,zh-TW;q=0.6', # Requests sorts cookies= alphabetically # 'Cookie': 'device_id=30c150d8bba6b59a776c2e783ab3baf4; s=by1hv4ciih; __utmz=1.1645204918.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); bid=a8ec0ec01035c8be5606c595aed718d4_kztd4jue; xq_is_login=1; u=1733473480; xq_a_token=b5d4b0bb48c361274af3657413be877434c6b846; xqat=b5d4b0bb48c361274af3657413be877434c6b846; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOjE3MzM0NzM0ODAsImlzcyI6InVjIiwiZXhwIjoxNjYyMzU3NTczLCJjdG0iOjE2NTk3NjU1NzM3NDgsImNpZCI6ImQ5ZDBuNEFadXAifQ.FYBLTo0xn2AftqnYRhqrpEk6a_09l4vZVQS4k5f4k7rbIYSVAYCULq-WvsifcjiRYalF7C2Dje8_JnoI3fg7C0EuvLOh1DmqfDUSmnSUj3SbGW_Ht1X8q656BZrCE7fqIeNgEmMO8cO1IwW64kU_821jIgWfVUl62Nb9uSzlI_RzpH5DjM1D6XVvV0W-iH9JqddgPHLc4NykMF5AO_q_vqmeQe2k-wC2hUbryBtZiSyx187E0YLUVulkMKXScvODFeYzSkZ7sPW4idfA4dlrVhD5rY2J8drSJGnOif5siDsEHFMCloXrORaHysSys-pdvoxJVuV3aUzpunpf9fuGIg; xq_r_token=de0c71fb63884746aabd6a37fe13a40ce56196cc; __utma=1.1751771128.1645204918.1659977612.1660301449.14; acw_tc=2760825c16607935161586753e9c4bcdd770c342a15d6a1e565c8bc39f2ab4; Hm_lvt_1db88642e346389874251b5a1eded6e3=1660708494,1660727447,1660735985,1660793521; Hm_lvt_fe218c11eab60b6ab1b6f84fb38bcc4a=1659978973,1660318981,1660793586; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1660793631; Hm_lpvt_fe218c11eab60b6ab1b6f84fb38bcc4a=1660794474', } response = requests.get(url, cookies=cookies, headers=headers) return response.text def fund(self, symbol): url = "https://xueqiu.com/S/{}" if self.isCrawl(symbol): return "" content = self.get(url=url.format(symbol)) if not self.checkValid(content): print('no valid') self.db['xueqiu_private_process_{}'.format(self.today_str)].update_one({'symbol': symbol}, {"$set": {"symbol": symbol, 'status': 0}}, True, True) return "" item = self.parse_detect(symbol, content) if item is None: return "" if item['name'] is None: self.db['xueqiu_private_process_{}'.format(self.today_str)].update_one({'symbol': symbol}, {"$set": {"symbol": symbol, 'status': 1}}, True, True) return "" try: self.doc.insert_one(item) except Exception as e: self.logger.error(e) return "{} error".format(symbol) else: self.db['xueqiu_private_process_{}'.format(self.today_str)].update_one({'symbol': symbol}, {"$set": {"symbol": symbol, 'status': 1}}, True, True) return symbol def parse_detect(self, symbol, content): return_item = {} resp = Selector(text=content) name = resp.xpath('//div[@class="cube-title"]/span[@class="name"]/text()').extract_first() profit_rate = resp.xpath('//div[@class="cube-profit-year fn-clear"]/span[@class="per"]/text()').extract_first() annual_return_this_year = resp.xpath( '//div[@class="cube-profits fn-clear"]/div[@class="cube-profit-day cube-profit"][4]/div[2]/text()').extract_first() manager_nick_name = resp.xpath('//div[@class="name fn-clear"]/span/text()').extract_first() create_date = resp.xpath('//span[@class="date"]/text()').extract_first() publish_date = resp.xpath('//div[@class="values-date period"]/text()').extract_first() if create_date is None: create_date = None else: match = re.search("( 成立于 (.*?) )", create_date) if match: create_date = match.group(1) else: create_date = None if publish_date is None: publish_date = None else: netvalue_date_match = re.search(" 净值日期:(.*)", publish_date) if netvalue_date_match: publish_date = netvalue_date_match.group(1) else: publish_date = None try: profit_rate = float(profit_rate) except: profit_rate = None try: annual_return_this_year = annual_return_this_year.replace("%", "") annual_return_this_year = float(annual_return_this_year) except: annual_return_this_year = None close_status = False if 'https://assets.imedao.com/images/cube-closed.png' in content: close_status = True return_item['symbol'] = symbol return_item['name'] = name return_item['profit_rate'] = profit_rate return_item['annual_return_this_year'] = annual_return_this_year return_item['manager_nick_name'] = manager_nick_name return_item['netvalue_date'] = publish_date return_item['create_date'] = create_date return_item['close_status'] = close_status return_item['crwaltime'] = datetime.datetime.now() return return_item def get_all_code(self): codes = [] for item in self.doc.find({}, {"symbol": 1}): codes.append(item['symbol']) return codes def generate_code(self): start = 0 end = 1500 code_list = [] for i in range(start, end): symbol = "P" + str(i).zfill(6) code_list.append(symbol) return code_list def brute_force(self): from concurrent.futures import ThreadPoolExecutor, as_completed executor = ThreadPoolExecutor(max_workers=5) code_list = self.generate_code() thread_list = [executor.submit(self.fund, (code,)) for code in code_list] for future in as_completed(thread_list): data = future.result() print("{} Done".format(data)) def seq_run(self): code_list = self.generate_code() for code in code_list: self.fund(code) def update_nick_name(self): need_to_be_updated = self.db['xueqiu_private_2021-12-28_brute_force'].find({'manager_nick_name':None},{'_id':1,'symbol':1}) for item in need_to_be_updated: # print(item) s_fund = self.doc.find_one({'symbol':item['symbol']}) if s_fund is None: continue print('update ',s_fund['manager_nick_name']) self.db['xueqiu_private_2021-12-28_brute_force'].update_one({"_id":item['_id']},{"$set":{'manager_nick_name':s_fund['manager_nick_name']}}) def update_normal(self,code,normal_item): try: self.doc.update_one({'symbol':code},{"$set":{'normal_Item':normal_item}}) except Exception as e: print(e) print("{} error".format(code)) def this_year_return(self): # 今年收益率 import time codes = self.get_all_code() # print(codes) # code = 'P001040' for code in codes: print('processing code {}'.format(code)) normal_item = self.this_year_vshs300(code) print(normal_item) self.update_normal(code,normal_item) time.sleep(1) def main(): app = PrivateFund() # app.run() # app.update_with_missing_data() # app.debug() # app.get_details() # app.brute_force() # app.fund('P000946') # app.seq_run() # app.update_nick_name() app.this_year_return() # 今年收益率 if __name__ == '__main__': main() ================================================ FILE: fund/基金持仓股.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "import akshare as ak\n", "def holding_stock_list(code,date):\n", " fund_portfolio_hold_em_df = ak.fund_portfolio_hold_em(code=code, year=date)\n", " print(fund_portfolio_hold_em_df)\n", " return fund_portfolio_hold_em_df" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", "0 1 601658 邮储银行 4.01 315.93 1702.86 2022年2季度股票投资明细\n", "1 2 600919 江苏银行 3.99 238.16 1695.71 2022年2季度股票投资明细\n", "2 3 601166 兴业银行 3.55 75.79 1508.22 2022年2季度股票投资明细\n", "3 4 600325 华发股份 3.18 178.19 1348.90 2022年2季度股票投资明细\n", "4 5 600153 建发股份 2.93 95.22 1244.53 2022年2季度股票投资明细\n", ".. ... ... ... ... ... ... ...\n", "118 119 600036 招商银行 1.35 6.40 299.52 2022年1季度股票投资明细\n", "119 120 600926 杭州银行 0.79 12.38 174.43 2022年1季度股票投资明细\n", "120 121 601872 招商轮船 0.40 18.88 89.11 2022年1季度股票投资明细\n", "121 122 300494 盛天网络 0.40 5.19 88.49 2022年1季度股票投资明细\n", "122 123 600837 海通证券 0.38 8.25 84.98 2022年1季度股票投资明细\n", "\n", "[123 rows x 7 columns]\n" ] } ], "source": [ "df=holding_stock_list('501059',2022)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
序号股票代码股票名称占净值比例持股数持仓市值季度
01601658邮储银行4.01315.931702.862022年2季度股票投资明细
12600919江苏银行3.99238.161695.712022年2季度股票投资明细
23601166兴业银行3.5575.791508.222022年2季度股票投资明细
34600325华发股份3.18178.191348.902022年2季度股票投资明细
45600153建发股份2.9395.221244.532022年2季度股票投资明细
56600188兖矿能源2.4726.601050.172022年2季度股票投资明细
67000552靖远煤电2.47243.191048.152022年2季度股票投资明细
78601225陕西煤业2.4549.051038.882022年2季度股票投资明细
89000090天健集团2.42148.901025.922022年2季度股票投资明细
910601666平煤股份2.2670.64960.002022年2季度股票投资明细
1011601958金钼股份2.19105.00928.202022年2季度股票投资明细
1112600502安徽建工2.15127.02914.532022年2季度股票投资明细
1213000002万科A2.1243.92900.362022年2季度股票投资明细
1314000937冀中能源2.09119.00887.742022年2季度股票投资明细
1415601000唐山港2.08341.56881.222022年2季度股票投资明细
1516601009南京银行2.0382.63861.002022年2季度股票投资明细
1617600863内蒙华电2.02235.41859.252022年2季度股票投资明细
1718601088中国神华1.9725.14837.152022年2季度股票投资明细
1819601098中南传媒1.9788.53835.722022年2季度股票投资明细
1920601577长沙银行1.91102.00808.862022年2季度股票投资明细
2021001979招商蛇口1.8859.40797.742022年2季度股票投资明细
2122600057厦门象屿1.7785.41750.752022年2季度股票投资明细
2223600548深高速1.7276.65731.242022年2季度股票投资明细
2324002419天虹股份1.71102.00727.262022年2季度股票投资明细
2425600064南京高科1.6363.07693.772022年2季度股票投资明细
2526600028中国石化1.63169.85692.992022年2季度股票投资明细
2627600461洪城环境1.6083.72677.292022年2季度股票投资明细
2728600027华电国际1.52164.49646.452022年2季度股票投资明细
2829600820隧道股份1.45100.60615.672022年2季度股票投资明细
2930600350山东高速1.40113.07593.622022年2季度股票投资明细
3031601668中国建筑1.39111.20591.582022年2季度股票投资明细
3132000932华菱钢铁1.36113.61578.272022年2季度股票投资明细
3233601928凤凰传媒1.3579.97571.792022年2季度股票投资明细
3334600585海螺水泥1.2915.55548.602022年2季度股票投资明细
3435600985淮北矿业1.2737.00538.722022年2季度股票投资明细
3536000778新兴铸管0.9483.00400.062022年2季度股票投资明细
3637601006大秦铁路0.8655.70367.062022年2季度股票投资明细
3738601298青岛港0.8667.00366.492022年2季度股票投资明细
3839600048保利发展0.8420.47357.412022年2季度股票投资明细
3940600449宁夏建材0.7927.50334.682022年2季度股票投资明细
\n", "
" ], "text/plain": [ " 序号 股票代码 股票名称 占净值比例 持股数 持仓市值 季度\n", "0 1 601658 邮储银行 4.01 315.93 1702.86 2022年2季度股票投资明细\n", "1 2 600919 江苏银行 3.99 238.16 1695.71 2022年2季度股票投资明细\n", "2 3 601166 兴业银行 3.55 75.79 1508.22 2022年2季度股票投资明细\n", "3 4 600325 华发股份 3.18 178.19 1348.90 2022年2季度股票投资明细\n", "4 5 600153 建发股份 2.93 95.22 1244.53 2022年2季度股票投资明细\n", "5 6 600188 兖矿能源 2.47 26.60 1050.17 2022年2季度股票投资明细\n", "6 7 000552 靖远煤电 2.47 243.19 1048.15 2022年2季度股票投资明细\n", "7 8 601225 陕西煤业 2.45 49.05 1038.88 2022年2季度股票投资明细\n", "8 9 000090 天健集团 2.42 148.90 1025.92 2022年2季度股票投资明细\n", "9 10 601666 平煤股份 2.26 70.64 960.00 2022年2季度股票投资明细\n", "10 11 601958 金钼股份 2.19 105.00 928.20 2022年2季度股票投资明细\n", "11 12 600502 安徽建工 2.15 127.02 914.53 2022年2季度股票投资明细\n", "12 13 000002 万科A 2.12 43.92 900.36 2022年2季度股票投资明细\n", "13 14 000937 冀中能源 2.09 119.00 887.74 2022年2季度股票投资明细\n", "14 15 601000 唐山港 2.08 341.56 881.22 2022年2季度股票投资明细\n", "15 16 601009 南京银行 2.03 82.63 861.00 2022年2季度股票投资明细\n", "16 17 600863 内蒙华电 2.02 235.41 859.25 2022年2季度股票投资明细\n", "17 18 601088 中国神华 1.97 25.14 837.15 2022年2季度股票投资明细\n", "18 19 601098 中南传媒 1.97 88.53 835.72 2022年2季度股票投资明细\n", "19 20 601577 长沙银行 1.91 102.00 808.86 2022年2季度股票投资明细\n", "20 21 001979 招商蛇口 1.88 59.40 797.74 2022年2季度股票投资明细\n", "21 22 600057 厦门象屿 1.77 85.41 750.75 2022年2季度股票投资明细\n", "22 23 600548 深高速 1.72 76.65 731.24 2022年2季度股票投资明细\n", "23 24 002419 天虹股份 1.71 102.00 727.26 2022年2季度股票投资明细\n", "24 25 600064 南京高科 1.63 63.07 693.77 2022年2季度股票投资明细\n", "25 26 600028 中国石化 1.63 169.85 692.99 2022年2季度股票投资明细\n", "26 27 600461 洪城环境 1.60 83.72 677.29 2022年2季度股票投资明细\n", "27 28 600027 华电国际 1.52 164.49 646.45 2022年2季度股票投资明细\n", "28 29 600820 隧道股份 1.45 100.60 615.67 2022年2季度股票投资明细\n", "29 30 600350 山东高速 1.40 113.07 593.62 2022年2季度股票投资明细\n", "30 31 601668 中国建筑 1.39 111.20 591.58 2022年2季度股票投资明细\n", "31 32 000932 华菱钢铁 1.36 113.61 578.27 2022年2季度股票投资明细\n", "32 33 601928 凤凰传媒 1.35 79.97 571.79 2022年2季度股票投资明细\n", "33 34 600585 海螺水泥 1.29 15.55 548.60 2022年2季度股票投资明细\n", "34 35 600985 淮北矿业 1.27 37.00 538.72 2022年2季度股票投资明细\n", "35 36 000778 新兴铸管 0.94 83.00 400.06 2022年2季度股票投资明细\n", "36 37 601006 大秦铁路 0.86 55.70 367.06 2022年2季度股票投资明细\n", "37 38 601298 青岛港 0.86 67.00 366.49 2022年2季度股票投资明细\n", "38 39 600048 保利发展 0.84 20.47 357.41 2022年2季度股票投资明细\n", "39 40 600449 宁夏建材 0.79 27.50 334.68 2022年2季度股票投资明细" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(40)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "fund_portfolio_hold_em() got an unexpected keyword argument 'symbol'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m/home/xda/github/stock/fund/基金持仓股.ipynb Cell 3'\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39makshare\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mak\u001b[39;00m\n\u001b[0;32m----> 3\u001b[0m fund_portfolio_hold_em_df \u001b[39m=\u001b[39m ak\u001b[39m.\u001b[39;49mfund_portfolio_hold_em(symbol\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39m000001\u001b[39;49m\u001b[39m\"\u001b[39;49m, date\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39m2020\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[1;32m 4\u001b[0m \u001b[39mprint\u001b[39m(fund_portfolio_hold_em_df)\n", "\u001b[0;31mTypeError\u001b[0m: fund_portfolio_hold_em() got an unexpected keyword argument 'symbol'" ] } ], "source": [ "import akshare as ak\n", "\n", "fund_portfolio_hold_em_df = ak.fund_portfolio_hold_em(code=\"000001\", date=\"2020\")\n", "print(fund_portfolio_hold_em_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "906064a35c7980fda78a8b97014bc5560dca56efd2e047844bdf4fb8a9b9c8a3" }, "kernelspec": { "display_name": "Python 3.9.7 ('cpy')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: futu/basic_usage.py ================================================ from futu import OpenQuoteContext from collections import Iterable def deep_print(obj): sep='='*20+'\n' print(sep) print(obj) print(sep) for item in dir(obj): if not item.startswith('__'): print(item,sep='\t') if isinstance(obj,Iterable): for item in obj: if isinstance(item,list): for _item in item: print(_item) elif isinstance(item,dict): for k,v in item.items(): print(k,' : ',v) else: print(item) quote_ctx = OpenQuoteContext( host='127.0.0.1',port=11111 ) data = quote_ctx.get_market_snapshot('HK.01024') deep_print(data) status = quote_ctx.get_global_state() deep_print(status) quote_ctx.close() print('program end') ================================================ FILE: futu/realtime_price.py ================================================ from futu import * quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111) ret_sub, err_message = quote_ctx.subscribe(['SZ.00300'], [SubType.QUOTE], subscribe_push=False) # 先订阅K 线类型。订阅成功后FutuOpenD将持续收到服务器的推送,False代表暂时不需要推送给脚本 if ret_sub == RET_OK: # 订阅成功 ret, data = quote_ctx.get_stock_quote(['SZ.00300']) # 获取订阅股票报价的实时数据 if ret == RET_OK: print(data) print(data['code'][0]) # 取第一条的股票代码 print(data['code'].values.tolist()) # 转为list else: print('error:', data) else: print('subscription failed', err_message) quote_ctx.close() # 关闭当条连接,FutuOpenD会在1分钟后自动取消相应股票相应类型的订阅 ================================================ FILE: futu/subscribe.py ================================================ import time from futu import * class OrderBookTest(OrderBookHandlerBase): def on_recv_rsp(self, rsp_pb): ret_code, data = super(OrderBookTest,self).on_recv_rsp(rsp_pb) if ret_code != RET_OK: print("OrderBookTest: error, msg: %s" % data) return RET_ERROR, data print("OrderBookTest ", data) # OrderBookTest自己的处理逻辑 return RET_OK, data quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111) handler = OrderBookTest() quote_ctx.set_handler(handler) # 设置实时摆盘回调 quote_ctx.subscribe(['HK.00700'], [SubType.ORDER_BOOK]) # 订阅买卖摆盘类型,FutuOpenD开始持续收到服务器的推送 time.sleep(15) # 设置脚本接收FutuOpenD的推送持续时间为15秒 quote_ctx.close() # 关闭当条连接,FutuOpenD会在1分钟后自动取消相应股票相应类型的订阅 ================================================ FILE: futu/unsubscrible.py ================================================ from futu import * from util import deep_print quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111) ret = quote_ctx.query_subscription(is_all_conn=True) deep_print(ret) ================================================ FILE: futu/util.py ================================================ from collections import Iterable def deep_print(obj): sep='='*20+'\n' print(sep) print(obj) print(sep) for item in dir(obj): if not item.startswith('__'): print(item,sep='\t') if isinstance(obj,Iterable): for item in obj: if isinstance(item,list): for _item in item: print(_item) elif isinstance(item,dict): for k,v in item.items(): print(k,' : ',v) else: print(item) ================================================ FILE: hk_stock/aastock_new_stock.py ================================================ # -*- coding: utf-8 -*- # @Time : 2021/6/28 23:15 # @File : aastock_new_stock.py # @Author : Rocky C@www.30daydo.com ''' http://www.aastocks.com/sc/stocks/market/ipo/listedipo.aspx?s=3&o=0&page=20 ''' import time from parsel import Selector from selenium import webdriver import sys sys.path.append('..') import datetime from common.BaseService import BaseService from configure.settings import DBSelector path = r'C:\OneDrive\Python\selenium\chromedriver.exe' class AAStockNewStock(BaseService): def __init__(self): super(AAStockNewStock, self).__init__('../log/aastock.log') self.conn = DBSelector().get_mysql_conn('db_stock') self.cursor = self.conn.cursor() def create_table(self): sql = '''CREATE TABLE IF NOT EXISTS `tb_hk_new_stock` ( `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` varchar(50) DEFAULT NULL, `code` varchar(10) NOT NULL, `issue_date` date DEFAULT NULL, `each_hand_stock` varchar(50) DEFAULT NULL, `share_value_Yi` varchar(50) DEFAULT NULL, `margin_price` varchar(50) DEFAULT NULL, `price` float(255,4) DEFAULT NULL, `over_price_part` varchar(50) DEFAULT NULL, `hit_least_num` int(255) DEFAULT NULL, `hit_ratio` float(255,4) DEFAULT NULL, `current_price` float(255,4) DEFAULT NULL, `first_day_raise` float(255,4) DEFAULT NULL, `accumulate_raise` float(255,4) DEFAULT NULL, `crawltime` DATETIME DEFAULT NULL, UNIQUE INDEX code_ix(`code` ASC) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4''' try: self.cursor.execute(sql) except Exception as e: print(e) self.conn.rollback() else: self.conn.commit() def fetch(self, page): options = webdriver.ChromeOptions() options.add_experimental_option('excludeSwitches', ['enable-automation']) prefs = {'profile.managed_default_content_settings.images': 2} options.add_experimental_option('prefs', prefs) options.add_argument( '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36') driver = webdriver.Chrome(executable_path=path, chrome_options=options) driver.implicitly_wait(40) url = 'http://www.aastocks.com/sc/stocks/market/ipo/listedipo.aspx?s=3&o=0&page={}' for p in range(1, page + 1): driver.get(url.format(p)) time.sleep(5) yield driver.page_source def convert_float(self, data): if data is None: print('数据为空') return None data = data.strip().replace('%', '').replace(',', '') try: print('解析后') print(data) data = float(data) except Exception as e: if data != 'N/A': print('解析异常') print(data) data = None return data def convert_date(self, data_str): try: date = datetime.datetime.strptime(data_str, '%Y/%m/%d') except Exception as e: print(e) date = None return date def convert_hand_int(self, data): try: data = int(data.strip().replace('手', '')) except: data = None return data def parse(self, content): response = Selector(text=content) ipo_list = response.xpath('//div[@id="IPOListed"]/table/tbody/tr') insert_sql = '''insert into `tb_hk_new_stock` (`name`,`code`,`issue_date`,`each_hand_stock`,`share_value_Yi`,`margin_price`,`price`,`over_price_part`,`hit_least_num`,`hit_ratio`,`current_price`,`first_day_raise`,`accumulate_raise`,`crawltime`) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE `crawltime`=%s''' for ipo_item in ipo_list: item_list = ipo_item.xpath('.//td') if len(item_list) < 2: continue name = item_list[1].xpath('.//a[1]/text()').extract_first() code = item_list[1].xpath('.//a[2]/text()').extract_first() issue_date = self.convert_date(item_list[2].xpath('.//text()').extract_first()) each_hand_stock = item_list[3].xpath('.//text()').extract_first() share_value_Yi = item_list[4].xpath('.//text()').extract_first() margin_price = item_list[5].xpath('.//text()').extract_first() price = self.convert_float(item_list[6].xpath('.//text()').extract_first()) over_price_part = item_list[7].xpath('.//text()').extract_first() hit_least_num = self.convert_hand_int(item_list[8].xpath('.//text()').extract_first()) hit_ratio = self.convert_float(item_list[9].xpath('.//text()').extract_first()) current_price = self.convert_float(item_list[10].xpath('.//text()').extract_first()) first_day_raise = self.convert_float(item_list[11].xpath('.//text()').extract_first()) accumulate_raise = self.convert_float(item_list[12].xpath('.//text()').extract_first()) now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') if margin_price == 'N/A': # 上市失败的 continue try: self.cursor.execute(insert_sql, ( name, code, issue_date, each_hand_stock, share_value_Yi, margin_price, price, over_price_part, hit_least_num, hit_ratio, current_price, first_day_raise, accumulate_raise, now, now)) except Exception as e: print(e) self.conn.rollback() else: self.conn.commit() def run(self): total_page = 25 self.create_table() gen = self.fetch(total_page) page = 0 for content in gen: print('page ', page) self.parse(content) page += 1 self.conn.close() def clear_data(self): 'select code from tb_hk_new_stock group by code having count(*) as n >1' pass def main(): app = AAStockNewStock() app.run() if __name__ == '__main__': main() ================================================ FILE: hk_stock/new_stock_release.py ================================================ # -*- coding: utf-8 -*- # website: http://30daydo.com # @Time : 2020/2/20 17:06 # @File : etf_info.py # 获取港股打新数据 import json import sys sys.path.append('..') import datetime from common.BaseService import BaseService from configure.settings import DBSelector from common.aes import AESDecrypt TIMEOUT = 30 # 超时 class HKNewStock(BaseService): def __init__(self): super(HKNewStock, self).__init__(logfile='../log/HKNewStock.log') self.base_url = 'https://api2.lianghuaipo.com/hk_ipo/get_paged_listed_stock_list' self.key = 'eFgabcda1bcda12bc2bcdePgefgadefg' self.aes_decoder = AESDecrypt() self.aes_decoder.set_key(self.key) self.engine = self.get_engine() def get_engine(self): return DBSelector().mongo('qq') @property def doc(self): return self.engine['db_stock']['hk_new_stock'] @property def headers(self): _headers = { "accept": "application/json, text/plain, */*", "accept-encoding": "gzip, deflate, br", "accept-language": "zh,en;q=0.9,en-US;q=0.8,zh-CN;q=0.7", "cache-control": "no-cache", "content-length": "771", "content-type": "application/x-www-form-urlencoded", "cookie": "Hm_lvt_a93cbc5800037e73153633ace5e288ec=1613452692,1613452700,1613452722,1613454109; Hm_lpvt_a93cbc5800037e73153633ace5e288ec=1613468195; io=BS-6Yzyi4tZknvyjAAEs", "origin": "https://www.lianghuaipo.com", "pragma": "no-cache", "referer": "https://www.lianghuaipo.com/", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-site", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36"} return _headers def form_data(self, page): data = { "now_page": page, "page_cnt": 30, } return data def crawl(self): for i in range(1, 31): content = self.post( url=self.base_url, post_data=self.form_data(i), _json=True, ) js_data = self.parse(content) if js_data: self.insert_mongo(js_data) def parse(self, content): if content.get('msg') != '返回成功': return None data = content.get('data') js_data= self.aes_decoder.decrypt(data) if js_data: return js_data[:js_data.rfind('}')+1] else: return None def insert_mongo(self, data): try: data=json.loads(data) except Exception as e: self.logger.error(e) return result_list = data.get('result_list') for item in result_list: item['crawltime']=datetime.datetime.now() if len(result_list)==0: return try: self.doc.insert_many(result_list) except Exception as e: self.logger.error(e) else: self.logger.info('写入成功') def rename(self): rename_dict ={ 'issuance_price':'发行定价', 'market_cap':'发行市值', 'is_cornerstone':'是否有基石', 'is_greenshoe':'是否有绿鞋', 'gray_pct_change':'暗盘涨幅', 'first_day_pct_change':'首日涨幅', 'total_pct_change':'累计涨幅', 'subscription_times':'超额申购倍数', 'winning_rate':'稳中一手', 'callback_ratio':'回拨比例', 'industry_name':'行业', 'listed_date':'上市日期', 'sponsors':'保荐机构', 'apply_people_num':'申购人数', 'first_hand_winning_rate':'一手中签率', } self.doc.update_many({},{'$rename':rename_dict}) def run(self): self.logger.info('start to crawl') self.crawl() self.logger.info('end of crawl') if __name__ == '__main__': app = HKNewStock() app.run() app.rename() ================================================ FILE: jisilu_bond_release.py ================================================ # -*-coding=utf-8-*- # @Time : 2018/12/20 0:20 # @File : jisilu_call.py from datahub.jisilu import Jisilu def main(): obj = Jisilu(remote='qq') obj.release_data() if __name__ == '__main__': main() ================================================ FILE: jisilu_daily.py ================================================ # -*-coding=utf-8-*- # @Time : 2018/12/20 0:25 # @File : jisilu_current.py from datahub.jisilu import Jisilu import fire def run(remote='qq'): obj = Jisilu(remote=remote) obj.daily_update() if __name__ == '__main__': fire.Fire(run) # shell : # python jisilu.py --remote=qq ================================================ FILE: jubi.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' ## python2代码,网站已经停止更新 import random import hashlib import hmac, time import smtplib from email.mime.text import MIMEText from email import Utils import threading import requests, itchat from toolkit import Toolkit class Jubi_web(): def __init__(self, send=None): cfg = Toolkit.getUserData('data.cfg') self.public_key = cfg['public_key'] self.private_key = cfg['private_key'] self.send = send from_mail = cfg['from_mail'] password = cfg['password'] to_mail = cfg['to_mail'] smtp_server = 'smtp.qq.com' self.server = smtp_server self.username = from_mail.split("@")[0] self.from_mail = from_mail self.password = password self.to_mail = to_mail self.coin_list = ['IFC', 'DOGE', 'EAC', 'DNC', 'MET', 'ZET', 'SKT', 'YTC', 'PLC', 'LKC', 'JBC', 'MRYC', 'GOOC', 'QEC', 'PEB', 'XRP', 'NXT', 'WDC', 'MAX', 'ZCC', 'HLB', 'RSS', 'PGC', 'RIO', 'XAS', 'TFC', 'BLK', 'FZ', 'ANS', 'XPM', 'VTC', 'KTC', 'VRC', 'XSGS', 'LSK', 'PPC', 'ETC', 'GAME', 'LTC', 'ETH', 'BTC'] # 初始化邮箱设置读取需要股票信息 # 这样子只登陆一次 if self.send == 'msn': try: self.smtp = smtplib.SMTP_SSL(port=465) self.smtp.connect(self.server) self.smtp.login(self.username, self.password) except smtplib.SMTPException as e: print(e) return 0 if send == 'wechat': self.w_name = 'wwwei' self.w_name1 = 'aiweichuangyi' itchat.auto_login(hotReload=True) account = itchat.get_friends(self.w_name) for i in account: if i['PYQuanPin'] == self.w_name: self.toName = i['UserName'] # print(self.toName) if i['PYQuanPin'] == self.w_name1: self.toName1 = i['UserName'] # print(self.toName) def send_wechat(self, name, content, user): w_content = name + ' ' + content itchat.send(w_content, toUserName=user) time.sleep(1) itchat.send(w_content, toUserName='filehelper') def send_text(self, name, content): subject = '%s' % name self.msg = MIMEText(content, 'plain', 'utf-8') self.msg['to'] = self.to_mail self.msg['from'] = self.from_mail self.msg['Subject'] = subject self.msg['Date'] = Utils.formatdate(localtime=1) try: self.smtp.sendmail(self.msg['from'], self.msg['to'], self.msg.as_string()) self.smtp.quit() print("sent") except smtplib.SMTPException as e: print(e) return 0 def warming(self, coin, up_price, down_price, user): url = 'https://www.jubi.com/api/v1/ticker/' while 1: time.sleep(5) try: data = requests.post(url, data={'coin': coin}).json() except Exception as e: print(e) print("time out. Retry") time.sleep(15) continue current = float(data['last']) if current >= up_price: print("Up to ", up_price) print("current price ", current) if self.send == 'msn': self.send_text(coin, str(current)) if self.send == 'wechat': self.send_wechat(coin, str(current), user) time.sleep(1200) if current <= down_price: print("Down to ", down_price) print("current price ", current) if self.send == 'msn': self.send_text(coin, str(current)) if self.send == 'wechat': self.send_wechat(coin, str(current), user) time.sleep(1200) # 上面的内容尽量不用修改。 def getContent(self): url = 'https://www.jubi.com/api/v1/trade_list' params_data = {'key': 'x', 'signature': 'x'} s = requests.get(url=url, params=params_data) def getHash(self, s): m = hashlib.md5() m.update(s) return m.hexdigest() def sha_convert(self, s): return hashlib.sha256(self.getHash(s)).hexdigest() def get_nonce(self): lens = 12 return ''.join([str(random.randint(0, 9)) for i in range(lens)]) def get_signiture(self): url = 'https://www.jubi.com/api/v1/ticker/' coin = 'zet' nonce = self.get_nonce() # sha=self.sha_convert(private_key) md5 = self.getHash(self.private_key) message = 'nonce=' + nonce + '&' + 'key=' + self.public_key # print(message) signature = hmac.new(md5, message, digestmod=hashlib.sha256).digest() # print(signature) # req=requests.post(stock_url,data={'signature':signature,'key':public_key,'nonce':nonce,'coin':'zet'}) req = requests.post(url, data={'coin': coin}) print(req.status_code) print(req.text) def real_time_ticker(self, coin): url = 'https://www.jubi.com/api/v1/ticker/' try: data = requests.post(url, data={'coin': coin}).json() # print(data) except Exception as e: print(e) data = None return data def real_time_depth(self, coin): url = 'https://www.jubi.com/api/v1/depth/' data = requests.post(url, data={'coin': coin}).json() print(data) data_bids = data['bids'] data_asks = data['asks'] print("bids") for i in data_bids: print(i[0], ) print(' ', ) print(i[1]) print("asks") for j in data_asks: print(j[0], ) print(' ', ) print(j[1]) def list_all_price(self): for i in self.coin_list: print(i, ) print(" price: ", ) p = self.real_time_ticker(i.lower()) if p is not None: print(p['last']) def getOrder(self, coin): url = 'https://www.jubi.com/api/v1/orders/' try: req = requests.get(url, params={'coin': coin}) except Exception as e: print(e) data = req.json() return data # recent 100 trade turn over def turnover(self, coin): i = coin.lower() coins = Toolkit.getUserData('coins.csv') total = long(coins[i]) p = self.getOrder(i) print(p) amount = 0.00 for j in p: t = j['amount'] amount = float(t) + amount # current=float(self.real_time_ticker(i)['last']) turn_over = amount * 1.00 / total * 100 print(turn_over) def multi_thread(self, coin_list, price_list, username): thread_num = len(coin_list) thread_list = [] for i in range(thread_num): if username[i] == 0: nameID = self.toName if username[i] == 1: nameID = self.toName1 t = threading.Thread(target=self.warming, args=(coin_list[i], price_list[i][0], price_list[i][1], nameID), ) thread_list.append(t) for j in thread_list: j.start() for k in thread_list: k.join() if __name__ == '__main__': obj = Jubi_web(send='wechat') # print(obj.get_signiture()) # print(obj.real_time_ticker('zet')) # obj.real_time_depth('zet') # obj.warming('zet',0.23,0.17) # obj.list_all_price() # obj.turnover('doge') # print(obj.getOrder('zet')) coin_list = ['zet', 'doge'] price_list = [[0.2, 0.11], [0.03, 0.02]] # obj.warming('zet',0.24,0.16) username = [0, 0] obj.multi_thread(coin_list, price_list, username) ================================================ FILE: juejin/fetch_data.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from __future__ import print_function, absolute_import\n", "from gm.api import *" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import os\n", "juejin_token = os.environ['juejin_token']\n", "# 掘金的官网可以免费申请 token\n", "\n", "set_token(juejin_token)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "ename": "GmError", "evalue": "{\"status\": 1001, \"message\": \"无法连接到终端服务\", \"function\": \"history\"}", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mGmError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[3], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m history_data \u001b[39m=\u001b[39m history(symbol\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39mSZSE.128025\u001b[39;49m\u001b[39m'\u001b[39;49m, frequency\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m1d\u001b[39;49m\u001b[39m'\u001b[39;49m, start_time\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m2021-04-14\u001b[39;49m\u001b[39m'\u001b[39;49m,end_time\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m2023-08-18\u001b[39;49m\u001b[39m'\u001b[39;49m, df\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m)\n", "File \u001b[1;32mc:\\Users\\xda\\.conda\\envs\\py38\\lib\\site-packages\\gm\\api\\query.py:599\u001b[0m, in \u001b[0;36mhistory\u001b[1;34m(symbol, frequency, start_time, end_time, fields, skip_suspended, fill_missing, adjust, adjust_end_time, df)\u001b[0m\n\u001b[0;32m 587\u001b[0m req \u001b[39m=\u001b[39m GetHistoryBarsReq(\n\u001b[0;32m 588\u001b[0m symbols\u001b[39m=\u001b[39msymbol,\n\u001b[0;32m 589\u001b[0m frequency\u001b[39m=\u001b[39mfrequency,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 596\u001b[0m adjust_end_time\u001b[39m=\u001b[39madjust_end_time,\n\u001b[0;32m 597\u001b[0m )\n\u001b[0;32m 598\u001b[0m status, result \u001b[39m=\u001b[39m py_gmi_history_bars_pb(req\u001b[39m.\u001b[39mSerializeToString())\n\u001b[1;32m--> 599\u001b[0m check_gm_status(status)\n\u001b[0;32m 600\u001b[0m rsp \u001b[39m=\u001b[39m Bars()\n\u001b[0;32m 601\u001b[0m rsp\u001b[39m.\u001b[39mParseFromString(result)\n", "File \u001b[1;32mc:\\Users\\xda\\.conda\\envs\\py38\\lib\\site-packages\\gm\\api\\_errors.py:31\u001b[0m, in \u001b[0;36mcheck_gm_status\u001b[1;34m(status)\u001b[0m\n\u001b[0;32m 29\u001b[0m message \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m; \u001b[39m\u001b[39m\"\u001b[39m \u001b[39m+\u001b[39m ext_message\n\u001b[0;32m 30\u001b[0m function \u001b[39m=\u001b[39m sys\u001b[39m.\u001b[39m_getframe()\u001b[39m.\u001b[39mf_back\u001b[39m.\u001b[39mf_code\u001b[39m.\u001b[39mco_name\n\u001b[1;32m---> 31\u001b[0m \u001b[39mraise\u001b[39;00m GmError(status, message, function)\n", "\u001b[1;31mGmError\u001b[0m: {\"status\": 1001, \"message\": \"无法连接到终端服务\", \"function\": \"history\"}" ] } ], "source": [ "history_data = history(symbol='SZSE.128025', frequency='1d', start_time='2021-04-14',end_time='2023-08-18', df=True)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolfrequencyopenhighlowclosevolumeamountpre_closebobeobposition
0SZSE.1280251d98.70099.12998.70098.900167101.6536e+0698.7002021-04-14 00:00:00+08:002021-04-14 00:00:00+08:000
1SZSE.1280251d98.90399.32098.90099.199124701.2355e+0698.9002021-04-15 00:00:00+08:002021-04-15 00:00:00+08:000
2SZSE.1280251d98.90199.48798.90099.287252222.5013e+0699.1992021-04-16 00:00:00+08:002021-04-16 00:00:00+08:000
3SZSE.1280251d99.20199.44699.13299.280342003.3957e+0699.2872021-04-19 00:00:00+08:002021-04-19 00:00:00+08:000
4SZSE.1280251d99.30099.80099.30099.650190501.8962e+0699.2802021-04-20 00:00:00+08:002021-04-20 00:00:00+08:000
5SZSE.1280251d100.006107.900100.006106.30044644474.7222e+0899.6502021-04-21 00:00:00+08:002021-04-21 00:00:00+08:000
6SZSE.1280251d106.000112.500103.505107.89045794775.0238e+08106.3002021-04-22 00:00:00+08:002021-04-22 00:00:00+08:000
7SZSE.1280251d108.000112.890103.220103.70036121133.8805e+08107.8902021-04-23 00:00:00+08:002021-04-23 00:00:00+08:000
8SZSE.1280251d104.500108.800102.999103.20623682672.4896e+08103.7002021-04-26 00:00:00+08:002021-04-26 00:00:00+08:000
9SZSE.1280251d103.000103.205101.208102.0996680506.8183e+07103.2062021-04-27 00:00:00+08:002021-04-27 00:00:00+08:000
\n", "
" ], "text/plain": [ " symbol frequency open high low close volume \\\n", "0 SZSE.128025 1d 98.700 99.129 98.700 98.900 16710 \n", "1 SZSE.128025 1d 98.903 99.320 98.900 99.199 12470 \n", "2 SZSE.128025 1d 98.901 99.487 98.900 99.287 25222 \n", "3 SZSE.128025 1d 99.201 99.446 99.132 99.280 34200 \n", "4 SZSE.128025 1d 99.300 99.800 99.300 99.650 19050 \n", "5 SZSE.128025 1d 100.006 107.900 100.006 106.300 4464447 \n", "6 SZSE.128025 1d 106.000 112.500 103.505 107.890 4579477 \n", "7 SZSE.128025 1d 108.000 112.890 103.220 103.700 3612113 \n", "8 SZSE.128025 1d 104.500 108.800 102.999 103.206 2368267 \n", "9 SZSE.128025 1d 103.000 103.205 101.208 102.099 668050 \n", "\n", " amount pre_close bob eob \\\n", "0 1.6536e+06 98.700 2021-04-14 00:00:00+08:00 2021-04-14 00:00:00+08:00 \n", "1 1.2355e+06 98.900 2021-04-15 00:00:00+08:00 2021-04-15 00:00:00+08:00 \n", "2 2.5013e+06 99.199 2021-04-16 00:00:00+08:00 2021-04-16 00:00:00+08:00 \n", "3 3.3957e+06 99.287 2021-04-19 00:00:00+08:00 2021-04-19 00:00:00+08:00 \n", "4 1.8962e+06 99.280 2021-04-20 00:00:00+08:00 2021-04-20 00:00:00+08:00 \n", "5 4.7222e+08 99.650 2021-04-21 00:00:00+08:00 2021-04-21 00:00:00+08:00 \n", "6 5.0238e+08 106.300 2021-04-22 00:00:00+08:00 2021-04-22 00:00:00+08:00 \n", "7 3.8805e+08 107.890 2021-04-23 00:00:00+08:00 2021-04-23 00:00:00+08:00 \n", "8 2.4896e+08 103.700 2021-04-26 00:00:00+08:00 2021-04-26 00:00:00+08:00 \n", "9 6.8183e+07 103.206 2021-04-27 00:00:00+08:00 2021-04-27 00:00:00+08:00 \n", "\n", " position \n", "0 0 \n", "1 0 \n", "2 0 \n", "3 0 \n", "4 0 \n", "5 0 \n", "6 0 \n", "7 0 \n", "8 0 \n", "9 0 " ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "history_data.head(10)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "history_data_df =get_history_instruments('SZSE.128025', fields=None, start_date='2020-01-01', end_date='2023-08-10', df=True)\n" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolpre_closeconversion_priceunderlying_symbollisted_date
870SZSE.128025186.0008.93SZSE.0027282017-12-28 00:00:00+08:00
871SZSE.128025185.0608.93SZSE.0027282017-12-28 00:00:00+08:00
872SZSE.128025182.4808.93SZSE.0027282017-12-28 00:00:00+08:00
873SZSE.128025191.0008.93SZSE.0027282017-12-28 00:00:00+08:00
874SZSE.128025192.4998.93SZSE.0027282017-12-28 00:00:00+08:00
\n", "
" ], "text/plain": [ " symbol pre_close conversion_price underlying_symbol \\\n", "870 SZSE.128025 186.000 8.93 SZSE.002728 \n", "871 SZSE.128025 185.060 8.93 SZSE.002728 \n", "872 SZSE.128025 182.480 8.93 SZSE.002728 \n", "873 SZSE.128025 191.000 8.93 SZSE.002728 \n", "874 SZSE.128025 192.499 8.93 SZSE.002728 \n", "\n", " listed_date \n", "870 2017-12-28 00:00:00+08:00 \n", "871 2017-12-28 00:00:00+08:00 \n", "872 2017-12-28 00:00:00+08:00 \n", "873 2017-12-28 00:00:00+08:00 \n", "874 2017-12-28 00:00:00+08:00 " ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "history_data_df[['symbol','pre_close','conversion_price','underlying_symbol','listed_date']].tail()" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolweight
0SHSE.6000190.29
1SZSE.3002740.59
2SHSE.6000250.06
3SZSE.3009990.13
4SHSE.6018680.16
.........
295SZSE.0021290.48
296SZSE.0023040.45
297SHSE.6000150.19
298SZSE.3004500.18
299SZSE.0024100.22
\n", "

300 rows × 2 columns

\n", "
" ], "text/plain": [ " symbol weight\n", "0 SHSE.600019 0.29\n", "1 SZSE.300274 0.59\n", "2 SHSE.600025 0.06\n", "3 SZSE.300999 0.13\n", "4 SHSE.601868 0.16\n", ".. ... ...\n", "295 SZSE.002129 0.48\n", "296 SZSE.002304 0.45\n", "297 SHSE.600015 0.19\n", "298 SZSE.300450 0.18\n", "299 SZSE.002410 0.22\n", "\n", "[300 rows x 2 columns]" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_constituents(index='SHSE.000300', fields='symbol, weight', df=True)\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datesymboldays_to_expire
02022-12-12CFFEX.IM22124
12022-12-13CFFEX.IM22123
22022-12-14CFFEX.IM22122
32022-12-15CFFEX.IM22121
42022-12-16CFFEX.IM22120
\n", "
" ], "text/plain": [ " date symbol days_to_expire\n", "0 2022-12-12 CFFEX.IM2212 4\n", "1 2022-12-13 CFFEX.IM2212 3\n", "2 2022-12-14 CFFEX.IM2212 2\n", "3 2022-12-15 CFFEX.IM2212 1\n", "4 2022-12-16 CFFEX.IM2212 0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_contract_expire_rest_days(symbols='CFFEX.IM2212', start_date='2022-12-12', end_date='2022-12-16', trade_flag = True, df=True)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "im_data = get_history_symbol(symbol='CFFEX.IM2212', start_date='2022-12-12', end_date='2022-12-16', df=True)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
trade_datepositionsettle_pricepre_settlepre_closeupper_limitlower_limitmargin_ratiomultiplieris_adjusted...listed_datedelisted_dateunderlying_symbolboardtrade_noption_typeoption_margin_ratio1option_margin_ratio2call_or_putconversion_start_date
02022-12-12 00:00:00+08:00403346665.806677.46684.87345.06009.80.15200False...2022-07-22 00:00:00+08:002022-12-16 00:00:00+08:00SHSE.000852000.00.0None
12022-12-13 00:00:00+08:00364626604.406665.86654.67332.25999.40.15200False...2022-07-22 00:00:00+08:002022-12-16 00:00:00+08:00SHSE.000852000.00.0None
22022-12-14 00:00:00+08:00275016565.406604.46604.87264.85944.00.15200False...2022-07-22 00:00:00+08:002022-12-16 00:00:00+08:00SHSE.000852000.00.0None
32022-12-15 00:00:00+08:00156966602.606565.46573.67221.85909.00.15200False...2022-07-22 00:00:00+08:002022-12-16 00:00:00+08:00SHSE.000852000.00.0None
42022-12-16 00:00:00+08:0006515.436602.66600.67923.05282.20.15200False...2022-07-22 00:00:00+08:002022-12-16 00:00:00+08:00SHSE.000852000.00.0None
\n", "

5 rows × 39 columns

\n", "
" ], "text/plain": [ " trade_date position settle_price pre_settle pre_close \\\n", "0 2022-12-12 00:00:00+08:00 40334 6665.80 6677.4 6684.8 \n", "1 2022-12-13 00:00:00+08:00 36462 6604.40 6665.8 6654.6 \n", "2 2022-12-14 00:00:00+08:00 27501 6565.40 6604.4 6604.8 \n", "3 2022-12-15 00:00:00+08:00 15696 6602.60 6565.4 6573.6 \n", "4 2022-12-16 00:00:00+08:00 0 6515.43 6602.6 6600.6 \n", "\n", " upper_limit lower_limit margin_ratio multiplier is_adjusted ... \\\n", "0 7345.0 6009.8 0.15 200 False ... \n", "1 7332.2 5999.4 0.15 200 False ... \n", "2 7264.8 5944.0 0.15 200 False ... \n", "3 7221.8 5909.0 0.15 200 False ... \n", "4 7923.0 5282.2 0.15 200 False ... \n", "\n", " listed_date delisted_date underlying_symbol \\\n", "0 2022-07-22 00:00:00+08:00 2022-12-16 00:00:00+08:00 SHSE.000852 \n", "1 2022-07-22 00:00:00+08:00 2022-12-16 00:00:00+08:00 SHSE.000852 \n", "2 2022-07-22 00:00:00+08:00 2022-12-16 00:00:00+08:00 SHSE.000852 \n", "3 2022-07-22 00:00:00+08:00 2022-12-16 00:00:00+08:00 SHSE.000852 \n", "4 2022-07-22 00:00:00+08:00 2022-12-16 00:00:00+08:00 SHSE.000852 \n", "\n", " board trade_n option_type option_margin_ratio1 option_margin_ratio2 \\\n", "0 0 0 0.0 0.0 \n", "1 0 0 0.0 0.0 \n", "2 0 0 0.0 0.0 \n", "3 0 0 0.0 0.0 \n", "4 0 0 0.0 0.0 \n", "\n", " call_or_put conversion_start_date \n", "0 None \n", "1 None \n", "2 None \n", "3 None \n", "4 None \n", "\n", "[5 rows x 39 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "im_data.tail(5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "py38", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.17" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: k-line/basic_usage.py ================================================ import akshare as ak import mpl_finance as mpf import matplotlib.pyplot as plt import pandas as pd def get_k_data(code="sz123073",name="同和转债k.xlsx"): df = ak.stock_zh_a_daily(symbol=code, start_date="20200901", end_date="20201230", adjust="qfq") df.to_excel(name) def kline_demo(): #创建绘图的基本参数 fig=plt.figure(figsize=(12, 8)) ax=fig.add_subplot(111) #获取刚才的股票数据 df = pd.read_excel("同和药业k.xlsx") mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0) #显示出来 plt.show() def axis_date(): from datetime import datetime from matplotlib.pylab import date2num import matplotlib.ticker as ticker #将股票时间转换为标准时间,不带时分秒的数据 def date_to_num(dates): num_time = [] for date in dates: date_time = datetime.strptime(date, '%Y-%m-%d') num_date = date2num(date_time) num_time.append(num_date) return num_time #创建绘图的基本参数 fig=plt.figure(figsize=(12, 8)) ax=fig.add_subplot(111) #获取刚才的股票数据 df = pd.read_excel("同和药业k.xlsx") mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0) df['date'] = pd.to_datetime(df['date']) df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d')) def format_date(x, pos=None): if x < 0 or x > len(df['date']) - 1: return '' return df['date'][int(x)] ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') #显示出来 plt.show() def ma_line(): from datetime import datetime from matplotlib.pylab import date2num import matplotlib.ticker as ticker import numpy as np #将股票时间转换为标准时间,不带时分秒的数据 def date_to_num(dates): num_time = [] for date in dates: date_time = datetime.strptime(date, '%Y-%m-%d') num_date = date2num(date_time) num_time.append(num_date) return num_time #创建绘图的基本参数 fig=plt.figure(figsize=(12, 8)) ax=fig.add_subplot(111) #获取刚才的股票数据 df = pd.read_excel("同和药业k.xlsx") mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0) df['date'] = pd.to_datetime(df['date']) df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d')) df["SMA5"] = df["close"].rolling(5).mean() df["SMA10"] = df["close"].rolling(10).mean() df["SMA30"] = df["close"].rolling(30).mean() ax.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线 ax.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线 ax.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线 def format_date(x, pos=None): if x < 0 or x > len(df['date']) - 1: return '' return df['date'][int(x)] ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') #显示出来 plt.show() def add_vol(): # 加入成交量 import mpl_finance as mpf import matplotlib.pyplot as plt import pandas as pd import matplotlib.ticker as ticker import numpy as np # 创建绘图的基本参数 fig, axes = plt.subplots(2, 1, sharex=True, figsize=(15, 10)) ax1, ax2 = axes.flatten() # 获取刚才的股票数据 df = pd.read_excel("同和药业k.xlsx") mpf.candlestick2_ochl(ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r', colordown='green', alpha=1.0) df['date'] = pd.to_datetime(df['date']) df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d')) def format_date(x, pos=None): if x < 0 or x > len(df['date']) - 1: return '' return df['date'][int(x)] df["SMA5"] = df["close"].rolling(5).mean() df["SMA10"] = df["close"].rolling(10).mean() df["SMA30"] = df["close"].rolling(30).mean() ax1.plot(np.arange(0, len(df)), df['SMA5']) # 绘制5日均线 ax1.plot(np.arange(0, len(df)), df['SMA10']) # 绘制10日均线 ax1.plot(np.arange(0, len(df)), df['SMA30']) # 绘制30日均线 ax1.grid(True) ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) red_pred = np.where(df["close"] > df["open"], df["volume"], 0) blue_pred = np.where(df["close"] < df["open"], df["volume"], 0) ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red") ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="green") plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') # 显示出来 plt.grid(visible=True) plt.show() def long_up_shadow(o,c,h,l): return True if (h-c)/c >=0.07 and (h-o)/o>=0.07 else False from recognize_form import plot_image def run(): df = pd.read_excel("同和药业k.xlsx") count_num = [] for row,item in df.iterrows(): if long_up_shadow(item['open'],item['close'],item['high'],item['low']): count_num.append(row) plot_image(df,count_num) ================================================ FILE: k-line/main.py ================================================ from basic_usage import get_k_data,axis_date,ma_line,add_vol,kline_demo,run from recognize_form import two_crow def main(): get_k_data(code="sz002241",name='歌尔股份2020.xlsx') kline_demo() axis_date() ma_line() add_vol() two_crow() run() if __name__ == '__main__': main() ================================================ FILE: k-line/recognize_form.py ================================================ # 识别k线形态 import pandas as pd import talib import matplotlib.pyplot as plt import matplotlib.ticker as ticker import mpl_finance as mpf def two_crow(): fig = plt.figure(figsize=(12, 8)) plt.rcParams['font.sans-serif'] = ['SimHei'] ax = fig.add_subplot(111) df = pd.read_excel("歌尔股份2020.xlsx") df['date'] = pd.to_datetime(df['date']) df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d')) df['tow_crows'] = talib.CDL2CROWS(df['open'].values, df['high'].values, df['low'].values, df['close'].values) pattern = df[(df['tow_crows'] == 100) | (df['tow_crows'] == -100)] mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r', colordown='green', alpha=1.0) for index, today in pattern.iterrows(): x_posit = df.index.get_loc(index) s="{}\n{}".format("两只乌鸦", today["date"]) ax.annotate(s, xy=(x_posit, today["high"]), xytext=(0, pattern["close"].mean()), xycoords="data", fontsize=18, textcoords="offset points", arrowprops=dict(arrowstyle="simple", color="r")) ax.xaxis.set_major_locator(ticker.MaxNLocator(20)) def format_date(x, pos=None): if x < 0 or x > len(df['date']) - 1: return '' return df['date'][int(x)] ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') plt.show() def plot_image(df,target): fig = plt.figure(figsize=(12, 8)) plt.rcParams['font.sans-serif'] = ['SimHei'] ax = fig.add_subplot(111) df['date'] = pd.to_datetime(df['date']) df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d')) mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r', colordown='green', alpha=1.0) for index in target: x_posit = df.index.get_loc(index) s = "{}\n{}".format("长上影", df.loc[index]["date"][5:]) ax.annotate(s, xy=(x_posit, df.loc[index]["high"]), xytext=(0, df.loc[index]["close"].mean()), xycoords="data", fontsize=18, textcoords="offset points", arrowprops=dict(arrowstyle="simple", color="r")) ax.xaxis.set_major_locator(ticker.MaxNLocator(20)) def format_date(x, pos=None): if x < 0 or x > len(df['date']) - 1: return '' return df['date'][int(x)] ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') plt.show() ================================================ FILE: k-line/search_target.py ================================================ import pandas as pd import talib import sys import tushare as ts sys.path.append('..') from configure.settings import config_dict ts_token = config_dict('ts_token') ts.set_token(ts_token) pro = ts.pro_api() start_date='20220105' end_date='20220520' import matplotlib.pyplot as plt import matplotlib.ticker as ticker import mpl_finance as mpf def plot(df): fig = plt.figure(figsize=(12, 8)) plt.rcParams['font.sans-serif'] = ['SimHei'] ax = fig.add_subplot(111) # df['trade_date'] = df['trade_date'].apply(lambda x: x.strftime('%Y%m%d')) df['tow_crows'] = talib.CDL2CROWS(df['open'].values, df['high'].values, df['low'].values, df['close'].values) pattern = df[(df['tow_crows'] == 100) | (df['tow_crows'] == -100)] mpf.candlestick2_ochl(ax, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r', colordown='green', alpha=1.0) for index, today in pattern.iterrows(): x_posit = df.index.get_loc(index) s = "{}\n{}".format("两只乌鸦", today["trade_date"]) ax.annotate(s, xy=(x_posit, today["high"]), xytext=(0, pattern["close"].mean()), xycoords="data", fontsize=18, textcoords="offset points", arrowprops=dict(arrowstyle="simple", color="r")) ax.xaxis.set_major_locator(ticker.MaxNLocator(20)) def format_date(x, pos=None): if x < 0 or x > len(df['trade_date']) - 1: return '' return df['trade_date'][int(x)] ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') plt.show() def get_all_codes(): df = pro.stock_basic(exchange='', list_status='', fields='') return df['ts_code'].tolist() def get_daily(code): df = pro.daily(ts_code=code, start_date=start_date, end_date=end_date) return df def search(df): # df['date'] = pd.to_datetime(df['date']) # df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d')) if len(df)==0: return False,[] df['tow_crows'] = talib.CDL2CROWS(df['open'].values, df['high'].values, df['low'].values, df['close'].values) pattern = df[(df['tow_crows'] == 100) | (df['tow_crows'] == -100)] if len(pattern)>0: location = [] for index, today in pattern.iterrows(): x_posit = df.index.get_loc(index) location.append(x_posit) return True,location return False,[] def run(): code_list = get_all_codes() for code in code_list: df = get_daily(code) found,location=search(df) if found: print(code,df.loc[location]) plot(df) run() ================================================ FILE: k_line.py ================================================ # -*-coding=utf-8-*- # 获取 不同形态的k线 import random import time import tushare as ts import pandas as pd import os, datetime, math import numpy as np import logging from configure.settings import DBSelector, MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, REDIS_HOST import redis from threading import Thread from common.BaseService import BaseService DB = DBSelector() engine = DB.get_engine('history', 'qq') conn = ts.get_apis() MYSQL_DB = 'history' cursor = DB.get_mysql_conn(MYSQL_DB, 'qq').cursor() # pd.set_option('display.max_rows', None) class Kline(BaseService): def __init__(self): super(Kline, self).__init__('log/kline.log') path = os.path.join(os.getcwd(), 'data') self.today_date = datetime.datetime.now().strftime('%Y-%m-%d') if not os.path.exists(path): os.mkdir(path) os.chdir(path) def store_base_data(self, target): self.all_info = ts.get_stock_basics() self.all_info = self.all_info.reset_index() print(self.all_info) if target == 'sql': self.all_info.to_sql('tb_baseinfo', engine, if_exists='replace') elif target == 'csv': self.all_info.to_csv('baseInfo.csv') else: logging.info('sql or csv option. Not get right argument') # 枚举每一个股票代码 def store_hist_data(self): read_cmd = 'select * from tb_baseInfo;' df = pd.read_sql(read_cmd, engine) for i in range(len(df)): code, name, start_date = df.loc[i]['code'], df.loc[i]['name'], df.loc[i]['timeToMarket'] self.get_hist_data(code, name, start_date) # time.sleep(random.random()) print(code, name, start_date) # 获取历史行情,前复权 ,使用bar函数,get_hist_data 经常会出错 def get_hist_data(self, code, name, start_data): try: start_data = datetime.datetime.strptime(str(start_data), '%Y%m%d').strftime('%Y-%m-%d') df = ts.bar(code, conn=conn, start_date=start_data, adj='qfq') print(df) except Exception as e: print(e) return df.insert(1, 'name', name) df = df.reset_index() try: df.to_sql(code, engine, if_exists='append') except Exception as e: print(e) def inital_data(self, target): if target == 'sql': self.today = pd.read_csv(self.today_date + '.csv', dtype={'code': np.str}) self.all = pd.read_csv('bases.csv', dtype={'code': np.str}) def _xiayingxian(self, row, ratio): ''' 下影线的逻辑 ratio 下影线的长度比例,数字越大,下影线越长 row: series类型 ''' open_p = float(row['open']) # print(open_p) closed = float(row['close']) # print(closed) low = float(row['low']) # print(low) high = float(row['high']) p = min(closed, open_p) try: diff = (p - low) * 1.00 / (high - low) diff = round(diff, 3) except ZeroDivisionError: diff = 0 if diff > ratio: xiayinxian_engine = DB.get_engine('db_selection','qq') date, code, name, ocupy_ration, standards = row['datetime'], row['code'], row['name'], diff, ratio df = pd.DataFrame( {'datetime': [date], 'code': [code], 'name': [name], 'ocupy_ration': [ocupy_ration], 'standards': [standards]}) try: df1 = pd.read_sql_table('xiayingxian', xiayinxian_engine, index_col='index') df = pd.concat([df1, df]) except Exception as e: print(e) # return None df = df.reset_index(drop=True) df.to_sql('xiayingxian', xiayinxian_engine, if_exists='replace') return row def store_data_not(self): df = self._xiayingxian() df.to_csv('xiayinxian.csv') # 把股票代码放入redis def redis_init(self): rds = redis.StrictRedis(REDIS_HOST, 6379, db=0) rds_2 = redis.StrictRedis(REDIS_HOST, 6379, db=1) for i in rds.keys(): d = dict({i: rds.get(i)}) rds_2.lpush('codes', d) # 正确的模板 def get_hist_line(self, date): print("Starting to capture") cmd = 'select * from `{}` where datetime = \'{}\'' r0 = redis.StrictRedis(REDIS_HOST, 6379, db=0) for code in r0.keys(): try: cursor.execute(cmd.format(code, date)) except Exception as e: continue data = cursor.fetchall() # try: data_row = data[0] except Exception as e: continue d = dict(zip(('datetime', 'code', 'name', 'open', 'close', 'high', 'low'), data_row[1:8])) self._xiayingxian(d, 0.7) # 把股票代码放到redis def add_code_redis(self): rds = redis.StrictRedis(REDIS_HOST, 6379, db=0) rds_1 = redis.StrictRedis(REDIS_HOST, 6379, db=1) df = ts.get_stock_basics() df = df.reset_index() # 清理数据库 if rds.dbsize() != 0: rds.flushdb() if rds_1.dbsize() != 0: rds_1.flushdb() for i in range(len(df)): code, name, timeToMarket = df.loc[i]['code'], df.loc[i]['name'], df.loc[i]['timeToMarket'] # print(str(timeToMarket)) d = dict({code: ':'.join([name, str(timeToMarket)])}) # print(d) rds.set(code, name) rds_1.lpush('codes', d) def get_hist_data(code, name, start_data): try: # start_data = datetime.datetime.strptime(str(start_data), '%Y%m%d').strftime('%Y-%m-%d') df = ts.bar(code, conn=conn, start_date=start_data, adj='qfq') except Exception as e: print(e) return hist_con = DB.get_engine('history') df.insert(1, 'name', name) df = df.reset_index() df2 = pd.read_sql_table(code, hist_con, index_col='index') try: new_df = pd.concat([df, df2]) new_df = new_df.reset_index(drop=True) new_df.to_sql(code, engine, if_exists='replace') except Exception as e: print(e) return class StockThread(Thread): def __init__(self, loop): Thread.__init__(self) self.rds = redis.StrictRedis(REDIS_HOST, 6379, db=1) self.loop_count = loop def run(self): self.loops() def loops(self): # start_date = datetime.datetime.now().strftime('%Y-%m-%d') start_date = '2017-11-21' while 1: try: item = self.rds.lpop('codes') print(item) except Exception as e: print(e) break d = eval(item) k = d.keys()[0] v = d[k] name = v.split(':')[0].strip() # start_date=v.split(':')[1].strip() get_hist_data(k, name, start_date) THREAD_NUM = 4 def StoreData(): threads = [] for i in range(THREAD_NUM): t = StockThread(i) t.start() threads.append(t) for j in range(THREAD_NUM): threads[j].join() print('done') # 能够正常运行的函数 def main(): obj = Kline() # obj.get_hist_line('2017-11-17') # obj.get_hist_line('2017-11-16') # obj.get_hist_line('2017-11-15') # obj.get_hist_line('2017-11-14') # obj.get_hist_line('2017-11-13') # 存储基本面的数据 # obj.store_base_data('sql') # 获取股票的前复权数据, 使用bar函数 # obj.store_hist_data() # 存放股票的代码和名字 # add_code_redis() # obj.redis_init() # 保存历史数据 # StoreData() if __name__ == '__main__': main() ================================================ FILE: longhuban.py ================================================ #-*-coding=utf-8-*- import requests import re import json def get_content(url,retry=5): headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'} while retry >0: try: r = requests.get(url,headers=headers) if r.status_code == 200 and len(r.text) >0: return r.text except Exception as e: print(e) retry-=1 if retry == 0 : return None def convert_json(url): content = get_content(url) if content is None: return lhb_date = [] try: # print(content) js = re.findall("var dateList=(.*?);",content,re.S)[0] # print(type(js)) js_data = json.loads(js) print(js_data) lhb_date = js_data.get('data') except Exception as e: print(e) return def convert_json(url,pattern): content = get_content(url) if content is None: return lhb_date = [] try: # print(content) js = re.findall(pattern,content,re.S)[0] # print(type(js)) js_data = json.loads(js) # print(js_data) lhb_date = js_data.get('data') # print(lhb_date) return lhb_date # for i in lhb_date: # print(i) except Exception as e: print(e) return def get_result(): code='300333' date='20180424' # lhb_list_url = 'http://stock.jrj.com.cn/action/lhb/getStockLhbDateList.jspa?vname=dateList&stockcode={}'.format(code) requestdetailURL="http://stock.jrj.com.cn/action/lhb/getStockLhbDetatil.jspa?vname=detailInfo&stockcode={}&date={}".format(code,date) return convert_json(requestdetailURL,'var detailInfo=(.*?);') ================================================ FILE: machine_learning/贝叶斯预测涨跌.py ================================================ import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.naive_bayes import BernoulliNB # 基于优矿平台 industry_category_df = DataAPI.EquIndustryGet(secID=u"", ticker=u"", industryVersionCD=u"010303", industry=u"", industryID=u"", industryID1=u"", industryID2=u"",industryID3=u"",intoDate=u"20210101",equTypeID=u"",field=u"",pandas="1") industry_category_df=industry_category_df.drop_duplicates(['ticker']) industry_category_df=industry_category_df[industry_category_df['ticker'].str.startswith(('3','6','0'))] # 过滤部分B股 industry_category_dict = dict(zip(industry_category_df['ticker'].tolist(),industry_category_df['industryName1'].tolist())) # 交易日历 beginDate=u"20210101" endDate=u"20210301" canlendar_df = DataAPI.TradeCalGet(exchangeCD=u"XSHG",beginDate=beginDate,endDate=endDate,isOpen=u"1",field=u"",pandas="1") canlendar_index = pd.Index(pd.to_datetime(canlendar_df['calendarDate'].tolist())) columns_name = list(industry_category_dict.keys()) industry_df = pd.DataFrame(data=np.NAN,index=canlendar_index,columns=columns_name) def apply_func(x): s=pd.Series(map(lambda x:industry_category_dict.get(x),x.index),index=x.index) return s industry_df_ = industry_df.apply(apply_func,axis=1) ticker_list = list(industry_category_dict.keys()) market_df =DataAPI.MktEqudGet(secID=u"", ticker=ticker_list, tradeDate=u"", beginDate=beginDate,endDate=endDate,isOpen="", field=u"tradeDate,ticker,marketValue,closePrice", pandas="1") d1=market_df.set_index(['tradeDate','ticker']).unstack()['marketValue'] lcap_=np.log(d1) labeled_lcap_ = lcap_.apply(pd.qcut, axis=1, q=5, labels=False, ) closePrice=market_df.set_index(['tradeDate','ticker']).unstack()['closePrice'] mom_ = closePrice/closePrice.shift(5)-1 mom_.dropna(axis=0,inplace=True,how='all') mom_result = mom_.apply(pd.qcut,axis=1,q=5,labels=False) closePrice_ = closePrice.sort_index() pct_change = closePrice_.pct_change() pct_change.dropna(axis=0,inplace=True,how='all') label_pct_change = pct_change.copy() label_pct_change[label_pct_change>0]=1 label_pct_change[label_pct_change<=0]=0 index = pd.to_datetime(label_pct_change.index) trade_calendar=index strategy_return = pd.Series(index=trade_calendar) # 进行策略回测 for i in range(len(trade_calendar)-2): # 获取训练对应x,y数据的时间和预测时x,y数据的时间 train_x_time = trade_calendar[i] train_y_time = trade_calendar[i+1] predict_x_time = trade_calendar[i+1] predict_y_time = trade_calendar[i+2] train_data = pd.DataFrame( { 'labeled_industry': industry_df_.loc[train_x_time], 'labeled_lcap': labeled_lcap_.loc[train_x_time]+200, 'labeled_mom': mom_result.loc[train_x_time]+300, 'labeled_pct_change':label_pct_change.loc[train_y_time] } ) train_data.dropna(axis=0, inplace=True, how='any') dummy_data1 = pd.get_dummies(train_data['labeled_industry']) dummy_data2 = pd.get_dummies(train_data['labeled_lcap']) dummy_data3 = pd.get_dummies(train_data['labeled_mom']) dummy_train_x = pd.concat([dummy_data1, dummy_data2, dummy_data3], axis=1) # 模型预测用数据读取 predict_data = pd.DataFrame( { 'labeled_industry': industry_df_.loc[predict_x_time], 'labeled_lcap': labeled_lcap_.loc[predict_x_time]+200, 'labeled_mom': mom_result.loc[predict_x_time]+300, 'pct_change': label_pct_change.loc[predict_y_time] } ) predict_data.dropna(axis=0, inplace=True, how='any') # 生成预测用哑变量矩阵 dummy_predict_data1 = pd.get_dummies(predict_data['labeled_industry']) dummy_predict_data2 = pd.get_dummies(predict_data['labeled_lcap']) dummy_predict_data3 = pd.get_dummies(predict_data['labeled_mom']) dummy_predict_x = pd.concat([dummy_predict_data1, dummy_predict_data2, dummy_predict_data3], axis=1) character_union = dummy_train_x.columns.union(dummy_predict_x.columns) dummy_train_x = dummy_train_x.reindex(columns=character_union, fill_value=0) dummy_predict_x = dummy_predict_x.reindex(columns=character_union, fill_value=0) # 训练模型 clf = BernoulliNB() clf.fit(dummy_train_x.values, train_data['labeled_pct_change'].values) # 进行预测并保存数据 prediction = clf.predict(dummy_predict_x.values) predict_data['prediction'] = prediction # 计算预测日策略收益率并保存到Series中 # 有可能某一天所有prediction都为0, if predict_data['prediction'].sum() == 0: strategy_return[predict_y_time] = 0 else: strategy_return[predict_y_time] = np.average(predict_data['pct_change'], weights=predict_data['prediction']) # 收益曲线 plt.figure(figsize=(10,6)) plt.plot((strategy_return+1).cumprod(), label='strategy_return') ================================================ FILE: monitor/__init__.py ================================================ # -*- coding: utf-8 -*- # @Time : 2020/11/21 0:09 # @File : __init__.py # @Author : Rocky C@www.30daydo.com ================================================ FILE: monitor/alert_me.py ================================================ # -*-coding=utf-8-*- # 估价达到自己的设定值,发邮件通知, 每天2.45发邮件 import fire import sys sys.path.append('..') from jsl_monitor import ReachTargetJSL from realtime_monitor_ts import ReachTarget # 可转债市场的监控 和 自选池 def main(monitor_type='jsl'): # 监控方式 if monitor_type == 'jsl': obj = ReachTargetJSL() else: obj = ReachTarget() obj.monitor() if __name__ == '__main__': fire.Fire(main) ================================================ FILE: monitor/big_deal.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' # 搜索大单进入的个股 import sys sys.path.append('..') from common.BaseService import BaseService import tushare as ts import pandas as pd pd.set_option('display.max_rows', None) class Monitor_Stock(BaseService): def __init__(self): super(Monitor_Stock, self).__init__('../log/bigdeal.log') # 大于某手的大单 def getBigDeal(self, code, vol): df = ts.get_today_ticks(code) #获取tick数据 print('df ', df) t = df[df['vol'] > vol] # s = df[df['amount'] > 100000000] # r = df[df['volume'] > vol * 10] if len(t)>0: self.logger.info("Big volume {}".format(code)) # self.logger.info(self.base[self.base['code'] == str(code)]['name'].values[0]) # self.logger.info(t) def init_market(self): ''' 获取全市场 ''' from configure.settings import get_tushare_pro pro = get_tushare_pro() data = pro.stock_basic(exchange='SSE', list_status='L') # print(data) data=data[~data['ts_code'].str.startswith("A")] return data['symbol'].tolist() def run(self): code_list = self.init_market() for i in code_list: try: # print(i) self.getBigDeal(i, 1000) except Exception as e: print(e) def main(): app = Monitor_Stock() # app.getBigDeal('002451',2000) app.run() # app.init_market() if __name__ == '__main__': main() ================================================ FILE: monitor/ceiling_break.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' # 股票封板监控 import time import datetime import tushare as ts import pandas as pd import threading from common.BaseService import BaseService from configure.settings import DBSelector EXCEPTION_TIME_OUT = 60 NORMAL_TIME_OUT = 3 TIME_RESET = 60 * 5 # 监测涨停板开板监测 class BreakMonitor(BaseService): def __init__(self, send=True): super(BreakMonitor, self).__init__() self.send = send self.DB = DBSelector() self.engine = self.DB.get_engine('db_stock', 'qq') self.bases = pd.read_sql('tb_basic_info', self.engine, index_col='index') def read_stock_list(self, file=None): if file: with open(file, 'r') as f: monitor_list = f.readlines() monitor_list = list(map(lambda x: x.strip(), monitor_list)) else: monitor_list = ['300100'] return monitor_list def percent(self, current, close): return (current - close) * 1.0 / close * 100 # 开板提示 def break_ceil(self, code): print(threading.current_thread().name) while 1: # 交易时间 if self.trading_time() != 0: break try: df = ts.get_realtime_quotes(code) except Exception as e: self.logger.error(e) time.sleep(5) continue v = float(df['b1_v'].values[0]) if self.percent(float(df.iloc[0]['price']), float(df.iloc[0]['pre_close'])) < 9: if self.send == True: title = f'{code}已经板了' self.notify(title) break if v <= 1000: print(datetime.datetime.now().strftime("%H:%M:%S")) print(u"小于万手,小心!跑") print(self.bases[self.bases['code'] == code]['name'].values[0]) if self.send == True: title = f'{code}开板了' self.notify(title) time.sleep(10) def monitor_break(self): thread_num = len(self.read_stock_list()) # 线程数和股票输一样 thread_list = [] for i in range(thread_num): t = threading.Thread(target=self.break_ceil, args=(self.read_stock_list()[i],)) thread_list.append(t) for j in thread_list: j.start() for k in thread_list: k.join() if __name__ == '__main__': obj = BreakMonitor(send=True) obj.monitor_break() ================================================ FILE: monitor/crawler_monitor.py ================================================ # 数据监控 import datetime import sys sys.path.append('..') from configure.settings import DBSelector from configure.util import send_message_via_wechat class Monitor: def __init__(self): pass def jsl_data_monitor(self): ''' 集思录数据监控 ''' db = DBSelector().get_mysql_conn('db_jisilu', type_='tencent-1c') cursor = db.cursor() date = datetime.datetime.now().strftime('%Y-%m-%d') # date='2022-01-01' sql = 'select `更新日期` from `tb_jsl_{}`'.format(date) count = 'select count(*) from `tb_jsl_{}`'.format(date) try: cursor.execute(sql) ret = cursor.fetchone() cursor.execute(count) count_ret = cursor.fetchone() except Exception as e: # 推送错误 msg = '当天爬取集思录数据出错' send_message_via_wechat(msg) try: date_ = ret[0].split(' ')[0] except Exception as e: msg = '当天爬取集思录数据日期解析出错' send_message_via_wechat(msg) return if date_ != date: msg = '当天爬取集思录数据日期解析出错' send_message_via_wechat(msg) return if count_ret[0] < 200: msg = '当天爬取集思录数据条数出错' send_message_via_wechat(msg) return def run(self): self.jsl_data_monitor() def main(): app = Monitor() app.run() if __name__ == '__main__': main() ================================================ FILE: monitor/jsl_monitor.py ================================================ # 使用jsl作为数据源 import json import redis import requests import sys sys.path.append('..') import time import threading from configure.settings import config from common.BaseService import BaseService, HistorySet from datahub.jsl_login import login ACCESS_INTERVAL = config['jsl_monitor']['ACCESS_INTERVAL'] ZZ_PERCENT = config['jsl_monitor']['ZZ_PERCENT'] ZG_PERCENT = config['jsl_monitor']['ZG_PERCENT'] REMAIN_SIZE = config['jsl_monitor']['REMAIN_SIZE'] EXPIRE_TIME = config['jsl_monitor']['EXPIRE_TIME'] HOLDING_FILENAME = config['holding_file'] JSL_USER = config['jsl_monitor']['JSL_USER'] JSL_PASSWORD = config['jsl_monitor']['JSL_PASSWORD'] ACCESS_INTERVAL_REALTIME = config['jsl_monitor']['ACCESS_INTERVAL_REALTIME'] FILTER_REDEEM = True #过滤强赎 REDIS_KEY = config['jsl_monitor']['REDIS_KEY'] REDIS_HOST=config['redis']['uc']['host'] REDIS_PORT=config['redis']['uc']['port'] REDIS_PASSWORD =config['redis']['uc']['password'] class ReachTargetJSL(BaseService): def __init__(self): super(ReachTargetJSL, self).__init__(f'../log/{self.__class__.__name__}.log') self.session = requests.Session() self.__headers = { 'Host': 'www.jisilu.cn', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Accept': 'application/json,text/javascript,*/*;q=0.01', 'Origin': 'https://www.jisilu.cn', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/67.0.3396.99Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'Referer': 'https://www.jisilu.cn/login/', 'Accept-Encoding': 'gzip,deflate,br', 'Accept-Language': 'zh,en;q=0.9,en-US;q=0.8', } ts = int(time.time() * 1000) self.params = ( ('___jsl', f'LST___t={ts}'), ) self.query_condition = { "fprice": None, "tprice": None, "curr_iss_amt": None, "volume": None, "svolume": None, "premium_rt": None, "ytm_rt": None, "rating_cd": None, "is_search": "N", "btype": "C", "listed": "Y", "qflag": "N", "sw_cd": None, "bond_ids": None, "rp": 50, } self.history = HistorySet(expire=EXPIRE_TIME) self.get_session() self.r=None def get_session(self): self.session = login(JSL_USER, JSL_PASSWORD) def get(self, *args, **kwargs): # 复写 try: response = self.session.post('https://www.jisilu.cn/data/cbnew/cb_list_new/', headers=self.__headers, params=self.params, data=self.query_condition, timeout=30) except Exception as e: self.logger.error(e) return None else: ret = response.json() return ret def redis_client_init(self): if self.r is None: self.r =redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT,password=REDIS_PASSWORD,decode_responses=False,db=0) def send_redis(self,data_list,key): self.redis_client_init() obj = json.dumps(data_list,ensure_ascii=False) try: self.r.set(key,obj) ret = self.r.expire(key,60) # 60秒过期 print(ret) except Exception as e: print(e) self.r = None self.redis_client_init() self.r.set(key,obj) ret = self.r.expire(key,60) print(ret) def once(self): result =self.fetch_data() t = threading.Thread(target=self.send_redis, args=(result,REDIS_KEY)) t.start() t.join() print('done') def fetch_data(self): ret = self.get() if not ret: time.sleep(5) result = [] for tmp_item in ret.get('rows', []): item = tmp_item.get('cell', {}) bond_nm = item.get('bond_nm', '').strip() bond_id = item.get('bond_id', '').strip() full_price = round(item.get('price'), 2) premium_rt = item.get('premium_rt') sincrease_rt = item.get('sincrease_rt') # 正股涨幅 increase_rt = item.get('increase_rt') curr_iss_amt = round(item.get('curr_iss_amt'), 2) # 剩余规模 flag = item.get('redeem_icon') pb = item.get('pb') list_dt = item.get('list_dt') convert_value = item.get('convert_value') convert_price = item.get('convert_price') tmp_dict = {'bond_nm': bond_nm, 'bond_id': bond_id, 'zz_price': full_price, 'premium_rt': premium_rt, 'sincrease_rt': sincrease_rt, 'increase_rt': increase_rt, 'curr_iss_amt': curr_iss_amt, 'flag': flag, 'pb': pb, 'list_dt': list_dt, 'convert_value': convert_value, 'convert_price': convert_price } result.append(tmp_dict) return result def realtime_fetch(self): while True: # if True: if self.trading_time() == 0: self.fetch_data() elif self.trading_time() == 1: break time.sleep(ACCESS_INTERVAL_REALTIME) def monitor(self): while True: # if True: if self.trading_time() == 0: ret = self.get() if not ret: self.logger.error('数据为空,网络问题') time.sleep(5) continue for body_dict in ret.get('rows', []): item = body_dict.get('cell', {}) bond_nm = item.get('bond_nm', '').strip() bond_id = item.get('bond_id', '').strip() full_price = round(item.get('price'),1) premium_rt = item.get('premium_rt') sincrease_rt = item.get('sincrease_rt') # 正股涨幅 if sincrease_rt is None: # 正股停牌了 continue increase_rt = item.get('increase_rt') curr_iss_amt = round(item.get('curr_iss_amt'),2) # 剩余规模 word = '涨停 ' if sincrease_rt > 0 else '跌停' flag = item.get('redeem_icon') if FILTER_REDEEM and (flag in ['Y','0','R','O']): #过滤强赎 continue if curr_iss_amt>=REMAIN_SIZE: # 过滤规模大于15亿 continue if abs(increase_rt) > ZZ_PERCENT and self.history.is_expire(bond_id): text = f'{bond_nm} {increase_rt},价格:{full_price}; 正股{sincrease_rt}; 规模:{curr_iss_amt}; 溢价率:{premium_rt}' t = threading.Thread(target=self.notify, args=(text,)) t.start() self.history.add(bond_id) if abs(sincrease_rt) >= ZG_PERCENT and self.history.is_expire(bond_id): text = f'{bond_nm} {increase_rt},价格:{full_price}; 正股{sincrease_rt}; 规模:{curr_iss_amt}; 溢价率:{premium_rt}' t = threading.Thread(target=self.notify, args=(text,)) t.start() self.logger.info(f'{bond_nm} {word}') self.history.add(bond_id) elif self.trading_time() == 1: break time.sleep(ACCESS_INTERVAL) if __name__ == "__main__": app = ReachTargetJSL() app.monitor() # app.once() ================================================ FILE: monitor/realtime_kzz_price.py ================================================ # -*-coding=utf-8-*- # @Time : 2020/1/20 10:54 # @File : realtime_price.py import pypinyin import time import requests import sys sys.path.append('..') from configure.util import read_web_headers_cookies __doc__=''' 命令行下替代网页版查询实时可转债数据 ''' session = requests.Session() headers, cookies = read_web_headers_cookies('jsl',headers=True, cookies=False) ts = int(time.time() * 1000) params = ( ('___jsl', f'LST___t={ts}'), ) data = { 'fprice': '', 'tprice': '', 'volume': '', 'svolume': '', 'premium_rt': '', 'ytm_rt': '', 'rating_cd': '', 'is_search': 'Y', 'btype': '', 'listed': 'Y', 'sw_cd': '', 'bond_ids': '', 'rp': '50' } while 1: name = input('input name => ') if name == 'q': print('退出') break try: response = session.post('https://www.jisilu.cn/data/cbnew/cb_list/', headers=headers, params=params, cookies=cookies, data=data, timeout=3) except Exception as e: print(e) continue ret = response.json() for body_dict in ret.get('rows', []): item = body_dict.get('cell', {}) bond_nm = item.get('bond_nm', '').strip() a = pypinyin.pinyin(bond_nm, style=pypinyin.FIRST_LETTER) b = [] for i in range(len(a)): b.append(str(a[i][0]).lower()) c = ''.join(b) if name == c: full_price = item.get('full_price') remium_rt = item.get('premium_rt') increase_rt = item.get('increase_rt') sincrease_rt = item.get('sincrease_rt') print('name ==>', bond_nm.replace('转债', '')) print('price ==>', full_price) print('pecent ==>', increase_rt) print('溢价率 ==>', remium_rt) print('正骨percent ==>', sincrease_rt) print('\n') ================================================ FILE: monitor/realtime_monitor_ts.py ================================================ # -*- coding: utf-8 -*- # @Time : 2020/11/16 10:26 # @File : realtime_monitor_ts.py # @Author : Rocky C@www.30daydo.com import tushare as ts import sys sys.path.append('..') from configure.settings import DBSelector from common.BaseService import BaseService import datetime import time import pandas as pd import numpy as np # 循环检测时间 LOOP_TIME = 60 EXECEPTION_TIME = 20 MARKET_OPENING = 0 # ALERT_PERCENTAGE = 3 DELTA_TIME = 30 ZG_ALERT_PERCENT = 8 ZZ_ALERT_PERCENT = 8 CW_ALERT_PERCENT = -5 DIFF_DELTA_TIME = 30 # ALERT_PERCENT_POOL = 3 DIFF_V = 40 # quote 接口以千为单位 file = 'D:\OneDrive\Stock\gj_hold.xls' # TODO 需要修复一些移除的函数 class ReachTarget(BaseService): def __init__(self): super(ReachTarget, self).__init__('log/reach_target.log') self.DB = DBSelector() self.engine = self.DB.get_engine('db_stock', 'qq') self.api = ts.get_apis() # python3 这个返回的不是list,需要手工转换 # self.kzz_code_list = list(self.stocks.keys()) # pool_code,pool_name=self.stock_pool() # self.pool_dict = dict(zip(pool_code,pool_name)) # self.pool_list= list(self.pool_dict.keys()) # 添加一部分持仓数据 或者 监测仓 # self.df = pd.read_table(file, encoding='gbk', dtype={'证券代码': np.str}) # try: # del self.df['Unnamed: 15'] # except Exception as e: # logger.error(e) # logger.error('删除多余列失败') # # code_list = list(self.df['证券代码'].values) # # # 移除非法证券代码 中签 # t = [code_list.remove(i) for i in code_list.copy() if i.startswith('7') or i[:2] == '07'] # # self.code_lists=code_list def all_bond_market(self): self.kzz_code, self.kzz_name, self.zg_code, self.name, self.yjl = self.zg_bond() self.kzz_stocks = dict(zip(self.kzz_code, self.kzz_name)) self.zg_stocks = dict(zip(self.zg_code, self.name)) self.kzz_stocks_yjl = dict(zip(self.kzz_code, self.yjl)) self.zg_stocks_yjl = dict(zip(self.zg_code, self.yjl)) return ( self.kzz_stocks, self.zg_stocks, self.kzz_stocks_yjl, self.zg_stocks_yjl) # 数据库获取模拟股,这个要废弃 def stock_pool(self): pool_table = 'tb_current_hold' pool_df = pd.read_sql(pool_table, self.engine, index_col='index') return list(pool_df['代码'].values), list(pool_df['名字'].values) # 判断市场 def identify_market(self, x): if x.startswith('3') or x.startswith('6') or x.startswith('0'): return False else: return True # 获取当前持仓个股 def get_current_position(self): engine = self.DB.get_engine('db_position', 'qq') df = pd.read_sql('tb_position_2019-06-17', con=engine) # 只关注可转债 df = df[df['证券代码'].map(self.identify_market)] kzz_stocks = dict( zip(list(df['证券代码'].values), list(df['证券名称'].values))) cons = self.DB.get_mysql_conn('db_stock', 'qq') cursor = cons.cursor() query_cmd = 'select 正股代码,正股名称,溢价率 from tb_bond_jisilu where 可转债代码=%s' zg_stocks = {} kzz_yjl = {} zg_yjl = {} for code in kzz_stocks: cursor.execute(query_cmd, (code)) ret = cursor.fetchone() if ret: zg_stocks[ret[0]] = ret[1] kzz_yjl[code] = ret[2] zg_yjl[ret[0]] = ret[2] # 可转债代码 # dict,dict,dict,dict return (kzz_stocks, zg_stocks, kzz_yjl, zg_yjl) # 获取市场所有可转债数据个股代码 正股 def zg_bond(self): bond_table = 'tb_bond_jisilu' try: jsl_df = pd.read_sql(bond_table, self.engine) except Exception as e: self.logger.info(e) return [], [], [], [], [] else: return list(jsl_df['可转债代码']), list(jsl_df['可转债名称']), list(jsl_df['正股代码'].values), \ list(jsl_df['正股名称'].values), list(jsl_df['溢价率'].values) # 可转债的监测 def monitor(self, total_market=True): ''' total_market 默认监控全市场 total_market = True ''' if total_market: (kzz_stocks, zg_stocks, kzz_yjl, zg_yjl) = self.all_bond_market() else: (kzz_stocks, zg_stocks, kzz_yjl, zg_yjl) = self.get_current_position() zg_code = list(zg_stocks.keys()) kzz_code = list(kzz_stocks.keys()) self.has_sent_kzz = dict( zip(kzz_code, [datetime.datetime.now()] * len(kzz_code))) self.has_sent_diff = dict( zip(kzz_code, [datetime.datetime.now()] * len(kzz_code))) self.has_sent_zg = dict( zip(zg_code, [datetime.datetime.now()] * len(zg_code))) while 1: current = trading_time() if current == MARKET_OPENING: self.get_realtime_info(kzz_code, self.has_sent_kzz, '转债', kzz_stocks, kzz_yjl, ZZ_ALERT_PERCENT) self.get_realtime_info(zg_code, self.has_sent_zg, '正股', zg_stocks, zg_yjl, ZG_ALERT_PERCENT) self.get_price_diff(codes=kzz_code, has_sent_=self.has_sent_diff, types='差价', kzz_stocks=kzz_stocks, kzz_stocks_yjl=kzz_yjl) time.sleep(LOOP_TIME) elif current == -1: time.sleep(LOOP_TIME) elif current == 1: try: ts.close_apis(self.api) except Exception as e: self.logger.info('fail to stop monitor {}'.format( datetime.datetime.now())) self.logger.info(e) exit(0) # 获取实时报价 def get_realtime_info(self, codes, has_sent, types, stock, yjl, percent): try: price_df = ts.quotes(codes, conn=self.api) except Exception as e: self.logger.error('获取可转债异常 >>>> {}'.format(e)) try: self.api = ts.get_apis() except Exception as e: self.logger.error('异常中存在异常{}'.format(e)) time.sleep(EXECEPTION_TIME) else: if len(price_df) != 0: price_df = price_df[price_df['cur_vol'] != 0] price_df['percent'] = (price_df['price'] - price_df['last_close']) / price_df[ 'last_close'] * 100 price_df['percent'] = price_df['percent'].map( lambda x: round(x, 2)) ret_dt = \ price_df[ (price_df['percent'] > percent) | (price_df['percent'] < -1 * percent)][ ['code', 'price', 'percent']] if len(ret_dt) > 0: # 提醒一次后,下一次的间隔为DELTA_TIME分钟后 # sent_list = [] for i in ret_dt['code']: if has_sent[i] <= datetime.datetime.now(): name_list = [] yjl_list = [] name_list.append(stock[i]) yjl_list.append(yjl[i]) has_sent[i] = datetime.datetime.now( ) + datetime.timedelta(minutes=DELTA_TIME) ret_dt1 = ret_dt[ret_dt['code'] == i] ret_dt1['名称'] = name_list ret_dt1['溢价率'] = yjl_list name = ret_dt1['名称'].values[0] price = ret_dt1['price'].values[0] percent = ret_dt1['percent'].values[0] yjl_v = ret_dt1['溢价率'].values[0] now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') content0 = '{t}\n{name}:价格:{price} 涨幅:{percent},溢价率:{yjl}'.format(name=name, price=price, percent=percent, yjl=yjl_v, t=now) self.logger.info(content0) try: self.notify(title=content0) except Exception as e: self.logger.info('发送微信失败') self.logger.info(e) # 获取差价 可转债 def get_price_diff(self, codes, has_sent_, types, kzz_stocks, kzz_stocks_yjl): # 针对可转债 try: df = ts.quotes(codes, conn=self.api) except Exception as e: self.logger.error('获取可转债异常 >>>> {}'.format(e)) try: self.api = ts.get_apis() except Exception as e: self.logger.error('异常中存在异常{}'.format(e)) time.sleep(EXECEPTION_TIME) else: df['bid1'] = df['bid1'].astype(float) df['ask1'] = df['ask1'].astype(float) df['diff'] = np.abs(df['bid1'] - df['ask1']) result = df[df['diff'] >= DIFF_V] if result.empty: # continue return else: for j in result['code']: if has_sent_[j] <= datetime.datetime.now(): has_sent_[j] = datetime.datetime.now( ) + datetime.timedelta(minutes=DIFF_DELTA_TIME) name_list = [] yjl_list = [] name_list.append(kzz_stocks[j]) yjl_list.append(kzz_stocks_yjl[j]) ret_dt1 = result[result['code'] == j] ret_dt1['名称'] = name_list ret_dt1['溢价率'] = yjl_list # ret_dt1 = ret_dt1.set_index('code', drop=True) code = j name = ret_dt1['名称'].values[0] price = ret_dt1['price'].values[0] bid = ret_dt1['bid1'].values[0] ask = ret_dt1['ask1'].values[0] diff = round(ret_dt1['diff'].values[0], 2) now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') content0 = '{t}\n{code}::{name}:价格:{price} 买1:{bid} 卖1:{ask}差价:{diff}'.format(code=code, name=name, price=price, bid=bid, ask=ask, diff=diff, t=now) self.logger.info(content0) try: wechat.send_content(content0) except Exception as e: self.logger.info('发送微信失败') self.logger.info(e) ================================================ FILE: monitor/server_api.py ================================================ from monitor.jsl_monitor import ReachTargetJSL class ServerAPI(ReachTargetJSL): def __init__(self): super(ServerAPI, self).__init__() def update(self): ret = self.fetch_data() new_result = [] for item in ret: tmp_dict = { "code": item[''], "name": item[''], "price": item[''], "percent": item[''], "premium_rt": item[''], "redeem_icon": item[''], "curr_iss_amt": item[''], "zg_price": item[''], "zg_code": item[''], "zg_percent": item[''], "zg_vol": item[''], "convert_price": item[''], "dead_line": item[''], "volume": item[''], "rating": item[''], "down_covert_p_time": item[''], "convert_start_date": item[''], "double_low": item[''], "convert_value": item[''], "change_down_condition": item[''], "turn_over_rate": item[''], "ytm": item['']} new_result.append(tmp_dict) self.send_redis(new_result, "ptrade") if __name__ == '__main__': app = ServerAPI() app.update() ================================================ FILE: new_stock_break.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' # 分析新股的开板时机 import tushare as ts import os import matplotlib.pyplot as plt class NewStockBreak(): def __init__(self,start_date=20170101,end_date=20170401): #为了文件整齐,新建一个文件夹data用来专门存放数据 current = os.getcwd() folder = os.path.join(current, 'new_stock') if os.path.exists(folder) == False: os.mkdir(folder) os.chdir(folder) #调用tushare接口,获取A股信息 df0=ts.get_stock_basics() # df0=pd.read_csv('bases.csv',dtype={'code':np.str}) self.bases=df0.sort_values('timeToMarket',ascending=False) #获取样本, 获取最近一个年的新股情况 self.cxg=self.bases[(self.bases['timeToMarket']>start_date) & (self.bases['timeToMarket']=date_start) & (df_k_data['date']<=date_end)] v_total_break=df3['volume'].sum() day=len(df3) rate=round(v_total_break*100*100.00/all_vol,2) #手和股 注意 else: rate,day = 0,0 # 换手率与天数 return rate,day def calc_open_day(self,code): cont=100000000 #total_vol=self.bases[self.bases['code']==code]['totals'].values[0] acutal_vol=self.bases[self.bases['code']==code]['outstanding'].values[0] all_vol= acutal_vol*cont #df= ts.get_hist_data(code) df1=ts.get_k_data(code) if len(df1)<3: return None #print(df1.info()) #df1=df.reset_index() #print(df1) start=df1['date'].values[0] print('Start day:', start) df2= df1[(df1['close']==df1['low']) & (df1['high']==df1['low'])] print(self.bases[self.bases['code']==code]['name'].values[0]) end=df2['date'].values[-1] print("Break day" , end) df3=df1[(df1['date']>=start) & (df1['date']<=end)] v_total_break=df3['volume'].sum() l=len(df3) print(l) print(v_total_break) rate=v_total_break*100*100.00/all_vol #手和股 注意 print(round(rate,6)) return rate,l def testcase(self): #self.calc_open_day('603096') result=[] max_line=[] k=[] for i in self.codes: t,l=self.calc_open_day(i) if t is not None: result.append(t) max_line.append({i:l}) k.append(l) x=range(len(result)) #print(x) #print(result) plt.bar(x,result) plt.show() sum=0 for i in result: sum=sum+i avg=sum*1.00/len(result) print(avg) max_v=max(k) print(max_v) print(max_line) def getData(self,filename): result=[] max_line=[] k=[] for i in self.codes: print(f'正处理{i}') name=self.bases.loc[i]['name'] rate,day=self.calc_open_by_percent(i) if rate: result.append(rate) max_line.append([name,day,rate]) k.append(day) #作图用的 #x=range(len(result)) #print(x) #print(result) #plt.bar(x,result) #lt.show() with open(filename,'w') as f: for x in max_line: #f.write(';'.join(x)) f.write(x[0]) f.write(';') f.write(str(x[1])) f.write(';') f.write(str(x[2])) f.write('\n') def main(): obj=NewStockBreak(start_date=20200101,end_date=20200701) obj.getData('cxg.txt') if __name__ == '__main__': main() ================================================ FILE: new_stock_fund.py ================================================ # -*- coding: utf-8 -*- # website: http://30daydo.com # @Time : 2019/10/24 0:03 # @File : new_stock_fund.py # 获取打新基金数据 import requests import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By import logging from scrapy.selector import Selector logger = logging.getLogger() PATH = r'C:\OneDrive\Python\selenium\chromedriver.exe' class TianTianFund(): def __init__(self): # 未上市 self.wss_url='http://fund.eastmoney.com/data/dxgjj_xgccjjyl.html#wss;SUMPLACE;desc;1' options = webdriver.ChromeOptions() options.add_argument( '--user-agent=Mozilla/5.0 (Windows NT 999999.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36') self.driver = webdriver.Chrome(executable_path=PATH, chrome_options=options) def get_fund(self): self.driver.get(self.wss_url) time.sleep(5) text=self.driver.page_source response = Selector(text=text) nodes = response.xpath('//tbody[@id="datalistwss_body"]/tr') for node in nodes: code = node.xpath('.//td[2]/a/text()').extract_first() name = node.xpath('.//td[3]/a/text()').extract_first() hit_count = node.xpath('.//td[6]/a[1]/text()').extract_first() fund_url = node.xpath('.//td[6]/a[1]/@href').extract_first() full_url = 'http://fund.eastmoney.com/data/'+fund_url new_stock_amount = node.xpath('.//td[6]/text()').extract_first() self.driver.get(fund_url) time.sleep(5) sub_response = Selector(text=self.driver.page_source) sub_nodes = sub_response.xpath('//tbody[@id="datalist_body"]/tr') new_stock_list = [] for sub_node in sub_nodes: d={} stock_code = sub_node.xpath('.//td[2]/a/text()').extract_first() stock_name = sub_node.xpath('.//td[3]/a/text()').extract_first() assign_mount = sub_node.xpath('.//td[9]/text()').extract_first() d['新股代码']=stock_code d['新股名称']=stock_name d['中的金额-万元']=assign_mount new_stock_list.append(d) print(new_stock_list) def start(self): self.get_fund() self.driver.close() if __name__=='__main__': fund = TianTianFund() fund.start() ================================================ FILE: pledged_validation.py ================================================ #-*-coding=utf-8-*- import json import tushare as ts import pandas as pd from configure.settings import get_engine import matplotlib.pyplot as plt # 股权质押数据整理 with open('codes.txt','r') as f: # s= f.read() codes=json.load(f) stocks=codes.get('example1') engine=get_engine('db_stock') # for key in codes.get('example1').keys(): # print(key, codes.get('example1').get(key)) # df1=pd.DataFrame() def pledge_info(): df=ts.stock_pledged() df.to_sql('tb_pledged_base',engine,if_exists='replace') df_list=[] for stock in stocks: df_list.append(df[df['code']==stock]) df=pd.concat(df_list) # print(df) df=df.reset_index(drop=True) # print(df) df= df.sort_values('p_ratio',ascending=False) df['code']=df['code'].astype('str') df['rest_ratio']=df['rest_pledged']/df['totals']*100 df['rest_ratio']=map(lambda x:round(x,2),df['rest_ratio']) df['unrest_ratio']=df['unrest_pledged']/df['totals']*100 df['unrest_ratio']=map(lambda x:round(x,2),df['unrest_ratio']) # print(df.info()) # print(df) # print(df.sort_values('deals',ascending=False)) # df.to_csv('pledge_my_stock.csv') def pledged_detail(): df=ts.pledged_detail() print(df.tail(10)) # for stock in stocks: # if len(df[df['code']==stock])!=0: # print(df[df['code']==stock]) # df.to_csv('pledge_all_stock.csv') df.to_sql('tb_pledged_detail',engine) def do_calculation(): df=pd.read_sql('tb_pledged_base',engine,index_col='index') # print(df) # df['unrest_ratio']=df['unrest_pledged']/df['totals']*100 # df['rest_ratio']=df['rest_pledged']/df['totals']*100 # df['unrest_ratio']=map(lambda x:round(x,2),df['unrest_ratio']) # df['rest_ratio']=map(lambda x:round(x,2),df['rest_ratio']) # df.to_sql('tb_pledged_base',engine,if_exists='replace') print('median ',df['p_ratio'].median()) print('mean ',df['p_ratio'].mean()) print('std ',df['p_ratio'].std()) print('var ',df['p_ratio'].var()) plt.figure() plt.hist(df['p_ratio'],20) # plt.hist(df['p_ratio'],10,normed=True) plt.show() # pledge_info() # pledged_detail() do_calculation() ================================================ FILE: plot_line.py ================================================ # -*-coding=utf-8-*- import datetime import os import random import time from optparse import OptionParser __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import pandas as pd import talib import tushare as ts import matplotlib as mpl from mpl_finance import candlestick2_ochl, volume_overlay import matplotlib.pyplot as plt from configure.settings import DBSelector import sys if sys.platform=='linux': # centos的配置, 根据自定义拷贝的字体 mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] else: mpl.rcParams['font.sans-serif'] = ['simhei'] mpl.rcParams['axes.unicode_minus'] = False def get_basic_info(): DB = DBSelector() engine = DB.get_engine('db_stock', 'qq') base_info = pd.read_sql('tb_basic_info', engine, index_col='index') return base_info def check_path(root_path,current,filename): folder_path = os.path.join(root_path, current) if not os.path.exists(folder_path): os.mkdir(folder_path) full_path = os.path.join(folder_path, filename) if os.path.exists(full_path): return None else: return full_path def plot_stock_line(api,code, name, table_type, current, root_path,start='2019-10-01', save=False): title = '{}_{}_{}_{}'.format(current, code, name, table_type).replace('*', '_') filename = title + '.png' full_path = check_path(root_path,current,filename) if full_path is None: return base_info = get_basic_info() if code is None and name is not None: code = base_info[base_info['name'] == name]['code'].values[0] df = None for _ in range(4): try: df = ts.bar(code, conn=api, start_date=start) except Exception as e: ts.close_apis(api) time.sleep(random.random() * 30) api = ts.get_apis() else: break if df is None: return df = df.sort_index() if name is None: name = base_info[base_info['code'] == code]['name'].values[0] df = df.reset_index() df['datetime'] = df['datetime'].dt.strftime('%Y-%m-%d') sma5 = talib.SMA(df['close'].values, 5) sma20 = talib.SMA(df['close'].values, 10) # ax.set_xticks(range(0,len(df),20)) # # ax.set_xticklabels(df['date'][::5]) # ax.set_xticklabels(df['datetime'][::20]) fig = plt.figure(figsize=(10, 8)) # fig,(ax,ax2)=plt.subplots(2,1,sharex=True,figsize=(16,10)) ax = fig.add_axes([0, 0.3, 1, 0.50]) ax2 = fig.add_axes([0, 0.1, 1, 0.20]) candlestick2_ochl(ax, df['open'], df['close'], df['high'], df['low'], width=1, colorup='r', colordown='g', alpha=0.6) ax.grid(True) ax.set_title(title) ax.plot(sma5, label='MA5') ax.legend() ax.plot(sma20, label='MA20') ax.legend(loc=2) ax.grid(True) # df['vol'].plot(kind='bar') volume_overlay(ax2, df['open'], df['close'], df['vol'], width=0.75, alpha=0.8, colordown='g', colorup='r') ax2.set_xticks(range(0, len(df), 20)) # ax.set_xticklabels(df['date'][::5]) ax2.set_xticklabels(df['datetime'][::20]) plt.setp(ax2.get_xticklabels(), rotation=30, horizontalalignment='right') ax2.grid(True) plt.subplots_adjust(hspace=0.3) if save: # path = os.path.join(os.path.dirname(__file__),'data',TODAY) fig.savefig(full_path) else: plt.show() plt.close() if __name__ == '__main__': parser = OptionParser() parser.add_option("-c", "--code", dest="code", help="-c 300141 #using code to find security") parser.add_option("-n", "--name", dest="name", help="-n 和顺电气 #using code to find security") (options, args) = parser.parse_args() if len((sys.argv)) >= 2: code = options.code name = options.name name = name.decode('utf-8') else: code = None name = '泰永长征' plot_stock_line(code=code, name=name, table_name='zdt', current='20180912', start='2018-02-01', save=False) ================================================ FILE: ptrade/__init__.py ================================================ ================================================ FILE: ptrade/逆回购.py ================================================ # 关注公众号:可转债量化分析 SH_FLAG =True SZ_FLAG = False def reverse_repurchase(context): cash = context.portfolio.cash #上海逆回购 if SH_FLAG: amount = int((cash/100)/1000)*1000 order('204001.SS', -amount) #深圳逆回购 if SZ_FLAG: amount = int((cash/100)/10)*10 order('131810.SZ', -amount) def initialize(context): ''' 初始化 ''' run_daily(context, reverse_repurchase, time='14:58') # 逆回购 ================================================ FILE: real_time_big_deal.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import datetime import tushare as ts import pandas as pd import time,os,threading import numpy as np from toolkit import Toolkit pd.set_option('display.max_rows',None) class BigMonitor(): def __init__(self): path=os.path.join(os.getcwd(),'data') if os.path.exists(path)==False: os.mkdir(path) print("Please put data under data folder") exit() os.chdir(path) self.stockList=Toolkit.read_stock('mystock.csv') self.bases=pd.read_csv('bases.csv',dtype={'code':np.str}) def loop(self,code): name=self.bases[self.bases['code']==code]['name'].values[0] print(name) while 1: time.sleep(2) df_t1=ts.get_realtime_quotes(code) v1=long(df_t1['volume'].values[0]) p1=float(df_t1['price'].values[0]) #print(df_t1) time.sleep(2) df_t2=ts.get_realtime_quotes(code) v2=long(df_t2['volume'].values[0]) p2=float(df_t2['price'].values[0]) delta_v= (v2-v1)/100 #换成手 #计算价差 price_v=p2-p1 if delta_v >1000: print(datetime.datetime.now().strftime('%H:%M:%S')) print("Big deal on %s" %name,) print(delta_v,'price diff',price_v) def multi_thread(self,code_list): thread_list=[] for i in code_list: t=threading.Thread(target=self.loop,args=(i,)) thread_list.append(t) for j in thread_list: j.start() def testcase(self): self.multi_thread(self.stockList) def main(): obj=BigMonitor() obj.testcase() main() ================================================ FILE: recordMyChoice.py ================================================ # -*-coding=utf-8-*- # 记录每天选股后的收益,用于跟踪每一只自选股 __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import datetime import os import xlrd import time from xlutils.copy import copy import tushare as ts from configure.settings import get_mysql_conn import codecs from configure.settings import LLogger logger=LLogger('recordMyChoice.log') class Prediction_rate(): def __init__(self): self.today_stock = ts.get_today_all() now = datetime.datetime.now() self.today = now.strftime("%Y-%m-%d") # weekday=now+datetime.timedelta(days=-2) # weekday=weekday.strftime("%Y-%m-%d") # print(weekday) # TODAY=now.strftime('%Y-%m-%d') self.path = os.path.join(os.getcwd(), 'data') self.filename = os.path.join(self.path, 'recordMyChoice.xls') def stock_pool(self, stock_list): pass def first_record(self, stockID): # stockID_list=['000673'] wb = xlrd.open_workbook(self.filename) table = wb.sheets()[0] nrow = table.nrows ncol = table.ncols print("%d*%d" % (nrow, ncol)) row_start = nrow wb_copy = copy(wb) sheet = wb_copy.get_sheet(0) # 调用 write 函数写入 info write(1,1,'Hello') # content = [] mystock = self.today_stock[self.today_stock['code'] == stockID] name = mystock['name'].values[0] in_price = mystock['trade'].values[0] current_price = in_price profit = 0.0 content = [self.today, stockID, name, in_price, current_price, profit] for i in range(len(content)): sheet.write(row_start, i, content[i]) row_start = row_start + 1 wb_copy.save(self.filename) def update(self): # 对已有的进行更新 pass ''' 持股信息保存到Mysql数据库, 更新,删除 ''' class StockRecord: def __init__(self): self.conn = get_mysql_conn('db_stock',local=True) self.cur = self.conn.cursor() self.table_name = 'tb_profit' self.today = datetime.datetime.now().strftime('%Y-%m-%d') # self.TODAY = '2018-04-13' def holding_stock_sql(self): path = os.path.join(os.path.dirname(__file__), 'data', 'mystock.csv') if not os.path.exists(path): return create_table_cmd = 'CREATE TABLE IF NOT EXISTS `tb_profit` (`证券代码` CHAR (6),`证券名称` VARCHAR (16), `保本价` FLOAT,`股票余额` INT,`盈亏比例` FLOAT,`盈亏` FLOAT, `市值` FLOAT);' try: self.cur.execute(create_table_cmd) self.conn.commit() except Exception as e: # print(e) logger.log(e) self.conn.rollback() with codecs.open(path, 'r', encoding='utf-8') as f: content = f.readlines() for i in range(1, len(content)): code, name, safe_price, count = content[i].strip().split(',')[:4] print(code, name, safe_price, count) insert_cmd = 'INSERT INTO `tb_profit` (`证券代码`,`证券名称`,`保本价`,`股票余额`) VALUES(\"%s\",\"%s\",\"%s\",\"%s\");' % ( code.zfill(6), name, safe_price, count) self._exe(insert_cmd) def delete(self, content): name = u"证券名称" cmd = u"DELETE FROM `{}` WHERE `{}` = \"{}\"".format(self.table_name, name, content) self._exe(cmd) def insert(self, code, name, safe_price, count): ''' :param code: 代码 :param name: 名称 :param safe_price: 保本价 :param count: 股票数目 :return: None ''' insert_cmd = 'INSERT INTO `tb_profit` (`证券代码`,`证券名称`,`保本价`,`股票余额`) VALUES(\"%s\",\"%s\",\"%s\",\"%s\");' % ( code.zfill(6), name, safe_price, count) self._exe(insert_cmd) # 执行mysql语句 def _exe(self, cmd): try: self.cur.execute(cmd) self.conn.commit() except Exception as e: # print(e) logger.log(e) self.conn.rollback() return self.cur # 更新每天的盈亏情况 def update_daily(self): add_cols = 'ALTER TABLE `{}` ADD `{}` FLOAT;'.format(self.table_name, self.today) self._exe(add_cols) # self.conn.commit() api = ts.get_apis() cmd = 'SELECT * FROM `{}`'.format(self.table_name) cur = self._exe(cmd) for i in cur.fetchall(): (code, name, safe_price, count, profit_ratio, profit, values, current_price,earn) = i[:9] df = ts.quotes(code, conn=api) current_price = round(float(df['price'].values[0]), 2) values = current_price * count last_close = df['last_close'].values[0] earn = (current_price - last_close) * count profit = (current_price - safe_price) * count profit_ratio = round(float(current_price - safe_price) / safe_price * 100, 2) update_cmd = 'UPDATE {} SET `盈亏比例`={} ,`盈亏`={}, `市值` ={}, `现价` = {},`{}`={} where `证券代码`= {};'.format( self.table_name, profit_ratio, profit, values, current_price, self.today, earn,code) # print(update_cmd) self._exe(update_cmd) ts.close_apis(api) # 删除某行 def update_item(self, code, content): cmd = 'UPDATE `{}` SET `保本价`={} where `证券代码`={};'.format(self.table_name, content, code) self._exe(cmd) def update_sold(self): cur = self.conn.cursor() tb_name = 'tb_sold_stock' cur.execute('select * from {}'.format(tb_name)) content = cur.fetchall() db_daily = get_mysql_conn('db_daily') db_cursor=db_daily.cursor() stock_table = datetime.datetime.now().strftime('%Y-%m-%d') # stock_table = '2018-05-02' for i in content: cmd='select `trade` from `{}` where `code`=\'{}\''.format(stock_table,i[0]) print(cmd) db_cursor.execute(cmd) ret = db_cursor.fetchone() sold_price = i[3] percentange =round(float(ret[0]- sold_price)/sold_price*100,2) update_cmd = 'update `{}` set `当前价`={} ,`卖出后涨跌幅`= {} where `代码`=\'{}\''.format(tb_name,ret[0],percentange,i[0]) print(update_cmd) cur.execute(update_cmd) self.conn.commit() if __name__ == "__main__": if ts.is_holiday(datetime.datetime.now().strftime('%Y-%m-%d')): exit(0) # obj=Prediction_rate() # obj.first_recode() # holding_stock_sql() obj = StockRecord() # obj.delete('深F120') # obj.insert('300580','贝斯特',19.88,200) obj.update_daily() obj.update_sold() # obj.update_item('300580',32.568) ================================================ FILE: relationship_case.py ================================================ #-*-coding=utf-8-*- import tushare as ts from pandas import Series import pandas as pd import numpy as np import matplotlib.pyplot as plt from pylab import mpl #mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题 mpl.rcParams['axes.unicode_minus'] = False # 每个月的解禁股与大盘指数的关系 def ban_share(code,name): conn =ts.get_apis() year_2017 = [2629.218,3970.902,2083.032,1720.327,1999.456,1771.074,2417.082,2904.992,2910.946,2971.483,2350.122,3874.328] df = ts.bar(code, conn=conn, freq='M', start_date='2016-12-30', end_date='2017-11-01', asset='INDEX') series = df['close'] ''' diff_series=[] print(series) l = len(series) for i in range(l-1): print(series[i]) d= series[i]-series[i+1] diff_series.append(d) #print(len(diff_series)) ''' #s2=Series(series) s2=series[:len(series)-1] s3 = s2.sort_index(ascending=True) #print(s3) s1 = Series(year_2017[0:len(s3)]) s3=s3.reset_index(drop=True) #print(s3) #print(s1) cor = s3.corr(s1) #print(len(s3)) #print(len(s1)) print(cor) plt.figure() plt.subplot(2,1,1) s1.plot() plt.subplot(2,1,2) s3.plot(title=name) plt.show() if abs(cor) >0.5: print('Great factor: ',code) def read_index(): df = pd.read_excel('data/index_data.xls') df['index_data']=df['index_data'].apply(lambda x:str(x).zfill(6)) #print(df) #df['index_data'].apply(lambda x:ban_share(x)) for i in range(len(df)): code = df.loc[i]['index_data'] name =df.loc[i]['name'] ban_share(code,name) def main(): read_index() #ban_share('000001') print('Done') main() ================================================ FILE: requirements.txt ================================================ easytrader loguru rsa redis pypinyin sqlalchemy pandas tushare akshare parsel loguru xlwt easyquotation loguru rsa pymongo pymysql ================================================ FILE: select_stock.py ================================================ # -*-coding=utf-8-*- # 适用 tushare 0.7.5 __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import tushare as ts import pandas as pd import os, datetime, time, Queue from toolkit import Toolkit from threading import Thread q = Queue.Queue() # 用来选股用的 pd.set_option('max_rows', None) from configure.settings import get_engine engine = get_engine('db_stock') # 缺陷: 暂时不能保存为excel class filter_stock(): def __init__(self,retry=5,local=False): if local: for i in range(retry): try: self.bases_save = ts.get_stock_basics() # print(self.bases_save) self.bases_save=self.bases_save.reset_index() self.bases_save.to_csv('bases.csv') self.bases_save.to_sql('bases',engine,if_exists='replace') if self.bases_save: break except Exception as e: if i>=4: self.bases_save=pd.DataFrame() exit() continue else: self.bases_save = pd.read_sql('bases',engine,index_col='index') self.base=self.bases_save # 因为网速问题,手动从本地抓取 self.today = time.strftime("%Y-%m-%d", time.localtime()) # self.base = pd.read_csv('bases.csv', dtype={'code': np.str}) self.all_code = self.base['code'].values self.working_count = 0 self.mystocklist = Toolkit.read_stock('mystock.csv') # 保存为excel 文件 这个时候csv 乱码,excel正常. def save_data_excel(self): df = ts.get_stock_basics() df.to_csv(self.today + '.csv', encoding='gbk') df_x = pd.read_csv(self.today + '.csv', encoding='gbk') df_x.to_excel(self.today + '.xls', encoding='gbk') os.remove(self.today + '.csv') def insert_garbe(self): print('*' * 30) print('\n') def showInfo(self, df): print('*' * 30) print('\n') print(df.info()) print('*' * 30) print('\n') print(df.dtypes) self.insert_garbe() print(df.describe()) # 计算每个地区有多少上市公司 def count_area(self, writeable=False): count = self.base['area'].value_counts() print(count) print(type(count)) if writeable: count.to_csv('各省的上市公司数目.csv') return count # 显示你要的某个省的上市公司 def get_area(self, area, writeable=False): user_area = self.base[self.base['area'] == area] user_area.sort_values('timeToMarket', inplace=True, ascending=False) if writeable: filename = area + '.csv' user_area.to_csv(filename) return user_area # 获取所有地区的分类个股 def get_all_location(self): series = self.count_area() index = series.index for i in index: name = unicode(i) self.get_area(name, writeable=True) # 找出指定日期后的次新股 def fetch_new_ipo(self, start_time, writeable=False): # 需要继续转化为日期类型 df = self.base.loc[self.base['timeToMarket'] > start_time] df.sort_values('timeToMarket', inplace=True, ascending=False) if writeable == True: df.to_csv("New_IPO.csv") # sum_a=df['pe'].sum() pe_av = df[df['pe'] != 0]['pe'].mean() pe_all_av = self.base[self.base['pe'] != 0]['pe'].mean() print(u"平均市盈率为 ", pe_av) print('A股的平均市盈率为 ', pe_all_av) return df # 获取成分股 def get_chengfenggu(self, writeable=False): s50 = ts.get_sz50s() if writeable == True: s50.to_excel('sz50.xls') list_s50 = s50['code'].values.tolist() # print(type(s50)) # print(type(list_s50)) # 返回list类型 return list_s50 # 计算一个票从最高位到目前 下跌多少 计算跌幅 def drop_down_from_high(self, start, code): end_day = datetime.date(datetime.date.today().year, datetime.date.today().month, datetime.date.today().day) end_day = end_day.strftime("%Y-%m-%d") # print(e)nd_day # print(start) total = ts.get_k_data(code=code, start=start, end=end_day) # print(total) high = total['high'].max() high_day = total.loc[total['high'] == high]['date'].values[0] print(high) print(high_day) current = total['close'].values[-1] print(current) percent = round((current - high) / high * 100, 2) print(percent) return percent def loop_each_cixin(self): df = self.fetch_new_ipo(20170101, writeable=False) all_code = df['code'].values print(all_code) # exit() percents = [] for each in all_code: print(each) # print(type(each)) percent = self.drop_down_from_high('2017-01-01', each) percents.append(percent) df['Drop_Down'] = percents # print(df) df.sort_values('Drop_Down', ascending=True, inplace=True) # print(df) df.to_csv(self.today + '_drop_Down_cixin.csv') # 获取所有的ma5>ma10 def macd(self): # df=self.fetch_new_ipo(writeable=True) # all_code=df['code'].values # all_code=self.get_all_code() # print(all_code) result = [] for each_code in self.all_code: print(each_code) try: df_x = ts.get_k_data(code=each_code, start='2017-03-01') # 只找最近一个月的,所以no item的是停牌。 except: print("Can't get k_data") continue if len(df_x) < 11: # return print("no item") continue ma5 = df_x['close'][-5:].mean() ma10 = df_x['close'][-10:].mean() if ma5 > ma10: # print("m5>m10: ",each_code," ",self.base[self.base['code']==each_code]['name'].values[0], "ma5: ",ma5,' m10: ',ma10) temp = [each_code, self.base[self.base['code'] == each_code]['name'].values[0]] print(temp) result.append(temp) print(result) print("Done") return result # 返回所有股票的代码 def get_all_code(self): return self.all_code # 获取成交量的ma5 或者10 def volume_calculate(self, codes): delta_day = 180 * 7 / 5 end_day = datetime.date(datetime.date.today().year, datetime.date.today().month, datetime.date.today().day) start_day = end_day - datetime.timedelta(delta_day) start_day = start_day.strftime("%Y-%m-%d") end_day = end_day.strftime("%Y-%m-%d") print(start_day) print(end_day) result_m5_large = [] result_m5_small = [] for each_code in codes: # print(e)ach_code try: df = ts.get_k_data(each_code, start=start_day, end=end_day) print(df) except Exception as e: print("Failed to get") print(e) continue if len(df) < 20: # print("not long enough") continue print(each_code) all_mean = df['volume'].mean() m5_volume_m = df['volume'][-5:].mean() m10_volume_m = df['volume'][-10:].mean() last_vol = df['volume'][-1] # 这里会不会有问题??? # 在这里分几个分支,放量 180天均量的4倍 if m5_volume_m > (4.0 * all_mean): print("m5 > m_all_avg ") print(each_code,) temp = self.base[self.base['code'] == each_code]['name'].values[0] print(temp) result_m5_large.append(each_code) # 成交量萎缩 if last_vol < (m5_volume_m / 3.0): result_m5_small.append(each_code) return result_m5_large, result_m5_large def turnover_check(self): delta_day = 60 * 7 / 5 end_day = datetime.date(datetime.date.today().year, datetime.date.today().month, datetime.date.today().day) start_day = end_day - datetime.timedelta(delta_day) start_day = start_day.strftime("%Y-%m-%d") end_day = end_day.strftime("%Y-%m-%d") print(start_day) print(end_day) for each_code in self.all_code: try: df = ts.get_hist_data(code=each_code, start=start_day, end=end_day) except: print("Failed to get data") continue mv5 = df['v_ma5'][-1] mv20 = df['v_ma20'][-1] mv_all = df['volume'].mean() # 写入csv文件 def write_to_text(self): print("On write") r = self.macd() filename = self.today + "-macd.csv" f = open(filename, 'w') for i in r: f.write(i[0]) f.write(',') f.write(i[1]) f.write('\n') f.close() def saveList(self, l, name): f = open(self.today + name + '.csv', 'w') if len(l) == 0: return False for i in l: f.write(i) f.write(',') name = self.base[self.base['code'] == i]['name'].values[0] f.write(name) f.write('\n') f.close() return True # 读取自己的csv文件 def read_csv(self): filename = self.today + "-macd.csv" df = pd.read_csv(filename) print(df) # 持股从高点下跌幅度 def own_drop_down(self): for i in self.mystocklist: print(i) self.drop_down_from_high(code=i, start='2017-01-01') print('\n') # 持股跌破均线 def _break_line(self, codes, k_type): delta_day = 60 * 7 / 5 end_day = datetime.date(datetime.date.today().year, datetime.date.today().month, datetime.date.today().day) start_day = end_day - datetime.timedelta(delta_day) start_day = start_day.strftime("%Y-%m-%d") end_day = end_day.strftime("%Y-%m-%d") print(start_day) print(end_day) all_break = [] for i in codes: try: df = ts.get_hist_data(code=i, start=start_day, end=end_day) if len(df) == 0: continue except Exception as e: print(e) continue else: self.working_count = self.working_count + 1 current = df['close'][0] ma5 = df['ma5'][0] ma10 = df['ma10'][0] ma20 = df['ma20'][0] ma_dict = {'5': ma5, '10': ma10, '20': ma20} ma_x = ma_dict[k_type] # print(ma_x) if current < ma_x: print('破位') print(i, " current: ", current) print(self.base[self.base['code'] == i]['name'].values[0], " ") print("holding place: ", ma_x) print("Break MA", k_type, "\n") all_break.append(i) return all_break # 检查自己的持仓或者市场所有破位的 def break_line(self, code, k_type='20', writeable=False, mystock=False): all_break = self._break_line(code, k_type) l = len(all_break) beaking_rate = l * 1.00 / self.working_count * 100 print("how many break: ", l) print("break Line rate ", beaking_rate) if mystock == False: name = '_all_' else: name = '_my__' if writeable: f = open(self.today + name + 'break_line_' + k_type + '.csv', 'w') f.write("Breaking rate: %f\n\n" % beaking_rate) f.write('\n'.join(all_break)) f.close() def _break_line_thread(self, codes, k_type='5'): delta_day = 60 * 7 / 5 end_day = datetime.date(datetime.date.today().year, datetime.date.today().month, datetime.date.today().day) start_day = end_day - datetime.timedelta(delta_day) start_day = start_day.strftime("%Y-%m-%d") end_day = end_day.strftime("%Y-%m-%d") print(start_day) print(end_day) all_break = [] for i in codes: try: df = ts.get_hist_data(code=i, start=start_day, end=end_day) if len(df) == 0: continue except Exception as e: print(e) continue else: self.working_count = self.working_count + 1 current = df['close'][0] ma5 = df['ma5'][0] ma10 = df['ma10'][0] ma20 = df['ma20'][0] ma_dict = {'5': ma5, '10': ma10, '20': ma20} ma_x = ma_dict[k_type] # print(ma_x) if current > ma_x: print(i, " current: ", current) print(self.base[self.base['code'] == i]['name'].values[0], " ") print("Break MA", k_type, "\n") all_break.append(i) q.put(all_break) def multi_thread_break_line(self, ktype='20'): total = len(self.all_code) thread_num = 10 delta = total / thread_num delta_left = total % thread_num t = [] i = 0 for i in range(thread_num): sub_code = self.all_code[i * delta:(i + 1) * delta] t_temp = Thread(target=self._break_line_thread, args=(sub_code, ktype)) t.append(t_temp) if delta_left != 0: sub_code = self.all_code[i * delta:i * delta + delta_left] t_temp = Thread(target=self._break_line_thread, args=(sub_code, ktype)) t.append(t_temp) for i in range(len(t)): t[i].start() for j in range(len(t)): t[j].join() result = [] print("working done") while not q.empty(): result.append(q.get()) ff = open(self.today + '_high_m%s.csv' % ktype, 'w') for kk in result: print(kk) for k in kk: ff.write(k) ff.write(',') ff.write(self.base[self.base['code'] == k]['name'].values[0]) ff.write('\n') ff.close() # 计算大盘的相关系,看关系如何 def relation(self): sh_index = ts.get_k_data('000001', index=True, start='2012-01-01') sh = sh_index['close'].values print(sh) vol_close = sh_index.corr() print(vol_close) ''' sz_index=ts.get_k_data('399001',index=True) sz=sz_index['close'].values print(sz) cy_index=ts.get_k_data('399006',index=True) s1=Series(sh) s2=Series(sz) print(s1.corr(s2)) ''' # 寻找业绩两年未负的,以防要st def profit(self): df_2016 = ts.get_report_data(2016, 4) # 第四季度就是年报 # df= df.sort_values('profits_yoy',ascending=False) # df.to_excel('profit.xls') df_2015 = ts.get_report_data(2015, 4) df_2016.to_excel('2016_report.xls') df_2015.to_excel('2015_report.xls') code_2015_lost = df_2015[df_2015['net_profits'] < 0]['code'].values code_2016_lost = df_2016[df_2016['net_profits'] < 0]['code'].values print(code_2015_lost) print(code_2016_lost) two_year_lost = [] # two_year_lost_name=[] for i in code_2015_lost: if i in code_2016_lost: print(i,) # name=self.base[self.base['code']==i].values[0] two_year_lost.append(i) self.saveList(two_year_lost, 'st_dangours.csv') # df_2014=ts.get_report_data(2014,4) def mydaily_check(self): self.break_line(self.mystocklist, k_type='5', writeable=True, mystock=True) def all_stock(self): self.multi_thread_break_line('20') #破净资产的股票 def get_break_bvps(): base_info = ts.get_stock_basics() current_prices = ts.get_today_all() current_prices[current_prices['code'] == '000625']['trade'].values[0] base_info.loc['000625']['bvps'] def main(): folder = os.path.join(os.path.dirname(__file__), 'data') if os.path.exists(folder) == False: os.mkdir(folder) os.chdir(folder) obj = filter_stock(local=True) # 留下来的函数都是有用的 # obj.count_area(writeable=True) # df=obj.get_area('广东',writeable=True) # obj.showInfo(df) # df=obj.get_area('深圳',writeable=True) # obj.showInfo(df) # obj.get_all_location() # obj.fetch_new_ipo(20170101,writeable=False) # obj.drop_down_from_high('2017-01-01','300580') # obj.loop_each_cixin() # df=obj.get_all_code() # result=obj.volume_calculate(df) # obj.saveList(result) # df=obj.get_chengfenggu() # large,small=obj.volume_calculate(df) # obj.saveList(large,'large') # obj.saveList(small,'small') # obj.write_to_text() # obj.read_csv() # obj.own_drop_down() # obj.volume_calculate() # obj.break_line() # obj.save_data_excel() # obj.break_line(mine=False,k_type='5') # obj.multi_thread() # code=obj.get_chengfenggu() # obj.break_line(code) # obj.big_deal('603918',400,'2017-04-22') # obj.current_day_ticks() # obj.relation() # obj.profit() # obj.mydaily_check() # obj.all_stock() if __name__ == "__main__": start_time = datetime.datetime.now() print(start_time) main() end_time = datetime.datetime.now() print(end_time) print("time use : ", (end_time - start_time).seconds) ================================================ FILE: shareholder_info.py ================================================ # -*- coding: utf-8 -*- # @Time : 2019/1/19 14:37 # @File : stockholder_info.py # 股东信息获取 import re import sys import pandas as pd import time import traceback from configure.settings import DBSelector from common.Base import pro import json class ShareHolderInfo(): ''' 十大股东与十大流通股东 ''' def __init__(self): self.init_mongo() self.tushare_init() def db_init(self): self.conn = DBSelector().get_mysql_conn('db_stock') self.cursor = self.conn.cursor() def init_mongo(self): self.client = DBSelector().mongo('qq') self.doc_holder = self.client['db_stock']['shareHolder'] # 十大 self.doc_holder_float = self.client['db_stock']['shareHolder_float'] # 十大 def tushare_init(self): self.pro = pro def exists(self, code): result = self.doc_holder.find_one({'ts_code': code}) return False if result is None else True def get_stock_list(self, exchange): df = self.pro.stock_basic(exchange=exchange, list_status='L') return dict(zip(list(df['ts_code'].values), list(df['name'].values))) # 生产日期 2000到2018 @staticmethod def create_date(): start_date = '20{}0101' end_date = '20{}1231' date_list = [] for i in range(18, 0, -1): print(start_date.format(str(i).zfill(2))) print(end_date.format(str(i).zfill(2))) date_list.append(i) return date_list # 十大和十大流通 def get_stockholder(self, code, start, end): ''' stockholder 十大 stockfloat 十大流通 ''' try: stockholder = self.pro.top10_holders(ts_code=code, start_date=start, end_date=end) # time.sleep(1) stockfloat = self.pro.top10_floatholders(ts_code=code, start_date=start, end_date=end) # time.sleep(1) except Exception as e: print(e) time.sleep(10) # ts.set_token(config['ts_token']) self.pro = pro stockholder = self.pro.top10_holders(ts_code=code, start_date=start, end_date=end) # time.sleep(1) stockfloat = self.pro.top10_floatholders(ts_code=code, start_date=start, end_date=end) # time.sleep(1) else: if stockholder.empty or stockfloat.empty: print('有空数据----> ', code) return pd.DataFrame(), pd.DataFrame() else: return stockholder, stockfloat def dumpMongo(self, doc, df): record_list = df.to_json(orient='records', force_ascii=False) record_list = json.loads(record_list) if len(record_list)==0: return try: doc.insert_many(record_list) except Exception as e: exc_type, exc_value, exc_obj = sys.exc_info() traceback.print_exc() def valid_code(self, code): return True if re.search('^\d{6}\.\S{2}', code) else False def run(self): start_date = '20{}0101' end_date = '20{}1231' exchange_list = ['SSE', 'SZSE'] for ex in exchange_list: code_dict = self.get_stock_list(ex) for code, name in code_dict.items(): # for i in range(20, 0, -1): i = 21 if not self.valid_code(code): print('invalid code ', code) continue if self.exists(code): continue print('crawling -->', code) start = start_date.format(str(i).zfill(2)) end = end_date.format(str(i).zfill(2)) df_holding, df_float = self.get_stockholder(code, start, end) self.dumpMongo(self.doc_holder, df_holding) self.dumpMongo(self.doc_holder_float, df_float) time.sleep(0.1) def main(): app = ShareHolderInfo() app.run() if __name__ == '__main__': main() ================================================ FILE: snowball.py ================================================ # -*-coding=utf-8-*- #抓取雪球的收藏文章 __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import requests,cookielib,re,json,time from toolkit import Toolkit from lxml import etree url='https://xueqiu.com/snowman/login' session = requests.session() session.cookies = cookielib.LWPCookieJar(filename="cookies") try: session.cookies.load(ignore_discard=True) except: print("Cookie can't load") agent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0' headers = {'Host': 'xueqiu.com', 'Referer': 'https://xueqiu.com/', 'Origin':'https://xueqiu.com', 'User-Agent': agent} account=Toolkit.getUserData('data.cfg') print(account['snowball_user']) print(account['snowball_password']) data={'username':account['snowball_user'],'password':account['snowball_password']} s=session.post(url,data=data,headers=headers) print(s.status_code) #print(s.text) session.cookies.save() fav_temp='https://xueqiu.com/favs?page=1' collection=session.get(fav_temp,headers=headers) fav_content= collection.text p=re.compile('"maxPage":(\d+)') maxPage=p.findall(fav_content)[0] #目前也只是第一页而已 print(maxPage) print(type(maxPage)) maxPage=int(maxPage) print(type(maxPage)) for i in range(1,maxPage+1): fav='https://xueqiu.com/favs?page=%d' %i collection=session.get(fav,headers=headers) fav_content= collection.text #print(fav_content) p=re.compile('var favs = {(.*?)};',re.S|re.M) result=p.findall(fav_content)[0].strip() new_result='{'+result+'}' #print(type(new_result)) #print(new_result) data=json.loads(new_result) use_data= data['list'] host='https://xueqiu.com' for i in use_data: url=host+ i['target'] print(url) txt_content=session.get(url,headers=headers).text #print(txt_content.text) tree=etree.HTML(txt_content) title=tree.xpath('//title/text()')[0] filename = re.sub('[\/:*?"<>|]', '-', title) print(filename) content=tree.xpath('//div[@class="detail"]') for i in content: Toolkit.save2filecn(filename, i.xpath('string(.)')) #print(content) #Toolkit.save2file(filename,) time.sleep(10) ================================================ FILE: source_code_reading/README.MD ================================================ # 源码阅读 ================================================ FILE: source_code_reading/source_code.py ================================================ import scrapy as sc import easyquotation as ea print(ea.__version__) print(ea.__author__) print(sc.__version__) # print(sc.__author__) ================================================ FILE: statistices.py ================================================ #-*-coding=utf-8-*- ''' 用于统计数据 ''' import alert ''' 计算收益 sold 卖价 buy 买入价 ''' def percentage(sold,buy): x=(sold-buy)*1.00/buy*100 print(round(x,2)) return x ''' 计算买入价 sold: 卖出的价格 需要的幅度 ''' def plan_buy_price(sold,percent): buy=sold*1.00/(1+percent*1.00/100) print(round(buy,2)) return buy #percentage(0.196,0.188) # plan_buy_price(10,10) a=1.567 print(round(a,2)) ================================================ FILE: stockInfo.py ================================================ # working v1.0 __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import json import datetime import time import codecs import os, sys import requests import re from scrapy.selector import Selector from elasticsearch import Elasticsearch from configure.settings import llogger logger = llogger('log/stockinfo.log') my_useragent = [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11', 'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)' ] es = Elasticsearch('10.18.6.102:9200') def create_tb(conn): cur = conn.cursor() cmd = '''CREATE TABLE IF NOT EXISTS tb_cnstock(Date DATETIME ,Title VARCHAR (800),URL VARCHAR (100),PRIMARY KEY (URL)) charset=utf8;''' try: cur.execute(cmd) conn.commit() return True except Exception as e: logger.info(e) conn.rollback() return False def getinfo(days=-30): last_day = datetime.datetime.now() + datetime.timedelta(days=days) url = "http://app.cnstock.com/api/waterfall?callback=jQuery19107348148582372209_1557710326005&colunm=qmt-tjd_ggkx&page={}&num=20&showstock=0" page = 1 temp_time = time.strftime("[%Y-%m-%d]-[%H-%M]", time.localtime()) store_filename = "StockNews-%s.log" % temp_time f_open = codecs.open(store_filename, 'w', 'utf-8') db_name = 'db_stock' conn = get_mysql_conn(db_name, local='local') cur = conn.cursor() run_flag = True while run_flag: headers = {'Referer': 'http://ggjd.cnstock.com/company/scp_ggjd/tjd_ggkx', 'User-Agent': 'Mozilla/5.0 (Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36', } retry = 3 response = None for _ in range(retry): try: response = requests.get(url=url.format(page), headers=headers) response.encoding = 'utf8' except Exception as e: if hasattr(e, 'code'): logger.info("error code %d" % e.code) elif hasattr(e, 'reason'): logger.info("error reason %s " % e.reason) time.sleep(5) else: if response.status_code == 200: break try: text = response.text.encode('utf8').decode('unicode_escape') js = re.search('jQuery19107348148582372209_1557710326005\((.*?)\)$', text, re.S).group(1) js = re.sub('\r\n', '', js) js_data = json.loads(js) except Exception as e: logger.error(e) return None content = js_data.get('data', {}).get('item', {}) if content is None: continue for item in content: title = item.get('title') if '晚间重要公告集锦' in title or '停复牌汇总' in title: continue link = item.get('link') link = link.replace('\\', '') pubdate_t = item.get('time') pubdate_dtype = datetime.datetime.strptime(pubdate_t, '%Y-%m-%d %H:%M:%S') if pubdate_dtype < last_day: run_flag = False keyword = item.get('keyword') if keyword: keyword = ' '.join(keyword) sub_content = None for i in range(2): try: sub_content = requests.get(url=link, headers=headers) except Exception as e: logger.error(e) continue # 重试 else: if sub_content.status_code == 200: break root = Selector(text=sub_content.text) detail_content = root.xpath('//div[@id="qmt_content_div"]')[0].xpath('string(.)').extract_first() if detail_content: detail_content = detail_content.strip() temp_tuple = (pubdate_dtype, title, link, detail_content, keyword) insert_sql = 'insert into tb_cnstock (Date,Title,URL,Content,keyword) values (%s,%s,%s,%s,%s)' # es try: pubdate_dtype=pubdate_dtype.strftime("%Y-%m-%d"'T'"%H:%M:%S") body = {'Title': title, 'ULR': link, 'keyword': keyword, 'content': detail_content, 'Date': pubdate_dtype} es.index(index='cnstock',doc_type='doc',body=body) except Exception as e: logger.error(e) # mysql try: cur.execute(insert_sql, temp_tuple) conn.commit() except Exception as e: logger.error(e) conn.rollback() file_content = '{} ---- {}\n{}\n\n'.format(pubdate_t, title, link) f_open.write(file_content) page += 1 f_open.close() if __name__ == "__main__": sub_folder = DATA_PATH if not os.path.exists(sub_folder): os.mkdir(sub_folder) os.chdir(sub_folder) if len(sys.argv) > 1: if re.match('-\d+', sys.argv[1]): day = int(sys.argv[1]) else: day = -3 else: day = -3 getinfo(days=day) # fetch_detail() ================================================ FILE: stock_check.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' #查询个股 import tushare as ts import matplotlib.pyplot as plt import pandas as pd import numpy as np from threading import Thread from multiprocessing import Pool,Queue,Process,Manager import multiprocessing multiprocessing.freeze_support() class CheckStock(): def __init__(self): #self.id=id self.base = pd.read_csv('bases.csv', dtype={'code': np.str}) ''' if len(self.id)!=6: print("Wrong stock code") exit() ''' def multi_thread(self): with open('stock_list.txt') as f: stock_list=f.readlines() ratio_list=[] for i in stock_list: i=i.strip() ratio_list.append(self.get_info(i)) #print(ratio_list) return ratio_list def get_info(self,id): print(id) try: df=ts.get_today_ticks(id) print('len of df ',len(df)) #print(df) if len(df)==0: print("Pause of exchange") return id,'pause' except Exception as e: print(e) print("ERROR") return id,'pause' ''' print('\n') max_p=df['price'].max() print(max_p) min_p=df['price'].min() print(min_p) #print(df) ''' buy= df[df['type']=='买盘']['volume'].sum() #print('buy:',buy) sell =df[df['type']=='卖盘']['volume'].sum() #print('sell: ',sell) neutral= df[df['type']=='中性盘']['volume'].sum() #print('neutral: ',neutral) #最后一个是开盘数据 start=df[-1:] vol_0=start['volume'].sum() #print('start') #print(start) total=buy+sell+neutral+vol_0 sum_all=df['volume'].sum() #print(total) #print(sum_all) ratio=round((buy-sell)*1.00/sell*100,2) #print("buy/sell ratio: ",ratio) return id,ratio ''' df['price'].plot() plt.grid() plt.show() ''' #类中不能多进程 def multi_process(self): stock_list=[] with open('stock_list.txt') as f: stock_list=f.readlines() #print(stock_list) stock_list=map(lambda x:x.strip(),stock_list) #print(stock_list) ''' p=Pool(len(stock_list)) result=p.map(self.get_info,stock_list) p.close() p.join() ''' p=Pool(len(stock_list)) #p_list=[] result=[] for i in stock_list: t=p.apply_async(self.get_info,args=(i,)) #p_list.append(Process(target=self.get_info,args=(i))) result.append(t) p.close() p.join() print(result) ''' for j in p_list: j.start() for k in p_list: k.join() ''' print(result) def show_name(self): #self.all=ts.get_stock_basics() #self.bases_save=ts.get_stock_basics() #self.bases_save.to_csv('bases.csv') stock_list=self.multi_thread() for st in stock_list: print("code: ",st[0]) name=self.base[self.base['code']==st[0]]['name'].values[0] print('name: ',name) print("ratio: ",st[1]) if st[1]>30: print("WOW, more than 30") print('\n') def sinle_thread(self,start,end): for i in range(start,end): id,ratio=self.get_info(self.all_code[i]) if ratio =='pause': continue if ratio>30: print(self.base[self.base['code']==id]['name'].values[0],' buy more than 30 percent') def scan_all(self): self.all_code=self.base['code'].values thread_num=500 all_num=len(self.all_code) each_thread=all_num/thread_num #print(type(all_code)) thread_list=[] for i in range(thread_num): t=Thread(target=self.sinle_thread,args=(i*each_thread,(i+1)*each_thread)) thread_list.append(t) for j in thread_list: j.start() for k in thread_list: k.join() def monitor(self): ratio_list=self.multi_thread() for js in ratio_list: if js[1]>30: print(js[0]) def sub_process_ratio(i,q): print("Start") try: df=ts.get_today_ticks(i) #print('len of df ',len(df)) #print(df) if len(df)==0: print("Pause of exchange") return i,'pause' except Exception as e: print(e) print("ERROR") return id,'pause' ''' print('\n') max_p=df['price'].max() print(max_p) min_p=df['price'].min() print(min_p) #print(df) ''' buy= df[df['type']=='买盘']['volume'].sum() #print('buy:',buy) sell =df[df['type']=='卖盘']['volume'].sum() #print('sell: ',sell) neutral= df[df['type']=='中性盘']['volume'].sum() #print('neutral: ',neutral) #最后一个是开盘数据 start=df[-1:] vol_0=start['volume'].sum() #print('start') #print(start) total=buy+sell+neutral+vol_0 sum_all=df['volume'].sum() #print(total) #print(sum_all) ratio=round((buy-sell)*1.00/sell*100,2) #print("buy/sell ratio: ",ratio) s= [i,ratio] print(s) q.put(s) def testcase1(i,j,q): print(i,j) q.put(i) def multi_process(): #stock_list=[] with open('stock_list.txt') as f: stock_list=f.readlines() #print(stock_list) stock_list=map(lambda x:x.strip(),stock_list) print(stock_list) ''' p=Pool(len(stock_list)) result=p.map(self.get_info,stock_list) p.close() p.join() ''' p=Pool(len(stock_list)) #p_list=[] result=[] manager=Manager() q=manager.Queue() #p1=Pool(8) #q1=Queue() for i in stock_list: #print(i) p.apply_async(sub_process_ratio,args=(i,q)) #p1.apply_async(testcase1,args=(i,i,q1)) #p_list.append(Process(target=self.get_info,args=(i))) #result.append(t) p.close() p.join() #print(result) while q.empty()==False: print('get') print(q.get()) if __name__=="__main__": #obj=CheckStock() #obj.get_info('000693') #obj.multi_thread() #obj.show_name() #obj.monitor() #obj.scan_all() #obj.multi_process() multi_process() ================================================ FILE: store_data.py ================================================ #-*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import tushare as ts import sqlite3 class TS_DB(): def __init__(self): self.db=sqlite3.connect("testdb.db") def save_csv(self,code): df = ts.get_k_data(code,start='2016-01-01',end='2016-12-28') filename=code+".csv" #df.to_csv(filename) df.to_sql("newtable",self.db,flavor='sqlite') if __name__=="__main__": obj=TS_DB() obj.save_csv('300333') ================================================ FILE: strategy_verify.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com 获取雪球的策略 2017-03-21 ''' import requests,time,re,os from lxml import etree from pandas import DataFrame import sqlite3 import sqlite3,sys,cookielib,datetime def create_table(strategy): work_path=os.path.join(os.getcwd(),'data') if os.path.exists(work_path)==False: os.mkdir(work_path) dbname='stragety_%d.db' %strategy dbname=os.path.join(work_path,dbname) conn = sqlite3.connect(dbname) try: create_tb_cmd=''' CREATE TABLE IF NOT EXISTS STRATEGY('日期' TEXT,'代码' TEXT,'股票' TEXT,'买入时间' TEXT,'盈亏' TEXT,'买入价格' TEXT,'当前价格' TEXT,'描述' TEXT); ''' conn.execute(create_tb_cmd) conn.commit() conn.close() print("create table successful") except: print("Create table failed") return False def insert(strategy,date_time,code,name,trigger_time,profit,trigger_price,current,desc): work_path=os.path.join(os.getcwd(),'data') if os.path.exists(work_path)==False: os.mkdir(work_path) dbname='stragety_%d.db' %strategy dbname=os.path.join(work_path,dbname) try: conn = sqlite3.connect(dbname) print("open database passed") #conn.text_factory = str cmd="INSERT INTO STRATEGY ('日期','代码', '股票','买入时间' ,'盈亏' ,'买入价格' ,'当前价格','描述' ) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s');" %(date_time,code,name,trigger_time,profit,trigger_price,current,desc) conn.execute(cmd) conn.commit() conn.close() print("Insert successful") except: print("Insert Failed") class Strategy(): def __init__(self): self.base_url='https://xueqiu.com/strategy/' self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0', 'Host':'xueqiu.com', } self.headers['X-Requested-With']='XMLHttpRequest' self.headers['DNT']='1' self.s=requests.session() def getData(self,page): url=self.base_url+str(page) resp=requests.get(url,headers=self.headers) print(resp.status_code) print(resp.text) def show_strategy(self): Status_Code=200 base_url='https://xueqiu.com/strategy/' for i in range(100): no_strategy=0 url=base_url+str(i) resp=requests.get(url,headers=self.headers) if resp.status_code==200: content=resp.text tree=etree.HTML(content) all_contnet=tree.xpath('//div[@class="detail-bd"]') print(tree.xpath('//title/text()')[0]) content_str=[] temp=[] p=re.compile('待定') for j in all_contnet: s= j.xpath('string(.)') temp.append(s) if p.findall(s): no_strategy=1 if no_strategy==0: print('%d has strategy' %i) for it in temp: print(it) time.sleep(10) def getStock(self,strategy,page): url='https://xueqiu.com/snowmart/push/stocks.json?product_id=%s&page=%s&count=5' %(str(strategy),str(page)) self.headers['Referer']='https://xueqiu.com/strategy/%s' %str(strategy) data_up={'product_id':strategy,'page':page,'count':5} self.s.get('https://xueqiu.com',headers=self.headers) resp=self.s.get(url,params=data_up,headers=self.headers) #time.sleep(20) return resp.json() def dataStore_SQLite(self,strategy,page): json_data=self.getStock(strategy,page) #print(json_data) if len(json_data)==0: return 0 items=json_data['items'] if len(items)==0: return 0 create_table(strategy) for item in items: desc=item['desc'].encode('utf-8') current=item['current'] d_time=datetime.datetime.fromtimestamp(item['trigger_time']*1.0/1000) str_time=d_time.strftime('%Y-%m-%d %H:%M') #trigger_time=datetime.datetime.fromtimestamp(item['trigger_time']*1.0/1000) trigger_time=str_time name=item['name'].encode('utf-8') trigger_price=item['trigger_price'] code=item['symbol'].encode('utf-8') profit=item['change_percent']*100.0 #print(profit) date_time=str_time #date_time=time.ctime(item['trigger_time']*1.0/1000) ''' print(type(desc)) print(type(current)) print(type(trigger_price)) print(type(trigger_time)) print(type(code)) print(type(profit)) print(type(date_time)) print(type(name)) ''' insert(strategy,date_time,code,name,trigger_time,profit,trigger_price,current,desc) def dataFilter(self,strategy,page): json_data=self.getStock(strategy,page) items=json_data['items'] colums_dict={'current': '', 'name': '', 'trigger_price': '', 'symbol': '', 'status_id': '', 'trigger_time': '', 'is_new': '', 'change_percent': '', 'flag': '', 'reply_count': '', 'target': '', 'desc': ''} df_total=DataFrame(colums_dict,index=['0']) for item in items: #print(item) df=DataFrame(item,index=['0']) print(df) df_total=df_total.append(df,ignore_index=True) ''' current: 目前价格 trigger_price: 入选价 change_percent: 盈亏比例 小数,非百分比 desc: 描述 帖子 ''' df_total.to_excel('stragety.xls') def DataDup(self,strategy): work_path=os.path.join(os.getcwd(),'data') if os.path.exists(work_path)==False: os.mkdir(work_path) dbname='stragety_%d.db' %strategy dbname=os.path.join(work_path,dbname) try: conn=sqlite3.connect(dbname) cmd='delete from STRATEGY where rowid not in (select max(rowid) from STRATEGY group by 代码);' conn.execute(cmd) time.sleep(1) conn.commit() time.sleep(1) conn.close() time.sleep(1) except: print("remove failed on ",strategy) def loops(self): for i in range(1,70): for j in range(20): print("Strategy %d" %i) status=self.dataStore_SQLite(i,j) if status==0: break time.sleep(2) def monitor(self,strategy): print("monitor") print("#"*20) print('\n') for i in range(10): json_data=self.getStock(strategy,i) items=json_data['items'] for item in items: print('\n\n') d_time=datetime.datetime.fromtimestamp(item['trigger_time']*1.00/1000) str_time=d_time.strftime('%Y-%m-%d %H:%M') print('买入时间 ',str_time) #print('买入时间 ',time.ctime(item['trigger_time']*1.00/1000)) print('当前价格 ',item['current']) print(item['name']) print('买入价格 ',item['trigger_price']) print('目前盈亏 ',float(item['change_percent'])*100.0) print(item['desc']) time.sleep(1) def main(): selection=input("Select option :\n" "1.\tMonitor the stragegy \n" "2.\tStore to Database\n" "3.\tRemove duplicate items\n") obj=Strategy() if selection==1: strategy=input('Strategy:') obj.monitor(strategy) elif selection ==2: obj.loops() elif selection==3: for i in range(1,60): obj.DataDup(i) if __name__=='__main__': main() ================================================ FILE: temp/edit.txt ================================================ var apidata={ content:"

序号股票代码股票名称相关资讯占净值比例持股数
(万股)
持仓市值
(万元人民币)
1AAPL.US苹果股吧行情9.99%0.42335.52
2MSFT.US微软股吧行情7.82%0.61262.48
3AMZN.US亚马逊股吧行情5.76%0.04193.51
4FB.USFacebook Inc-A股吧行情4.36%0.18146.29
5GOOG.US谷歌-C股吧行情4.30%0.03144.56
6GOOGL.US谷歌-A股吧行情3.80%0.02127.54
7INTC.US英特尔股吧行情2.78%0.3793.37
8CMCSA.US康卡斯特股吧行情2.66%0.1989.38
9CSCO.US思科股吧行情2.45%0.3982.41
10AMGN.US安进股吧行情1.76%0.0659.13

序号股票代码股票名称相关资讯占净值比例持股数
(万股)
持仓市值
(万元人民币)
1AAPL.US苹果股吧行情9.67%0.32243.61
2MSFT.US微软股吧行情7.13%0.47179.51
3AMZN.US亚马逊股吧行情6.30%0.03158.80
4FB.USFacebook Inc-A股吧行情4.73%0.14119.15
5GOOG.US谷歌-C股吧行情4.25%0.02106.93
6GOOGL.US谷歌-A股吧行情3.77%0.0295.04
7INTC.US英特尔股吧行情2.84%0.2871.44
8CSCO.US思科股吧行情2.53%0.3063.80
9CMCSA.US康卡斯特股吧行情2.53%0.1463.75
10AMGN.US安进股吧行情1.98%0.0449.90

序号股票代码股票名称相关资讯占净值比例持股数
(万股)
持仓市值
(万元人民币)
1AAPL.US苹果股吧行情9.43%0.45286.23
2MSFT.US微软股吧行情7.20%0.64218.49
3AMZN.US亚马逊股吧行情6.00%0.04182.22
4FB.USFacebook Inc-A股吧行情4.67%0.19141.64
5GOOG.US谷歌-C股吧行情4.26%0.03129.42
6GOOGL.US谷歌-A股吧行情3.69%0.02111.97
7CMCSA.US康卡斯特股吧行情2.82%0.2085.64
8INTC.US英特尔股吧行情2.76%0.3883.65
9CSCO.US思科股吧行情2.57%0.4177.95
10AMGN.US安进股吧行情2.04%0.0661.85

序号股票代码股票名称相关资讯占净值比例持股数
(万股)
持仓市值
(万元人民币)
1AAPL.US苹果股吧行情10.50%0.48338.65
2MSFT.US微软股吧行情7.59%0.69244.76
3AMZN.US亚马逊股吧行情4.85%0.04156.49
4FB.USFacebook Inc-A股吧行情4.55%0.20146.71
5GOOG.US谷歌-C股吧行情4.48%0.03144.40
6GOOGL.US谷歌-A股吧行情3.88%0.03125.20
7INTC.US英特尔股吧行情2.66%0.4185.64
8CMCSA.US康卡斯特股吧行情2.58%0.2183.27
9CSCO.US思科股吧行情2.49%0.4480.28
10GILD.US吉利德科学股吧行情2.18%0.1270.33
",arryear:[2022,2021,2020,2019,2018,2017,2016,2015],curyear:2016}; ================================================ FILE: toolkit.py ================================================ # -*-coding=utf-8-*- #常用的工具集合 __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import codecs class Toolkit(): @staticmethod def save2file( filename, content): # 保存为文件 filename = filename + ".txt" f = open(filename, 'a') f.write(content) f.close() @staticmethod def save2filecn( filename, content): # 保存为文件 #filename = filename + ".txt" f = codecs.open(filename, 'a',encoding='utf-8') f.write(content) f.close() @staticmethod def getUserData(cfg_file): f=open(cfg_file,'r') account={} for i in f.readlines(): ctype,passwd=i.split('=') #print(ctype) #print(passwd) account[ctype.strip()]=passwd.strip() return account @staticmethod def read_stock(cfg_file): result=[] try: f=open(cfg_file,'r').readlines() for i in f: i=i.strip() if len(i)!=6: continue result.append(i) #print(i) except Exception as e: print(e) return None return result ================================================ FILE: trader/__init__.py ================================================ # -*- coding: utf-8 -*- # @Time : 2020/11/21 16:39 # @File : __init__.py # @Author : Rocky C@www.30daydo.com ================================================ FILE: trader/auto_trader.py ================================================ # -*- coding: utf-8 -*- # website: http://30daydo.com # @Time : 2019/3/19 23:21 # @File : auto_trader.py import datetime import logging import time import pymongo import easyquotation import easytrader import pandas as pd from config import PROGRAM_PATH, MONGO_PORT, MONGO_HOST from configure.settings import DBSelector SELL = 7 # 配置为8%个点卖 DB = DBSelector() class AutoTrader(): def __init__(self): self.today = datetime.date.today().strftime('%Y-%m-%d') # self.stock_candidates = self.get_candidates() # self.stock_candidates = self.get_candidates() self.logger = self.llogger('log/auto_trader_{}'.format(self.today)) self.logger.info('程序启动') self.user = easytrader.use('gj_client') # self.user = easytrader.use('ths') self.user.prepare('user.json') # self.user.connect(PROGRAM_PATH) # self.blacklist_bond = self.get_blacklist() # self.q=easyquotation.use('qq') self.yesterday = datetime.datetime.now() + datetime.timedelta(days=-1) # 如果是周一 加一个判断 self.yesterday = self.yesterday.strftime('%Y-%m-%d') def get_close_price(self): conn = DB.get_mysql_conn('db_jisilu', 'qq') cursor = conn.cursor() cmd = 'select 可转债代码,可转债价格 from `tb_jsl_{}`'.format(self.yesterday) try: cursor.execute(cmd) result = cursor.fetchall() except Exception as e: return None else: d = {} for item in result: d[item[0]] = item[1] return d # 设置涨停 附近卖出 挂单 def set_ceiling(self): position = self.get_position() # print(position) code_price = self.get_close_price() for each_stock in position: try: code = each_stock.get('证券代码') amount = int(each_stock.get('可用余额', 0)) if amount <= 0.1: continue close_price = code_price.get(code, None) buy_price = round(close_price * (1 + SELL * 0.01), 1) self.user.sell(code, price=buy_price, amount=amount) except Exception as e: self.logger.error(e) # 获取候选股票池数据 def get_candidates(self): stock_candidate_df = pd.read_sql( 'tb_stock_candidates', con=self.engine) stock_candidate_df = stock_candidate_df.sort_values(by='可转债价格') return stock_candidate_df def get_market_data(self): market_data_df = pd.read_sql('tb_bond_jisilu', con=self.engine) return market_data_df # 永远不买的 def get_blacklist(self): black_list_df = pd.read_sql('tb_bond_blacklist', con=self.engine) return black_list_df['code'].values # 开盘前统一下单 def morning_start(self, p): # print(self.user.balance) codes = self.stock_candidates['可转债代码'] prices = self.stock_candidates['可转债价格'] code_price_dict = dict(zip(codes, prices)) count = 0 while 1: count += 1 logging.info('Looping {}'.format(count)) for code, price in code_price_dict.copy().items(): # 价格设定为昨天收盘价的-2% if code not in self.blacklist_bond: # buy_price=round(price*0.98,2) deal_detail = self.q.stocks(code) close = deal_detail.get(code, {}).get('close') # 昨日收盘 ask = deal_detail.get(code, {}).get('ask1') # 卖一 bid = deal_detail.get(code, {}).get('bid1') # 买一价 current_percent = (ask - close) / close * 100 # print(current_percent) if current_percent <= p: self.logger.info('>>>>代码{}, 当前价格{}, 开盘跌幅{}'.format(code, bid, current_percent)) try: print('code {} buy price {}'.format(code, ask)) self.user.buy(code, price=ask + 0.1, amount=10) except Exception as e: self.logger.error('>>>>买入{}出错'.format(code)) self.logger.error(e) else: del code_price_dict[code] # 空的时候退出 if not code_price_dict: break time.sleep(20) # 持仓仓位 def get_position(self): ''' [{'证券代码': '128012', '证券名称': '辉丰转债', '股票余额': 10.0, '可用余额': 10.0, '市价': 97.03299999999999, '冻结数量': 0, '参考盈亏': 118.77, '参考成本价': 85.156, '参考盈亏比例(%)': 13.947000000000001, '市值': 970.33, '买入成本': 85.156, '市场代码': 1, '交易市场': '深圳A股', '股东帐户': '0166448046', '实际数量': 10, 'Unnamed: 15': ''} :return: ''' return self.user.position # 持仓仓位 Dataframe格式 def get_position_df(self): position_list = self.get_position() # print(position_list) df = pd.DataFrame(position_list) return df def save_position(self): self.engine = DB.get_engine('db_position', 'qq') df = self.get_position_df() # print(df) try: df.to_sql('tb_position_{}'.format(self.today), con=self.engine, if_exists='replace') except Exception as e: self.logger.error(e) def llogger(self, filename): logger = logging.getLogger(filename) # 不加名称设置root logger logger.setLevel(logging.DEBUG) formatter = logging.Formatter( '%(asctime)s - %(name)s - Line:%(lineno)d:-%(levelname)s: - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') # 使用FileHandler输出到文件 fh = logging.FileHandler(filename + '.log') fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) # 使用StreamHandler输出到屏幕 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) # 添加两个Handler logger.addHandler(ch) logger.addHandler(fh) return logger def end(self): self.logger.info('程序退出') if __name__ == '__main__': trader = AutoTrader() # 开盘挂单 # kaipan_percent = -2 # trader.morning_start(kaipan_percent) # trader.save_position() # trader.end() trader.set_ceiling() ================================================ FILE: transfer_data_es.py ================================================ # -*-coding=utf-8-*- # @Time : 2019/7/12 18:41 # @File : transfer_data_es.py from configure.settings import get_mysql_conn from elasticsearch import Elasticsearch es = Elasticsearch('10.18.6.102:9200') conn = get_mysql_conn('db_stock','local') cursor = conn.cursor() query_cmd = 'select * from tb_cnstock' cursor.execute(query_cmd) ret = cursor.fetchall() for item in ret: # print(item) date = item[0] title = item[1] url = item[2] content = item[3] keyword = item[4] body = {'Title':title,'ULR':url,'keyword':keyword,'content':content,'Date':date} try: es.index(index='cnstock',doc_type='doc',body=body) except Exception as e: print(e) print(url) ================================================ FILE: utils/delivery_order.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com 交割单处理 保存交割单到数据库 ''' import os import datetime import pandas as pd import numpy as np import re from configure.settings import DBSelector import fire pd.set_option('display.max_rows', None) class DeliveryOrder(): def __init__(self): self.gj_table = 'tb_delivery_gj_django' self.hb_table = 'tb_delivery_hb_django' self.db_init() def db_init(self): DB = DBSelector() self.engine = DB.get_engine('db_stock', 'qq') self.conn = DB.get_mysql_conn('db_stock', 'qq') def setpath(self, path): path = os.path.join(os.getcwd(), path) if os.path.exists(path) == False: os.mkdir(path) os.chdir(path) # 单独处理华宝证券的数据 def merge_data_HuaBao(self, filename): try: # 根据不同的格式选用不同的函数 df = pd.read_csv(filename, encoding='gbk') except Exception as e: print(e) raise OSError("打开文件失败") df = df.reset_index(drop='True') df = df.dropna(subset=['成交时间']) df['成交日期'] = df['成交日期'].astype(np.str) + df['成交时间'] # TODO 重复,删除 df['成交日期'] = df['成交日期'].map(lambda x: datetime.datetime.strptime( x, "%Y%m%d%H:%M:%S").strftime('%Y-%m-%d %H:%M:%S')) try: df['成交日期'] = pd.to_datetime(df['成交日期']) except Exception as e: print(e) del df['股东代码'] del df['成交时间'] df = df[(df['委托类别'] == '买入') | (df['委托类别'] == '卖出')] df = df.fillna(0) df = df.sort_values(by='成交日期', ascending=False) cursor = self.conn.cursor() insert_cmd = f''' insert into {self.hb_table} (成交日期,证券代码,证券名称,委托类别,成交数量,成交价格,成交金额,发生金额,佣金,印花税,过户费,其他费) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)''' check_dup = f''' select * from {self.hb_table} where 成交日期=%s and 证券代码=%s and 委托类别=%s and 成交数量=%s and 发生金额=%s ''' for index, row in df.iterrows(): date = row['成交日期'] date = date.to_pydatetime() cursor.execute(check_dup, (date, row['证券代码'], row['委托类别'], row['成交数量'], row['发生金额'])) if cursor.fetchall(): print('有重复数据,忽略') continue else: cursor.execute(insert_cmd, ( date, row['证券代码'], row['证券名称'], row['委托类别'], row['成交数量'], row['成交价格'], row['成交金额'], row['发生金额'], row['佣金'], row['印花税'], row['过户费'], row['其他费'])) self.conn.commit() self.conn.close() # 合并一年的交割单 def years_ht(self): df_list = [] for i in range(1, 2): # 固定一个文件 filename = 'HT_2018-05_week4-5.xls' try: t = pd.read_table(filename, encoding='gbk', dtype={'证券代码': np.str}) except Exception as e: print(e) continue df_list.append(t) df = pd.concat(df_list) df = df.reset_index() df['成交日期'] = map(lambda x: datetime.datetime.strptime( str(x), "%Y%m%d"), df['成交日期']) df = df[df['摘要'] != '申购配号'] df = df[df['摘要'] != '质押回购拆出'] df = df[df['摘要'] != '拆出质押购回'] del df['合同编号'] del df['备注'] del df['股东帐户'] del df['结算汇率'] del df['Unnamed: 16'] df = df.sort_values(by='成交日期') df = df.set_index('成交日期') df.to_sql('tb_delivery_HT', self.engine, if_exists='append') def caculation(self, df): fee = df['手续费'].sum() + df['印花税'].sum() + df['其他杂费'].sum() print(fee) # 计算每个月的费用 def month(self): pass # 国金账户 2018-01 到 11月数据入库, 这个函数不用动了。保留csv格式 def years_gj(self): df_list = [] for i in range(2, 12): filename = 'GJ_2018_%s.csv' % str(i).zfill(2) try: t = pd.read_csv(filename, encoding='gbk', dtype={'证券代码': np.str}) except Exception as e: print(e) df_list.append(t) df = pd.concat(df_list) df = df.reset_index(drop='True') df['成交日期'] = df['成交日期'].astype(np.str) + df['成交时间'] df['成交日期'] = df['成交日期'].map(lambda x: datetime.datetime.strptime( x, "%Y%m%d%H:%M:%S").strftime('%Y-%m-%d %H:%M:%S')) try: df['成交日期'] = pd.to_datetime(df['成交日期']) except Exception as e: print(e) del df['股东帐户'] del df['成交时间'] df = df.sort_values(by='成交日期', ascending=False) df = df.set_index('成交日期') df.to_sql('tb_delivery_gj', self.engine, if_exists='replace') def file_exists(self, filepath): return True if os.path.exists(filepath) else False # 单独处理某个文件(单独一个月的数据) 文件格式:国金-保存为xls,然后另存为csv 或者按照天也可以 def years_gj_each_month_day(self, filename): if not self.file_exists(filename): raise ValueError('路径不存在') try: # 根据不同的格式选用不同的函数 df = pd.read_csv(filename, encoding='gbk', dtype={'证券代码': np.str}) except Exception as e: print(e) raise ValueError('读取文件错误') df = df.reset_index(drop='True') df['成交日期'] = df['成交日期'].astype(np.str) + df['成交时间'] df['成交日期'] = df['成交日期'].map(lambda x: datetime.datetime.strptime( x, "%Y%m%d%H:%M:%S").strftime('%Y-%m-%d %H:%M:%S')) try: df['成交日期'] = pd.to_datetime(df['成交日期']) except Exception as e: print(e) del df['股东帐户'] del df['成交时间'] df = df.fillna(0) df = df[(df['操作'] != '申购配号') & (df['操作'] != '拆出质押购回') & (df['操作'] != '质押回购拆出')] df = df.sort_values(by='成交日期', ascending=False) cursor = self.conn.cursor() insert_cmd = f''' insert into {self.gj_table} (成交日期,证券代码,证券名称,操作,成交数量,成交均价,成交金额,余额,发生金额,手续费,印花税,过户费,本次金额,其他费用,交易市场) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)''' check_dup = f''' select * from {self.gj_table} where 成交日期=%s and 证券代码=%s and 操作=%s and 成交数量=%s and 余额=%s ''' for index, row in df.iterrows(): date = row['成交日期'] date = date.to_pydatetime() cursor.execute(check_dup, (date, row['证券代码'], row['操作'], row['成交数量'], row['余额'])) if cursor.fetchall(): print('有重复数据,忽略') else: cursor.execute(insert_cmd, ( date, row['证券代码'], row['证券名称'], row['操作'], row['成交数量'], row['成交均价'], row['成交金额'], row['余额'], row['发生金额'], row['手续费'], row['印花税'], row['过户费'], row['本次金额'], row['其他费用'], row['交易市场'])) self.conn.commit() self.conn.close() def pretty(self): df = pd.read_sql('tb_delivery_GJ', self.engine, index_col='成交日期') # print(df) # del df['Unnamed: 17'] del df['index'] df.to_sql('tb_delivery_GJ', self.engine, if_exists='replace') # 数据同步到另一个django数据库 def data_sync(self): cursor = self.conn.cursor() # 最新的数据库 select_cmd = '''select * from tb_delivery_gj''' cursor.execute(select_cmd) ret = list(cursor.fetchall()) print('new db ', len(ret)) # 旧的数据库 select_cmd2 = '''select * from tb_delivery_gj_django''' cursor.execute(select_cmd2) ret2 = list(cursor.fetchall()) print('old db ', len(ret2)) ret_copy = ret.copy() for item in ret: # print(item) for item2 in ret2: if item[0] == item2[0] and item[1] == item2[1] and item[2] == item2[2] and item[4] == item2[4] and item[ 5] == item2[5]: try: ret_copy.remove(item) except Exception as e: continue for i in ret_copy: update_sql = ''' insert into tb_delivery_gj_django (成交日期,证券代码,证券名称,操作,成交数量,成交均价,成交金额,) ''' print('diff len ', len(ret_copy)) # 银转证 def bank_account(self): folder_path = os.path.join(os.path.dirname(__file__), 'private') os.chdir(folder_path) df_list = [] for file in os.listdir(folder_path): if re.search('2', file.decode('gbk')): df = pd.read_table(file, encoding='gbk') df_list.append(df) total_df = pd.concat(df_list) del total_df['货币单位'] del total_df['合同编号'] del total_df['Unnamed: 8'] del total_df['银行名称'] total_df['发生金额'] = map(lambda x, y: x * -1 if y == '证券转银行' else x, total_df['发生金额'], total_df['操作']) total_df['委托时间'] = map(lambda x: str(x).zfill(6), total_df['委托时间']) total_df['日期'] = map(lambda x, y: str(x) + " " + y, total_df['日期'], total_df['委托时间']) total_df['日期'] = pd.to_datetime(total_df['日期'], format='%Y%m%d %H%M%S') total_df = total_df.set_index('日期') df = total_df[total_df['备注'] == '成功[[0000]交易成功]'] del df['备注'] del df['委托时间'] df.to_sql('tb_bank_cash', self.engine, if_exists='replace') def GJfunc(obj, path, name): # path = base_path + broker obj.setpath(path) # obj.data_sync() obj.years_gj_each_month_day(filename=name) # obj.years_gj_each_month() # obj.years_gj() # obj.years_ht() # bank_account() # obj.pretty() def HBfunc(obj, path, name): obj.setpath(path) obj.merge_data_HuaBao(filename=name) def main(broker, name): ''' broker: HB GJ name ''' # 国金 obj = DeliveryOrder() base_path = f'private/{datetime.date.today().year}/' path = base_path + broker # 国金 if broker == 'GJ': GJfunc(obj, path, name) # 华宝 elif broker == 'HB': HBfunc(obj, path, name) if __name__ == '__main__': fire.Fire(main) ================================================ FILE: utils/profit_compare.py ================================================ import fire class ProfitTool: def __init__(self,codes) -> None: if isinstance(codes ,str): self.codes = [codes] elif isinstance(codes,list): self.codes = list(codes) else: raise TypeError('输入类型有误') def main(codes): codes=codes.split(',') print(codes) if __name__=='__main__': fire.Fire(main) ================================================ FILE: utils/push_msn.py ================================================ # -*-coding=utf-8-*- __author__ = 'Rocky' ''' http://30daydo.com Contact: weigesysu@qq.com ''' import smtplib, time,os,datetime from email.mime.text import MIMEText from email import Utils from toolkit import Toolkit import tushare as ts from pandas import Series import matplotlib.pyplot as plt # import itchat # 推送股价信息到手机 class MailSend(): def __init__(self, smtp_server, from_mail, password, to_mail): self.server = smtp_server self.username = from_mail.split("@")[0] self.from_mail = from_mail self.password = password self.to_mail = to_mail # 初始化邮箱设置 def send_txt(self, name, price, percent, status): if 'up' == status: content = '%s > %.2f , %.2f' % (name, price, percent) if 'down' == status: content = '%s < %.2f , %.2f' % (name, price, percent) content = content + '%' print(content) subject = '%s' % name self.msg = MIMEText(content, 'plain', 'utf-8') self.msg['to'] = self.to_mail self.msg['from'] = self.from_mail self.msg['Subject'] = subject self.msg['Date'] = Utils.formatdate(localtime=1) try: self.smtp = smtplib.SMTP_SSL(port=465) self.smtp.connect(self.server) self.smtp.login(self.username, self.password) self.smtp.sendmail(self.msg['from'], self.msg['to'], self.msg.as_string()) self.smtp.quit() print("sent") except smtplib.SMTPException as e: print(e) return 0 def push_msg(name, price, percent, status): cfg = Toolkit.getUserData('data.cfg') from_mail = cfg['from_mail'] password = cfg['password'] to_mail = cfg['to_mail'] obj = MailSend('smtp.qq.com', from_mail, password, to_mail) obj.send_txt(name, price, percent, status) def read_stock(name): f = open(name) stock_list = [] for s in f.readlines(): s = s.strip() row = s.split(';') # print(row) # print("code :",row[0]) # rint "price :",row[1] stock_list.append(row) return stock_list def meet_price(code, price_up, price_down,type): try: df = ts.get_realtime_quotes(code) except Exception as e: print(e) time.sleep(5) return 0 real_price = df['price'].values[0] name = df['name'].values[0] real_price = float(real_price) pre_close = float(df['pre_close'].values[0]) percent = (real_price - pre_close) / pre_close * 100 # print(percent) # percent=df[''] # print(type(real_price)) if real_price >= price_up: print('%s price higher than %.2f , %.2f' % (name, real_price, percent),) print('%') if type=='msn': push_msg(name, real_price, percent, 'up') return 1 elif type=='wechat': pass if real_price <= price_down: print('%s price lower than %.2f , %.2f' % (name, real_price, percent),) print('%') if type=='msn': push_msg(name, real_price, percent, 'down') return 1 elif type=='wechat': pass def meet_percent(code, percent_up, percent_down,type): try: df = ts.get_realtime_quotes(code) except Exception as e: print(e) time.sleep(5) return 0 real_price = df['price'].values[0] name = df['name'].values[0] real_price = float(real_price) pre_close = float(df['pre_close'].values[0]) real_percent = (real_price - pre_close) / pre_close * 100 # print(percent) # percent=df[''] # print(type(real_price)) if real_percent >= percent_up: print('%s percent higher than %.2f , %.2f' % (name, real_percent, real_price),) if type=='msn': push_msg(name, real_price, real_price, 'up') return 1 elif type=='wechat': pass return 1 if real_percent <= percent_down: print('%s percent lower than %.2f , %.2f' % (name, real_percent, real_price),) print('%') if type=='mns': push_msg(name, real_price, real_percent, 'down') return 1 elif type=='wechat': pass return 1 # 推送一般的实盘消息 def general_info(): t_all = ts.get_today_all() result = [] t1 = t_all[t_all['changepercent'] <= -9.0].count()['changepercent'] result.append(t1) for i in range(-9, 9, 1): temp = t_all[(i * 1.00 < t_all['changepercent']) & (t_all['changepercent'] <= (i + 1) * 1.00)].count()[ 'changepercent'] result.append(temp) t2 = t_all[t_all['changepercent'] > 9.0].count()['changepercent'] result.append(t2) return result #test in sourcetree #test in house #开板提示 def break_ceil(code): while 1: time.sleep(2) try: df=ts.get_realtime_quotes(code) except: time.sleep(5) continue v=long(df['b1_v'].values[0]) print(datetime.datetime.now().strftime("%H:%M:%S")) print(v) #print(type(v)) if v<=10000 : print(u"小于万手,小心!跑") push_msg('break',10,10,'down') #这里可以优化,不必每次都登陆。 def monitor_break(): #all_base=pd.read_csv('bases.csv',dtype={'code':np.str}) break_ceil('002868') def visual(): data = general_info() s = Series(data=data, index=[range(-10, 10)]) print(s) fg = s.plot(kind='bar', table=True) plt.show(fg) def main(): # read_stock() choice = input("Input your choice:\n") if str(choice) == '1': # using price: stock_lists_price = read_stock('price.txt') while 1: t = 0 for each_stock in stock_lists_price: code = each_stock[0] price_down = float(each_stock[1]) price_up = float(each_stock[2]) t = meet_price(code, price_up, price_down) if t: stock_lists_price.remove(each_stock) if str(choice) == '2': # using percent stock_lists_percent = read_stock('percent.txt') while 1: t = 0 for each_stock in stock_lists_percent: code = each_stock[0] percent_down = float(each_stock[1]) percent_up = float(each_stock[2]) t = meet_percent(code, percent_up, percent_down,type) if t: stock_lists_percent.remove(each_stock) if __name__ == '__main__': path=os.path.join(os.getcwd(), '../data') if os.path.exists(path)==False: os.mkdir(path) os.chdir(path) main() # general_info() #visual() #monitor_break() ================================================ FILE: yesterday_zt_monitor.py ================================================ # -*-coding=utf-8-*- ''' 昨日涨停的今日的实时情况 ''' import datetime import matplotlib matplotlib.use("Pdf") from configure.settings import DBSelector,config_dict import pandas as pd import tushare as ts from plot_line import plot_stock_line from common.BaseService import BaseService from configure.util import send_message_via_wechat import fire # 绘制k线图,今日涨停的k线图 class PlotYesterdayZT(BaseService): def __init__(self): super(PlotYesterdayZT, self).__init__('log/yester_zdt.log') self.image_path = config_dict('data_path') def get_data(self,table): DB = DBSelector() engine = DB.get_engine('db_zdt', 'qq') try: df = pd.read_sql(table, engine) except Exception as e: self.logger.error('table_name >>> {}'.format(table)) self.logger.error(e) return None else: return df def plot_yesterday_zt(self,api,type_name='zrzt', current=datetime.datetime.now().strftime('%Y%m%d')): start_data = datetime.datetime.now() + datetime.timedelta(days=-200) start_data=start_data.strftime('%Y-%m-%d') table = f'{current}{type_name}' df = self.get_data(table) for i in range(len(df)): code = df.iloc[i]['代码'] name = df.iloc[i]['名称'] plot_stock_line(api,code, name, table_type=type_name, current=current, root_path=self.image_path,start=start_data, save=True) def main(current=None): # current='20191016' if current is None: current = datetime.datetime.now().strftime('%Y%m%d') if isinstance(current,int): current=str(current) app = PlotYesterdayZT() api =ts.get_apis() for plot_type in ['zrzt', 'zdt']: try: app.plot_yesterday_zt(api,plot_type, current=current) except Exception as e: print(plot_type,'error') print(e) send_message_via_wechat('zdt_plot 出错') continue ts.close_apis(conn=api) if __name__ == '__main__': fire.Fire(main) ================================================ FILE: 收益率曲线绘制.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from setting import get_mysql_conn" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "conn = get_mysql_conn(db='db_stock',local='local')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cursor = conn.cursor()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cmd = 'select Date,NetValue,HS300 from tb_jingzhi'\n", "cursor.execute(cmd)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ret = cursor.fetchall()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "result = []\n", "for item in ret:\n", " d={}\n", " d['Date']=item[0]\n", " d['NetValue']=item[1]\n", " d['hs']=item[2]\n", " result.append(d)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = df.set_index('Date',drop=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.figure(figsize=(12,10))\n", "df['NetValue'].plot()\n", "df['hs'].plot()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['NetValue'].mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['NetValue'].std()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['NetValue'].var()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['hs'].mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['hs'].std()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df['hs'].var()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 新闻分析.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from setting import get_engine\n", "first=get_engine('db_stock')\n", "import pandas as pd\n", "df =pd.read_sql('tb_cnstock',first)\n", "\n", "second = get_engine('db_news')\n", "df2=pd.read_sql('tb_cnstock',second)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateTitleURL
02016-10-18 08:43:00欧富源科技1亿拍下深南电两房产公司股权http://company.cnstock.com/company/scp_gsxw/20...
12016-10-25 09:12:00净利增速远超营收 兔宝宝回复半年报问询http://company.cnstock.com/company/scp_gsxw/20...
22016-10-25 13:06:00ST沪科重要事项未公告下午临停http://company.cnstock.com/company/scp_gsxw/20...
32016-11-02 08:56:00西王食品收购Kerr 80%股权完成交割http://company.cnstock.com/company/scp_gsxw/20...
42016-11-08 13:42:00万福生科11月8日下午开市起停牌http://company.cnstock.com/company/scp_gsxw/20...
\n", "
" ], "text/plain": [ " Date Title \\\n", "0 2016-10-18 08:43:00 欧富源科技1亿拍下深南电两房产公司股权 \n", "1 2016-10-25 09:12:00 净利增速远超营收 兔宝宝回复半年报问询 \n", "2 2016-10-25 13:06:00 ST沪科重要事项未公告下午临停 \n", "3 2016-11-02 08:56:00 西王食品收购Kerr 80%股权完成交割 \n", "4 2016-11-08 13:42:00 万福生科11月8日下午开市起停牌 \n", "\n", " URL \n", "0 http://company.cnstock.com/company/scp_gsxw/20... \n", "1 http://company.cnstock.com/company/scp_gsxw/20... \n", "2 http://company.cnstock.com/company/scp_gsxw/20... \n", "3 http://company.cnstock.com/company/scp_gsxw/20... \n", "4 http://company.cnstock.com/company/scp_gsxw/20... " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateTitleURL
02016-10-18 08:43:00欧富源科技1亿拍下深南电两房产公司股权http://company.cnstock.com/company/scp_gsxw/20...
12016-10-25 09:12:00净利增速远超营收 兔宝宝回复半年报问询http://company.cnstock.com/company/scp_gsxw/20...
22016-10-25 13:06:00ST沪科重要事项未公告下午临停http://company.cnstock.com/company/scp_gsxw/20...
32016-11-02 08:56:00西王食品收购Kerr 80%股权完成交割http://company.cnstock.com/company/scp_gsxw/20...
42016-11-08 13:42:00万福生科11月8日下午开市起停牌http://company.cnstock.com/company/scp_gsxw/20...
\n", "
" ], "text/plain": [ " Date Title \\\n", "0 2016-10-18 08:43:00 欧富源科技1亿拍下深南电两房产公司股权 \n", "1 2016-10-25 09:12:00 净利增速远超营收 兔宝宝回复半年报问询 \n", "2 2016-10-25 13:06:00 ST沪科重要事项未公告下午临停 \n", "3 2016-11-02 08:56:00 西王食品收购Kerr 80%股权完成交割 \n", "4 2016-11-08 13:42:00 万福生科11月8日下午开市起停牌 \n", "\n", " URL \n", "0 http://company.cnstock.com/company/scp_gsxw/20... \n", "1 http://company.cnstock.com/company/scp_gsxw/20... \n", "2 http://company.cnstock.com/company/scp_gsxw/20... \n", "3 http://company.cnstock.com/company/scp_gsxw/20... \n", "4 http://company.cnstock.com/company/scp_gsxw/20... " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.head()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_new[~(df_new['URL'].isin(df_old['URL'].values))]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 选股.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "█\r" ] } ], "source": [ "#-*-coding=utf-8-*-\n", "# 用来选股的\n", "from setting import get_engine\n", "import pandas as pd\n", "import tushare as ts" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "engine = get_engine('db_stock')\n", "basic_df = pd.read_sql('tb_basic_info',engine,index_col='index')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
index
0603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018041035286.051.9841.9855.848.193.8742986.02018-04-11
1300356光一科技电气设备江苏206.513.694.15208679.9597810.2117068.50...2.492012100928831.280.69-39.02-47.7626.054.3019839.02018-04-11
2600711盛屯矿业小金属福建26.1514.9716.771125400.88590581.0076470.36...3.1119960531104130.270.6262.61223.676.852.95106700.02018-04-11
3002160常铝股份江苏32.314.727.24622252.69297916.59151107.36...1.452007082127155.900.3740.0356.0717.643.8450000.02018-04-11
4000717韶钢松山普钢广东6.3224.2024.201441538.00440514.44801547.88...5.3519970508-331470.38-1.3786.352381.1313.269.66132008.02018-04-11
\n", "

5 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals totalAssets \\\n", "index \n", "0 603897 N长城 电气设备 浙江 25.57 0.45 1.78 131807.23 \n", "1 300356 光一科技 电气设备 江苏 206.51 3.69 4.15 208679.95 \n", "2 600711 盛屯矿业 小金属 福建 26.15 14.97 16.77 1125400.88 \n", "3 002160 常铝股份 铝 江苏 32.31 4.72 7.24 622252.69 \n", "4 000717 韶钢松山 普钢 广东 6.32 24.20 24.20 1441538.00 \n", "\n", " liquidAssets fixedAssets ... pb timeToMarket undp \\\n", "index ... \n", "0 117523.63 10988.37 ... 4.27 20180410 35286.05 \n", "1 97810.21 17068.50 ... 2.49 20121009 28831.28 \n", "2 590581.00 76470.36 ... 3.11 19960531 104130.27 \n", "3 297916.59 151107.36 ... 1.45 20070821 27155.90 \n", "4 440514.44 801547.88 ... 5.35 19970508 -331470.38 \n", "\n", " perundp rev profit gpr npr holders 更新日期 \n", "index \n", "0 1.98 41.98 55.84 8.19 3.87 42986.0 2018-04-11 \n", "1 0.69 -39.02 -47.76 26.05 4.30 19839.0 2018-04-11 \n", "2 0.62 62.61 223.67 6.85 2.95 106700.0 2018-04-11 \n", "3 0.37 40.03 56.07 17.64 3.84 50000.0 2018-04-11 \n", "4 -1.37 86.35 2381.13 13.26 9.66 132008.0 2018-04-11 \n", "\n", "[5 rows x 24 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df.head()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "basic_df=basic_df[basic_df['timeToMarket']!=0]" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 3506 entries, 0 to 3509\n", "Data columns (total 24 columns):\n", "code 3506 non-null object\n", "name 3506 non-null object\n", "industry 3506 non-null object\n", "area 3506 non-null object\n", "pe 3506 non-null float64\n", "outstanding 3506 non-null float64\n", "totals 3506 non-null float64\n", "totalAssets 3506 non-null float64\n", "liquidAssets 3506 non-null float64\n", "fixedAssets 3506 non-null float64\n", "reserved 3506 non-null float64\n", "reservedPerShare 3506 non-null float64\n", "esp 3506 non-null float64\n", "bvps 3506 non-null float64\n", "pb 3506 non-null float64\n", "timeToMarket 3506 non-null int64\n", "undp 3506 non-null float64\n", "perundp 3506 non-null float64\n", "rev 3506 non-null float64\n", "profit 3506 non-null float64\n", "gpr 3506 non-null float64\n", "npr 3506 non-null float64\n", "holders 3506 non-null float64\n", "更新日期 3506 non-null object\n", "dtypes: float64(18), int64(1), object(5)\n", "memory usage: 684.8+ KB\n" ] } ], "source": [ "basic_df.info()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python2.7/dist-packages/pandas/core/ops.py:816: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", " result = getattr(x, name)(y)\n" ] }, { "ename": "TypeError", "evalue": "invalid type comparison", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mbasic_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbasic_df\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreset_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbasic_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timeToMarket'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc\u001b[0m in \u001b[0;36mreset_index\u001b[0;34m(self, level, drop, inplace, col_level, col_fill)\u001b[0m\n\u001b[1;32m 3339\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3340\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3341\u001b[0;31m \u001b[0mlevel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_level_number\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlev\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mlev\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3342\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mMultiIndex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3343\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/indexes/base.pyc\u001b[0m in \u001b[0;36m_get_level_number\u001b[0;34m(self, level)\u001b[0m\n\u001b[1;32m 1618\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1619\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_level_number\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1620\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_index_level\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1621\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1622\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/indexes/base.pyc\u001b[0m in \u001b[0;36m_validate_index_level\u001b[0;34m(self, level)\u001b[0m\n\u001b[1;32m 1613\u001b[0m \u001b[0;34m\" Index has only 1 level, not %d\"\u001b[0m \u001b[0;34m%\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1614\u001b[0m (level + 1))\n\u001b[0;32m-> 1615\u001b[0;31m \u001b[0;32melif\u001b[0m \u001b[0mlevel\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1616\u001b[0m raise KeyError('Level %s must be same as name (%s)' %\n\u001b[1;32m 1617\u001b[0m (level, self.name))\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/ops.pyc\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(self, other, axis)\u001b[0m\n\u001b[1;32m 877\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 878\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrstate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'ignore'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 879\u001b[0;31m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mna_op\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 880\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_scalar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mres\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 881\u001b[0m raise TypeError('Could not compare {typ} type with Series'\n", "\u001b[0;32m/usr/local/lib/python2.7/dist-packages/pandas/core/ops.pyc\u001b[0m in \u001b[0;36mna_op\u001b[0;34m(x, y)\u001b[0m\n\u001b[1;32m 816\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mNotImplemented\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 818\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"invalid type comparison\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 819\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 820\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: invalid type comparison" ] } ], "source": [ "basic_df = basic_df.reset_index(basic_df['timeToMarket'],drop=True)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
index
0603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018041035286.051.9841.9855.848.193.8742986.02018-04-11
1300356光一科技电气设备江苏206.513.694.15208679.9597810.2117068.50...2.492012100928831.280.69-39.02-47.7626.054.3019839.02018-04-11
2600711盛屯矿业小金属福建26.1514.9716.771125400.88590581.0076470.36...3.1119960531104130.270.6262.61223.676.852.95106700.02018-04-11
3002160常铝股份江苏32.314.727.24622252.69297916.59151107.36...1.452007082127155.900.3740.0356.0717.643.8450000.02018-04-11
4000717韶钢松山普钢广东6.3224.2024.201441538.00440514.44801547.88...5.3519970508-331470.38-1.3786.352381.1313.269.66132008.02018-04-11
\n", "

5 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals totalAssets \\\n", "index \n", "0 603897 N长城 电气设备 浙江 25.57 0.45 1.78 131807.23 \n", "1 300356 光一科技 电气设备 江苏 206.51 3.69 4.15 208679.95 \n", "2 600711 盛屯矿业 小金属 福建 26.15 14.97 16.77 1125400.88 \n", "3 002160 常铝股份 铝 江苏 32.31 4.72 7.24 622252.69 \n", "4 000717 韶钢松山 普钢 广东 6.32 24.20 24.20 1441538.00 \n", "\n", " liquidAssets fixedAssets ... pb timeToMarket undp \\\n", "index ... \n", "0 117523.63 10988.37 ... 4.27 20180410 35286.05 \n", "1 97810.21 17068.50 ... 2.49 20121009 28831.28 \n", "2 590581.00 76470.36 ... 3.11 19960531 104130.27 \n", "3 297916.59 151107.36 ... 1.45 20070821 27155.90 \n", "4 440514.44 801547.88 ... 5.35 19970508 -331470.38 \n", "\n", " perundp rev profit gpr npr holders 更新日期 \n", "index \n", "0 1.98 41.98 55.84 8.19 3.87 42986.0 2018-04-11 \n", "1 0.69 -39.02 -47.76 26.05 4.30 19839.0 2018-04-11 \n", "2 0.62 62.61 223.67 6.85 2.95 106700.0 2018-04-11 \n", "3 0.37 40.03 56.07 17.64 3.84 50000.0 2018-04-11 \n", "4 -1.37 86.35 2381.13 13.26 9.66 132008.0 2018-04-11 \n", "\n", "[5 rows x 24 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df.head()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "basic_df['timeToMarket']=pd.to_datetime(basic_df['timeToMarket'],format='%Y%m%d')" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
index
0603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018-04-1035286.051.9841.9855.848.193.8742986.02018-04-11
1300356光一科技电气设备江苏206.513.694.15208679.9597810.2117068.50...2.492012-10-0928831.280.69-39.02-47.7626.054.3019839.02018-04-11
2600711盛屯矿业小金属福建26.1514.9716.771125400.88590581.0076470.36...3.111996-05-31104130.270.6262.61223.676.852.95106700.02018-04-11
3002160常铝股份江苏32.314.727.24622252.69297916.59151107.36...1.452007-08-2127155.900.3740.0356.0717.643.8450000.02018-04-11
4000717韶钢松山普钢广东6.3224.2024.201441538.00440514.44801547.88...5.351997-05-08-331470.38-1.3786.352381.1313.269.66132008.02018-04-11
\n", "

5 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals totalAssets \\\n", "index \n", "0 603897 N长城 电气设备 浙江 25.57 0.45 1.78 131807.23 \n", "1 300356 光一科技 电气设备 江苏 206.51 3.69 4.15 208679.95 \n", "2 600711 盛屯矿业 小金属 福建 26.15 14.97 16.77 1125400.88 \n", "3 002160 常铝股份 铝 江苏 32.31 4.72 7.24 622252.69 \n", "4 000717 韶钢松山 普钢 广东 6.32 24.20 24.20 1441538.00 \n", "\n", " liquidAssets fixedAssets ... pb timeToMarket undp \\\n", "index ... \n", "0 117523.63 10988.37 ... 4.27 2018-04-10 35286.05 \n", "1 97810.21 17068.50 ... 2.49 2012-10-09 28831.28 \n", "2 590581.00 76470.36 ... 3.11 1996-05-31 104130.27 \n", "3 297916.59 151107.36 ... 1.45 2007-08-21 27155.90 \n", "4 440514.44 801547.88 ... 5.35 1997-05-08 -331470.38 \n", "\n", " perundp rev profit gpr npr holders 更新日期 \n", "index \n", "0 1.98 41.98 55.84 8.19 3.87 42986.0 2018-04-11 \n", "1 0.69 -39.02 -47.76 26.05 4.30 19839.0 2018-04-11 \n", "2 0.62 62.61 223.67 6.85 2.95 106700.0 2018-04-11 \n", "3 0.37 40.03 56.07 17.64 3.84 50000.0 2018-04-11 \n", "4 -1.37 86.35 2381.13 13.26 9.66 132008.0 2018-04-11 \n", "\n", "[5 rows x 24 columns]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df.head()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
timeToMarket
2018-04-10603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018-04-1035286.051.9841.9855.848.193.8742986.02018-04-11
2012-10-09300356光一科技电气设备江苏206.513.694.15208679.9597810.2117068.50...2.492012-10-0928831.280.69-39.02-47.7626.054.3019839.02018-04-11
1996-05-31600711盛屯矿业小金属福建26.1514.9716.771125400.88590581.0076470.36...3.111996-05-31104130.270.6262.61223.676.852.95106700.02018-04-11
2007-08-21002160常铝股份江苏32.314.727.24622252.69297916.59151107.36...1.452007-08-2127155.900.3740.0356.0717.643.8450000.02018-04-11
1997-05-08000717韶钢松山普钢广东6.3224.2024.201441538.00440514.44801547.88...5.351997-05-08-331470.38-1.3786.352381.1313.269.66132008.02018-04-11
1996-05-03600896览海投资水运海南0.005.778.69448937.09363976.13453.85...2.741996-05-03-60134.50-0.69-94.8018.3891.85-416.7543837.02018-04-11
1997-06-25000819岳阳兴长石油加工湖南0.002.712.7181995.8859217.6317258.00...4.921997-06-2519668.430.7216.55-132.478.32-0.6231400.02018-04-11
2018-03-26600929湖南盐业食品湖南72.521.509.18310491.6378859.31139873.81...5.362018-03-2671625.130.781.3015.0647.717.24140295.02018-04-11
2010-04-30300076GQY视讯电脑设备浙江0.003.684.24116227.6176413.8121807.57...2.352010-04-3010759.370.25-40.70-1298.9335.65-29.9141000.02018-04-11
2007-08-03002144宏达高科纺织浙江26.281.361.77199379.3851652.7828723.63...1.512007-08-0352805.732.9912.73-6.0329.9215.7121057.02018-04-11
2017-03-16300621维业股份装修装饰深圳37.990.431.39186181.06169977.592515.88...3.412017-03-1626666.501.920.000.0013.344.2219044.02018-04-11
2017-09-20603106恒银金融电脑设备天津45.400.702.80212309.42190471.2716428.07...4.802017-09-2027721.100.990.000.0033.9511.2336000.02018-04-11
2017-03-15603811诚意药业化学制药浙江38.800.570.8567298.3246722.6212191.86...4.482017-03-159561.421.126.121.5752.1120.3110574.02018-04-11
2018-03-28002930宏川智慧仓储物流广东62.900.612.43187270.8013539.20103894.40...3.662018-03-2838270.211.57-0.7410.3356.5925.41115500.02018-04-11
2017-09-22603963大理药业化学制药云南73.920.251.0062622.2044925.3010986.69...8.402017-09-229541.130.950.000.0063.8520.0027488.02018-04-11
2018-03-30603214爱婴室百货上海49.450.251.0076961.1561297.167078.72...9.272018-03-3025456.172.5514.0626.4728.415.1826639.02018-04-11
2017-01-17300595欧普康视医疗保健安徽54.160.761.2484769.4671856.963970.03...10.122017-01-1720604.491.6631.6129.5676.0650.726781.02018-04-11
2017-03-21300627华测导航通信设备上海85.660.501.2395269.3088869.282105.35...9.132017-03-2119288.671.560.000.0054.5614.9716380.02018-04-11
2017-02-08603637镇海股份建筑施工浙江66.690.331.3386330.4676018.325968.18...4.332017-02-0820656.951.55-37.75-28.9131.5422.639897.02018-04-11
2017-10-10300705九典制药化学制药湖南89.940.291.1776920.2551869.2613084.78...9.342017-10-1012709.621.0842.0125.7651.9312.8321243.02018-04-11
2017-10-31603289泰瑞机器专用机械浙江45.820.512.0488554.8268437.2115267.82...5.652017-10-3126118.491.280.000.0030.6312.4048514.02018-04-11
2017-05-09603229奥翔药业化学制药浙江93.030.401.6068624.1345903.0014470.87...7.222017-05-0914151.700.880.000.0060.6322.6514088.02018-04-11
2017-06-02300660江苏雷利电气设备江苏26.100.251.02280316.22256656.8016994.20...3.212017-06-0233226.213.260.000.0026.7412.0718283.02018-04-11
2016-08-02300529健帆生物医疗保健广东62.991.064.18170240.02123065.9532537.78...12.852016-08-0248161.671.1532.1640.7284.1439.5822527.02018-04-11
2017-09-22002900哈三联化学制药黑龙江44.110.532.11218374.66135898.9268163.18...4.352017-09-2239189.781.8650.993.3674.1715.7638400.02018-04-11
2017-05-19002873新天药业中成药贵州44.540.170.6991925.2757405.9021257.95...5.892017-05-1918090.752.630.000.0081.0911.759615.02018-04-11
2010-02-03002350北京科锐电气设备北京184.533.763.87280886.13197356.5642124.90...3.112010-02-0334932.310.9023.04-44.2823.271.0352854.02018-04-11
2008-05-16002235安妮股份造纸福建58.103.344.16272703.47126430.0619098.98...2.012008-05-165426.160.1366.06473.5031.6314.4630659.02018-04-11
2017-08-10300688创业黑马综合类北京171.330.170.6841396.5540351.37380.64...14.132017-08-106212.930.910.000.0056.9117.9715720.02018-04-11
2018-02-26603712七一二通信设备天津363.051.007.72348015.50277392.6357633.35...21.082018-02-2620558.850.270.000.0049.578.3988473.02018-04-11
..................................................................
2014-09-10300392腾信股份互联网北京192.021.643.84150430.13116865.2614213.17...7.382014-09-1011726.030.3117.47324.1310.241.5327346.02018-04-11
1999-03-25600209罗顿发展综合类海南0.004.264.3986705.9323242.8016197.40...6.311999-03-255083.850.1253.0151.864.02-30.8159619.02018-04-11
1997-06-11000735罗 牛 山农业综合海南54.6810.6011.52618940.00207991.38180241.88...3.021997-06-1172196.310.63116.2985.1130.9213.8880000.02018-04-11
2010-02-11300054鼎龙股份化工原料湖北30.936.659.61397465.50226564.6647543.53...2.702010-02-1177185.900.8035.4130.8436.6718.2417874.02018-04-11
1997-01-28000613大东海A旅游服务海南1574.132.663.648746.661382.313908.87...58.341997-01-28-34110.73-0.9428.55207.4460.0810.2420000.02018-04-11
2016-03-22300484蓝海华腾电气设备深圳25.000.942.08103367.3690467.023893.34...5.062016-03-2235972.951.732.540.9439.2724.1414835.02018-04-11
2015-03-18300433蓝思科技元器件湖南46.394.4426.293134060.001093617.131565460.63...3.242015-03-18823279.003.1341.9312.3925.005.9135003.02018-04-11
2017-06-06300661圣邦股份元器件北京87.020.150.6186190.9682643.931150.35...8.732017-06-0619735.473.240.000.0043.6216.025677.02018-04-11
2017-01-05300588熙菱信息软件服务新疆65.770.311.0084675.4279111.96736.22...8.192017-01-0513293.881.3335.5685.3924.817.4710945.02018-04-11
2017-01-26300603立昂技术通信设备新疆47.460.571.03124445.8299134.212345.56...8.702017-01-2616070.231.57247.32259.1620.038.6111752.02018-04-11
2017-11-09300719安达维尔航空北京53.580.421.68111330.5299828.749335.78...5.002017-11-0926470.751.5810.59-1.5253.6720.4225100.02018-04-11
2009-12-16002320海峡股份水运海南74.694.305.08390513.69136325.91235803.70...4.752009-12-1679676.131.5726.1564.7142.1323.2917700.02018-04-11
2017-08-03300687赛意信息软件服务广东52.570.200.8083921.6880942.17291.20...6.362017-08-0314224.571.780.000.0031.3613.3413585.02018-04-11
2010-05-20300083劲胜智能元器件广东16.4111.9114.321144811.25728822.63176756.77...1.642010-05-2039800.050.2831.86424.0327.298.9647930.02018-04-11
2008-05-08002229鸿博股份广告包装福建525.654.155.03210997.52117592.2261739.38...3.452008-05-0821342.100.42-17.88-15.1424.061.5540500.02018-04-11
2017-10-19300709精研科技元器件江苏31.010.220.88104817.9751288.0536566.43...3.832017-10-1926389.693.000.000.0040.4917.0416000.02018-04-11
2017-05-16300653正海生物医疗保健山东65.830.200.8053081.6045645.282500.00...8.402017-05-1612030.731.5021.3535.6393.6733.748714.02018-04-11
2017-11-27300727润禾材料化工原料浙江90.090.240.9843196.9225291.6112968.00...8.962017-11-278362.070.860.000.0029.5610.7550562.02018-04-11
2011-01-25300166东方国信软件服务北京78.818.0610.50468344.94273063.0022614.40...3.722011-01-2597738.210.9318.8630.8945.8619.7235285.02018-04-11
2015-03-24603729龙韵股份广告包装上海176.040.670.6797434.9382516.067244.75...4.192015-03-2446754.807.01-6.88-53.6210.852.045819.02018-04-11
2017-05-23300657弘信电子元器件福建67.080.261.04184841.84111414.6059763.01...6.422017-05-2318206.141.750.000.0013.573.7911765.02018-04-11
2016-03-03300502新易盛通信设备四川39.291.252.38135900.52100870.7729193.11...4.652016-03-0348375.462.0329.8820.0325.6114.6021261.02018-04-11
1999-12-09000955欣龙控股纺织海南0.005.385.38140784.4268316.9946174.09...5.761999-12-09-40120.17-0.7536.59-155.8112.15-9.5833494.02018-04-11
2011-07-07002596海南瑞泽其他建材海南76.577.2610.74498120.41292194.8459208.46...5.372011-07-0763369.160.5956.17150.9419.126.1221200.02018-04-11
2011-03-16300189神农基因种植业海南0.008.8210.24260142.09166160.4129938.77...2.982011-03-169359.570.09148.6649.1312.07-1.2062017.02018-04-11
1994-01-03600806*ST昆机机床制造云南0.003.905.31193646.66121889.9745542.53...0.001994-01-03-45091.93-0.8521.07-23.373.60-51.4333099.02018-04-11
2003-09-05600432*ST吉恩小金属吉林0.0016.0416.041373541.75297409.28768094.25...0.002003-09-05-549617.19-3.439.91-56.2415.12-42.8670654.02018-04-11
1999-09-16000950*ST建峰农药化肥重庆0.005.9917.281562395.131296451.6348986.46...0.001999-09-16193228.361.121.16758.449.075.2030624.02018-04-11
1996-11-15000629*ST钒钛普钢四川0.0047.6785.901047323.31429526.09468832.44...0.001996-11-15-1126974.13-1.31-11.07114.4217.749.15309055.02018-04-11
1993-05-18000511*ST烯碳矿物制品辽宁0.0011.5511.55346274.91312833.032405.45...0.001993-05-18-63425.48-0.5543.62-55.460.22-14.68164822.02018-04-11
\n", "

3506 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals \\\n", "timeToMarket \n", "2018-04-10 603897 N长城 电气设备 浙江 25.57 0.45 1.78 \n", "2012-10-09 300356 光一科技 电气设备 江苏 206.51 3.69 4.15 \n", "1996-05-31 600711 盛屯矿业 小金属 福建 26.15 14.97 16.77 \n", "2007-08-21 002160 常铝股份 铝 江苏 32.31 4.72 7.24 \n", "1997-05-08 000717 韶钢松山 普钢 广东 6.32 24.20 24.20 \n", "1996-05-03 600896 览海投资 水运 海南 0.00 5.77 8.69 \n", "1997-06-25 000819 岳阳兴长 石油加工 湖南 0.00 2.71 2.71 \n", "2018-03-26 600929 湖南盐业 食品 湖南 72.52 1.50 9.18 \n", "2010-04-30 300076 GQY视讯 电脑设备 浙江 0.00 3.68 4.24 \n", "2007-08-03 002144 宏达高科 纺织 浙江 26.28 1.36 1.77 \n", "2017-03-16 300621 维业股份 装修装饰 深圳 37.99 0.43 1.39 \n", "2017-09-20 603106 恒银金融 电脑设备 天津 45.40 0.70 2.80 \n", "2017-03-15 603811 诚意药业 化学制药 浙江 38.80 0.57 0.85 \n", "2018-03-28 002930 宏川智慧 仓储物流 广东 62.90 0.61 2.43 \n", "2017-09-22 603963 大理药业 化学制药 云南 73.92 0.25 1.00 \n", "2018-03-30 603214 爱婴室 百货 上海 49.45 0.25 1.00 \n", "2017-01-17 300595 欧普康视 医疗保健 安徽 54.16 0.76 1.24 \n", "2017-03-21 300627 华测导航 通信设备 上海 85.66 0.50 1.23 \n", "2017-02-08 603637 镇海股份 建筑施工 浙江 66.69 0.33 1.33 \n", "2017-10-10 300705 九典制药 化学制药 湖南 89.94 0.29 1.17 \n", "2017-10-31 603289 泰瑞机器 专用机械 浙江 45.82 0.51 2.04 \n", "2017-05-09 603229 奥翔药业 化学制药 浙江 93.03 0.40 1.60 \n", "2017-06-02 300660 江苏雷利 电气设备 江苏 26.10 0.25 1.02 \n", "2016-08-02 300529 健帆生物 医疗保健 广东 62.99 1.06 4.18 \n", "2017-09-22 002900 哈三联 化学制药 黑龙江 44.11 0.53 2.11 \n", "2017-05-19 002873 新天药业 中成药 贵州 44.54 0.17 0.69 \n", "2010-02-03 002350 北京科锐 电气设备 北京 184.53 3.76 3.87 \n", "2008-05-16 002235 安妮股份 造纸 福建 58.10 3.34 4.16 \n", "2017-08-10 300688 创业黑马 综合类 北京 171.33 0.17 0.68 \n", "2018-02-26 603712 七一二 通信设备 天津 363.05 1.00 7.72 \n", "... ... ... ... ... ... ... ... \n", "2014-09-10 300392 腾信股份 互联网 北京 192.02 1.64 3.84 \n", "1999-03-25 600209 罗顿发展 综合类 海南 0.00 4.26 4.39 \n", "1997-06-11 000735 罗 牛 山 农业综合 海南 54.68 10.60 11.52 \n", "2010-02-11 300054 鼎龙股份 化工原料 湖北 30.93 6.65 9.61 \n", "1997-01-28 000613 大东海A 旅游服务 海南 1574.13 2.66 3.64 \n", "2016-03-22 300484 蓝海华腾 电气设备 深圳 25.00 0.94 2.08 \n", "2015-03-18 300433 蓝思科技 元器件 湖南 46.39 4.44 26.29 \n", "2017-06-06 300661 圣邦股份 元器件 北京 87.02 0.15 0.61 \n", "2017-01-05 300588 熙菱信息 软件服务 新疆 65.77 0.31 1.00 \n", "2017-01-26 300603 立昂技术 通信设备 新疆 47.46 0.57 1.03 \n", "2017-11-09 300719 安达维尔 航空 北京 53.58 0.42 1.68 \n", "2009-12-16 002320 海峡股份 水运 海南 74.69 4.30 5.08 \n", "2017-08-03 300687 赛意信息 软件服务 广东 52.57 0.20 0.80 \n", "2010-05-20 300083 劲胜智能 元器件 广东 16.41 11.91 14.32 \n", "2008-05-08 002229 鸿博股份 广告包装 福建 525.65 4.15 5.03 \n", "2017-10-19 300709 精研科技 元器件 江苏 31.01 0.22 0.88 \n", "2017-05-16 300653 正海生物 医疗保健 山东 65.83 0.20 0.80 \n", "2017-11-27 300727 润禾材料 化工原料 浙江 90.09 0.24 0.98 \n", "2011-01-25 300166 东方国信 软件服务 北京 78.81 8.06 10.50 \n", "2015-03-24 603729 龙韵股份 广告包装 上海 176.04 0.67 0.67 \n", "2017-05-23 300657 弘信电子 元器件 福建 67.08 0.26 1.04 \n", "2016-03-03 300502 新易盛 通信设备 四川 39.29 1.25 2.38 \n", "1999-12-09 000955 欣龙控股 纺织 海南 0.00 5.38 5.38 \n", "2011-07-07 002596 海南瑞泽 其他建材 海南 76.57 7.26 10.74 \n", "2011-03-16 300189 神农基因 种植业 海南 0.00 8.82 10.24 \n", "1994-01-03 600806 *ST昆机 机床制造 云南 0.00 3.90 5.31 \n", "2003-09-05 600432 *ST吉恩 小金属 吉林 0.00 16.04 16.04 \n", "1999-09-16 000950 *ST建峰 农药化肥 重庆 0.00 5.99 17.28 \n", "1996-11-15 000629 *ST钒钛 普钢 四川 0.00 47.67 85.90 \n", "1993-05-18 000511 *ST烯碳 矿物制品 辽宁 0.00 11.55 11.55 \n", "\n", " totalAssets liquidAssets fixedAssets ... pb \\\n", "timeToMarket ... \n", "2018-04-10 131807.23 117523.63 10988.37 ... 4.27 \n", "2012-10-09 208679.95 97810.21 17068.50 ... 2.49 \n", "1996-05-31 1125400.88 590581.00 76470.36 ... 3.11 \n", "2007-08-21 622252.69 297916.59 151107.36 ... 1.45 \n", "1997-05-08 1441538.00 440514.44 801547.88 ... 5.35 \n", "1996-05-03 448937.09 363976.13 453.85 ... 2.74 \n", "1997-06-25 81995.88 59217.63 17258.00 ... 4.92 \n", "2018-03-26 310491.63 78859.31 139873.81 ... 5.36 \n", "2010-04-30 116227.61 76413.81 21807.57 ... 2.35 \n", "2007-08-03 199379.38 51652.78 28723.63 ... 1.51 \n", "2017-03-16 186181.06 169977.59 2515.88 ... 3.41 \n", "2017-09-20 212309.42 190471.27 16428.07 ... 4.80 \n", "2017-03-15 67298.32 46722.62 12191.86 ... 4.48 \n", "2018-03-28 187270.80 13539.20 103894.40 ... 3.66 \n", "2017-09-22 62622.20 44925.30 10986.69 ... 8.40 \n", "2018-03-30 76961.15 61297.16 7078.72 ... 9.27 \n", "2017-01-17 84769.46 71856.96 3970.03 ... 10.12 \n", "2017-03-21 95269.30 88869.28 2105.35 ... 9.13 \n", "2017-02-08 86330.46 76018.32 5968.18 ... 4.33 \n", "2017-10-10 76920.25 51869.26 13084.78 ... 9.34 \n", "2017-10-31 88554.82 68437.21 15267.82 ... 5.65 \n", "2017-05-09 68624.13 45903.00 14470.87 ... 7.22 \n", "2017-06-02 280316.22 256656.80 16994.20 ... 3.21 \n", "2016-08-02 170240.02 123065.95 32537.78 ... 12.85 \n", "2017-09-22 218374.66 135898.92 68163.18 ... 4.35 \n", "2017-05-19 91925.27 57405.90 21257.95 ... 5.89 \n", "2010-02-03 280886.13 197356.56 42124.90 ... 3.11 \n", "2008-05-16 272703.47 126430.06 19098.98 ... 2.01 \n", "2017-08-10 41396.55 40351.37 380.64 ... 14.13 \n", "2018-02-26 348015.50 277392.63 57633.35 ... 21.08 \n", "... ... ... ... ... ... \n", "2014-09-10 150430.13 116865.26 14213.17 ... 7.38 \n", "1999-03-25 86705.93 23242.80 16197.40 ... 6.31 \n", "1997-06-11 618940.00 207991.38 180241.88 ... 3.02 \n", "2010-02-11 397465.50 226564.66 47543.53 ... 2.70 \n", "1997-01-28 8746.66 1382.31 3908.87 ... 58.34 \n", "2016-03-22 103367.36 90467.02 3893.34 ... 5.06 \n", "2015-03-18 3134060.00 1093617.13 1565460.63 ... 3.24 \n", "2017-06-06 86190.96 82643.93 1150.35 ... 8.73 \n", "2017-01-05 84675.42 79111.96 736.22 ... 8.19 \n", "2017-01-26 124445.82 99134.21 2345.56 ... 8.70 \n", "2017-11-09 111330.52 99828.74 9335.78 ... 5.00 \n", "2009-12-16 390513.69 136325.91 235803.70 ... 4.75 \n", "2017-08-03 83921.68 80942.17 291.20 ... 6.36 \n", "2010-05-20 1144811.25 728822.63 176756.77 ... 1.64 \n", "2008-05-08 210997.52 117592.22 61739.38 ... 3.45 \n", "2017-10-19 104817.97 51288.05 36566.43 ... 3.83 \n", "2017-05-16 53081.60 45645.28 2500.00 ... 8.40 \n", "2017-11-27 43196.92 25291.61 12968.00 ... 8.96 \n", "2011-01-25 468344.94 273063.00 22614.40 ... 3.72 \n", "2015-03-24 97434.93 82516.06 7244.75 ... 4.19 \n", "2017-05-23 184841.84 111414.60 59763.01 ... 6.42 \n", "2016-03-03 135900.52 100870.77 29193.11 ... 4.65 \n", "1999-12-09 140784.42 68316.99 46174.09 ... 5.76 \n", "2011-07-07 498120.41 292194.84 59208.46 ... 5.37 \n", "2011-03-16 260142.09 166160.41 29938.77 ... 2.98 \n", "1994-01-03 193646.66 121889.97 45542.53 ... 0.00 \n", "2003-09-05 1373541.75 297409.28 768094.25 ... 0.00 \n", "1999-09-16 1562395.13 1296451.63 48986.46 ... 0.00 \n", "1996-11-15 1047323.31 429526.09 468832.44 ... 0.00 \n", "1993-05-18 346274.91 312833.03 2405.45 ... 0.00 \n", "\n", " timeToMarket undp perundp rev profit gpr \\\n", "timeToMarket \n", "2018-04-10 2018-04-10 35286.05 1.98 41.98 55.84 8.19 \n", "2012-10-09 2012-10-09 28831.28 0.69 -39.02 -47.76 26.05 \n", "1996-05-31 1996-05-31 104130.27 0.62 62.61 223.67 6.85 \n", "2007-08-21 2007-08-21 27155.90 0.37 40.03 56.07 17.64 \n", "1997-05-08 1997-05-08 -331470.38 -1.37 86.35 2381.13 13.26 \n", "1996-05-03 1996-05-03 -60134.50 -0.69 -94.80 18.38 91.85 \n", "1997-06-25 1997-06-25 19668.43 0.72 16.55 -132.47 8.32 \n", "2018-03-26 2018-03-26 71625.13 0.78 1.30 15.06 47.71 \n", "2010-04-30 2010-04-30 10759.37 0.25 -40.70 -1298.93 35.65 \n", "2007-08-03 2007-08-03 52805.73 2.99 12.73 -6.03 29.92 \n", "2017-03-16 2017-03-16 26666.50 1.92 0.00 0.00 13.34 \n", "2017-09-20 2017-09-20 27721.10 0.99 0.00 0.00 33.95 \n", "2017-03-15 2017-03-15 9561.42 1.12 6.12 1.57 52.11 \n", "2018-03-28 2018-03-28 38270.21 1.57 -0.74 10.33 56.59 \n", "2017-09-22 2017-09-22 9541.13 0.95 0.00 0.00 63.85 \n", "2018-03-30 2018-03-30 25456.17 2.55 14.06 26.47 28.41 \n", "2017-01-17 2017-01-17 20604.49 1.66 31.61 29.56 76.06 \n", "2017-03-21 2017-03-21 19288.67 1.56 0.00 0.00 54.56 \n", "2017-02-08 2017-02-08 20656.95 1.55 -37.75 -28.91 31.54 \n", "2017-10-10 2017-10-10 12709.62 1.08 42.01 25.76 51.93 \n", "2017-10-31 2017-10-31 26118.49 1.28 0.00 0.00 30.63 \n", "2017-05-09 2017-05-09 14151.70 0.88 0.00 0.00 60.63 \n", "2017-06-02 2017-06-02 33226.21 3.26 0.00 0.00 26.74 \n", "2016-08-02 2016-08-02 48161.67 1.15 32.16 40.72 84.14 \n", "2017-09-22 2017-09-22 39189.78 1.86 50.99 3.36 74.17 \n", "2017-05-19 2017-05-19 18090.75 2.63 0.00 0.00 81.09 \n", "2010-02-03 2010-02-03 34932.31 0.90 23.04 -44.28 23.27 \n", "2008-05-16 2008-05-16 5426.16 0.13 66.06 473.50 31.63 \n", "2017-08-10 2017-08-10 6212.93 0.91 0.00 0.00 56.91 \n", "2018-02-26 2018-02-26 20558.85 0.27 0.00 0.00 49.57 \n", "... ... ... ... ... ... ... \n", "2014-09-10 2014-09-10 11726.03 0.31 17.47 324.13 10.24 \n", "1999-03-25 1999-03-25 5083.85 0.12 53.01 51.86 4.02 \n", "1997-06-11 1997-06-11 72196.31 0.63 116.29 85.11 30.92 \n", "2010-02-11 2010-02-11 77185.90 0.80 35.41 30.84 36.67 \n", "1997-01-28 1997-01-28 -34110.73 -0.94 28.55 207.44 60.08 \n", "2016-03-22 2016-03-22 35972.95 1.73 2.54 0.94 39.27 \n", "2015-03-18 2015-03-18 823279.00 3.13 41.93 12.39 25.00 \n", "2017-06-06 2017-06-06 19735.47 3.24 0.00 0.00 43.62 \n", "2017-01-05 2017-01-05 13293.88 1.33 35.56 85.39 24.81 \n", "2017-01-26 2017-01-26 16070.23 1.57 247.32 259.16 20.03 \n", "2017-11-09 2017-11-09 26470.75 1.58 10.59 -1.52 53.67 \n", "2009-12-16 2009-12-16 79676.13 1.57 26.15 64.71 42.13 \n", "2017-08-03 2017-08-03 14224.57 1.78 0.00 0.00 31.36 \n", "2010-05-20 2010-05-20 39800.05 0.28 31.86 424.03 27.29 \n", "2008-05-08 2008-05-08 21342.10 0.42 -17.88 -15.14 24.06 \n", "2017-10-19 2017-10-19 26389.69 3.00 0.00 0.00 40.49 \n", "2017-05-16 2017-05-16 12030.73 1.50 21.35 35.63 93.67 \n", "2017-11-27 2017-11-27 8362.07 0.86 0.00 0.00 29.56 \n", "2011-01-25 2011-01-25 97738.21 0.93 18.86 30.89 45.86 \n", "2015-03-24 2015-03-24 46754.80 7.01 -6.88 -53.62 10.85 \n", "2017-05-23 2017-05-23 18206.14 1.75 0.00 0.00 13.57 \n", "2016-03-03 2016-03-03 48375.46 2.03 29.88 20.03 25.61 \n", "1999-12-09 1999-12-09 -40120.17 -0.75 36.59 -155.81 12.15 \n", "2011-07-07 2011-07-07 63369.16 0.59 56.17 150.94 19.12 \n", "2011-03-16 2011-03-16 9359.57 0.09 148.66 49.13 12.07 \n", "1994-01-03 1994-01-03 -45091.93 -0.85 21.07 -23.37 3.60 \n", "2003-09-05 2003-09-05 -549617.19 -3.43 9.91 -56.24 15.12 \n", "1999-09-16 1999-09-16 193228.36 1.12 1.16 758.44 9.07 \n", "1996-11-15 1996-11-15 -1126974.13 -1.31 -11.07 114.42 17.74 \n", "1993-05-18 1993-05-18 -63425.48 -0.55 43.62 -55.46 0.22 \n", "\n", " npr holders 更新日期 \n", "timeToMarket \n", "2018-04-10 3.87 42986.0 2018-04-11 \n", "2012-10-09 4.30 19839.0 2018-04-11 \n", "1996-05-31 2.95 106700.0 2018-04-11 \n", "2007-08-21 3.84 50000.0 2018-04-11 \n", "1997-05-08 9.66 132008.0 2018-04-11 \n", "1996-05-03 -416.75 43837.0 2018-04-11 \n", "1997-06-25 -0.62 31400.0 2018-04-11 \n", "2018-03-26 7.24 140295.0 2018-04-11 \n", "2010-04-30 -29.91 41000.0 2018-04-11 \n", "2007-08-03 15.71 21057.0 2018-04-11 \n", "2017-03-16 4.22 19044.0 2018-04-11 \n", "2017-09-20 11.23 36000.0 2018-04-11 \n", "2017-03-15 20.31 10574.0 2018-04-11 \n", "2018-03-28 25.41 115500.0 2018-04-11 \n", "2017-09-22 20.00 27488.0 2018-04-11 \n", "2018-03-30 5.18 26639.0 2018-04-11 \n", "2017-01-17 50.72 6781.0 2018-04-11 \n", "2017-03-21 14.97 16380.0 2018-04-11 \n", "2017-02-08 22.63 9897.0 2018-04-11 \n", "2017-10-10 12.83 21243.0 2018-04-11 \n", "2017-10-31 12.40 48514.0 2018-04-11 \n", "2017-05-09 22.65 14088.0 2018-04-11 \n", "2017-06-02 12.07 18283.0 2018-04-11 \n", "2016-08-02 39.58 22527.0 2018-04-11 \n", "2017-09-22 15.76 38400.0 2018-04-11 \n", "2017-05-19 11.75 9615.0 2018-04-11 \n", "2010-02-03 1.03 52854.0 2018-04-11 \n", "2008-05-16 14.46 30659.0 2018-04-11 \n", "2017-08-10 17.97 15720.0 2018-04-11 \n", "2018-02-26 8.39 88473.0 2018-04-11 \n", "... ... ... ... \n", "2014-09-10 1.53 27346.0 2018-04-11 \n", "1999-03-25 -30.81 59619.0 2018-04-11 \n", "1997-06-11 13.88 80000.0 2018-04-11 \n", "2010-02-11 18.24 17874.0 2018-04-11 \n", "1997-01-28 10.24 20000.0 2018-04-11 \n", "2016-03-22 24.14 14835.0 2018-04-11 \n", "2015-03-18 5.91 35003.0 2018-04-11 \n", "2017-06-06 16.02 5677.0 2018-04-11 \n", "2017-01-05 7.47 10945.0 2018-04-11 \n", "2017-01-26 8.61 11752.0 2018-04-11 \n", "2017-11-09 20.42 25100.0 2018-04-11 \n", "2009-12-16 23.29 17700.0 2018-04-11 \n", "2017-08-03 13.34 13585.0 2018-04-11 \n", "2010-05-20 8.96 47930.0 2018-04-11 \n", "2008-05-08 1.55 40500.0 2018-04-11 \n", "2017-10-19 17.04 16000.0 2018-04-11 \n", "2017-05-16 33.74 8714.0 2018-04-11 \n", "2017-11-27 10.75 50562.0 2018-04-11 \n", "2011-01-25 19.72 35285.0 2018-04-11 \n", "2015-03-24 2.04 5819.0 2018-04-11 \n", "2017-05-23 3.79 11765.0 2018-04-11 \n", "2016-03-03 14.60 21261.0 2018-04-11 \n", "1999-12-09 -9.58 33494.0 2018-04-11 \n", "2011-07-07 6.12 21200.0 2018-04-11 \n", "2011-03-16 -1.20 62017.0 2018-04-11 \n", "1994-01-03 -51.43 33099.0 2018-04-11 \n", "2003-09-05 -42.86 70654.0 2018-04-11 \n", "1999-09-16 5.20 30624.0 2018-04-11 \n", "1996-11-15 9.15 309055.0 2018-04-11 \n", "1993-05-18 -14.68 164822.0 2018-04-11 \n", "\n", "[3506 rows x 24 columns]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df.set_index(basic_df['timeToMarket'],drop=True)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
timeToMarket
2018-04-10603897N长城电气设备浙江25.570.451.78131807.23117523.6310988.37...4.272018-04-1035286.051.9841.9855.848.193.8742986.02018-04-11
2018-03-26600929湖南盐业食品湖南72.521.509.18310491.6378859.31139873.81...5.362018-03-2671625.130.781.3015.0647.717.24140295.02018-04-11
2017-03-16300621维业股份装修装饰深圳37.990.431.39186181.06169977.592515.88...3.412017-03-1626666.501.920.000.0013.344.2219044.02018-04-11
2017-09-20603106恒银金融电脑设备天津45.400.702.80212309.42190471.2716428.07...4.802017-09-2027721.100.990.000.0033.9511.2336000.02018-04-11
2017-03-15603811诚意药业化学制药浙江38.800.570.8567298.3246722.6212191.86...4.482017-03-159561.421.126.121.5752.1120.3110574.02018-04-11
2018-03-28002930宏川智慧仓储物流广东62.900.612.43187270.8013539.20103894.40...3.662018-03-2838270.211.57-0.7410.3356.5925.41115500.02018-04-11
2017-09-22603963大理药业化学制药云南73.920.251.0062622.2044925.3010986.69...8.402017-09-229541.130.950.000.0063.8520.0027488.02018-04-11
2018-03-30603214爱婴室百货上海49.450.251.0076961.1561297.167078.72...9.272018-03-3025456.172.5514.0626.4728.415.1826639.02018-04-11
2017-01-17300595欧普康视医疗保健安徽54.160.761.2484769.4671856.963970.03...10.122017-01-1720604.491.6631.6129.5676.0650.726781.02018-04-11
2017-03-21300627华测导航通信设备上海85.660.501.2395269.3088869.282105.35...9.132017-03-2119288.671.560.000.0054.5614.9716380.02018-04-11
2017-02-08603637镇海股份建筑施工浙江66.690.331.3386330.4676018.325968.18...4.332017-02-0820656.951.55-37.75-28.9131.5422.639897.02018-04-11
2017-10-10300705九典制药化学制药湖南89.940.291.1776920.2551869.2613084.78...9.342017-10-1012709.621.0842.0125.7651.9312.8321243.02018-04-11
2017-10-31603289泰瑞机器专用机械浙江45.820.512.0488554.8268437.2115267.82...5.652017-10-3126118.491.280.000.0030.6312.4048514.02018-04-11
2017-05-09603229奥翔药业化学制药浙江93.030.401.6068624.1345903.0014470.87...7.222017-05-0914151.700.880.000.0060.6322.6514088.02018-04-11
2017-06-02300660江苏雷利电气设备江苏26.100.251.02280316.22256656.8016994.20...3.212017-06-0233226.213.260.000.0026.7412.0718283.02018-04-11
2017-09-22002900哈三联化学制药黑龙江44.110.532.11218374.66135898.9268163.18...4.352017-09-2239189.781.8650.993.3674.1715.7638400.02018-04-11
2017-05-19002873新天药业中成药贵州44.540.170.6991925.2757405.9021257.95...5.892017-05-1918090.752.630.000.0081.0911.759615.02018-04-11
2017-08-10300688创业黑马综合类北京171.330.170.6841396.5540351.37380.64...14.132017-08-106212.930.910.000.0056.9117.9715720.02018-04-11
2018-02-26603712七一二通信设备天津363.051.007.72348015.50277392.6357633.35...21.082018-02-2620558.850.270.000.0049.578.3988473.02018-04-11
2017-11-21300726宏达电子元器件湖南86.520.404.00100780.3080427.538466.57...16.702017-11-2123141.200.580.000.0070.7339.7379196.02018-04-11
2017-07-03300670大烨智能电气设备江苏88.130.271.0869398.4259512.136638.05...6.812017-07-0314113.521.310.000.0031.0615.7713484.02018-04-11
2017-04-21300554三超新材矿物制品江苏94.440.130.5248783.3233910.7512251.67...10.862017-04-2110747.622.070.000.0047.1524.984538.02018-04-11
2017-05-22603383顶点软件软件服务福建49.790.210.86115820.30104881.363878.28...5.412017-05-2238075.214.4319.0944.5978.7841.808928.02018-04-11
2018-02-23002927泰永长征电气设备贵州102.260.230.9443605.3535037.030.00...12.702018-02-230.000.000.000.000.0018.5148823.02018-04-11
2018-02-06300644南京聚隆塑料江苏62.160.160.6482547.7860597.2318706.01...6.212018-02-0625969.654.0613.33-28.2617.555.5131946.02018-04-11
2017-01-20300598诚迈科技软件服务江苏111.580.480.8053850.8644918.25626.82...9.782017-01-2017461.712.18-3.84-22.1231.268.109182.02018-04-11
2017-01-10603266天龙股份塑料浙江34.030.251.0098374.4671618.7218603.42...3.682017-01-1033154.173.328.214.7228.0510.338819.02018-04-11
2017-12-18002919名臣健康日用化工广东69.130.200.8146302.280.000.00...6.242017-12-180.000.000.000.000.007.7743677.02018-04-11
2017-04-21603139康惠制药中成药陕西61.040.251.0094826.3581229.315390.80...3.352017-04-2133866.513.390.000.0057.1015.6413137.02018-04-11
2018-03-23300634彩讯股份软件服务深圳81.300.404.00100621.5565063.451320.74...11.012018-03-2319710.350.4933.4644.5448.0121.3677432.02018-04-11
..................................................................
2017-03-24300629新劲刚矿物制品广东137.290.290.6748471.4036097.238623.61...9.682017-03-2412290.361.842.26-8.1032.249.847729.02018-04-11
2017-11-15300721怡达股份化工原料江苏40.040.200.80100619.9360467.4821425.98...3.092017-11-1518573.722.320.000.0016.715.4814138.02018-04-11
2017-08-22300693盛弘股份电气设备深圳54.610.230.9178534.1576455.401210.45...5.002017-08-2212563.211.380.000.0050.4011.9613821.02018-04-11
2017-12-29300735光弘科技通信设备广东43.810.893.55106216.2248046.2348601.87...5.122017-12-2922749.500.640.000.0027.7714.2758700.02018-04-11
2017-12-05300730科创信息软件服务湖南907.520.230.9332997.2624184.006611.02...17.952017-12-058310.850.890.000.0036.002.6948600.02018-04-11
2017-10-31002910庄园牧场乳制品甘肃63.180.471.87180371.7787209.1562579.91...3.832017-10-3139948.322.13-5.62-9.9630.7110.8827589.02018-04-11
2017-11-01300711广哈通信通信设备广东85.400.361.4434718.6230575.381612.71...11.252017-11-0111660.600.810.000.0053.0320.2271217.02018-04-11
2018-01-19300738奥飞数据电信运营广东73.050.160.6533440.900.000.00...14.122018-01-190.000.000.000.000.0017.3332672.02018-04-11
2017-08-08603535嘉诚国际仓储物流广东31.440.381.50171046.63107917.2736970.78...2.712017-08-0851971.033.4620.4714.3223.1111.4916499.02018-04-11
2017-04-26300514友讯达通信设备深圳62.790.251.0068944.2166716.281369.74...8.142017-04-2613530.611.350.000.0041.9813.4911522.02018-04-11
2018-01-16300733西菱动力汽车配件四川47.620.401.60102448.710.000.00...5.472018-01-160.000.000.000.000.0015.6177780.02018-04-11
2018-02-01300739明阳电路元器件深圳39.960.311.2396984.0054019.5736262.06...7.392018-02-0114147.721.150.000.0032.1511.7461548.02018-04-11
2017-07-31300679电连技术元器件深圳25.500.301.20329440.88281085.1634557.31...3.012017-07-3159821.284.990.000.0047.2326.2123866.02018-04-11
2017-09-26603363傲农生物饲料福建75.900.604.26253808.34117686.9071882.36...10.012017-09-2617489.060.41-1.5218.3218.862.2132006.02018-04-11
2017-12-27300684中石科技化工原料北京79.800.220.8783437.3156011.8024528.76...11.842017-12-2720423.992.35187.49123.0636.4214.4217500.02018-04-11
2017-01-05603032德新交运公路新疆175.300.651.3349133.6240787.214330.50...10.942017-01-0512899.170.97-22.93-46.6136.6113.732328.02018-04-11
2017-08-22300696爱乐达航空四川103.570.170.6972619.9653274.5514581.25...7.532017-08-229670.871.400.000.0071.1452.0014938.02018-04-11
2017-02-20300613富瀚微半导体上海68.970.130.4597363.9085505.561777.51...7.872017-02-2026320.405.810.000.0049.4625.2611264.02018-04-11
2017-09-13603648畅联股份仓储物流上海48.820.923.69181480.97129244.9528878.70...5.112017-09-1320402.980.550.000.0027.6313.5458370.02018-04-11
2017-12-29603329上海雅仕仓储物流上海65.330.331.3284900.6872657.600.00...8.462017-12-290.000.000.000.000.004.3735041.02018-04-11
2017-12-08300731科创新源橡胶深圳52.750.220.8726369.3823502.031737.75...11.112017-12-085390.140.620.000.0048.5425.9445956.02018-04-11
2017-06-06300661圣邦股份元器件北京87.020.150.6186190.9682643.931150.35...8.732017-06-0619735.473.240.000.0043.6216.025677.02018-04-11
2017-01-05300588熙菱信息软件服务新疆65.770.311.0084675.4279111.96736.22...8.192017-01-0513293.881.3335.5685.3924.817.4710945.02018-04-11
2017-01-26300603立昂技术通信设备新疆47.460.571.03124445.8299134.212345.56...8.702017-01-2616070.231.57247.32259.1620.038.6111752.02018-04-11
2017-11-09300719安达维尔航空北京53.580.421.68111330.5299828.749335.78...5.002017-11-0926470.751.5810.59-1.5253.6720.4225100.02018-04-11
2017-08-03300687赛意信息软件服务广东52.570.200.8083921.6880942.17291.20...6.362017-08-0314224.571.780.000.0031.3613.3413585.02018-04-11
2017-10-19300709精研科技元器件江苏31.010.220.88104817.9751288.0536566.43...3.832017-10-1926389.693.000.000.0040.4917.0416000.02018-04-11
2017-05-16300653正海生物医疗保健山东65.830.200.8053081.6045645.282500.00...8.402017-05-1612030.731.5021.3535.6393.6733.748714.02018-04-11
2017-11-27300727润禾材料化工原料浙江90.090.240.9843196.9225291.6112968.00...8.962017-11-278362.070.860.000.0029.5610.7550562.02018-04-11
2017-05-23300657弘信电子元器件福建67.080.261.04184841.84111414.6059763.01...6.422017-05-2318206.141.750.000.0013.573.7911765.02018-04-11
\n", "

477 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals \\\n", "timeToMarket \n", "2018-04-10 603897 N长城 电气设备 浙江 25.57 0.45 1.78 \n", "2018-03-26 600929 湖南盐业 食品 湖南 72.52 1.50 9.18 \n", "2017-03-16 300621 维业股份 装修装饰 深圳 37.99 0.43 1.39 \n", "2017-09-20 603106 恒银金融 电脑设备 天津 45.40 0.70 2.80 \n", "2017-03-15 603811 诚意药业 化学制药 浙江 38.80 0.57 0.85 \n", "2018-03-28 002930 宏川智慧 仓储物流 广东 62.90 0.61 2.43 \n", "2017-09-22 603963 大理药业 化学制药 云南 73.92 0.25 1.00 \n", "2018-03-30 603214 爱婴室 百货 上海 49.45 0.25 1.00 \n", "2017-01-17 300595 欧普康视 医疗保健 安徽 54.16 0.76 1.24 \n", "2017-03-21 300627 华测导航 通信设备 上海 85.66 0.50 1.23 \n", "2017-02-08 603637 镇海股份 建筑施工 浙江 66.69 0.33 1.33 \n", "2017-10-10 300705 九典制药 化学制药 湖南 89.94 0.29 1.17 \n", "2017-10-31 603289 泰瑞机器 专用机械 浙江 45.82 0.51 2.04 \n", "2017-05-09 603229 奥翔药业 化学制药 浙江 93.03 0.40 1.60 \n", "2017-06-02 300660 江苏雷利 电气设备 江苏 26.10 0.25 1.02 \n", "2017-09-22 002900 哈三联 化学制药 黑龙江 44.11 0.53 2.11 \n", "2017-05-19 002873 新天药业 中成药 贵州 44.54 0.17 0.69 \n", "2017-08-10 300688 创业黑马 综合类 北京 171.33 0.17 0.68 \n", "2018-02-26 603712 七一二 通信设备 天津 363.05 1.00 7.72 \n", "2017-11-21 300726 宏达电子 元器件 湖南 86.52 0.40 4.00 \n", "2017-07-03 300670 大烨智能 电气设备 江苏 88.13 0.27 1.08 \n", "2017-04-21 300554 三超新材 矿物制品 江苏 94.44 0.13 0.52 \n", "2017-05-22 603383 顶点软件 软件服务 福建 49.79 0.21 0.86 \n", "2018-02-23 002927 泰永长征 电气设备 贵州 102.26 0.23 0.94 \n", "2018-02-06 300644 南京聚隆 塑料 江苏 62.16 0.16 0.64 \n", "2017-01-20 300598 诚迈科技 软件服务 江苏 111.58 0.48 0.80 \n", "2017-01-10 603266 天龙股份 塑料 浙江 34.03 0.25 1.00 \n", "2017-12-18 002919 名臣健康 日用化工 广东 69.13 0.20 0.81 \n", "2017-04-21 603139 康惠制药 中成药 陕西 61.04 0.25 1.00 \n", "2018-03-23 300634 彩讯股份 软件服务 深圳 81.30 0.40 4.00 \n", "... ... ... ... ... ... ... ... \n", "2017-03-24 300629 新劲刚 矿物制品 广东 137.29 0.29 0.67 \n", "2017-11-15 300721 怡达股份 化工原料 江苏 40.04 0.20 0.80 \n", "2017-08-22 300693 盛弘股份 电气设备 深圳 54.61 0.23 0.91 \n", "2017-12-29 300735 光弘科技 通信设备 广东 43.81 0.89 3.55 \n", "2017-12-05 300730 科创信息 软件服务 湖南 907.52 0.23 0.93 \n", "2017-10-31 002910 庄园牧场 乳制品 甘肃 63.18 0.47 1.87 \n", "2017-11-01 300711 广哈通信 通信设备 广东 85.40 0.36 1.44 \n", "2018-01-19 300738 奥飞数据 电信运营 广东 73.05 0.16 0.65 \n", "2017-08-08 603535 嘉诚国际 仓储物流 广东 31.44 0.38 1.50 \n", "2017-04-26 300514 友讯达 通信设备 深圳 62.79 0.25 1.00 \n", "2018-01-16 300733 西菱动力 汽车配件 四川 47.62 0.40 1.60 \n", "2018-02-01 300739 明阳电路 元器件 深圳 39.96 0.31 1.23 \n", "2017-07-31 300679 电连技术 元器件 深圳 25.50 0.30 1.20 \n", "2017-09-26 603363 傲农生物 饲料 福建 75.90 0.60 4.26 \n", "2017-12-27 300684 中石科技 化工原料 北京 79.80 0.22 0.87 \n", "2017-01-05 603032 德新交运 公路 新疆 175.30 0.65 1.33 \n", "2017-08-22 300696 爱乐达 航空 四川 103.57 0.17 0.69 \n", "2017-02-20 300613 富瀚微 半导体 上海 68.97 0.13 0.45 \n", "2017-09-13 603648 畅联股份 仓储物流 上海 48.82 0.92 3.69 \n", "2017-12-29 603329 上海雅仕 仓储物流 上海 65.33 0.33 1.32 \n", "2017-12-08 300731 科创新源 橡胶 深圳 52.75 0.22 0.87 \n", "2017-06-06 300661 圣邦股份 元器件 北京 87.02 0.15 0.61 \n", "2017-01-05 300588 熙菱信息 软件服务 新疆 65.77 0.31 1.00 \n", "2017-01-26 300603 立昂技术 通信设备 新疆 47.46 0.57 1.03 \n", "2017-11-09 300719 安达维尔 航空 北京 53.58 0.42 1.68 \n", "2017-08-03 300687 赛意信息 软件服务 广东 52.57 0.20 0.80 \n", "2017-10-19 300709 精研科技 元器件 江苏 31.01 0.22 0.88 \n", "2017-05-16 300653 正海生物 医疗保健 山东 65.83 0.20 0.80 \n", "2017-11-27 300727 润禾材料 化工原料 浙江 90.09 0.24 0.98 \n", "2017-05-23 300657 弘信电子 元器件 福建 67.08 0.26 1.04 \n", "\n", " totalAssets liquidAssets fixedAssets ... pb \\\n", "timeToMarket ... \n", "2018-04-10 131807.23 117523.63 10988.37 ... 4.27 \n", "2018-03-26 310491.63 78859.31 139873.81 ... 5.36 \n", "2017-03-16 186181.06 169977.59 2515.88 ... 3.41 \n", "2017-09-20 212309.42 190471.27 16428.07 ... 4.80 \n", "2017-03-15 67298.32 46722.62 12191.86 ... 4.48 \n", "2018-03-28 187270.80 13539.20 103894.40 ... 3.66 \n", "2017-09-22 62622.20 44925.30 10986.69 ... 8.40 \n", "2018-03-30 76961.15 61297.16 7078.72 ... 9.27 \n", "2017-01-17 84769.46 71856.96 3970.03 ... 10.12 \n", "2017-03-21 95269.30 88869.28 2105.35 ... 9.13 \n", "2017-02-08 86330.46 76018.32 5968.18 ... 4.33 \n", "2017-10-10 76920.25 51869.26 13084.78 ... 9.34 \n", "2017-10-31 88554.82 68437.21 15267.82 ... 5.65 \n", "2017-05-09 68624.13 45903.00 14470.87 ... 7.22 \n", "2017-06-02 280316.22 256656.80 16994.20 ... 3.21 \n", "2017-09-22 218374.66 135898.92 68163.18 ... 4.35 \n", "2017-05-19 91925.27 57405.90 21257.95 ... 5.89 \n", "2017-08-10 41396.55 40351.37 380.64 ... 14.13 \n", "2018-02-26 348015.50 277392.63 57633.35 ... 21.08 \n", "2017-11-21 100780.30 80427.53 8466.57 ... 16.70 \n", "2017-07-03 69398.42 59512.13 6638.05 ... 6.81 \n", "2017-04-21 48783.32 33910.75 12251.67 ... 10.86 \n", "2017-05-22 115820.30 104881.36 3878.28 ... 5.41 \n", "2018-02-23 43605.35 35037.03 0.00 ... 12.70 \n", "2018-02-06 82547.78 60597.23 18706.01 ... 6.21 \n", "2017-01-20 53850.86 44918.25 626.82 ... 9.78 \n", "2017-01-10 98374.46 71618.72 18603.42 ... 3.68 \n", "2017-12-18 46302.28 0.00 0.00 ... 6.24 \n", "2017-04-21 94826.35 81229.31 5390.80 ... 3.35 \n", "2018-03-23 100621.55 65063.45 1320.74 ... 11.01 \n", "... ... ... ... ... ... \n", "2017-03-24 48471.40 36097.23 8623.61 ... 9.68 \n", "2017-11-15 100619.93 60467.48 21425.98 ... 3.09 \n", "2017-08-22 78534.15 76455.40 1210.45 ... 5.00 \n", "2017-12-29 106216.22 48046.23 48601.87 ... 5.12 \n", "2017-12-05 32997.26 24184.00 6611.02 ... 17.95 \n", "2017-10-31 180371.77 87209.15 62579.91 ... 3.83 \n", "2017-11-01 34718.62 30575.38 1612.71 ... 11.25 \n", "2018-01-19 33440.90 0.00 0.00 ... 14.12 \n", "2017-08-08 171046.63 107917.27 36970.78 ... 2.71 \n", "2017-04-26 68944.21 66716.28 1369.74 ... 8.14 \n", "2018-01-16 102448.71 0.00 0.00 ... 5.47 \n", "2018-02-01 96984.00 54019.57 36262.06 ... 7.39 \n", "2017-07-31 329440.88 281085.16 34557.31 ... 3.01 \n", "2017-09-26 253808.34 117686.90 71882.36 ... 10.01 \n", "2017-12-27 83437.31 56011.80 24528.76 ... 11.84 \n", "2017-01-05 49133.62 40787.21 4330.50 ... 10.94 \n", "2017-08-22 72619.96 53274.55 14581.25 ... 7.53 \n", "2017-02-20 97363.90 85505.56 1777.51 ... 7.87 \n", "2017-09-13 181480.97 129244.95 28878.70 ... 5.11 \n", "2017-12-29 84900.68 72657.60 0.00 ... 8.46 \n", "2017-12-08 26369.38 23502.03 1737.75 ... 11.11 \n", "2017-06-06 86190.96 82643.93 1150.35 ... 8.73 \n", "2017-01-05 84675.42 79111.96 736.22 ... 8.19 \n", "2017-01-26 124445.82 99134.21 2345.56 ... 8.70 \n", "2017-11-09 111330.52 99828.74 9335.78 ... 5.00 \n", "2017-08-03 83921.68 80942.17 291.20 ... 6.36 \n", "2017-10-19 104817.97 51288.05 36566.43 ... 3.83 \n", "2017-05-16 53081.60 45645.28 2500.00 ... 8.40 \n", "2017-11-27 43196.92 25291.61 12968.00 ... 8.96 \n", "2017-05-23 184841.84 111414.60 59763.01 ... 6.42 \n", "\n", " timeToMarket undp perundp rev profit gpr npr \\\n", "timeToMarket \n", "2018-04-10 2018-04-10 35286.05 1.98 41.98 55.84 8.19 3.87 \n", "2018-03-26 2018-03-26 71625.13 0.78 1.30 15.06 47.71 7.24 \n", "2017-03-16 2017-03-16 26666.50 1.92 0.00 0.00 13.34 4.22 \n", "2017-09-20 2017-09-20 27721.10 0.99 0.00 0.00 33.95 11.23 \n", "2017-03-15 2017-03-15 9561.42 1.12 6.12 1.57 52.11 20.31 \n", "2018-03-28 2018-03-28 38270.21 1.57 -0.74 10.33 56.59 25.41 \n", "2017-09-22 2017-09-22 9541.13 0.95 0.00 0.00 63.85 20.00 \n", "2018-03-30 2018-03-30 25456.17 2.55 14.06 26.47 28.41 5.18 \n", "2017-01-17 2017-01-17 20604.49 1.66 31.61 29.56 76.06 50.72 \n", "2017-03-21 2017-03-21 19288.67 1.56 0.00 0.00 54.56 14.97 \n", "2017-02-08 2017-02-08 20656.95 1.55 -37.75 -28.91 31.54 22.63 \n", "2017-10-10 2017-10-10 12709.62 1.08 42.01 25.76 51.93 12.83 \n", "2017-10-31 2017-10-31 26118.49 1.28 0.00 0.00 30.63 12.40 \n", "2017-05-09 2017-05-09 14151.70 0.88 0.00 0.00 60.63 22.65 \n", "2017-06-02 2017-06-02 33226.21 3.26 0.00 0.00 26.74 12.07 \n", "2017-09-22 2017-09-22 39189.78 1.86 50.99 3.36 74.17 15.76 \n", "2017-05-19 2017-05-19 18090.75 2.63 0.00 0.00 81.09 11.75 \n", "2017-08-10 2017-08-10 6212.93 0.91 0.00 0.00 56.91 17.97 \n", "2018-02-26 2018-02-26 20558.85 0.27 0.00 0.00 49.57 8.39 \n", "2017-11-21 2017-11-21 23141.20 0.58 0.00 0.00 70.73 39.73 \n", "2017-07-03 2017-07-03 14113.52 1.31 0.00 0.00 31.06 15.77 \n", "2017-04-21 2017-04-21 10747.62 2.07 0.00 0.00 47.15 24.98 \n", "2017-05-22 2017-05-22 38075.21 4.43 19.09 44.59 78.78 41.80 \n", "2018-02-23 2018-02-23 0.00 0.00 0.00 0.00 0.00 18.51 \n", "2018-02-06 2018-02-06 25969.65 4.06 13.33 -28.26 17.55 5.51 \n", "2017-01-20 2017-01-20 17461.71 2.18 -3.84 -22.12 31.26 8.10 \n", "2017-01-10 2017-01-10 33154.17 3.32 8.21 4.72 28.05 10.33 \n", "2017-12-18 2017-12-18 0.00 0.00 0.00 0.00 0.00 7.77 \n", "2017-04-21 2017-04-21 33866.51 3.39 0.00 0.00 57.10 15.64 \n", "2018-03-23 2018-03-23 19710.35 0.49 33.46 44.54 48.01 21.36 \n", "... ... ... ... ... ... ... ... \n", "2017-03-24 2017-03-24 12290.36 1.84 2.26 -8.10 32.24 9.84 \n", "2017-11-15 2017-11-15 18573.72 2.32 0.00 0.00 16.71 5.48 \n", "2017-08-22 2017-08-22 12563.21 1.38 0.00 0.00 50.40 11.96 \n", "2017-12-29 2017-12-29 22749.50 0.64 0.00 0.00 27.77 14.27 \n", "2017-12-05 2017-12-05 8310.85 0.89 0.00 0.00 36.00 2.69 \n", "2017-10-31 2017-10-31 39948.32 2.13 -5.62 -9.96 30.71 10.88 \n", "2017-11-01 2017-11-01 11660.60 0.81 0.00 0.00 53.03 20.22 \n", "2018-01-19 2018-01-19 0.00 0.00 0.00 0.00 0.00 17.33 \n", "2017-08-08 2017-08-08 51971.03 3.46 20.47 14.32 23.11 11.49 \n", "2017-04-26 2017-04-26 13530.61 1.35 0.00 0.00 41.98 13.49 \n", "2018-01-16 2018-01-16 0.00 0.00 0.00 0.00 0.00 15.61 \n", "2018-02-01 2018-02-01 14147.72 1.15 0.00 0.00 32.15 11.74 \n", "2017-07-31 2017-07-31 59821.28 4.99 0.00 0.00 47.23 26.21 \n", "2017-09-26 2017-09-26 17489.06 0.41 -1.52 18.32 18.86 2.21 \n", "2017-12-27 2017-12-27 20423.99 2.35 187.49 123.06 36.42 14.42 \n", "2017-01-05 2017-01-05 12899.17 0.97 -22.93 -46.61 36.61 13.73 \n", "2017-08-22 2017-08-22 9670.87 1.40 0.00 0.00 71.14 52.00 \n", "2017-02-20 2017-02-20 26320.40 5.81 0.00 0.00 49.46 25.26 \n", "2017-09-13 2017-09-13 20402.98 0.55 0.00 0.00 27.63 13.54 \n", "2017-12-29 2017-12-29 0.00 0.00 0.00 0.00 0.00 4.37 \n", "2017-12-08 2017-12-08 5390.14 0.62 0.00 0.00 48.54 25.94 \n", "2017-06-06 2017-06-06 19735.47 3.24 0.00 0.00 43.62 16.02 \n", "2017-01-05 2017-01-05 13293.88 1.33 35.56 85.39 24.81 7.47 \n", "2017-01-26 2017-01-26 16070.23 1.57 247.32 259.16 20.03 8.61 \n", "2017-11-09 2017-11-09 26470.75 1.58 10.59 -1.52 53.67 20.42 \n", "2017-08-03 2017-08-03 14224.57 1.78 0.00 0.00 31.36 13.34 \n", "2017-10-19 2017-10-19 26389.69 3.00 0.00 0.00 40.49 17.04 \n", "2017-05-16 2017-05-16 12030.73 1.50 21.35 35.63 93.67 33.74 \n", "2017-11-27 2017-11-27 8362.07 0.86 0.00 0.00 29.56 10.75 \n", "2017-05-23 2017-05-23 18206.14 1.75 0.00 0.00 13.57 3.79 \n", "\n", " holders 更新日期 \n", "timeToMarket \n", "2018-04-10 42986.0 2018-04-11 \n", "2018-03-26 140295.0 2018-04-11 \n", "2017-03-16 19044.0 2018-04-11 \n", "2017-09-20 36000.0 2018-04-11 \n", "2017-03-15 10574.0 2018-04-11 \n", "2018-03-28 115500.0 2018-04-11 \n", "2017-09-22 27488.0 2018-04-11 \n", "2018-03-30 26639.0 2018-04-11 \n", "2017-01-17 6781.0 2018-04-11 \n", "2017-03-21 16380.0 2018-04-11 \n", "2017-02-08 9897.0 2018-04-11 \n", "2017-10-10 21243.0 2018-04-11 \n", "2017-10-31 48514.0 2018-04-11 \n", "2017-05-09 14088.0 2018-04-11 \n", "2017-06-02 18283.0 2018-04-11 \n", "2017-09-22 38400.0 2018-04-11 \n", "2017-05-19 9615.0 2018-04-11 \n", "2017-08-10 15720.0 2018-04-11 \n", "2018-02-26 88473.0 2018-04-11 \n", "2017-11-21 79196.0 2018-04-11 \n", "2017-07-03 13484.0 2018-04-11 \n", "2017-04-21 4538.0 2018-04-11 \n", "2017-05-22 8928.0 2018-04-11 \n", "2018-02-23 48823.0 2018-04-11 \n", "2018-02-06 31946.0 2018-04-11 \n", "2017-01-20 9182.0 2018-04-11 \n", "2017-01-10 8819.0 2018-04-11 \n", "2017-12-18 43677.0 2018-04-11 \n", "2017-04-21 13137.0 2018-04-11 \n", "2018-03-23 77432.0 2018-04-11 \n", "... ... ... \n", "2017-03-24 7729.0 2018-04-11 \n", "2017-11-15 14138.0 2018-04-11 \n", "2017-08-22 13821.0 2018-04-11 \n", "2017-12-29 58700.0 2018-04-11 \n", "2017-12-05 48600.0 2018-04-11 \n", "2017-10-31 27589.0 2018-04-11 \n", "2017-11-01 71217.0 2018-04-11 \n", "2018-01-19 32672.0 2018-04-11 \n", "2017-08-08 16499.0 2018-04-11 \n", "2017-04-26 11522.0 2018-04-11 \n", "2018-01-16 77780.0 2018-04-11 \n", "2018-02-01 61548.0 2018-04-11 \n", "2017-07-31 23866.0 2018-04-11 \n", "2017-09-26 32006.0 2018-04-11 \n", "2017-12-27 17500.0 2018-04-11 \n", "2017-01-05 2328.0 2018-04-11 \n", "2017-08-22 14938.0 2018-04-11 \n", "2017-02-20 11264.0 2018-04-11 \n", "2017-09-13 58370.0 2018-04-11 \n", "2017-12-29 35041.0 2018-04-11 \n", "2017-12-08 45956.0 2018-04-11 \n", "2017-06-06 5677.0 2018-04-11 \n", "2017-01-05 10945.0 2018-04-11 \n", "2017-01-26 11752.0 2018-04-11 \n", "2017-11-09 25100.0 2018-04-11 \n", "2017-08-03 13585.0 2018-04-11 \n", "2017-10-19 16000.0 2018-04-11 \n", "2017-05-16 8714.0 2018-04-11 \n", "2017-11-27 50562.0 2018-04-11 \n", "2017-05-23 11765.0 2018-04-11 \n", "\n", "[477 rows x 24 columns]" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basic_df['2017':'2018']" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "dfs = basic_df['2016':'2018']" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
codenameindustryareapeoutstandingtotalstotalAssetsliquidAssetsfixedAssets...pbtimeToMarketundpperundprevprofitgprnprholders更新日期
timeToMarket
2017-05-04603501韦尔股份半导体上海137.280.424.56204200.45169034.1917705.68...14.752017-05-0447177.931.040.000.0019.106.2022079.02018-04-11
2017-07-05300671富满电子半导体深圳95.240.251.0168242.4351843.6214202.12...7.732017-07-0510927.211.080.000.0027.9511.6310100.02018-04-11
2017-03-17300625三雄极光半导体广东29.170.912.80271604.44225907.6623129.76...2.962017-03-1760387.822.160.000.0033.2810.8544932.02018-04-11
2017-04-06300632光莆股份半导体福建41.730.371.1666851.9643581.0119568.85...4.802017-04-0619050.151.650.000.0030.1312.3811562.02018-04-11
2016-10-12002815崇达技术半导体深圳32.881.064.10494307.56244897.22177228.13...5.782016-10-12114256.762.7938.1018.1432.6114.3127600.02018-04-11
2016-12-28300582英飞特半导体浙江83.811.212.03136238.9745586.1056919.20...3.622016-12-2820920.551.0318.08-34.8830.555.6917911.02018-04-11
2017-03-14300623捷捷微电半导体江苏42.110.370.94133111.3891724.8025565.35...5.182017-03-1433622.193.590.000.0056.4935.6114861.02018-04-11
2016-08-18603986兆易创新半导体北京85.621.472.03213397.97169092.529192.86...24.172016-08-1873909.363.6544.69134.7438.5722.3816098.02018-04-11
2017-12-01002913奥士康半导体湖南41.270.361.44190226.63104183.2281802.18...3.152017-12-0136008.442.500.000.0023.979.1830331.02018-04-11
2017-07-12300672国科微半导体湖南1273.880.281.1296894.6871145.507825.18...7.972017-07-1210634.240.950.000.0048.042.5216331.02018-04-11
2017-10-16300708聚灿光电半导体江苏67.730.642.57147835.2775164.5546085.87...10.452017-10-1618079.840.7029.3281.5328.9717.7236514.02018-04-11
2017-02-20300613富瀚微半导体上海68.970.130.4597363.9085505.561777.51...7.872017-02-2026320.405.810.000.0049.4625.2611264.02018-04-11
\n", "

12 rows × 24 columns

\n", "
" ], "text/plain": [ " code name industry area pe outstanding totals \\\n", "timeToMarket \n", "2017-05-04 603501 韦尔股份 半导体 上海 137.28 0.42 4.56 \n", "2017-07-05 300671 富满电子 半导体 深圳 95.24 0.25 1.01 \n", "2017-03-17 300625 三雄极光 半导体 广东 29.17 0.91 2.80 \n", "2017-04-06 300632 光莆股份 半导体 福建 41.73 0.37 1.16 \n", "2016-10-12 002815 崇达技术 半导体 深圳 32.88 1.06 4.10 \n", "2016-12-28 300582 英飞特 半导体 浙江 83.81 1.21 2.03 \n", "2017-03-14 300623 捷捷微电 半导体 江苏 42.11 0.37 0.94 \n", "2016-08-18 603986 兆易创新 半导体 北京 85.62 1.47 2.03 \n", "2017-12-01 002913 奥士康 半导体 湖南 41.27 0.36 1.44 \n", "2017-07-12 300672 国科微 半导体 湖南 1273.88 0.28 1.12 \n", "2017-10-16 300708 聚灿光电 半导体 江苏 67.73 0.64 2.57 \n", "2017-02-20 300613 富瀚微 半导体 上海 68.97 0.13 0.45 \n", "\n", " totalAssets liquidAssets fixedAssets ... pb \\\n", "timeToMarket ... \n", "2017-05-04 204200.45 169034.19 17705.68 ... 14.75 \n", "2017-07-05 68242.43 51843.62 14202.12 ... 7.73 \n", "2017-03-17 271604.44 225907.66 23129.76 ... 2.96 \n", "2017-04-06 66851.96 43581.01 19568.85 ... 4.80 \n", "2016-10-12 494307.56 244897.22 177228.13 ... 5.78 \n", "2016-12-28 136238.97 45586.10 56919.20 ... 3.62 \n", "2017-03-14 133111.38 91724.80 25565.35 ... 5.18 \n", "2016-08-18 213397.97 169092.52 9192.86 ... 24.17 \n", "2017-12-01 190226.63 104183.22 81802.18 ... 3.15 \n", "2017-07-12 96894.68 71145.50 7825.18 ... 7.97 \n", "2017-10-16 147835.27 75164.55 46085.87 ... 10.45 \n", "2017-02-20 97363.90 85505.56 1777.51 ... 7.87 \n", "\n", " timeToMarket undp perundp rev profit gpr npr \\\n", "timeToMarket \n", "2017-05-04 2017-05-04 47177.93 1.04 0.00 0.00 19.10 6.20 \n", "2017-07-05 2017-07-05 10927.21 1.08 0.00 0.00 27.95 11.63 \n", "2017-03-17 2017-03-17 60387.82 2.16 0.00 0.00 33.28 10.85 \n", "2017-04-06 2017-04-06 19050.15 1.65 0.00 0.00 30.13 12.38 \n", "2016-10-12 2016-10-12 114256.76 2.79 38.10 18.14 32.61 14.31 \n", "2016-12-28 2016-12-28 20920.55 1.03 18.08 -34.88 30.55 5.69 \n", "2017-03-14 2017-03-14 33622.19 3.59 0.00 0.00 56.49 35.61 \n", "2016-08-18 2016-08-18 73909.36 3.65 44.69 134.74 38.57 22.38 \n", "2017-12-01 2017-12-01 36008.44 2.50 0.00 0.00 23.97 9.18 \n", "2017-07-12 2017-07-12 10634.24 0.95 0.00 0.00 48.04 2.52 \n", "2017-10-16 2017-10-16 18079.84 0.70 29.32 81.53 28.97 17.72 \n", "2017-02-20 2017-02-20 26320.40 5.81 0.00 0.00 49.46 25.26 \n", "\n", " holders 更新日期 \n", "timeToMarket \n", "2017-05-04 22079.0 2018-04-11 \n", "2017-07-05 10100.0 2018-04-11 \n", "2017-03-17 44932.0 2018-04-11 \n", "2017-04-06 11562.0 2018-04-11 \n", "2016-10-12 27600.0 2018-04-11 \n", "2016-12-28 17911.0 2018-04-11 \n", "2017-03-14 14861.0 2018-04-11 \n", "2016-08-18 16098.0 2018-04-11 \n", "2017-12-01 30331.0 2018-04-11 \n", "2017-07-12 16331.0 2018-04-11 \n", "2017-10-16 36514.0 2018-04-11 \n", "2017-02-20 11264.0 2018-04-11 \n", "\n", "[12 rows x 24 columns]" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfs[dfs['industry']==u'半导体']" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "df = ts.get_day_all()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "engine =get_engine('db_rocky')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df.to_sql('tb_temp',engine)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 雪球赏金.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# 元卫南 赏金分析\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pymongo\n", "client = pymongo.MongoClient('10.18.6.46',27001)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "doc=client['xueqiu']['reward']" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "result =[]\n", "for i in doc.find({},{'_id':0}):\n", " result.append(i)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8968" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(result)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(result)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
amountbeen_rewardcreated_atdescriptionnameorigin_post_iduser_id
06.00元卫南2019-08-13 21:31:36None慕狼为友1310853141880162437
11.00元卫南2019-08-13 22:03:16价值兜底,趋势赚钱,分批买卖,组合选股。秦韬1310853149644764163
21.00元卫南2019-08-13 21:51:36比较懒,有钱就定期买入一些,现在主要买入一些指数基金Betula111310853143256958535
366.66元卫南2019-08-13 08:09:38Shero冉冉71310390854102521305
419.99元卫南2019-08-13 15:11:39失去的会以另外的方式永远存在babyluo1310390858941786191
\n", "
" ], "text/plain": [ " amount been_reward created_at description \\\n", "0 6.00 元卫南 2019-08-13 21:31:36 None \n", "1 1.00 元卫南 2019-08-13 22:03:16 价值兜底,趋势赚钱,分批买卖,组合选股。 \n", "2 1.00 元卫南 2019-08-13 21:51:36 比较懒,有钱就定期买入一些,现在主要买入一些指数基金 \n", "3 66.66 元卫南 2019-08-13 08:09:38 \n", "4 19.99 元卫南 2019-08-13 15:11:39 失去的会以另外的方式永远存在 \n", "\n", " name origin_post_id user_id \n", "0 慕狼为友 131085314 1880162437 \n", "1 秦韬 131085314 9644764163 \n", "2 Betula11 131085314 3256958535 \n", "3 Shero冉冉7 131039085 4102521305 \n", "4 babyluo 131039085 8941786191 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 8968 entries, 0 to 8967\n", "Data columns (total 7 columns):\n", "amount 8968 non-null float64\n", "been_reward 8968 non-null object\n", "created_at 8968 non-null object\n", "description 6536 non-null object\n", "name 8968 non-null object\n", "origin_post_id 8968 non-null int64\n", "user_id 8968 non-null int64\n", "dtypes: float64(1), int64(2), object(4)\n", "memory usage: 490.5+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "df['created_at']=pd.to_datetime(df['created_at'])" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 8968 entries, 0 to 8967\n", "Data columns (total 7 columns):\n", "amount 8968 non-null float64\n", "been_reward 8968 non-null object\n", "created_at 8968 non-null datetime64[ns]\n", "description 6536 non-null object\n", "name 8968 non-null object\n", "origin_post_id 8968 non-null int64\n", "user_id 8968 non-null int64\n", "dtypes: datetime64[ns](1), float64(1), int64(2), object(3)\n", "memory usage: 490.5+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "df=df.set_index('created_at',drop=True)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
amountbeen_rewarddescriptionnameorigin_post_iduser_id
created_at
2019-08-13 21:31:366.00元卫南None慕狼为友1310853141880162437
2019-08-13 22:03:161.00元卫南价值兜底,趋势赚钱,分批买卖,组合选股。秦韬1310853149644764163
2019-08-13 21:51:361.00元卫南比较懒,有钱就定期买入一些,现在主要买入一些指数基金Betula111310853143256958535
2019-08-13 08:09:3866.66元卫南Shero冉冉71310390854102521305
2019-08-13 15:11:3919.99元卫南失去的会以另外的方式永远存在babyluo1310390858941786191
\n", "
" ], "text/plain": [ " amount been_reward description name \\\n", "created_at \n", "2019-08-13 21:31:36 6.00 元卫南 None 慕狼为友 \n", "2019-08-13 22:03:16 1.00 元卫南 价值兜底,趋势赚钱,分批买卖,组合选股。 秦韬 \n", "2019-08-13 21:51:36 1.00 元卫南 比较懒,有钱就定期买入一些,现在主要买入一些指数基金 Betula11 \n", "2019-08-13 08:09:38 66.66 元卫南 Shero冉冉7 \n", "2019-08-13 15:11:39 19.99 元卫南 失去的会以另外的方式永远存在 babyluo \n", "\n", " origin_post_id user_id \n", "created_at \n", "2019-08-13 21:31:36 131085314 1880162437 \n", "2019-08-13 22:03:16 131085314 9644764163 \n", "2019-08-13 21:51:36 131085314 3256958535 \n", "2019-08-13 08:09:38 131039085 4102521305 \n", "2019-08-13 15:11:39 131039085 8941786191 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "31851.6" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['2019']['amount'].sum()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['2018']['amount'].sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.0" } }, "nbformat": 4, "nbformat_minor": 2 }