![[Python数据分析]新股破板买入,赚钱几率如何? [Python数据分析]新股破板买入,赚钱几率如何?](https://image.shishitao.com:8440/aHR0cHM6Ly9ia3FzaW1nLmlrYWZhbi5jb20vdXBsb2FkL2NoYXRncHQtcy5wbmc%2FIQ%3D%3D.png?!?w=700&webp=1)
这是本人一直比较好奇的问题,网上没搜到,最近在看python数据分析,正好自己动手做一下试试。作者对于python是零基础,需要从头学起。
在写本文时,作者也没有完成这个小分析目标,边学边做吧。
================================================================
Python基础:
中国大学Mooc,南京大学,张莉老师 -《用Python玩转数据》
了解基本的语法和常用函数就行了,其他的用的时候再搜。
财经数据源:
TuShare - http://tushare.org/index.html
免费,开源Python财经数据接口包。
GitHub: https://github.com/waditu/tushare
基本的资料目前就看了这些,其他的都是网上即时搜的,以前的没保存,接下来会慢慢加。
================================================================
既然是新股发行后破板的表现,要设一个时间段,否则没意义,所以先以半年为时间段,统计破板后的数据,时间太久了也没用,次新股一年为限,但我们可以以一个月为限,本别分析,破板买入,30个交易日内每天的盈利概率。
要做的事情可以分为以下几步:
1. 获取近半年来的新股数据
2. 拿到每支股票上市后的数据
3. 筛选出破板后三十天的数据,并汇总
4. 计算整体上每天盈利的概率
-----
第一步:如何获取近半年的新股数据。
TuShare新股数据接口:
输入参数:retry_count, pause
返回数据较多,是Pandas DataFrame格式的数据,下面折叠的部分是测试输出结果,其中很多对于现在要做的没有用,需要筛选一下。
关心的返回值:code - 股票代码,name - 股票名称, issue_date - 上市日期
import tushare as ts
ts.new_stocks()
Last login: Fri Oct :: on ttys001
localhost:~ shengtianhe$ python
Python 3.5. |Anaconda 4.2. (x86_64)| (default, Jul , ::)
[GCC 4.2. Compatible Apple LLVM 4.2 (clang-425.0.)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tushare as ts
>>> ts.new_stocks()
[Getting data:]######## code name ipo_date issue_date amount markets price pe \
湘油泵 -- NaN 2023.0 723.0 10.46 22.98
吴江银行 -- NaN 11150.0 3345.0 6.83 12.62
上海银行 -- NaN 60045.0 18000.0 17.77 8.26
国泰集团 -- NaN 5528.0 2028.0 0.00 0.00
海兴电力 -- NaN 9334.0 3734.0 23.63 21.32
国检集团 -- NaN 5500.0 2200.0 10.04 22.97
东方中科 -- NaN 2834.0 1124.0 4.96 22.95
快克股份 -- NaN 2300.0 2070.0 16.50 21.04
贝达药业 -- NaN 4100.0 3690.0 17.57 22.99
丝路视觉 -- NaN 2780.0 2502.0 5.54 22.99
富森美 -- NaN 4400.0 3960.0 23.49 22.99
海天精工 -- NaN 5220.0 4698.0 1.50 22.98
理工光科 -- NaN 1400.0 1400.0 13.91 22.99
中富通 -- NaN 1753.0 1753.0 10.26 22.99
塞力斯 -- -- 1274.0 1274.0 26.91 22.98
佳发安泰 -- NaN 1800.0 1800.0 17.56 22.99
新华网 -- -- 5190.0 4672.0 27.69 22.99
电魂网络 -- -- 6000.0 5400.0 15.62 18.16
杭州银行 -- -- 26175.0 23558.0 14.39 10.23
黄山胶囊 -- -- 2167.0 1950.0 13.88 22.98
五洲新春 -- -- 5060.0 4554.0 8.80 22.96
和科达 -- -- 2500.0 2250.0 8.29 22.98
能科股份 -- -- 2839.0 2555.0 7.54 22.97
万集科技 -- -- 2670.0 2403.0 12.25 20.91
集智股份 -- -- 1200.0 1200.0 14.08 22.99
和仁科技 -- -- 2000.0 2000.0 12.53 22.99
路通视信 -- -- 2000.0 2000.0 15.40 22.99
汇顶科技 -- -- 4500.0 4050.0 19.42 22.99
古鳌科技 -- -- 1836.0 1836.0 12.48 22.88
顾家家居 -- -- 8250.0 7425.0 24.66 22.99
.. ... ... ... ... ... ... ... ...
东方新星 -- -- 2534.0 2281.0 7.49 20.49
海利生物 -- -- 7000.0 6300.0 6.81 21.28
雪峰科技 -- -- 8235.0 7412.0 4.98 22.95
创业软件 -- -- 1700.0 1530.0 14.02 22.98
永兴特钢 -- -- 5000.0 4500.0 21.74 17.97
莱克电气 -- -- 4100.0 3690.0 19.08 22.99
惠伦晶体 -- -- 4208.0 3787.0 6.43 22.96
赢合科技 -- -- 1950.0 1755.0 12.41 20.34
山河药辅 -- -- 1160.0 1044.0 14.96 22.99
中光防雷 -- -- 2107.0 1896.0 14.74 13.24
山河药辅 -- -- 1160.0 1044.0 14.96 22.99
中光防雷 -- -- 2107.0 1896.0 14.74 13.24
普丽盛 -- -- 2500.0 2250.0 19.17 22.55
金石东方 -- -- 1700.0 1530.0 10.57 22.98
鹏辉能源 -- -- 2100.0 1890.0 14.87 22.99
易尚展示 -- -- 1756.0 1580.0 10.48 22.98
博济医药 -- -- 1667.0 1500.0 12.87 22.98
乐凯新材 -- -- 1540.0 1386.0 8.85 7.11
双杰电气 -- -- 3449.0 3104.0 12.13 22.89
山东华鹏 -- -- 2640.0 2376.0 8.73 22.97
鲍斯股份 -- -- 2112.0 1901.0 9.81 22.81
福鞍股份 -- -- 2500.0 2250.0 10.77 22.91
江苏有线 -- -- 59700.0 53730.0 5.47 22.98
浩云科技 -- -- 2000.0 1800.0 15.79 22.88
运达科技 -- -- 2800.0 2520.0 21.70 22.97
清水源 -- -- 1670.0 1503.0 10.53 19.30
珍宝岛 -- -- 6458.0 5812.0 23.60 22.91
大豪科技 -- -- 5100.0 4590.0 11.17 22.98
广生堂 -- -- 1750.0 1260.0 21.47 18.67
NaN NaN NaN NaN NaN NaN NaN limit funds ballot
0.70 2.116 0.00
3.30 7.615 0.00
18.00 106.700 0.00
0.00 3.566 0.00
3.70 22.065 0.00
2.20 5.522 0.00
1.10 1.406 0.00
0.90 3.795 0.03
1.20 7.204 0.04
1.10 1.540 0.03
1.30 10.336 0.04
1.50 4.305 0.05
1.40 1.947 0.01
1.75 1.799 0.02
1.20 3.428 0.02
1.80 3.161 0.02
2.00 14.372 0.04
2.40 9.372 0.05
7.80 37.666 0.13
0.85 3.008 0.02
2.00 4.453 0.04
1.00 2.072 0.03
1.10 2.141 0.03
1.05 3.271 0.03
1.20 1.690 0.01
2.00 2.506 0.02
2.00 3.080 0.02
1.30 8.739 0.05
1.80 2.291 0.02
2.40 20.345 0.06
.. ... ... ...
1.00 1.898 0.32
2.80 4.774 0.31
3.20 3.875 0.30
0.65 2.384 0.20
2.00 10.872 0.48
1.20 7.823 0.40
1.55 2.706 0.34
0.75 2.421 0.33
0.45 1.736 0.30
0.80 3.106 0.30
0.45 1.736 0.30
0.80 3.106 0.30
1.00 4.212 0.62
0.65 1.475 0.44
0.80 2.782 0.45
0.65 1.550 0.34
0.65 1.884 0.30
0.60 1.115 0.46
1.30 3.698 0.77
1.00 1.934 0.47
0.80 1.732 0.68
1.00 2.399 0.47
17.70 31.220 1.24
0.80 2.841 0.46
1.10 5.578 0.61
0.60 1.523 0.50
1.80 14.275 0.83
1.50 5.183 0.62
0.70 2.588 0.30
NaN NaN NaN [ rows x columns]
筛选规则:
issue_date 在半年之内。
Pandas API:
http://pandas.pydata.org/pandas-docs/stable/api.html
其中pandas.DataFrame.Sort可以带参数过滤DataFrame:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort.html
但觉得这样还得进一步过滤,搜了一下,发现可以直接操作。
import tushare as ts
df=ts.new_stocks()
df=df[df['issue_date']>'2016-06-01']
这样我们就直接取到了所有六月一日后上市的新股数据:
>>> import tushare as ts
>>> df=ts.new_stocks()
[Getting data:]########>>> df=df[df['issue_date']>'2016-06-01']
>>> df
code name ipo_date issue_date amount markets price pe \
塞力斯 -- -- 1274.0 1274.0 26.91 22.98
新华网 -- -- 5190.0 4672.0 27.69 22.99
电魂网络 -- -- 6000.0 5400.0 15.62 18.16
杭州银行 -- -- 26175.0 23558.0 14.39 10.23
黄山胶囊 -- -- 2167.0 1950.0 13.88 22.98
五洲新春 -- -- 5060.0 4554.0 8.80 22.96
和科达 -- -- 2500.0 2250.0 8.29 22.98
能科股份 -- -- 2839.0 2555.0 7.54 22.97
万集科技 -- -- 2670.0 2403.0 12.25 20.91
集智股份 -- -- 1200.0 1200.0 14.08 22.99
和仁科技 -- -- 2000.0 2000.0 12.53 22.99
路通视信 -- -- 2000.0 2000.0 15.40 22.99
汇顶科技 -- -- 4500.0 4050.0 19.42 22.99
古鳌科技 -- -- 1836.0 1836.0 12.48 22.88
顾家家居 -- -- 8250.0 7425.0 24.66 22.99
博创科技 -- -- 2067.0 1860.0 11.75 22.97
恒康家居 -- -- 6000.0 5400.0 15.41 22.66
路畅科技 -- -- 3000.0 2700.0 6.89 22.97
来伊份 -- -- 6000.0 5400.0 11.67 22.98
鼎信通讯 -- -- 4340.0 3906.0 14.02 22.99
崇达技术 -- -- 5000.0 4500.0 16.31 22.98
城地股份 -- -- 2460.0 2214.0 12.13 22.97
川环科技 -- -- 1495.0 1495.0 22.07 22.99
优德精密 -- -- 1667.0 1667.0 15.03 22.99
常熟银行 -- -- 22227.0 20005.0 4.28 9.89
雄帝科技 -- -- 1334.0 1334.0 20.43 22.99
泰晶科技 -- -- 1668.0 1668.0 16.14 22.99
联得装备 -- -- 1783.0 1783.0 13.50 22.98
无锡银行 -- -- 18481.0 16633.0 4.47 9.91
农尚环境 -- -- 2328.0 2095.0 9.06 18.12
.. ... ... ... ... ... ... ... ...
健帆生物 -- -- 4200.0 3780.0 10.80 22.98
中潜股份 -- -- 2125.0 1913.0 10.50 22.99
江苏银行 -- -- 115445.0 103900.0 6.27 7.64
三祥新材 -- -- 3355.0 3020.0 5.28 22.98
超讯通信 -- -- 2000.0 2000.0 11.99 22.98
博思软件 -- -- 1710.0 1710.0 11.68 22.99
华锋股份 -- -- 2000.0 2000.0 6.20 22.96
辰安科技 -- -- 2000.0 2000.0 21.92 22.99
海波重科 -- -- 2560.0 2304.0 10.04 22.97
吉宏股份 -- -- 2900.0 2610.0 6.37 22.84
海汽集团 -- -- 7900.0 7110.0 3.82 18.20
科大国创 -- -- 2300.0 2070.0 10.05 22.84
丰元股份 -- -- 2423.0 2181.0 5.80 22.97
爱司凯 -- -- 2000.0 2000.0 11.26 22.98
世名科技 -- -- 1667.0 1667.0 18.55 22.98
玲珑轮胎 -- -- 20000.0 18000.0 12.98 22.97
新宏泰 -- -- 3705.0 3335.0 8.49 19.30
洪汇新材 -- -- 2700.0 2430.0 9.52 22.98
哈森股份 -- -- 5436.0 4892.0 9.15 22.98
合诚股份 -- -- 2500.0 2250.0 10.55 21.00
盛讯达 -- -- 2334.0 2101.0 22.22 22.68
微光股份 -- -- 1472.0 1472.0 19.51 15.24
新光药业 -- -- 2000.0 2000.0 12.20 8.26
小康股份 -- -- 14250.0 12825.0 5.81 18.19
三德科技 -- -- 2500.0 2250.0 8.57 22.98
环球印务 -- -- 2500.0 2250.0 7.98 22.99
上海沪工 -- -- 2500.0 2250.0 10.09 22.98
中国核建 -- -- 52500.0 47250.0 3.47 15.60
久之洋 -- -- 3000.0 2700.0 22.50 22.98
三棵树 -- -- 2500.0 2250.0 15.94 18.09 limit funds ballot
1.20 3.428 0.02
2.00 14.372 0.04
2.40 9.372 0.05
7.80 37.666 0.13
0.85 3.008 0.02
2.00 4.453 0.04
1.00 2.072 0.03
1.10 2.141 0.03
1.05 3.271 0.03
1.20 1.690 0.01
2.00 2.506 0.02
2.00 3.080 0.02
1.30 8.739 0.05
1.80 2.291 0.02
2.40 20.345 0.06
0.80 2.429 0.03
2.40 9.246 0.05
1.20 2.067 0.03
2.40 7.002 0.05
1.30 6.085 0.05
1.50 8.155 0.04
0.90 3.647 0.03
1.45 3.299 0.02
1.65 2.506 0.02
6.60 9.513 0.12
1.30 2.725 0.01
1.60 2.692 0.02
1.75 2.407 0.02
5.50 8.261 0.10
0.90 2.110 0.03
.. ... ... ...
1.20 4.536 0.05
0.70 2.231 0.04
34.60 72.384 0.47
1.30 1.771 0.04
2.00 2.398 0.02
1.70 1.997 0.02
2.00 1.240 0.02
2.00 4.384 0.02
1.00 2.570 0.04
1.15 3.004 0.03
2.30 3.018 0.08
0.90 2.312 0.04
0.95 1.405 0.03
2.00 2.252 0.02
1.65 3.092 0.02
6.00 25.960 0.14
1.40 3.148 0.05
1.05 2.570 0.03
2.10 4.974 0.06
1.00 2.638 0.04
0.90 5.188 0.04
1.45 2.872 0.02
2.00 2.440 0.02
4.20 8.550 0.11
1.00 2.143 0.04
1.00 1.995 0.03
1.00 2.522 0.04
15.70 20.212 0.28
1.20 6.750 0.04
1.00 3.987 0.04 [ rows x columns]
但我们只需要code, name 和 issue_date的信息,所以再加一行:
import tushare as ts
df=ts.new_stocks()
df=df[df['issue_date']>'2016-06-01']
df=df[['code','name','issue_date']]
这是运行结果:
>>> df=df[['code','name','issue_date']]
>>> df
code name issue_date
塞力斯 --
新华网 --
电魂网络 --
杭州银行 --
黄山胶囊 --
五洲新春 --
和科达 --
能科股份 --
万集科技 --
集智股份 --
和仁科技 --
路通视信 --
汇顶科技 --
古鳌科技 --
顾家家居 --
博创科技 --
恒康家居 --
路畅科技 --
来伊份 --
鼎信通讯 --
崇达技术 --
城地股份 --
川环科技 --
优德精密 --
常熟银行 --
雄帝科技 --
泰晶科技 --
联得装备 --
无锡银行 --
农尚环境 --
.. ... ... ...
健帆生物 --
中潜股份 --
江苏银行 --
三祥新材 --
超讯通信 --
博思软件 --
华锋股份 --
辰安科技 --
海波重科 --
吉宏股份 --
海汽集团 --
科大国创 --
丰元股份 --
爱司凯 --
世名科技 --
玲珑轮胎 --
新宏泰 --
洪汇新材 --
哈森股份 --
合诚股份 --
盛讯达 --
微光股份 --
新光药业 --
小康股份 --
三德科技 --
环球印务 --
上海沪工 --
中国核建 --
久之洋 --
三棵树 -- [ rows x columns]
现在我们已经取到过去半年上市的新股的数据,包括股票代码,名称和上市日期。
-----
第二步:如何拿到每支股票上市后的数据。
TuShare历史交易数据接口:
输入参数:code, start, end, ktype(数据类型,默认是日K线), retry_count, pause
返回数据较多,同样也是Pandas DataFrame格式的数据,下面折叠的部分是测试输出结果,其中很多对于现在要做的没有用,需要筛选一下。
关心的返回值:date - 日期,open - 开盘价, close - 收盘价, p_change - 涨跌幅
我们以六月三日上市的新股三棵树(603737)为例:
import tushare as ts
df=ts.get_hist_data('')
测试运行如下:
>>> df=ts.get_hist_data('')
>>> df
open high close low volume price_change p_change \
date
-- 82.50 82.70 81.53 81.10 8990.79 -0.57 -0.69
-- 82.30 82.35 82.19 81.34 6959.08 0.24 0.29
-- 82.04 84.18 81.99 81.51 11004.83 -0.11 -0.13
-- 82.68 83.32 82.09 82.03 14014.53 -0.89 -1.07
-- 78.98 83.79 83.00 78.31 26251.55 3.93 4.97
-- 79.19 79.34 79.08 77.32 12459.65 -0.17 -0.21
-- 78.50 79.50 79.25 78.05 10224.54 0.75 0.95
-- 80.60 80.60 78.49 78.44 17851.50 -1.27 -1.59
-- 77.72 79.80 79.77 77.72 12765.18 1.76 2.26
-- 78.60 79.70 78.01 77.80 15855.89 -1.07 -1.35
-- 79.42 80.10 79.00 78.21 11452.91 -0.14 -0.18
-- 78.85 79.88 79.15 78.20 11277.68 0.18 0.23
-- 77.17 79.47 78.95 76.60 18557.77 0.90 1.15
-- 77.95 79.30 78.07 76.63 21518.05 0.05 0.06
-- 72.93 79.95 78.03 72.93 25128.50 5.11 7.01
-- 73.08 73.29 72.90 71.90 7940.73 -0.15 -0.20
-- 73.18 74.16 73.46 73.08 9711.11 0.05 0.07
-- 73.25 74.10 73.37 72.30 8694.66 0.10 0.14
-- 72.02 73.31 73.30 71.88 10588.05 0.78 1.08
-- 76.24 76.24 72.51 72.30 18983.21 -3.77 -4.94
-- 78.18 78.18 76.31 76.12 13200.18 -1.59 -2.04
-- 79.10 79.80 77.90 77.61 15900.57 -0.78 -0.99
-- 79.10 79.80 78.67 77.80 13804.02 -0.96 -1.21
-- 81.60 81.60 79.64 78.80 15751.28 -1.07 -1.33
-- 80.56 81.39 80.71 80.48 8901.68 0.12 0.15
-- 81.80 82.80 80.57 80.28 23667.66 -3.47 -4.13
-- 86.20 88.16 83.99 83.62 38293.43 -2.19 -2.54
-- 82.50 86.22 86.19 81.30 30861.92 1.55 1.83
-- 83.78 85.96 84.66 83.55 23143.33 0.95 1.14
-- 82.50 83.87 83.71 82.50 13567.35 0.90 1.09
... ... ... ... ... ... ... ...
-- 100.00 100.98 97.17 96.66 25811.42 -3.71 -3.68
-- 100.50 103.20 100.90 99.01 35970.92 1.18 1.18
-- 98.00 100.84 99.73 97.50 29597.28 0.87 0.88
-- 99.00 101.66 98.87 96.50 38939.97 -1.65 -1.64
-- 96.96 101.58 100.51 92.06 54520.75 1.13 1.14
-- 110.00 110.80 99.38 99.38 63645.73 -11.04 -10.00
-- 111.51 113.40 110.47 110.00 42732.83 -3.25 -2.86
-- 111.12 118.50 113.71 111.02 64406.13 0.96 0.85
-- 114.00 115.60 112.75 110.00 57436.00 -2.93 -2.53
-- 110.11 117.99 115.63 109.10 96591.87 5.25 4.76
-- 111.89 112.00 110.46 108.33 56773.07 -1.35 -1.21
-- 111.00 116.00 111.82 108.50 87725.18 -4.26 -3.67
-- 111.00 116.08 116.08 106.00 179909.75 10.55 10.00
-- 105.53 105.53 105.53 105.53 1748.55 9.59 10.00
-- 95.94 95.94 95.94 95.94 2631.18 8.72 10.00
-- 87.22 87.22 87.22 87.22 10737.11 7.93 10.00
-- 79.29 79.29 79.29 79.29 2013.69 7.21 10.00
-- 72.08 72.08 72.08 72.08 2413.01 6.55 9.99
-- 65.53 65.53 65.53 65.53 1152.33 5.96 10.01
-- 59.57 59.57 59.57 59.57 998.79 5.42 10.01
-- 54.15 54.15 54.15 54.15 1332.01 4.92 9.99
-- 49.23 49.23 49.23 49.23 1086.13 4.48 10.01
-- 44.75 44.75 44.75 44.75 257.15 4.07 10.01
-- 40.68 40.68 40.68 40.68 286.50 3.70 10.01
-- 36.98 36.98 36.98 36.98 627.34 3.36 9.99
-- 33.62 33.62 33.62 33.62 346.27 3.06 10.01
-- 30.56 30.56 30.56 30.56 158.75 2.78 10.01
-- 27.78 27.78 27.78 27.78 35.00 2.53 10.02
-- 25.25 25.25 25.25 25.25 22.00 2.30 10.02
-- 22.95 22.95 22.95 22.95 155.00 7.01 43.98 ma5 ma10 ma20 v_ma5 v_ma10 v_ma20 turnover
date
-- 82.160 80.540 78.207 13444.16 13637.75 14011.51 3.60
-- 81.670 80.287 77.946 14137.93 13883.97 14221.98 2.78
-- 81.082 79.983 77.732 14791.02 14315.83 14669.05 4.40
-- 80.382 79.679 77.566 16160.35 15071.12 14809.01 5.61
-- 79.918 79.277 77.443 15910.48 15821.47 14895.85 10.50
-- 78.920 78.780 77.329 13831.35 15709.17 14028.36 4.98
-- 78.904 78.162 77.403 13630.00 15257.28 14588.76 4.09
-- 78.884 77.583 77.640 13840.63 15205.93 15992.20 7.14
-- 78.976 77.071 78.025 13981.89 14290.25 16642.72 5.11
-- 78.636 76.424 78.270 15732.46 14072.54 17161.63 6.34
-- 78.640 75.874 78.555 17586.98 14385.27 17047.20 4.58
-- 77.420 75.605 78.744 16884.55 14559.99 16960.55 4.51
-- 76.282 75.480 78.975 16571.23 15022.28 17103.11 7.42
-- 75.166 75.452 79.172 14598.61 14546.91 16525.29 8.61
-- 74.212 75.609 79.420 12412.61 13970.23 15914.86 10.05
-- 73.108 75.877 79.673 11183.55 12347.55 15266.72 3.18
-- 73.790 76.644 80.274 12235.44 13920.24 15776.66 3.88
-- 74.678 77.697 80.795 13473.33 16778.47 15717.01 3.48
-- 75.738 78.979 81.333 14495.21 18995.20 15837.12 4.24
-- 77.006 80.115 81.848 15527.85 20250.73 16159.17 7.59
-- 78.646 81.235 82.447 13511.55 19709.14 16344.07 5.28
-- 79.498 81.883 82.944 15605.04 19361.10 16273.08 6.36
-- 80.716 82.470 83.386 20083.61 19183.94 16362.07 5.52
-- 82.220 82.891 83.768 23495.19 18503.67 17271.29 6.30
-- 83.224 83.231 84.417 24973.60 17859.48 17452.37 3.56
-- 83.824 83.469 85.042 25906.74 18185.89 18336.10 9.47
-- 84.268 83.905 85.753 23117.16 17633.07 18567.30 15.32
-- 84.224 83.894 86.355 18284.26 14655.54 18866.01 12.34
-- 83.562 83.686 86.659 13512.14 12679.05 19115.24 9.26
-- 83.238 83.580 86.929 10745.36 12067.61 19107.11 5.43
... ... ... ... ... ... ... ...
-- 99.436 104.912 97.632 36968.07 50965.29 42787.78 10.32
-- 99.878 106.241 95.481 44534.93 54061.45 41563.81 14.39
-- 101.792 107.333 92.898 45887.31 59236.88 39819.57 11.84
-- 104.588 108.968 90.149 52849.08 74268.13 38352.56 15.58
-- 107.364 109.634 87.239 56548.29 70548.99 36419.89 21.81
-- 110.388 109.177 84.063 64962.51 65360.03 33725.22 25.46
-- 112.604 107.961 80.774 63587.98 60069.17 30560.24 17.09
-- 112.874 104.843 76.779 72586.45 55997.25 28431.54 25.76
-- 113.348 100.680 72.483 95687.17 49797.94 25212.98 22.97
-- 111.904 95.958 68.108 84549.68 44169.57 22342.28 38.64
-- 107.966 90.352 63.474 65757.55 34610.27 17520.44 22.71
-- 103.318 84.721 61.001 56550.35 29066.16 15454.51 35.09
-- 96.812 78.462 58.177 39408.06 20402.25 11439.48 71.96
-- 88.012 71.329 54.771 3908.71 2437.00 1529.46 0.70
-- 80.012 64.844 51.599 3789.46 2290.79 1515.77 1.05
-- 72.738 58.948 48.643 3462.99 2090.41 1441.41 4.29
-- 66.124 53.588 45.887 1581.97 1051.32 777.43 0.81
-- 60.112 48.715 43.318 1396.45 865.83 682.33 0.97
-- 54.646 44.285 40.921 965.28 628.03 538.11 0.46
-- 49.676 40.257 38.684 792.12 514.99 482.27 0.40
-- 45.158 36.595 36.595 717.83 430.62 430.62 0.53
-- 41.052 34.644 34.644 520.68 330.46 330.46 0.43
-- 37.318 32.821 32.821 335.20 236.00 236.00 0.10
-- 33.924 31.117 31.117 290.77 232.98 232.98 0.11
-- 30.838 29.523 29.523 237.87 224.06 224.06 0.25
-- 28.032 28.032 28.032 143.40 143.40 143.40 0.14
-- 26.635 26.635 26.635 92.69 92.69 92.69 0.06
-- 25.327 25.327 25.327 70.67 70.67 70.67 0.01
-- 24.100 24.100 24.100 88.50 88.50 88.50 0.01
-- 22.950 22.950 22.950 155.00 155.00 155.00 0.06 [ rows x columns]
同样,按照第一步的思路对数据稍加处理:
df=df[['date','open','close','p_change']]
此时却出了问题,报错如下:
>>> df=df[['date','open','close','p_change']]
Traceback (most recent call last):
File "<stdin>", line , in <module>
File "/Users/shengtianhe/anaconda/lib/python3.5/site-packages/pandas/core/frame.py", line , in __getitem__
return self._getitem_array(key)
File "/Users/shengtianhe/anaconda/lib/python3.5/site-packages/pandas/core/frame.py", line , in _getitem_array
indexer = self.ix._convert_to_indexer(key, axis=)
File "/Users/shengtianhe/anaconda/lib/python3.5/site-packages/pandas/core/indexing.py", line , in _convert_to_indexer
raise KeyError('%s not in index' % objarr[mask])
KeyError: "['date'] not in index"
检查打出来的数据名称没问题,就考虑,第一列会不会是其他的东西,搜到几个有用的命令:
from pandas import DataFrame #从pandas库中引用DataFrame df_obj = DataFrame() #创建DataFrame对象
df_obj.dtypes #查看各行的数据格式
df_obj.head() #查看前几行的数据,默认前5行
df_obj.tail() #查看后几行的数据,默认后5行
df_obj.index #查看索引
df_obj.columns #查看列名
df_obj.values #查看数据值
df_obj.describe #描述性统计
df_obj.T #转置
df_obj.sort(columns = ‘’)#按列名进行排序
df_obj.sort_index(by=[‘’,’’])#多列排序,使用时报该函数已过时,请用sort_values
df_obj.sort_values(by=['',''])同上
运行index和columns,果然date是index:
>>> df.columns
Index(['open', 'high', 'close', 'low', 'volume', 'price_change', 'p_change',
'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20', 'turnover'],
dtype='object')
>>> df.index
Index(['2016-10-28', '2016-10-27', '2016-10-26', '2016-10-25', '2016-10-24',
'2016-10-21', '2016-10-20', '2016-10-19', '2016-10-18', '2016-10-17',
'2016-10-14', '2016-10-13', '2016-10-12', '2016-10-11', '2016-10-10',
'2016-09-30', '2016-09-29', '2016-09-28', '2016-09-27', '2016-09-26',
'2016-09-23', '2016-09-22', '2016-09-21', '2016-09-20', '2016-09-19',
'2016-09-14', '2016-09-13', '2016-09-12', '2016-09-09', '2016-09-08',
'2016-09-07', '2016-09-06', '2016-09-05', '2016-09-02', '2016-09-01',
'2016-08-31', '2016-08-30', '2016-08-29', '2016-08-26', '2016-08-25',
'2016-08-24', '2016-08-23', '2016-08-22', '2016-08-19', '2016-08-18',
'2016-08-17', '2016-08-16', '2016-08-15', '2016-08-12', '2016-08-11',
'2016-08-10', '2016-08-09', '2016-08-08', '2016-08-05', '2016-08-04',
'2016-08-03', '2016-08-02', '2016-08-01', '2016-07-29', '2016-07-28',
'2016-07-27', '2016-07-26', '2016-07-25', '2016-07-22', '2016-07-21',
'2016-07-20', '2016-07-19', '2016-07-18', '2016-07-15', '2016-07-14',
'2016-07-13', '2016-07-12', '2016-07-11', '2016-07-08', '2016-07-07',
'2016-07-06', '2016-07-05', '2016-07-04', '2016-07-01', '2016-06-30',
'2016-06-29', '2016-06-28', '2016-06-27', '2016-06-24', '2016-06-23',
'2016-06-22', '2016-06-21', '2016-06-20', '2016-06-17', '2016-06-16',
'2016-06-15', '2016-06-14', '2016-06-13', '2016-06-08', '2016-06-07',
'2016-06-06', '2016-06-03'],
dtype='object', name='date')
所以选取列的语句应该是:
df=df[['open','close','p_change']]
结果如下:
>>> df=df[['open','close','p_change']]
>>> df
open close p_change
date
-- 82.50 81.53 -0.69
-- 82.30 82.19 0.29
-- 82.04 81.99 -0.13
-- 82.68 82.09 -1.07
-- 78.98 83.00 4.97
-- 79.19 79.08 -0.21
-- 78.50 79.25 0.95
-- 80.60 78.49 -1.59
-- 77.72 79.77 2.26
-- 78.60 78.01 -1.35
-- 79.42 79.00 -0.18
-- 78.85 79.15 0.23
-- 77.17 78.95 1.15
-- 77.95 78.07 0.06
-- 72.93 78.03 7.01
-- 73.08 72.90 -0.20
-- 73.18 73.46 0.07
-- 73.25 73.37 0.14
-- 72.02 73.30 1.08
-- 76.24 72.51 -4.94
-- 78.18 76.31 -2.04
-- 79.10 77.90 -0.99
-- 79.10 78.67 -1.21
-- 81.60 79.64 -1.33
-- 80.56 80.71 0.15
-- 81.80 80.57 -4.13
-- 86.20 83.99 -2.54
-- 82.50 86.19 1.83
-- 83.78 84.66 1.14
-- 82.50 83.71 1.09
... ... ... ...
-- 100.00 97.17 -3.68
-- 100.50 100.90 1.18
-- 98.00 99.73 0.88
-- 99.00 98.87 -1.64
-- 96.96 100.51 1.14
-- 110.00 99.38 -10.00
-- 111.51 110.47 -2.86
-- 111.12 113.71 0.85
-- 114.00 112.75 -2.53
-- 110.11 115.63 4.76
-- 111.89 110.46 -1.21
-- 111.00 111.82 -3.67
-- 111.00 116.08 10.00
-- 105.53 105.53 10.00
-- 95.94 95.94 10.00
-- 87.22 87.22 10.00
-- 79.29 79.29 10.00
-- 72.08 72.08 9.99
-- 65.53 65.53 10.01
-- 59.57 59.57 10.01
-- 54.15 54.15 9.99
-- 49.23 49.23 10.01
-- 44.75 44.75 10.01
-- 40.68 40.68 10.01
-- 36.98 36.98 9.99
-- 33.62 33.62 10.01
-- 30.56 30.56 10.01
-- 27.78 27.78 10.02
-- 25.25 25.25 10.02
-- 22.95 22.95 43.98 [ rows x columns]
现在我们已经取得了过去半年新上市的股票和他们上市后的数据。
-----
第三步:如何筛选出破板后三十天的数据,并汇总。
……此处省略长达二十分钟的思考与百度……想到这样一个办法取得第一次破板的日期:
import tushare as ts
df=ts.get_hist_data('603737')
df=df[['open','close','p_change']]
start_date=df[df['p_change']<9.8].tail(1).index[0]
解释一下:df是一个DataFrame, 可以提取某一列中值小于9.8的所有行,提取结果仍然是DataFrame,DF有个方法叫tail()取最后几条数据,我们已经知道日期是index,所以取日期用index[0],由于本人python没基础…取日期的方法是试出来的……
接下来,用这个日期去过滤,我们只关心破板后的数据:
df=df[df.index>=start_date]
这里[]中的还是我试出来的……觉得应该这么写……
>>> import tushare as ts
>>> df=ts.get_hist_data('')
>>>
>>> df=df[['open','close','p_change']]
>>> start_date=df[df['p_change']<9.8].tail().index[]
>>> df=df[df.index>start_date]
>>> df
open close p_change
date
-- 82.50 81.53 -0.69
-- 82.30 82.19 0.29
-- 82.04 81.99 -0.13
-- 82.68 82.09 -1.07
-- 78.98 83.00 4.97
-- 79.19 79.08 -0.21
-- 78.50 79.25 0.95
-- 80.60 78.49 -1.59
-- 77.72 79.77 2.26
-- 78.60 78.01 -1.35
-- 79.42 79.00 -0.18
-- 78.85 79.15 0.23
-- 77.17 78.95 1.15
-- 77.95 78.07 0.06
-- 72.93 78.03 7.01
-- 73.08 72.90 -0.20
-- 73.18 73.46 0.07
-- 73.25 73.37 0.14
-- 72.02 73.30 1.08
-- 76.24 72.51 -4.94
-- 78.18 76.31 -2.04
-- 79.10 77.90 -0.99
-- 79.10 78.67 -1.21
-- 81.60 79.64 -1.33
-- 80.56 80.71 0.15
-- 81.80 80.57 -4.13
-- 86.20 83.99 -2.54
-- 82.50 86.19 1.83
-- 83.78 84.66 1.14
-- 82.50 83.71 1.09
... ... ... ...
-- 88.29 90.08 0.11
-- 89.00 90.16 -0.50
-- 87.18 90.58 3.70
-- 86.61 87.34 1.17
-- 85.00 86.35 1.41
-- 87.52 85.12 -3.47
-- 88.01 88.20 -0.68
-- 85.67 88.78 2.98
-- 84.93 86.21 1.51
-- 87.35 84.93 -4.30
-- 85.75 88.77 3.75
-- 86.10 85.53 -0.48
-- 91.50 85.95 -6.56
-- 87.90 91.97 4.54
-- 88.33 87.90 -0.66
-- 92.59 88.45 -4.69
-- 94.69 92.81 -1.91
-- 94.98 94.60 0.06
-- 97.00 94.56 -2.71
-- 100.00 97.17 -3.68
-- 100.50 100.90 1.18
-- 98.00 99.73 0.88
-- 99.00 98.87 -1.64
-- 96.96 100.51 1.14
-- 110.00 99.38 -10.00
-- 111.51 110.47 -2.86
-- 111.12 113.71 0.85
-- 114.00 112.75 -2.53
-- 110.11 115.63 4.76
-- 111.89 110.46 -1.21 [ rows x columns]
接下来,假设破板买入后最长持股10天,这样我们只取妹纸股票之后10天的数据,这样数据比较整齐,也便于后续处理。如果数据不满10天,则跳过。
df=df.tail(11)['close']
>>> import tushare as ts
>>> df=ts.get_hist_data('')
>>>
>>> df=df[['open','close','p_change']]
>>> start_date=df[df['p_change']<9.8].tail().index[]
>>> df=df[df.index>=start_date]
>>> df=df.tail()['close']
>>> df
date
-- 100.90
-- 99.73
-- 98.87
-- 100.51
-- 99.38
-- 110.47
-- 113.71
-- 112.75
-- 115.63
-- 110.46
-- 111.82
Name: close, dtype: float64
通过上一步,我们取到包含破板当日以及之后十天的收盘价,将数据转换为numpy.array数据。
close_array=df.values
>>> close_array=df.values
>>> close_array
array([ 100.9 , 99.73, 98.87, 100.51, 99.38, 110.47, 113.71,
112.75, 115.63, 110.46, 111.82])
进一步进行处理,如果破板后某个交易日收盘价格高于破板当天收盘价,则将array中的值置为1,否则为0。
import tushare as ts
import numpy as np df=ts.get_hist_data('') df=df[['open','close','p_change']]
start_date=df[df['p_change']<9.8].tail(1).index[0]
df=df[df.index>=start_date]
df=df.tail(11)['close'] close_array=df.values
for i in range(1,11):
if close_array[i]>close_array[0]:
close_array[i]=1
else:
close_array[i]=0 close_array[0]=0 print (close_array)
输出结果:
localhost:~ shengtianhe$ python find.py
[ . . . . . . . . . . .]
一只股票的数据组织好了,接下来把所有新股的数据取出来,这里需要用到合并array的方法numpy.concatenate,另外代码里还有一些小地方的处理,搜了一圈才知道怎么做,比如如何返回值判断非空:
import tushare as ts
import numpy as np
import pandas as pd df=ts.new_stocks()
df=df[df['issue_date']>'2016-06-01']
df=df[['code','name','issue_date']] df=df[['code']]
stock_code=df.values # print(stock_code) i=0
df_matrix = None for stock in stock_code:
detail=ts.get_hist_data(stock_code[i][0])
if detail is None:
i=i+1
continue detail=detail[['open','close','p_change']]
hasbreak=detail[detail['p_change']<9.8] if hasbreak.size==0:
i=i+1
continue start_date=hasbreak.tail(1).index[0]
hasbreak=hasbreak[hasbreak.index>=start_date]
hasbreak=hasbreak.tail(11)['close'] if hasbreak.size <11:
i=i+1
continue close_array=hasbreak.values
for day in range(1,hasbreak.size):
if close_array[day]>close_array[0]:
close_array[day]=1
else:
close_array[day]=0
close_array[0]=0 df_matrix_thisRound=pd.DataFrame(close_array)
df_matrix_thisRound=df_matrix_thisRound.T if df_matrix is None:
df_matrix=df_matrix_thisRound
else:
df_matrix=np.concatenate((df_matrix,df_matrix_thisRound.values)) i=i+1 print(df_matrix)
运行结果如下:
localhost:~ shengtianhe$ python proData.py
[Getting data:]########[[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]
[ . . . . . . . . . . .]]
-----
第四步:如何计算整体上每天盈利的概率。
这一步就相对简单了,直接求每一列的均值即可,数值上就代表当天盈利的概率了。
http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.mean.html
加入代码如下:
mean=df_matrix.mean(0)
print(mean)
运行结果如下:
[ . 0.62686567 0.65671642 0.64179104 0.65671642 0.71641791
0.74626866 0.73134328 0.71641791 0.70149254 0.70149254]
结论:
就目前时间段来看,破板后买入十个交易日内赚钱的概率还是蛮高的。
这段程序只是第一次写,当然还有很多可以改进的地方,但想要的结果已经有了个大概了。下一步感兴趣可以把结果用可视化的输出表示出来,先去睡觉啦!
总体来说还是比较满足的!
哈哈哈