月度归档:2015年09月

Web Plotting Python金融分析学习

练习了2个数据源的,分别是yahoo和tushare的

 

import numpy as np

import pandas as pd

url=’http://ichart.yahoo.com/table.csv?s=MSFT&a=0&b=1&c=2009′
data=pd.read_csv(url,parse_dates=[‘Date’])

data.plot(x=”Date”,y=’Close’)

就能看到微软2009年的走势图了

 

第二种方法是从tushare获取数据:

data1=ts.get_hist_data(‘sh’)

但是这里获取的数据没有常规的日期列,需要把索引复制到日期列里:

data1[‘Date’]=data1.index

data1.plot(x=’Date’,y=’close’)

这样就能看到近3年的上证走势图了!

 

顺便学习了Bokeh绘图,好像这个挺推荐的:

可以直接输出网页,可以实时绘图!

from bokeh.plotting import figure, output_file, show

# prepare some data
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5]

# output to static HTML file
output_file("lines.html", title="line plot example")

# create a new plot with a title and axis labels
p = figure(title="simple line example", x_axis_label='x', y_axis_label='y')

# add a line renderer with legend and line thickness
p.line(x, y, legend="Temp.", line_width=2)

# show the results
show(p)

真的需要盲目烧钱追求大数据吗? zt

http://news.xinhuanet.com/info/2013-05/16/c_132386147.htm

大数据可能是现在最炙手可热的技术名词了。热就意味着有泡沫,有值得反思的地方。Quartz的Christopher Mims 5月6日发表了一篇文章,名为“大多数数据都不大,假装大数据其实是瞎浪费钱”,有理有据,推荐一读。以下为译文:

  如果你现在还没有加入大数据的阵营, 那你想办法弄到一些。毕竟, 竞争需要大数据。如果你的数据量很小, 你将被竞争对手彻底打败。

作为顾问和 IT公司向企业推销的另一个大项目,在大数据背后的猜想还存在很多问题。幸运的是,诚实的大数据实践者(又称数据科学家)从不放下怀疑态度, 并提出了一系列对大数据大肆宣传感到厌倦的理由。如下:

理由一,即使像Facebook和Yahoo!这样的互联网巨头也并非总是处理大数据,Google风格工具的应用是不合适的

Facebook和雅虎运行其巨型集群机(功能强大的服务器集合)来处理数据。必须要进行集群处理是大数据的标志之一。毕竟,在家用PC就能处理的数据不能称为大数据。将业务拆分为小业务,使用一系列的计算机来处理每个小业务的必要性,是类似Google计算世界上每一个网页排名的大数据问题典型特点。

现在看来,对于Facabook和Yahoo!来说,每个业务都是用同样规模的集群机是不必要的。比如Facebook的情况,工程师提交给集群机的大多数任务都是 MB到GB的范围,完全可以在一台计算机甚至笔记本电脑上完成。

Yahoo!也存在类似的情况, Yahoo!集群机所处理的数据中位数只有 12.5GB,通常台式电脑不能处理这种任务,但一台配置较好的服务器完全可以胜任。

以上观点均提炼于Microsoft Research的一篇名为《 Nobody ever got fired for buying a cluster》的论文。论文中指出即使是在最渴求数据的公司,多数问题也不必集群处理。因为对于大量问题类型而言,集群是一个相对低效 甚至是完全不合适的解决方案。

理由二,大数据已经成为数据分析的代名词,这种定义是混乱的,并会起到反作用。

数据分析最早可追溯到为皇家粮仓的所有粮食制表统计,但是现在你必须要在数据前加“大”字,必要的数据分析已经卷入了一场较大但是用处不大的流行风暴中。例如,一篇文章告诫读者“ 3个步骤将大数据运用到你的小企业中”,其实小企业的数据量谷歌文档就能处理,更不说用笔记本的EXCEL了。

这就是说,实际上大多数企业处理的数据都是被Open Knowledge Foundation的Rufus Pollock所说的小数据。这很重要,这是一场“革命”, Pollock称。但它与大数据关系不大。

理由三,超大化你的数据规模正在变成一件得不偿失的事情

数据越多就越好吗?不尽然。如果你正在寻找相关方程式——x,y的关系,如何能给我提供有效信息?实际上数据越多,随之而来的麻烦也越大。

能从大数据中提取的信息会随着数据规模的增加而减少,Michael Wu(社交媒体分析公司Lithium的首席数据分析学家) 写道。这意味着越过了某一点后,继续增加数据所产生的边际数据回报率减少到如此地步,收集更多数据仅仅是浪费时间。

原因之一:数据越“大”,寻找相关性时错误信息会更多。正如数据分析家Vincent Granville在《 The curse of big data》(《大数据的诅咒》)中写道的:即使只包括1000个条目的数据集,也很容易会陷入处理几百万个相关分析的处境。”这意味着,“所有这些相关分析,有些可能会高度符合,但这仅仅是一种偶然:如果你使用这种相关分析作为预测模型,结果将会错误”。

这个错误经常在大数据的原始应用领域之一遗传学中突然出现。对基因组序列有兴趣的科学家苦心找寻其相关性而进行的无休止的研究,最终却得出了各种毫无益处的结果。

理由四,在某些情况下,大数据会令你茅塞顿开,但也可能会令你陷入困惑。

公司一旦开始使用大数据,就深陷于一系列艰涩学科的研究中——统计,数据质量,和其他构成“数据科学”的一切。就像那些每天都需要发表出版物的科学,经常会被忽视或是被修正,或是从未被证实,这之中的陷阱实在太多了。

数据收集方式的偏见,上下文的缺乏,数据聚集的缺口,数据的人工处理模式和整体认知偏差都会导致即使最好的研究人员也可能发现错误的相关模型, 麻省理工学院媒体实验室客座教授Kate Crawford说:“我们可能会陷入某种算法幻觉中”。换句话说,即使你有大数据,也并非IT部门的任何人都能处理的,他可能需要有博士学位或等量经验。当处理完成后,他们的答案可能是你并不需要“大数据”。

那么哪个更好——大数据或小数据?

你的业务需要数据吗?当然需要。但是只有 尖头发呆伯特的老板才会像赶时髦一样购买具有所谓重要性的数据规模。在科学领域同样存在着企业使用数据制定决策时固有的问题——数据质量,总体目标以及上下文和直觉的重要性。记住:Gregor Mendel仅利用一本笔记本的数据就发现了遗传的秘密。重要是数据的质量,而不是数据的规模。

pandas新手教程之基础篇 zt

python api文档见这里:

https://www.ricequant.com/api/python/chn

Jupyter Notebook社区 策略研究 我的策略 帮助 登出 tutorials_basic Last Checkpoint: Last Wednesday at 3:29 PM (autosaved)
Ipython List策略研究列表
Python 3
File
Edit
View
Insert
Cell
Kernel
Help
Cell Toolbar:
pandas新手教程之基础篇
下面是关于pandas以及其生态系统下的libraries的基础运用展示
基础篇教程分10节,从最基础的Series和DataFrame讲起,直到最后做成最基本的移动均线和标准差,达到可以基本可以使用ricequant上ipython       notebook的级别。

注:一些要调用的libraries,之后会用到
在手打运行参考代码的时候,一定要对齐,一定要对齐,一定要对齐!重要的事情说三遍!(⊙o⊙)
另由于教程的篇幅,所以设置了显示的最长行数31,保证有一个月的数据能够在教程中显示出来
In [8]:

from pandas import Series, DataFrame
import pandas as pd
import numpy as np
import scipy as sp
import statsmodels.tsa.stattools as sts
import matplotlib.pyplot as plt
import statsmodels.api as sm
pd.options.display.max_rows = 31
1:series
Pandas最重要的数据结构有二,Series和DataFrame,Panel暂不涉及。本节主要提到pandas series的一些基本操作
In [9]:

labels = [‘a’,’b’,’c’,’d’,’e’]
s2 = Series(np.random.randn(5),index =labels)
s2
Out[9]:
a   -1.333205
b   -1.049079
c    1.431448
d    0.292383
e    0.918513
dtype: float64
In [6]:

‘b’ in s2
Out[6]:
True
In [4]:

s2[‘b’]
Out[4]:
-0.36129673980263433
to_dict查看词典
In [5]:

mapping = s2.to_dict()
mapping
Out[5]:
{‘a': -0.38272820928427753,
‘b': -0.36129673980263433,
‘c': -0.13586616742241123,
‘d': -1.1435589583111128,
‘e': -2.193229583218169}
通过词典的方式也可以构建Series
In [6]:

Series(mapping)

Out[6]:
a   -0.382728
b   -0.361297
c   -0.135866
d   -1.143559
e   -2.193230
dtype: float64
一次取数据的长度默认为一年,见下,至于为什么是如此的数据结构,结尾彩蛋告诉你~
In [7]:

ts = get_price(‘600208.XSHG’)[‘ClosingPx’][-10:]
ts
Out[7]:
MDEntryDate
2013-12-20    3.17
2013-12-23    3.18
2013-12-24    3.17
2013-12-25    3.16
2013-12-26    3.11
2013-12-27    3.16
2013-12-30    3.17
2013-12-31    3.20
2014-01-02    3.19
2014-01-03    3.13
Name: ClosingPx, dtype: float64
声明了strat_date & end_date 以后才可以进行更个性化的定制,当然了,美股别忘记加上国家’us’
In [8]:

tsspecial = get_price(‘AAPL.US’,’us’, start_date=’2001-04-01′, end_date=’2015-04-12′)[‘ClosingPx’][-90:]
tsspecial
Out[8]:
MDEntryDate
2014-12-01    115.070
2014-12-02    114.630
2014-12-03    115.930
2014-12-04    115.490
2014-12-05    115.000
2014-12-08    112.400
2014-12-09    114.120
2014-12-10    111.950
2014-12-11    111.620
2014-12-12    109.730
2014-12-15    108.225
2014-12-16    106.745
2014-12-17    109.410
2014-12-18    112.650
2014-12-19    111.780

2015-03-20    125.900
2015-03-23    127.210
2015-03-24    126.690
2015-03-25    123.380
2015-03-26    124.240
2015-03-27    123.250
2015-03-30    126.370
2015-03-31    124.430
2015-04-01    124.250
2015-04-02    125.320
2015-04-06    127.350
2015-04-07    126.010
2015-04-08    125.600
2015-04-09    126.560
2015-04-10    127.100
Name: ClosingPx, dtype: float64
从头按顺序取ts前5项
In [9]:

ts[:5]
Out[9]:
MDEntryDate
2013-12-20    3.17
2013-12-23    3.18
2013-12-24    3.17
2013-12-25    3.16
2013-12-26    3.11
Name: ClosingPx, dtype: float64
In [10]:

ts.index
Out[10]:
DatetimeIndex([‘2013-12-20′, ‘2013-12-23′, ‘2013-12-24′, ‘2013-12-25′,
‘2013-12-26′, ‘2013-12-27′, ‘2013-12-30′, ‘2013-12-31′,
‘2014-01-02′, ‘2014-01-03′],
dtype=’datetime64[ns]’, name=’MDEntryDate’, freq=None, tz=None)
确认标签,并且按照标签取值,其实和直接按位置取是等价的。
In [13]:

date = ts.index[6]
date
Out[13]:
Timestamp(‘2013-12-30 00:00:00′)
In [14]:

ts[date]
Out[14]:
3.1699999999999999
In [15]:

ts[6]
Out[15]:
3.1699999999999999
米筐技能:同时读取多只股票,更多米筐技请参考basic_demo.
In [16]:

dfcn = get_price([‘000024.XSHE’, ‘000001.XSHE’, ‘000002.XSHE’])[‘ClosingPx’][-10:]
2:DataFrame
本节介绍关于DataFrame数据结构的一些基本操作
In [17]:

dfus = get_price([‘AAPL.US’,’IBM.US’,’MSFT.US’],country = ‘us’) [‘ClosingPx’][-30:]
dfus
Out[17]:
AAPL.US IBM.US MSFT.US
MDEntryDate
2013-11-20 73.571429 185.19 37.080
2013-11-21 74.448000 184.13 37.400
2013-11-22 74.257143 181.30 37.570
2013-11-25 74.820000 178.94 37.640
2013-11-26 76.200000 177.31 37.350
2013-11-27 77.994286 178.97 37.600
2013-11-29 79.438571 179.68 38.130
2013-12-02 78.747143 177.48 38.450
2013-12-03 80.903143 176.08 38.310
2013-12-04 80.714286 175.74 38.940
2013-12-05 81.128714 176.08 38.000
2013-12-06 80.002857 177.67 38.360
2013-12-09 80.918571 177.46 38.705
2013-12-10 80.792857 177.12 38.110
2013-12-11 80.194286 175.20 37.610
2013-12-12 80.077143 173.37 37.220
2013-12-13 79.204286 172.80 36.690
2013-12-16 79.642857 177.85 36.885
2013-12-17 79.284286 175.76 36.520
2013-12-18 78.681429 178.70 36.580
2013-12-19 77.780000 180.22 36.250
2013-12-20 78.431429 180.02 36.800
2013-12-23 81.441429 182.23 36.620
2013-12-24 81.095714 183.22 37.080
2013-12-26 80.557143 185.35 37.440
2013-12-27 80.012857 185.08 37.290
2013-12-30 79.217143 186.41 37.290
2013-12-31 80.145714 187.57 37.410
2014-01-02 79.018571 185.53 37.160
2014-01-03 77.282857 186.64 36.910
考察IBM和微软的股价比率
In [18]:

dfus[‘Ratio’] =  dfus[‘IBM.US’] / dfus[‘MSFT.US’]
dfus
Out[18]:
AAPL.US IBM.US MSFT.US Ratio
MDEntryDate
2013-11-20 73.571429 185.19 37.080 4.994337
2013-11-21 74.448000 184.13 37.400 4.923262
2013-11-22 74.257143 181.30 37.570 4.825659
2013-11-25 74.820000 178.94 37.640 4.753985
2013-11-26 76.200000 177.31 37.350 4.747256
2013-11-27 77.994286 178.97 37.600 4.759840
2013-11-29 79.438571 179.68 38.130 4.712300
2013-12-02 78.747143 177.48 38.450 4.615865
2013-12-03 80.903143 176.08 38.310 4.596189
2013-12-04 80.714286 175.74 38.940 4.513097
2013-12-05 81.128714 176.08 38.000 4.633684
2013-12-06 80.002857 177.67 38.360 4.631648
2013-12-09 80.918571 177.46 38.705 4.584937
2013-12-10 80.792857 177.12 38.110 4.647599
2013-12-11 80.194286 175.20 37.610 4.658336
2013-12-12 80.077143 173.37 37.220 4.657980
2013-12-13 79.204286 172.80 36.690 4.709730
2013-12-16 79.642857 177.85 36.885 4.821743
2013-12-17 79.284286 175.76 36.520 4.812705
2013-12-18 78.681429 178.70 36.580 4.885183
2013-12-19 77.780000 180.22 36.250 4.971586
2013-12-20 78.431429 180.02 36.800 4.891848
2013-12-23 81.441429 182.23 36.620 4.976242
2013-12-24 81.095714 183.22 37.080 4.941208
2013-12-26 80.557143 185.35 37.440 4.950588
2013-12-27 80.012857 185.08 37.290 4.963261
2013-12-30 79.217143 186.41 37.290 4.998927
2013-12-31 80.145714 187.57 37.410 5.013900
2014-01-02 79.018571 185.53 37.160 4.992734
2014-01-03 77.282857 186.64 36.910 5.056624
删除多余该列,dfus留着之后用
In [19]:

del dfus[‘Ratio’]
dfus
Out[19]:
AAPL.US IBM.US MSFT.US
MDEntryDate
2013-11-20 73.571429 185.19 37.080
2013-11-21 74.448000 184.13 37.400
2013-11-22 74.257143 181.30 37.570
2013-11-25 74.820000 178.94 37.640
2013-11-26 76.200000 177.31 37.350
2013-11-27 77.994286 178.97 37.600
2013-11-29 79.438571 179.68 38.130
2013-12-02 78.747143 177.48 38.450
2013-12-03 80.903143 176.08 38.310
2013-12-04 80.714286 175.74 38.940
2013-12-05 81.128714 176.08 38.000
2013-12-06 80.002857 177.67 38.360
2013-12-09 80.918571 177.46 38.705
2013-12-10 80.792857 177.12 38.110
2013-12-11 80.194286 175.20 37.610
2013-12-12 80.077143 173.37 37.220
2013-12-13 79.204286 172.80 36.690
2013-12-16 79.642857 177.85 36.885
2013-12-17 79.284286 175.76 36.520
2013-12-18 78.681429 178.70 36.580
2013-12-19 77.780000 180.22 36.250
2013-12-20 78.431429 180.02 36.800
2013-12-23 81.441429 182.23 36.620
2013-12-24 81.095714 183.22 37.080
2013-12-26 80.557143 185.35 37.440
2013-12-27 80.012857 185.08 37.290
2013-12-30 79.217143 186.41 37.290
2013-12-31 80.145714 187.57 37.410
2014-01-02 79.018571 185.53 37.160
2014-01-03 77.282857 186.64 36.910
基本属性:标签(index)、列(columns)、值(values)
In [20]:

dfus.index
Out[20]:
DatetimeIndex([‘2013-11-20′, ‘2013-11-21′, ‘2013-11-22′, ‘2013-11-25′,
‘2013-11-26′, ‘2013-11-27′, ‘2013-11-29′, ‘2013-12-02′,
‘2013-12-03′, ‘2013-12-04′, ‘2013-12-05′, ‘2013-12-06′,
‘2013-12-09′, ‘2013-12-10′, ‘2013-12-11′, ‘2013-12-12′,
‘2013-12-13′, ‘2013-12-16′, ‘2013-12-17′, ‘2013-12-18′,
‘2013-12-19′, ‘2013-12-20′, ‘2013-12-23′, ‘2013-12-24′,
‘2013-12-26′, ‘2013-12-27′, ‘2013-12-30′, ‘2013-12-31′,
‘2014-01-02′, ‘2014-01-03′],
dtype=’datetime64[ns]’, name=’MDEntryDate’, freq=None, tz=None)
In [21]:

dfus.columns
Out[21]:
Index([‘AAPL.US’, ‘IBM.US’, ‘MSFT.US’], dtype=’object’)
In [22]:

dfus.values
Out[22]:
array([[  73.57142857,  185.19      ,   37.08      ],
[  74.448     ,  184.13      ,   37.4       ],
[  74.25714286,  181.3       ,   37.57      ],
[  74.82      ,  178.94      ,   37.64      ],
[  76.2       ,  177.31      ,   37.35      ],
[  77.99428571,  178.97      ,   37.6       ],
[  79.43857143,  179.68      ,   38.13      ],
[  78.74714286,  177.48      ,   38.45      ],
[  80.90314286,  176.08      ,   38.31      ],
[  80.71428571,  175.74      ,   38.94      ],
[  81.12871429,  176.08      ,   38.        ],
[  80.00285714,  177.67      ,   38.36      ],
[  80.91857143,  177.46      ,   38.705     ],
[  80.79285714,  177.12      ,   38.11      ],
[  80.19428571,  175.2       ,   37.61      ],
[  80.07714286,  173.37      ,   37.22      ],
[  79.20428571,  172.8       ,   36.69      ],
[  79.64285714,  177.85      ,   36.885     ],
[  79.28428571,  175.76      ,   36.52      ],
[  78.68142857,  178.7       ,   36.58      ],
[  77.78      ,  180.22      ,   36.25      ],
[  78.43142857,  180.02      ,   36.8       ],
[  81.44142857,  182.23      ,   36.62      ],
[  81.09571429,  183.22      ,   37.08      ],
[  80.55714286,  185.35      ,   37.44      ],
[  80.01285714,  185.08      ,   37.29      ],
[  79.21714286,  186.41      ,   37.29      ],
[  80.14571429,  187.57      ,   37.41      ],
[  79.01857143,  185.53      ,   37.16      ],
[  77.28285714,  186.64      ,   36.91      ]])
In [23]:

date = dfus.index[5]
dfus.ix[date]
Out[23]:
AAPL.US     77.994286
IBM.US     178.970000
MSFT.US     37.600000
Name: 2013-11-27 00:00:00, dtype: float64
其等价于如下代码,Series和DataFrame在这方面是类似的。
In [24]:

dfus.ix[5]
Out[24]:
AAPL.US     77.994286
IBM.US     178.970000
MSFT.US     37.600000
Name: 2013-11-27 00:00:00, dtype: float64
In [25]:

dfus.ix[5,’IBM.US’]
Out[25]:
178.97
最基本的筛选
In [26]:

dfus.ix[dfus[‘AAPL.US’]>80]
Out[26]:
AAPL.US IBM.US MSFT.US
MDEntryDate
2013-12-03 80.903143 1