python numpy学习笔记(4)

本文介绍了一个用于分析AAPL股票价格的程序,该程序能够计算不同星期的成交量加权平均价格(VWAP),并对最近三周的开盘价、最高价、最低价及收盘价进行汇总。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次主要实现日期转化成星期几的函数的编写,并对于每周几的VWAP的值进行计算,并对于AAPL三周以内周股价进行汇总。

并对于之前的代码进行优化。


第一部分:历史以星期为标准的VWAP的计算

首先,将csv文件中的数据读取,我的样例来自雅虎财经提供数据,格式为2017/07/20。

所以转化函数应该编写成:

from datetime import *

def datestr2num(s):
    return datetime.strptime(s, "%Y/%m/%d").date().weekday()
# 日期转化成星期几的函数

之后在读取文件时,使用loadtext函数中的converter参数进行选择。

DateData, OpenData, HighData, LowData, CloseData, ADJCloseData, VolumeData \
    = loadtxt('AAPL.csv', delimiter=',', usecols=(0, 1, 2, 3, 4, 5, 6), converters={0: datestr2num}, unpack=True)
# usecols 是读取0—6行,converters是将第0行的数据通过调用datestr2num 函数转化成日期类型,unpack是分拆

可以对比之前的代码,更加简洁了(其实是我删除的csv文件中的一行文字说明项,这样读取数据方便了)。

之后利用这些前置工作,做一个计算苹果公司历史股价在每周一到周五的VWAP(成交量加权平均数)。

VWAP_weekday = zeros(5)  # 创建一个5个行向量的数组
for i in range(5):
    indices = where(DateData == i)  # 获取DateData的索引号
    prices = take(CloseData, indices)   # 从CloseData中得到索引为indices的值
    volume = take(VolumeData, indices)   # 从中VolumeData中得到索引为indices的值
    VWAP_weekday[i] = average(prices,weights=volume)  # prices的加权平均值,权重为成交量
    print "weekday", i+1, "average price is", VWAP_weekday[i]
print"the weekday ",argmax(VWAP_weekday)+1, "has the max price", max(VWAP_weekday)
# argmax 可以提取最大数据对应的索引值,max找到那个数据
print "the weekday ", argmin(VWAP_weekday)+1, "has the min price", min(VWAP_weekday)
# argmin 可以提取最小数据对应的索引值,min找到那个数据

此处使用了argmin与argmax函数,以及take的操作。

使用where可以得到相关条件的索引值,使用take可以得到对应索引的真实存储值。


第二部分:最近三周以周为单位的数据汇总

读取最近三周的数据:

open = OpenData[:16]
high = HighData[:16]
low = LowData[:16]
close = CloseData[:16]
dates = DateData[:16]
# 读取前三周的数据,存储于各个数组中

将三周的数据变成个编到一个序列里面。

first_mondy = ravel(where(dates == 0))[0]
# 用where找到相应的数组下标,进而生成一个二维数组,ravel展平数组,第一个星期一正好是数组下标为0的变量
last_fridy = ravel(where(dates == 4))[-1]
# 用where找到相应的数组下标,进而生成一个二维数组,ravel展平数组,最后一个星期五正好是数组下标为-1的变量
week_indices = arange(first_mondy,last_fridy+1)
# 将第一个星期一与最后一个星期五中的所有的日期构成一个序列
week_indices = split(week_indices, 3)
# 将序列平均切片成三部分

之后编写summarize函数,对于周数据的技术指标进行计算。

def summarize(a, o, h, l, c):
    mondy_open = o[a[0]]
    week_high = max(take(h,a))
    week_low = min(take(l,a))
    friday_close = c[a[-1]]
    return ("APPL", mondy_open, week_high, week_low, friday_close)
#将周数据汇总,找到周数据的开盘价,最高价,最低价,收盘价

最后,使用app_along_axis函数,对于每一个部分进行操作。

week_summary = apply_along_axis(summarize, 1, week_indices, open, high, low, close)
# 调用app_along_axis函数,对于将week_indices, open, high, low, close都传进summarize中,进行处理
print week_summary

全部代码如下:

# -*- coding:utf-8 -*-
from numpy import *
from datetime import *

def datestr2num(s):
    return datetime.strptime(s, "%Y/%m/%d").date().weekday()
# 日期转化成星期几的函数

def summarize(a, o, h, l, c):
    mondy_open = o[a[0]]
    week_high = max(take(h,a))
    week_low = min(take(l,a))
    friday_close = c[a[-1]]
    return ("APPL", mondy_open, week_high, week_low, friday_close)
#将周数据汇总,找到周数据的开盘价,最高价,最低价,收盘价

DateData, OpenData, HighData, LowData, CloseData, ADJCloseData, VolumeData \
    = loadtxt('AAPL.csv', delimiter=',', usecols=(0, 1, 2, 3, 4, 5, 6), converters={0: datestr2num}, unpack=True)
# usecols 是读取0—6行,converters是将第0行的数据通过调用datestr2num 函数转化成日期类型,unpack是分拆
Avg_OpenData = mean(OpenData)  # 开盘价的算数平均数
VMAP = average(CloseData, weights=VolumeData)  # 成交价与成交量的加权平均数
Max_HighData = max(HighData)  # 历史最高价的最大值
Low_LowData = min(LowData)  # 历史最低价的最小值
Ptp_CloseData = ptp(CloseData)  # 成交价的极差
Median_CloseData = median(CloseData)  # 成交价的中位数
Var_CloseData = var(CloseData)  # 成交价的方差
Population_Variance_CloseData = nansum(((CloseData - mean(CloseData)) ** 2)) / (len(CloseData) - 1)
# 由概率论知识可得,样本的无偏估计量为离差平方和除以样本估计量-1

Rate_Return = diff(CloseData) / CloseData[:-1]  # 股票收益率的计算
StandardDeviation_Rate_Return = std(Rate_Return)  # 收益率的标准差
LogRate_Return = diff(log(CloseData))  # 对数收益率
Index_Position = where(Rate_Return > 0)  # 收益率大于0的索引
Volatility_Annual = (std(LogRate_Return) / mean(LogRate_Return)) / sqrt(1.0 / 252.0)
# 股票的年波动率,对数收益率的标准差除以对数收益率的均值,再除以交易天数(252天)倒数的平方根

# 成交量加权平均数的计算
VWAP_weekday = zeros(5)  # 创建一个5个行向量的数组
for i in range(5):
    indices = where(DateData == i)  # 获取DateData的索引号
    prices = take(CloseData, indices)   # 从CloseData中得到索引为indices的值
    volume = take(VolumeData, indices)   # 从中VolumeData中得到索引为indices的值
    VWAP_weekday[i] = average(prices,weights=volume)  # prices的加权平均值,权重为成交量
    print "weekday", i+1, "average price is", VWAP_weekday[i]
print"the weekday ",argmax(VWAP_weekday)+1, "has the max price", max(VWAP_weekday)
# argmax 可以提取最大数据对应的索引值,max找到那个数据
print "the weekday ", argmin(VWAP_weekday)+1, "has the min price", min(VWAP_weekday)
# argmin 可以提取最小数据对应的索引值,min找到那个数据

open = OpenData[:16]
high = HighData[:16]
low = LowData[:16]
close = CloseData[:16]
dates = DateData[:16]
# 读取前三周的数据,存储于各个数组中

first_mondy = ravel(where(dates == 0))[0]
# 用where找到相应的数组下标,进而生成一个二维数组,ravel展平数组,第一个星期一正好是数组下标为0的变量
last_fridy = ravel(where(dates == 4))[-1]
# 用where找到相应的数组下标,进而生成一个二维数组,ravel展平数组,最后一个星期五正好是数组下标为-1的变量
week_indices = arange(first_mondy,last_fridy+1)
# 将第一个星期一与最后一个星期五中的所有的日期构成一个序列
week_indices = split(week_indices, 3)
# 将序列平均切片成三部分
week_summary = apply_along_axis(summarize, 1, week_indices, open, high, low, close)
# 调用app_along_axis函数,对于将week_indices, open, high, low, close都传进summarize中,进行处理
print week_summary






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值