使用 pandas 计算移动平均线

数据说明

这个日线数据有以下的字段:
【code】 股票的代码,上证股票以sh开头,深证股票以sz开头
【date】 交易日期
【open】 开盘价
【high】 最高价
【low】 最低价
【close】 收盘价
【change】 涨跌幅,复权之后的真实涨跌幅,保证准确
【volume】 成交量
【money】 成交额
【traded_market_value】 流通市值
【market_value】 总市值
【turnover】 换手率,成交量/流通股本
【adjust_price】 后复权价,复权开始时间为股票上市日,精确到小数点后10位
【report_type】 最近一期财务报告的类型,3-31对应一季报,6-30对应半年报,9-30对应三季报,12-31对应年报
【report_date】 最近一期财务报告实际发布的日期
【PE_TTM】 最近12个月市盈率,股价 / 最近12个月归属母公司的每股收益TTM
【PS_TTM】 最近12个月市销率, 股价 / 最近12个月每股营业收入
【PC_TTM】 最近12个月市现率, 股价 / 最近12个月每股经营现金流
【PB】 市净率,股价 / 最近期财报每股净资产

计算移动平均线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# -*- coding: utf-8 -*-
"""
@author: yucezhe
@contact: QQ:2089973054 email:xjc@yucezhe.com
"""
import pandas as pd
# ========== 从原始csv文件中导入股票数据,以浦发银行sh600000为例
# 导入数据 - 注意:这里请填写数据文件在您电脑中的路径
stock_data = pd.read_csv('all_trading_data/stock data/sh600000.csv', parse_dates=[1])
# 将数据按照交易日期从远到近排序
stock_data.sort('date', inplace=True)
# ========== 计算移动平均线
# 分别计算5日、20日、60日的移动平均线
ma_list = [5, 20, 60]
# 计算简单算术移动平均线MA - 注意:stock_data['close']为股票每天的收盘价
for ma in ma_list:
stock_data['MA_' + str(ma)] = pd.rolling_mean(stock_data['close'], ma)
# 计算指数平滑移动平均线EMA
for ma in ma_list:
stock_data['EMA_' + str(ma)] = pd.ewma(stock_data['close'], span=ma)
# 将数据按照交易日期从近到远排序
stock_data.sort('date', ascending=False, inplace=True)
# ========== 将算好的数据输出到csv文件 - 注意:这里请填写输出文件在您电脑中的路径
stock_data.to_csv('sh600000_ma_ema.csv', index=False)

计算创业板平均市盈率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# -*- coding: utf-8 -*-
"""
@contact: xing_jicheng@foxmail.com
"""
import os
import pandas as pd
# ======== 便利数据文件夹中所有股票文件的文件名,得到股票代码列表stock_code_list
stock_code_list = []
for root, dirs, files in os.walk('all_trading_data/stock data'):
if files:
for f in files:
stock_code_list.append(f.split('.csv')[0])
print stock_code_list
# ======== 根据上一步得到的代码列表,便利所有股票,并将这些股票合并到一张表格all_stock中
all_stock = pd.DataFrame()
# 遍历每个股票,筛选出创业板股票
for code in stock_code_list:
# 创业板股票代码都是以3开头
if code[2] != '3':
continue
print '正在处理', code
# 从csv文件中读取该股票数据
stock_data = pd.read_csv('all_trading_data/stock data/' + code +'.csv',
parse_dates=[1])
# 删除PE_TTM值为空的数据行
stock_data = stock_data[stock_data['PE_TTM'].notnull()]
# PE_TTM = 总市值 / 净利润_TTM, 这里通过这个公式计算 净利润_TTM
stock_data['净利润'] = stock_data['market_value'] / stock_data['PE_TTM']
# 选取需要的字段,去除其他不需要的字段
stock_data = stock_data[['code','date','market_value','净利润']]
# 将该股票的数据合并到output中
all_stock = all_stock.append(stock_data, ignore_index = True )
# ======== 基于output表格,通过groupby语句,计算创业板股票每天的平均市盈率
output = all_stock.groupby('date')[['market_value','净利润']].sum()
output['股票数量'] = all_stock.groupby('date').size()
output['创业板平均市盈率'] = output['market_value'] / output['净利润']
output.to_csv('创业板平均市盈率.csv', encoding= 'utf-8')

极简方法将日线数据转为周线、月线或其他周期

分析股票数据的时候,往往会用不同的周期进行分析,以期得到更加全面的结果。比如日线、周线、月线,或者5分钟、15分钟、30分钟、60分钟。甚至有的时候会想,为什么的我的周期必须是自然周或者自然月,我能不能每11天或者每24天一个周期。

面对这样的需求,就必须写程序在不同的周期之间进行转换。本篇文章以将日线数据转换为周线数据为案例例,向大家介绍pandas的以下功能:
使用pandas导入和导出输出
resample函数的用法

在进行日线周线转换的时候,一定要注意,大部分周线的指标是这个日线指标在这一周最后一个交易日的值。比如周线的【close】应该等于这一周最后一天日线数据的【close】。但是有的指标是例外,比如周线的【high】应该等于这一周所有日线【high】中的最大值,周线的【volume】应该等于这一周所有日线【volume】的和。有了这样的理解之后,直接上程序截图,里面有详细的注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# -*- coding: utf-8 -*-
import pandas as pd
# 读取数据
stock_data = pd.read_csv('all_trading_data/stock data/sh600000.csv', parse_dates=[1])
# ============== 将导入的日线数据stock_data,转换为周线数据period_stock_data
# 设定转换的周期period_type,转换为周'W',月'M',季'Q',五分钟'5min',12天是'12D'
period_type = 'W'
# 将 date 设定为 index
stock_data.set_index('date', inplace=True)
# 进行转换,周线的每个变量都等于那一周最后一个交易日的变量值
period_stock_data = stock_data.resample(period_type, how = 'last')
# 周线的 change 等于那一周中每日 change 的连续相乘法
period_stock_data['change'] = stock_data['change'].resample(period_type, how=lambda x: (x+1.0).prod() - 1.0)
# 轴线的 open 等于那一周中第一个交易日的 open
period_stock_data['open'] = stock_data['open'].resample(period_type, how = 'first')
# 周线的 high 等于那一周中 high 的最大值
period_stock_data['high'] = stock_data['high'].resample(period_type, how = 'max')
# 周线的 low 等于那一周中 low 的最小值
period_stock_data['low'] = stock_data['low'].resample(period_type, how = 'min')
# 轴线的 volume 和 money 等于那一周中 volume 和 money 的各自的和
period_stock_data['volume'] = stock_data['volume'].resample(period_type, how = 'sum')
period_stock_data['money'] = stock_data['money'].resample(period_type, how = 'sum')
# 计算周线 turnover
period_stock_data['turnover'] = period_stock_data['volume'] / (period_stock_data['traded_market_value'] / period_stock_data['close'])
# 股票在有些周一天都没有交易,将这些周去除
period_stock_data = period_stock_data[period_stock_data['code'].notnull()]
period_stock_data.reset_index(inplace = True)
# =============== 导出数据
period_stock_data.to_csv('week_stock_data.csv', index = False)