In [ ]:
#4201458 石怀宇

引用数据库

In [1]:
import re
import pdfplumber
import os
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['axes.unicode_minus']=False
import tushare as ts

爬取公司基本信息

In [2]:
ts.set_token('4a22e1fcdbba73b7336b8aa1f7f6e5f2eef0cf6fee943619d48d3bfb')
pro = ts.pro_api()

df1 = pro.query('stock_basic', exchange='', list_status='L', fields='ts_code,name')
df1=df1.sort_values(by='ts_code')
df1

df2=pro.stock_company(exchange='', fields='ts_code,chairman,office,website,email')
df2=df2.sort_values(by='ts_code')
df2
df2['name']=df1['name']
df2
Out[2]:
ts_code chairman website email office name
895 000001.SZ 谢永林 www.bank.pingan.com PAB_db@pingan.com.cn 广东省深圳市罗湖区深南东路5047号 *ST晨鑫
896 000002.SZ 郁亮 www.vanke.com ir@vanke.com;peterluk@vanke.com 广东省深圳市盐田区大梅沙环梅路33号万科中心 中原内配
897 000003.SZ 马钟鸿 None Regintian@163.com 广东省深圳市盐田综合保税区金马创新产业园B栋九层 国星光电
916 000004.SZ 黄翔 www.sz000004.cn gnkjsz@163.com;jyz6187@qq.com;xuliruan@hotmail... 广东省深圳市福田区梅林路卓越梅林中心广场(南区)B座2206A 三维工程
917 000005.SZ 丁芃 www.fountain.com.cn fountain@sfc.com.cn;xiaochun@sfc.com.cn 广东省深圳市罗湖区深南东路2017号华乐大厦3楼 *ST金正
918 000006.SZ 赵宏伟 www.zhenye.com szzygp@126.com 广东省深圳市南山区科技南路16号深圳湾科技生态园11栋A座42-43层 中超控股
919 000007.SZ 陆波 www.sz000007.com stock0007@126.com;867904718@qq.com 广东省深圳市福田区梅林街道梅康路8号理想时代大厦6楼 双环传动
920 000008.SZ 王志全 www.shenzhou-gaotie.com houxiaojing@vip.163.com;dongmi@shenzhou-gaotie... 北京市海淀区高梁桥斜街59号院1号楼中坤大厦16层 ST圣莱
936 000009.SZ 陈政立 www.chinabaoan.com zgbajt@163.net 广东省深圳市罗湖区笋岗东路1002号宝安广场A座28-29层 山东墨龙
937 000010.SZ 陈飞霖 www.eco-beauty.cn IR@eco-beauty.cn 广东省深圳市宝安中心区宝兴路6号海纳百川总部大厦B座1701-1703室 通鼎互联
938 000011.SZ 刘声向 www.szwuye.com.cn 000011touzizhe@szwuye.com.cn;000011touzizhe@16... 广东省深圳市罗湖区人民南路国贸大厦16层,20层,39层,42层 恒基达鑫
939 000012.SZ 陈琳 www.csgholding.com securities@csgholding.com 广东省深圳市南山区蛇口工业六路一号南玻大厦 荣盛石化
940 000013.SZ 厉怒江 None spec@sina.com 广东省深圳市深南中路2201号嘉麟豪庭B座1701 华斯股份
941 000014.SZ 陈勇 www.shahe.cn wf000014@163.com 广东省深圳市南山区白石路2222号沙河世纪楼 佳隆股份
942 000015.SZ 宿南南 None jiangxiaoan@szzhgroup.com 广东省深圳市大鹏新区葵涌街道迅宝循环经济园二期研发大楼 *ST辉丰
958 000016.SZ 刘凤喜 www.konka.com szkonka@konka.com 广东省深圳市南山区粤海街道科技园科技南十二路28号康佳研发大厦15-24层 *ST蓝丰
959 000017.SZ 李海 www.cbc.com.cn dmc@szcbc.com 广东省深圳市福田区八卦路31号众鑫科技大厦501室 宝馨科技
960 000018.SZ 陈略 www.sgwde.com 000018sz@sina.com 北京市亦庄开发区经海三路109号神州长城科技楼 金字火腿
677 000019.SZ 祝俊明 www.slkg1949.com szch@slkg1949.com;chenky@slkg1949.com;liumy@sl... 广东省深圳市福田区福虹路9号世贸广场A座13楼 江南化工
678 000020.SZ 李中秋 www.hwafa.com.cn huafainvestor@126.com.cn 广东省深圳市福田区华发北路411栋华发大厦东座6楼 奥特迅
679 000021.SZ 周剑 www.kaifa.cn stock@kaifa.cn 广东省深圳市福田区彩田路7006号 合兴包装
681 000023.SZ 林宏润 www.sztiandi.com std000023@vip.163.com 广东省深圳市南山区高新技术产业园(北区)朗山路东物商业大楼10楼 科大讯飞
695 000024.SZ 孙承铭 www.cmpd.cn cmpdir@cmhk.com 广东省深圳市南山区蛇口工业区兴华路六号南海意库三号楼 滨江集团
696 000025.SZ 富春龙 www.tellus.cn sunbl@tellus.cn;ir@tellus.cn;liuml@tellus.cn 广东省深圳市罗湖区水贝二路特力大厦3,4楼 蔚蓝锂芯
697 000026.SZ 黄勇峰 www.fiytagroup.com investor@fiyta.com.cn 广东省深圳市南山区高新南一道飞亚达科技大厦20楼 北化股份
698 000027.SZ 熊佩锦 www.sec.com.cn ir@sec.com.cn 广东省深圳市福田区金田路2026号能源大厦北塔楼9,29-31,34-41层 *ST聚力
699 000028.SZ 林兆雄 www.szaccord.com.cn gyyz0028@sinopharm.com;gyyzinvestor@sinopharm.com 广东省深圳市福田区八卦四路15号一致药业大厦 华东数控
719 000029.SZ 刘征宇 www.sfjt.com.cn spg@163.net 广东省深圳市人民南路深房广场47楼 华明装备
715 000030.SZ 张丕杰 www.fawer.com.cn 000030@fawer.com.cn 吉林省长春市汽车高新区学海街701号 浙富控股
716 000031.SZ 周政 www.grandjoy.com cofco-property@cofco.com 广东省深圳市福田区福华一路1号大中华国际交易广场35层,北京市朝阳区朝阳门南大街8号中粮福临... 陕天然气
... ... ... ... ... ... ...
3169 688585.SH 蔡朝阳 new.swancor.com ir@swancor.com.cn 上海市松江区松胜路618号;天津经济技术开发区汉沽现代产业区彩云街6号;江苏省盐城市阜宁高新... 中铝国际
49 688586.SH 宋祖铭 www.jianghang.com/index.html hkgy@jianghang.com 安徽省合肥市包河工业区延安路35号 华控赛格
3732 688588.SH 张宝泉 www.linkstec.com info@linkstec.com;dingn@linkstec.com;wanghui7@... 江苏省苏州市工业园区启泰路96号 秦安股份
3125 688589.SH 贺臻 www.leaguerme.com zhengquanbu@leaguerme.com 广东省深圳市南山区西丽街道高新技术产业园清华信息港科研楼11楼1101 健民集团
4016 688590.SH 郭玮 www.newtouch.com investor@newtouch.com 中国(上海)自由贸易试验区峨山路91弄98号(软件园1号楼)第四层至第六层 佰仁医疗
2581 688595.SH 卢国建 www.chipsea.com info@chipsea.com 广东省深圳市南山区南海大道1079号花园城数码大厦A座901A号 江苏舜天
42 688596.SH YU DONG LEI www.gentech-online.com ir@gentech-online.com 上海市闵行区春永路55号2幢 华锦股份
3324 688598.SH 王冰泉 www.kbcarbon.com KBC@kbcarbon.com 湖南省益阳市迎宾西路2号 方正证券
1505 688599.SH 高纪凡 www.trinasolar.com/cn IR@trinasolar.com 江苏省常州市新北区天合光伏产业园天合路2号 万顺新材
628 688600.SH 臧牧 www.wayeal.com.cn wayeal@wayeal.com.cn 安徽省合肥市高新区文曲路8号 *ST江特
3472 688608.SH LIANG ZHANG www.bestechnic.com ir@bestechnic.com 上海市浦东新区金科路2889弄长泰广场B座201/205 网达软件
1931 688617.SH 成正辉 www.aptmed.com ir@aptmed.com 广东省深圳市南山区西丽街道松坪山社区松坪山朗山路11号同方信息港B栋601 润欣科技
2127 688618.SH 熊伟 www.3onedata.com.cn XYY-SW@3onedata.com 广东省深圳市南山区西丽街道百旺信高科技工业园1区3栋 蠡湖股份
2972 688628.SH 洪少俊 www.uni-trend.com.cn stock@uni-trend.com.cn 广东省东莞市东莞松山湖高新技术产业开发区工业北一路6号 通策医疗
4107 688656.SH JOHN LI www.hob-biotech.com jshob@hob-biotech.com 江苏省苏州市工业园区星湖街218号生物纳米园C6,C10栋 杭华股份
27 688658.SH 于伟仕 www.youcareyk.com irm@youcareyk.com 北京市北京经济技术开发区宏达中路6号 中国天楹
3686 688668.SH 王成海 www.dingtong.net.cn dt-stocks@dingtong.net.cn 广东省东莞市东城街道周屋社区银珠路七号 奇精机械
3624 688669.SH 陈钢 www.polyrocks.com ir@polyrocks.com 广东省清远市高新技术产业开发区雄兴工业城B6 珍宝岛
665 688678.SH 许惠钧 www.freewon.com.cn ir@freewon.com.cn 江苏省苏州市昆山市千灯镇玉溪西路168号 大为股份
505 688679.SH 杨明 www.ahtongyuan.com qi_dunwei@sina.com 安徽省合肥市蜀山区望江西路129号五彩商业广场18-19层 中工国际
445 688680.SH 李民 www.hiuv.net hiuv@hiuv.net 上海金山区山德路29号,江苏张家港市杨舍镇金塘西路南侧101号,江苏常州西太湖科技产业园西太... 皇台酒业
352 688686.SH 卢治临 www.optmv.com info@optmv.com 广东省东莞市长安镇锦厦社区河南工业区锦升路8号 三湘印象
3840 688688.SH 井贤栋 www.antgroup.com Ant_Investor@antgroup.com 浙江省杭州市西湖区西溪新座5幢802室 中创物流
504 688689.SH 杨森茂 www.gmesemi.com gmesec@gmesemi.cn 江苏省常州市新北区长江北路19号 三花智控
3892 688698.SH 胡智勇 www.veichi.com hewanzhu@veichi.com 江苏省苏州市吴中经济技术开发区郭巷街道淞葭路1000号 东亚药业
3898 688699.SH 王乐康 www.chinaasic.com ir@chinaasic.com 广东省深圳市南山区高新技术产业园南区高新南一道015号国微研发大楼三层 德利股份
151 688777.SH CUI SHAN www.supcontech.com ir@supcon.com 浙江省杭州市滨江区六和路309号 海南海药
192 688788.SH 刘建德 www.consys.com.cn securities@consys.com.cn 广东省深圳市南山区西丽街道高新北区朗山路7号航空电子工程研发大厦 恒立实业
3743 688819.SH 杨建芬 www.cn-tn.com dshbgs@tiannenggroup.com 浙江省湖州市长兴县画溪工业园包桥路18号 宁波高发
500 688981.SH 周子学 www.smics.com ir@smics.com 上海市浦东新区张江路18号 国机精工

4308 rows × 6 columns

文件路径

In [3]:
os.chdir('C:\\Users\\桌面\\2019')
#读取文件夹文件
path = 'C:\\Users\\桌面\\2019'
path1 = 'C:\\Users\\桌面\\2019txt'
files = os.listdir(path)
files1 = os.listdir(path1)

PDF转换为txt

In [4]:
for file in files:
    print(file)
    with pdfplumber.open(file) as pdf:
        f = open(path1+'\\'+file+'.txt', 'w', encoding='utf-8')
        for page in pdf.pages:
            try:
                text = page.extract_text()
                if text != None:
                    f.write(text)
            except :
                print('error')
                pass
300214:2019年年度报告.pdf
300235:2019年年度报告.pdf
300291:2019年年度报告.pdf
300316:2019年年度报告.pdf
300363:2019年年度报告.pdf
300370:2019年年度报告.pdf
300428:2019年年度报告.pdf
300442:2019年年度报告.pdf
300451:2019年年度报告.pdf
300460:2019年年度报告.pdf
300492:2019年年度报告.pdf
300502:2019年年度报告.pdf
300504:2019年年度报告.pdf
300505:2019年年度报告.pdf
300519:2019年年度报告.pdf
300528:2019年年度报告.pdf
300538:2019年年度报告.pdf
300547:2019年年度报告.pdf
300548:2019年年度报告.pdf
300591:2019年年度报告.pdf
300612:2019年年度报告.pdf
300622:2019年年度报告.pdf
300637:2019年年度报告.pdf
300661:2019年年度报告.pdf
300670:2019年年度报告.pdf
300671:2019年年度报告.pdf
300678:2019年年度报告.pdf
300723:2019年年度报告.pdf
300755:2019年年度报告.pdf
300770:2019年年度报告.pdf
300775:2019年年度报告.pdf
300779:2019年年度报告.pdf
300789:2019年年度报告.pdf
300792:2019年年度报告.pdf
300808:2019年年度报告.pdf

最近三年归属于公司股东的净利润(元)

In [54]:
最近三年归属于上市公司股东的净利润 = []
for file in files1:
    print(file)
    with open(path1+'\\'+file, 'r', encoding='utf-8') as f: 
        data = f.read()
        f.close
        data = data.replace(' ', '')    
        profit = re.findall(r'归属于上市公司股东的净利润(元)(.*?)\n', data)        
        profit = " ".join(str(i) for i in profit)
        prof1 = re.findall(r'\d*\,?\d*\,?\d*\,?\d+\.?\d\d', profit)
        del prof1[2]        
        gsmc = re.search('(.*?)有限公司', data)
        公司名称 = gsmc.group(1)
        porf1.insert(0,公司名称)
        最近三年归属于上市公司股东的净利润.append(incom1)
300214:2019年年度报告.pdf.txt
300235:2019年年度报告.pdf.txt
300291:2019年年度报告.pdf.txt
300316:2019年年度报告.pdf.txt
300363:2019年年度报告.pdf.txt
300370:2019年年度报告.pdf.txt
300428:2019年年度报告.pdf.txt
300442:2019年年度报告.pdf.txt
300451:2019年年度报告.pdf.txt
300460:2019年年度报告.pdf.txt
300492:2019年年度报告.pdf.txt
300502:2019年年度报告.pdf.txt
300504:2019年年度报告.pdf.txt
300505:2019年年度报告.pdf.txt
300519:2019年年度报告.pdf.txt
300528:2019年年度报告.pdf.txt
300538:2019年年度报告.pdf.txt
300547:2019年年度报告.pdf.txt
300548:2019年年度报告.pdf.txt
300591:2019年年度报告.pdf.txt
300612:2019年年度报告.pdf.txt
300622:2019年年度报告.pdf.txt
300637:2019年年度报告.pdf.txt
300661:2019年年度报告.pdf.txt
300670:2019年年度报告.pdf.txt
300671:2019年年度报告.pdf.txt
300678:2019年年度报告.pdf.txt
300723:2019年年度报告.pdf.txt
300755:2019年年度报告.pdf.txt
300770:2019年年度报告.pdf.txt
300775:2019年年度报告.pdf.txt
300779:2019年年度报告.pdf.txt
300789:2019年年度报告.pdf.txt
300792:2019年年度报告.pdf.txt
300808:2019年年度报告.pdf.txt

最近三年归属于公司股东的净利润(元)

表格形式输出

In [56]:
df3 = pd.DataFrame(最近三年归属于上市公司股东的净利润)
df3
Out[56]:
0 1 2 3 4 5
0 山东日科化学股份 2,420,120,333.77 1,568,771,296.29 2,103,216,856.38 None None
1 深圳市方直科技股份 109,014,398.01 107,245,103.63 100,510,607.42 None None
2 北京华录百纳影视股份 611,431,097.94 629,521,249.35 2,247,623,728.70 None None
3 浙江晶盛机电股份 3,109,742,819.15 2,535,711,475.03 1,948,848,200.36 None None
4 重庆博腾制药科技股份 1,551,298,762.27 1,184,863,256.32 1,184,088,767.29 None None
5 北京安控科技股份 1,255,875,227.80 1,371,045,013.22 1,766,370,972.14 None None
6 河北四通新型金属材料股份 6,426,889,811.08 6,754,637,522.85 6,262,823,276.54 None None
7 上海普丽盛包装股份 640,060,243.46 579,549,995.56 694,225,978.93 None None
8 创业慧康科技股份 1,479,824,747.66 1,290,288,361.43 1,152,952,938.09 None None
9 广东惠伦晶体科技股份 309,942,731.09 318,987,012.27 363,278,187.71 None None
10 华图山鼎设计股份 213,738,816.56 215,946,744.36 149,941,000.43 None None
11 成都新易盛通信技术股份 1,164,873,682.36 759,950,284.50 877,365,361.78 None None
12 四川天邑康和通信股份 2,137,738,779.11 2,775,005,851.17 2,354,874,134.30 None None
13 昆明川金诺化工股份 1,125,995,638.52 965,593,161.31 799,813,584.75 None None
14 浙江新光药业股份 291,262,099.70 276,257,365.69 310,865,113.13 None None
15 幸福蓝海影视文化集团股份 2,138,087,936.10 1,654,823,836.35 1,517,230,070.94 None None
16 深圳市同益实业股份 1,787,353,342.15 1,295,612,052.52 1,010,108,368.74 None None
17 四川川环科技股份 576,570,899.55 610,366,219.73 647,774,368.00 None None
18 博创科技股份 407,171,642.60 275,110,934.64 349,236,707.65 None None
19 广东万里马实业股份 675,535,587.07 693,399,606.66 604,143,896.88 None None
20 宣亚国际营销科技(北京)股份 354,228,722.98 369,281,216.23 504,510,269.50 None None
21 博士眼镜连锁股份 655,031,758.19 566,055,654.27 471,321,887.98 None None
22 浙江扬帆新材料股份 511,692,670.37 525,975,255.69 2.72 436,471,908.25 436,471,908.25
23 圣邦微电子(北京)股份 792,494,891.33 572,392,694.37 38.45 531,505,272.15 531,505,272.15
24 江苏大烨智能电气股份 386,148,084.92 355,366,687.26 339,810,515.98 None None
25 深圳市富满电子集团股份 598,224,427.85 496,688,658.45 439,734,381.50 None None
26 中科院成都信息技术股份 364,413,271.82 344,467,451.37 290,694,326.03 None None
27 一品红药业股份 1,637,405,569.89 1,429,554,297.97 1,380,217,271.58 None None
28 华致酒行连锁管理股份 3,737,888,401.79 2,720,804,229.54 2,406,518,403.67 None None
29 广东南方新媒体股份 995,995,779.68 643,164,088.73 445,957,893.70 None None
30 西安三角防务股份 613,876,364.67 465,723,211.93 374,760,035.25 None None
31 青岛惠城环保科技股份 343,794,748.38 343,872,381.52 266,606,998.82 None None
32 成都唐源电气股份 308,757,518.33 264,614,714.55 208,126,044.69 None None
33 杭州壹网壹创科技股份 1,450,821,188.98 1,012,796,031.64 704,407,372.24 None None
34 广东久量股份 879,602,396.23 867,574,820.46 864,338,971.47 None None

获取基本面数据

In [1]:
#先引入后面可能用到的包(package)
import pandas as pd  
import numpy as np
from scipy import stats
import tushare as ts 
import matplotlib.pyplot as plt
%matplotlib inline   

#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
#调取股票基本面数据和行情数据
#基本面数据
basics_data=pro.query('stock_basic', exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
basics_data
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-f27d0944a2de> in <module>()
      3 import numpy as np
      4 from scipy import stats
----> 5 import tushare as ts
      6 import matplotlib.pyplot as plt
      7 get_ipython().run_line_magic('matplotlib', 'inline')

ModuleNotFoundError: No module named 'tushare'

分布

In [58]:
#使用groupby对上市公司归属地进行汇总,
#统计每个省份(直辖市)上市公司的总数
area=basics_data.groupby('area')['name'].count()
#从大到小进行排序,取出前十名
area.sort_values(ascending=False)[:10]
Out[58]:
area
浙江    518
江苏    484
北京    380
广东    341
上海    339
深圳    332
山东    227
福建    150
四川    135
安徽    126
Name: name, dtype: int64

把深圳的数据加入到广东当中

In [59]:
#将“广东”与深圳数据合并成新的广东
area['广东']=area['广东']+area['深圳']
area.drop(['深圳'],inplace=True)
area.sort_values(ascending=False)[:10]
Out[59]:
area
广东    673
浙江    518
江苏    484
北京    380
上海    339
山东    227
福建    150
四川    135
安徽    126
湖南    117
Name: name, dtype: int64

分布地图

In [61]:
#导入作图包
from pyecharts import Map
# 将数据转化为字典,不转也可以
d =dict(area)
province=list(d.keys())
value=list(d.values())
#maptype='china' 只显示全国直辖市和省级
#数据只能是省名和直辖市的名称
map = Map("中国上市公司分布", title_color="#fff",
          title_pos="center", width=1200, 
          height=600,background_color='#404a59')
map.add("", province, value,visual_range=[min(value),max(value)], 
       is_label_show=True,maptype='china',
        visual_text_color='#000',label_pos="center", 
        is_visualmap=True)
map.render(path="中国上市公司分布.html")
#到所在的目录查找文件:中国上市公司分布.html

使用python对时间序列模型进行建模与分析

In [15]:
import pandas as pd
import numpy as np
import statsmodels.tsa.api as smt     
#tsa为Time Series analysis缩写
import statsmodels.api as sm
import scipy.stats as scs
from arch import arch_model
#画图
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
In [16]:
#先定义一个画图函数,后面都会用到

def ts_plot(data, lags=None,title=''):

    if not isinstance(data, pd.Series):   
        data = pd.Series(data)
    #matplotlib官方提供了五种不同的图形风格,
    #包括bmh、ggplot、dark_background、fivethirtyeight和grayscale
    with plt.style.context('ggplot'):    
        fig = plt.figure(figsize=(10, 8))
        layout = (3, 2)
        ts_ax = plt.subplot2grid(layout, (0, 0), colspan=2)
        acf_ax = plt.subplot2grid(layout, (1, 0))
        pacf_ax = plt.subplot2grid(layout, (1, 1))
        qq_ax = plt.subplot2grid(layout, (2, 0))
        pp_ax = plt.subplot2grid(layout, (2, 1))
        data.plot(ax=ts_ax)
        ts_ax.set_title(title+'时序图')
        smt.graphics.plot_acf(data, lags=lags, ax=acf_ax, alpha=0.5)
        acf_ax.set_title('自相关系数')
        smt.graphics.plot_pacf(data, lags=lags, ax=pacf_ax, alpha=0.5)
        pacf_ax.set_title('偏自相关系数')
        sm.qqplot(data, line='s', ax=qq_ax)
        qq_ax.set_title('QQ 图')        
        scs.probplot(data, sparams=(data.mean(), 
                     data.std()), plot=pp_ax)
        pp_ax.set_title('PP 图') 
        plt.tight_layout()
    return

# 模拟AR(1) 过程 
#设置随机种子(括号里数字无意义)
np.random.seed(1)
#模拟次数
n=5000
#AR模型的参数
a = 0.8
#扰动项为正态分布
x = w = np.random.normal(size=n)
for t in range(1,n):
    x[t] = a*x[t-1] + w[t]
#画图
ts_plot(x, lags=30)
In [20]:
#估计数据的AR模型参数和滞后阶数
def simu_ar(data,a,maxlag=30,true_order = 1):
    '''data:要拟合的数据;a为参数,可以为列表;maxlag:最大滞后阶数'''
    # 拟合AR(p)模型
    result = smt.AR(data).fit(maxlag=maxlag, ic='aic', trend='nc')
    #选择滞后阶数
    est_order = smt.AR(data).select_order(maxlag=maxlag,
                ic='aic', trend='nc')  
    #参数选择标准ic : 有四个选择 {‘aic’,’bic’,’hqic’,’t-stat’}
    #趋势项:trend:c是指包含常数项,nc为不含常数项
    #打印结果
    print(f'参数估计值:{result.params.round(2)},估计的滞后阶数:{est_order}')
    print(f'真实参数值:{a},真实滞后阶数 {true_order}')
simu_ar(x,a=0.8)
参数估计值:[0.8],估计的滞后阶数:1
真实参数值:0.8,真实滞后阶数 1

以MFI指标编写的python回测框架

In [39]:
#先引入后面可能用到的包(package)
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['axes.unicode_minus']=False

#引入TA-Lib库
import talib as ta

import tushare as ts
df=ts.get_k_data('sh',start='2000-01-01')
df.index=pd.to_datetime(df.date)
df=df.sort_index()
df['ret']=df.close/df.close.shift(1)-1
df.head()


high,low,close,volume=df.high.values,df.low.values,df.close.values,df.volume.values
df['mfi']=ta.MFI(high, low, close, volume, timeperiod=14)
plt.figure(figsize=(16,14))
plt.subplot(211)
df['close'].plot(color='r')
plt.xlabel('')
plt.title('上证综指走势',fontsize=15)
plt.subplot(212)
df['mfi'].plot()
plt.title('MFI指标',fontsize=15)
plt.xlabel('')
plt.show()




# In[186]:


#当前日的MFI<20,而当日的MFI>20时,买入信号设置为1
for i in range(15,len(df)):
    if df['mfi'][i]>20 and df['mfi'][i-1]<20:
        df.loc[df.index[i],'收盘信号']=1
    if df['mfi'][i]<80 and df['mfi'][i-1]>80:
        df.loc[df.index[i],'收盘信号']=0


#计算每天的仓位,当天持有上证指数时,仓位为1,当天不持有上证指数时,仓位为0
pd.options.mode.chained_assignment = None
df['当天仓位']=df['收盘信号'].shift(1)
df['当天仓位'].fillna(method='ffill',inplace=True)


from datetime import datetime,timedelta
d=df[df['当天仓位']==1].index[0]-timedelta(days=1)
df_new=df.loc[d:]
df_new['ret'][0]=0
df_new['当天仓位'][0]=0


#当仓位为1时,买入上证指数,当仓位为0时,空仓,计算资金指数
df_new['资金指数']=(df_new.ret*df['当天仓位']+1.0).cumprod()
df_new['指数净值']=(df_new.ret+1.0).cumprod()


df.close.plot(figsize=(16,7))
for i in range(len(df)):
    if df['收盘信号'][i]==1:
        plt.annotate('买',xy=(df.index[i],df.close[i]),arrowprops=dict(facecolor='r',shrink=0.05))
    if df['收盘信号'][i]==0:
        plt.annotate('卖',xy=(df.index[i],df.close[i]),arrowprops=dict(facecolor='g',shrink=0.1))    
plt.title('上证指数2000-2019年MFI买卖信号',size=15)
plt.xlabel('')
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()


#查看最近四年情况
df1=df.loc['2016-01-01':,]
df1.close.plot(figsize=(16,7))
for i in range(len(df1)):
    if df1['收盘信号'][i]==1:
        plt.annotate('买',xy=(df1.index[i],df1.close[i]),arrowprops=dict(facecolor='r',shrink=0.05))
    if df1['收盘信号'][i]==0:
        plt.annotate('卖',xy=(df1.index[i],df1.close[i]),arrowprops=dict(facecolor='g',shrink=0.1))    
plt.title('上证指数2016-2019年MFI买卖信号',fontsize=15)
plt.xlabel('')
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()

df1['策略净值']=(df1.ret*df1['当天仓位']+1.0).cumprod()
df1['指数净值']=(df1.ret+1.0).cumprod()

df1['策略收益率']=df1['策略净值']/df1['策略净值'].shift(1)-1
df1['指数收益率']=df1.ret
total_ret=df1[['策略净值','指数净值']].iloc[-1]-1
annual_ret=pow(1+total_ret,250/len(df_new))-1
dd=(df1[['策略净值','指数净值']].cummax()-df1[['策略净值','指数净值']])/df1[['策略净值','指数净值']].cummax()
d=dd.max()
beta=df1[['策略收益率','指数收益率']].cov().iat[0,1]/df1['指数收益率'].var()
alpha=(annual_ret['策略净值']-annual_ret['指数净值']*beta)
exReturn=df1['策略收益率']-0.03/250
sharper_atio=np.sqrt(len(exReturn))*exReturn.mean()/exReturn.std()
TA1=round(total_ret['策略净值']*100,2)
TA2=round(total_ret['指数净值']*100,2)
AR1=round(annual_ret['策略净值']*100,2)
AR2=round(annual_ret['指数净值']*100,2)
MD1=round(d['策略净值']*100,2)
MD2=round(d['指数净值']*100,2)
S=round(sharper_atio,2)
print(f'累计收益率:策略{TA1}%,指数{TA2}%;\n年化收益率:策略{AR1}%,指数{AR2}%;\n最大回撤:  策略{MD1}%,指数{MD2}%;\n策略alpha: {round(alpha,2)},策略beta:{round(beta,2)}; \n夏普比率:  {S}')

df1[['策略净值','指数净值']].plot(figsize=(15,7))
plt.title('上证指数与MFI指标策略\n2016年1月1日至今',size=15)

bbox = dict(boxstyle="round", fc="w", ec="0.5", alpha=0.9)

plt.text('2017-05-01', 0.75, f'累计收益率:策略{TA1}%,指数{TA2}%;\n年化收益率:策略{AR1}%,指数{AR2}%;\n最大回撤:  策略{MD1}%,指数{MD2}%;\n策略alpha: {round(alpha,2)},策略beta:{round(beta,2)}; \n夏普比率:  {S}',         size=13,bbox=bbox)  
plt.xlabel('')
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()

def get_data(code,date):
    df=ts.get_k_data(code,start=date)
    df.index=pd.to_datetime(df.date)
    df=df.sort_index()
    df['ret']=df.close/df.close.shift(1)-1
    return df

#关掉pandas的warnings
pd.options.mode.chained_assignment = None
def strategy(code,date,L,H):
    df=get_data(code,date)
    high,low,close,volume=df.high.values,df.low.values,df.close.values,df.volume.values
    df['mfi']=ta.MFI(high, low, close, volume, timeperiod=14)
    for i in range(14,len(df)):
        if df['mfi'][i]>L and df['mfi'][i-1]<L:
            df.loc[df.index[i],'收盘信号']=1
        if df['mfi'][i]<H and df['mfi'][i-1]>H:
            df.loc[df.index[i],'收盘信号']=0

    df['当天仓位']=df['收盘信号'].shift(1)
    df['当天仓位'].fillna(method='ffill',inplace=True)
    
    
    d=df[df['当天仓位']==1].index[0]-timedelta(days=1)
    df1=df.loc[d:]
    df1['ret'][0]=0
    df1['当天仓位'][0]=0
    #当仓位为1时,买入上证指数,当仓位为0时,空仓,计算资金指数
    df1['策略净值']=(df1.ret.values*df1['当天仓位'].values+1.0).cumprod()
    df1['指数净值']=(df1.ret.values+1.0).cumprod()
    df1['策略收益率']=df1['策略净值']/df1['策略净值'].shift(1)-1
    df1['指数收益率']=df1.ret
    total_ret=df1[['策略净值','指数净值']].iloc[-1]-1
    annual_ret=pow(1+total_ret,250/len(df_new))-1
    dd=(df1[['策略净值','指数净值']].cummax()-df1[['策略净值','指数净值']])/df1[['策略净值','指数净值']].cummax()
    d=dd.max()
    beta=df1[['策略收益率','指数收益率']].cov().iat[0,1]/df1['指数收益率'].var()
    alpha=(annual_ret['策略净值']-annual_ret['指数净值']*beta)
    exReturn=df1['策略收益率']-0.03/250
    sharper_atio=np.sqrt(len(exReturn))*exReturn.mean()/exReturn.std()
    TA1=round(total_ret['策略净值']*100,2)
    TA2=round(total_ret['指数净值']*100,2)
    AR1=round(annual_ret['策略净值']*100,2)
    AR2=round(annual_ret['指数净值']*100,2)
    MD1=round(d['策略净值']*100,2)
    MD2=round(d['指数净值']*100,2)
    S=round(sharper_atio,2)
    df1[['策略净值','指数净值']].plot(figsize=(15,7))
    plt.title('上证指数与MFI指标策略\n'+date+'至今',size=15)
    bbox = dict(boxstyle="round", fc="w", ec="0.5", alpha=0.9)
    plt.text(df1.index[int(len(df1)/5)], df1['指数净值'].max()/1.5, f'累计收益率:策略{TA1}%,指数{TA2}%;\n年化收益率:策略{AR1}%,指数{AR2}%;\n最大回撤:  策略{MD1}%,指数{MD2}%;\n策略alpha: {round(alpha,2)},策略beta:{round(beta,2)}; \n夏普比率:  {S}',size=13,bbox=bbox)  
    plt.xlabel('')
    ax=plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    plt.show()


strategy('sh','2009-05-12',20,80)

strategy('sh','2009-04-12',20,90)

strategy('sh','2009-04-12',20,95)

strategy('sh','2009-04-12',30,95)

strategy('sh','2009-04-12',15,95)

strategy('sh','2016-01-01',20,90)

strategy('sh','2000-01-01',20,80)

strategy('sh','2000-01-01',20,92)

strategy('sh','2017-04-12',20,80)

strategy('sh','2017-04-12',20,92)
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
累计收益率:策略-3.75%,指数1.05%;
年化收益率:策略-0.2%,指数0.06%;
最大回撤:  策略21.01%,指数30.77%;
策略alpha: -0.0,策略beta:0.47; 
夏普比率:  -0.26
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
The read operation timed out
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2
In [ ]: