|
|
|
|
移动端

2.1.2 字符串和容器(1)

《量化交易之路:用Python做股票量化分析》第2章量化语言——Python,第2部分(第2~6章)主要讲解了量化交易需要的基础知识及相关工具,如Python语言、NumPy、pandas、数据可视化及量化数学等知识,适合完全没有任何编程经验的读者从头开始阅读。本节为大家介绍字符串和容器。

作者:阿布来源:机械工业出版社|2017-10-19 15:59

技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战

2.1.2  字符串和容器(1)

字符串和容器是所有语言中必不可少的,也是最基础的。

1.字符串

Python中的字符串是不可变对象(immutable), 一般对字符串操作的API都是返回一个新的字符串。

通过id()函数可以获得对象的内存地址,如果两个对象的内存地址是一样的,那么这两个对象是一个对象。以下代码使用replace()函数将空格删除,可以看出replace()函数后price_str的id数值改变了。

  1. print '旧的price_str id= {}'.format(id(price_str))  
  2. price_strprice_str = price_str.replace(' ', '')  
  3. print '新的price_str id= {}'.format(id(price_str))  
  4. price_str 

输出如下:

  1. 旧的price_str id4952191240 
  2. 新的price_str id4951758504 
  3. '30.14,29.58,26.36,32.56,32.82' 

2.容器

列表是一种有序的容器,可以对元素进行增、删、改操作,例如:

  1. # split以逗号分隔字符串,返回数组price_array  
  2. price_array = price_str.split(',')  
  3. print price_array  
  4. # price_array尾部append一个重复的32.82  
  5. price_array.append('32.82')  
  6. print price_array 

输出如下:

  1. ['30.14', '29.58', '26.36', '32.56', '32.82']  
  2. ['30.14', '29.58', '26.36', '32.56', '32.82', '32.82'] 

集合是一个无序的容器,且集合中的元素无重复。以下代码使用set()函数将price_array转换为集合,发现之前加入的重复的32.82没有了。

  1. set(price_array) 

输出如下:

  1. {'26.36', '29.58', '30.14', '32.56', '32.82'} 

也可以使用remove()函数将'32.82'移除,注意它只移除第一次出现的数据。

  1. price_array.remove('32.82') 

输出如下:

  1. ['30.14', '29.58', '26.36', '32.56', '32.82'] 

3.循环控制

Python中的循环与其他语言类似:

表达式for a in array循环依次从array中获取元素赋予a变量;

while循环,结果为真时不断循环,结果不成立时退出循环。

【需求1】将这一组收盘价格赋予更多含义,加上对应的收盘日期。

首先创建一个数组,里面对应着每个收盘价格的交易日期,使用for循环实现,代码如下:

  1. date_array = []  
  2. date_base = 20170118 
  3. # 这里用for只是为了计数,无用的变量Python建议使用'_'声明  
  4. for _ in xrange(0, len(price_array)):  
  5.     date_array.append(str(date_base))  
  6.     # 本节只是简单示例,不考虑日期的进位  
  7.     date_base += 1  
  8. date_array 

输出如下:

  1. ['20170118', '20170119', '20170120', '20170121', '20170122'] 

使用while循环实现:

  1. date_array = []  
  2. date_base = 20170118 
  3. price_cnt = len(price_array) - 1  
  4. while price_cnt > 0:  
  5.     date_array.append(str(date_base))  
  6.     date_base += 1  
  7.     price_cnt -1 
  8. date_array 

输出如下:

  1. ['20170118', '20170119', '20170120', '20170121', '20170122'] 

4.列表推导式

前面示例写了8行代码才构建了一组日期,在Python金融数据量化中更建议的写法是使用列表推导式来完成,代码如下:

  1. date_base = 20170118 
  2. date_array = [str(date_base + ind) for ind, _ in  
  3.               enumerate(price_array)]  
  4. date_array 

输出如下:

  1. ['20170118', '20170119', '20170120', '20170121', '20170122'] 

备注:推导式的写法需要一段时间来适应,没适应前全部使用for和while循环也可以。

为了对应交易日期与收盘价格,可以使用tuple元祖来封装上面的这个结构,但需要注意tuple对象与字符串对象都是不可变对象(immutable)。

zip的效果是同时迭代多个序列,每次分别从一个序列中取一个元素,一旦其中某个序列到达结尾,则迭代宣告结束。

  1. stock_tuple_list = [(date, price) for date, price in  
  2.                     zip(date_array, price_array)]  
  3. # tuple访问使用索引  
  4. print '20170119日价格:{}'.format(stock_tuple_list[1][1])  
  5. stock_tuple_list 

输出如下:

  1. 20170119日价格:29.58  
  2.  
  3. [('20170118', '30.14'),  
  4.  ('20170119', '29.58'),  
  5.  ('20170120', '26.36'),  
  6.  ('20170121', '32.56'),  
  7.  ('20170122', '32.82')] 

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

.NET for Flash动态网站开发手札

本书深入浅出地说明了如何利用.NET、Flash及XML来辅助Flash富媒体应用程序的开发。 本书首先介绍了Flash影片应用程序与.NET应用程序结合的...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊