numpy数组符号化与函数向量化

计算净额成交量

Key_Function:

np.sign(数组): 返回数组中每个元素的正负符号

np.piecewise(数组, 条件列表, 返回值列表): 通过条件列表中的元素, 判断数组中的元素在条件列表中的索引, 取返回值列表对应的索引, 当做返回值, 用这些返回值组成一个新的数组

Code:

import numpy as np
import matplotlib.pyplot as plt

c, v = np.loadtxt(‘BHP.csv‘, delimiter=‘,‘, usecols=(6,7), unpack=True)
# c是每日收盘价, v是每日成交量
‘‘‘
c
[ 93.72  95.64  94.56  93.3   93.93  92.39  92.11  92.36  91.76  93.91
  94.6   93.27  94.43  96.02  95.76  94.47  94.34  92.22  88.31  89.59
  89.02  86.95  84.88  87.38  88.56  89.59  88.71  90.02  91.26  90.67]
v
[ 1741900.  2620800.  2461300.  3270900.  2650200.  4667300.  5359800.
  7768400.  4799100.  3448300.  4719800.  3898900.  3727700.  3379400.
  2463900.  3590900.  3805000.  3271700.  5507800.  2996800.  3434800.
  5008300.  7809799.  3947100.  3809700.  3098200.  3500200.  4285600.
  3918800.  3632200.]

‘‘‘
# 计算每日收盘价的差
change = np.diff(c)
print(change)
‘‘‘
[ 1.92 -1.08 -1.26  0.63 -1.54 -0.28  0.25 -0.6   2.15  0.69 -1.33  1.16
  1.59 -0.26 -1.29 -0.13 -2.12 -3.91  1.28 -0.57 -2.07 -2.07  2.5   1.18
  1.03 -0.88  1.31  1.24 -0.59]
‘‘‘

signs = np.sign(change)
print(signs)
‘‘‘
[ 1. -1. -1.  1. -1. -1.  1. -1.  1.  1. -1.  1.  1. -1. -1. -1. -1. -1.
  1. -1. -1. -1.  1.  1.  1. -1.  1.  1. -1.]
‘‘‘
# 通过判断数组元素是否满足条件, 返回满足条件的返回值
pieces = np.piecewise(change, [change < 0, change > 0], [-1, 1])
print(pieces)
‘‘‘
[ 1. -1. -1.  1. -1. -1.  1. -1.  1.  1. -1.  1.  1. -1. -1. -1. -1. -1.
  1. -1. -1. -1.  1.  1.  1. -1.  1.  1. -1.]
‘‘‘

print(np.array_equal(signs, pieces))
# True

# 计算OBV值  OBV值,就是当天的成交量, 但其正负依赖于收盘价的变化量
print(v[1:] * signs)
‘‘‘
[ 2620800. -2461300. -3270900.  2650200. -4667300. -5359800.  7768400.
 -4799100.  3448300.  4719800. -3898900.  3727700.  3379400. -2463900.
 -3590900. -3805000. -3271700. -5507800.  2996800. -3434800. -5008300.
 -7809799.  3947100.  3809700.  3098200. -3500200.  4285600.  3918800.
 -3632200.]
‘‘‘

交易过程模拟

Key_Function:

np.vectorize函数: 相当于python的map函数, 将函数向量化, 即输入参数从单个元素变成向量

  避免了使用循环遍历数组中的每一个元素

ndarray对象可以在[]中填入条件, 进行元素的过滤

def myfunc(a, b):
    "Return a-b if a>b, otherwise return a+b"
    if a > b:
        return a - b
    else:
        return a + b

vfunc = np.vectorize(myfunc)

vfunc([1, 2, 3, 4], 2)
# array([3, 4, 1, 2])
       

Code:

import numpy as np
import matplotlib.pyplot as plt

o, h, l, c = np.loadtxt(‘BHP.csv‘, delimiter=‘,‘, usecols=(3,4,5,6), unpack=True)
# 开盘价,最高价, 最低价, 收盘价

def calc_profit(open, high, low, close):
    # 以比开盘价稍低的价格买入
    buy = open * float(0.999)
    # 当日股价区间
    if low < buy < high:
        return (close - buy) / buy     # 计算当日相对利润
    else:
        return 0

# np.vectorize() 将函数向量化
func = np.vectorize(calc_profit)    # 将4个输入数组, 输出成一个数组

profits = func(o, h, l, c)
print(profits)
‘‘‘
[ 0.00755895  0.0123267   0.0021668   0.00780612  0.          0.00154302
 -0.01006869  0.00568316 -0.00614746  0.00560552 -0.00121617 -0.01774473
  0.00675817  0.00225356 -0.00274807 -0.02015786  0.00762307 -0.00675369
 -0.00675957  0.          0.01065112  0.02904986 -0.01558377  0.00168882
 -0.0098442  -0.00499634 -0.00783465  0.00603003  0.00540779  0.00376864]
‘‘‘

real_trades = profits[profits != 0]     # 过滤掉等于0的元素
print(len(real_trades),"  ", round(100.0 * len(real_trades)/len(c),2), "%")
# 28    93.33 %
# 数组的除法是对应元素相除

print(round(np.mean(real_trades) * 100,2 )) # 2表示取两位有效数字
# 0.02

winning_trades = profits[profits > 0]
print(len(winning_trades), round(100.0 * len(winning_trades)/len(c), 2), "%")
# 16 53.33 %
print(round(np.mean(winning_trades) * 100, 2))
# 0.72

losing_trades = profits[profits < 0]
print(len(losing_trades), round(100.0 * len(losing_trades)/len(c), 2), "%")
# 12 40.0 %
print(round(np.mean(losing_trades) * 100, 2))
# -0.92

原文地址:https://www.cnblogs.com/draven123/p/11392021.html

时间: 2024-10-14 10:44:25

numpy数组符号化与函数向量化的相关文章

Python numpy数组扩展效率问题

Numpy库的ndarray数组可以方便地进行各种多维数据处理工作 可是它最大的缺点就是不可动态扩展--"NumPy的数组没有这种动态改变大小的功能,numpy.append()函数每次都会重新分配整个数组,并把原来的数组复制到新数组中."(引用自http://blog.chinaunix.net/uid-23100982-id-3164530.html) 场景: 今天用ndarray处理 42000 条数据时,就遇到了数组扩展的效率问题 文件名:train.csv(后附下载) 文件大

numpy数组、向量、矩阵运算

可以来我的Github看原文,欢迎交流. https://github.com/AsuraDong/Blog/blob/master/Articles/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/numpy%E6%95%B0%E7%BB%84%E3%80%81%E5%90%91%E9%87%8F%E3%80%81%E7%9F%A9%E9%98%B5%E8%BF%90%E7%AE%97.md import numpy as np import pandas as pd

【Python实战15】NumPy数组的创建

NumPy提供了一个N维数组对象,即:ndarray.ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的. 创建ndarray数组 创建数组最简单的方式就是使用array函数,它接受一切序列型的对象,然后产生一个新的含有传入数据的NumPy数组.如下: 嵌套的序列将会被转换为一个多为数组: 除非显示的说明,np.array会尝试为新建的这个数组推断出一个较为合适的数据类型,我们可以通过dtype来进行查看,比如上面刚建立的数组类型为:int32类型:另,我们可以

数据分析与展示——NumPy数据存取与函数

NumPy库入门 NumPy数据存取和函数 数据的CSV文件存取 CSV文件 CSV(Comma-Separated Value,逗号分隔值)是一种常见的文件格式,用来存储批量数据. np.savetxt(frame,array,fmt='%.18e',delimiter=None) frame:文件.字符串或产生器,可以是.gz或.bz2的压缩文件. array:存入文件的数组. fmt:写入文件的格式,例如:%d %.2f %.18e. delimiter:分割字符串,默认是任何空格. 范例

Numpy数组对象的操作-索引机制、切片和迭代方法

前几篇博文我写了数组创建和数据运算,现在我们就来看一下数组对象的操作方法.使用索引和切片的方法选择元素,还有如何数组的迭代方法. 一.索引机制 1.一维数组 In [1]: a = np.arange(10,16) In [2]: a Out[2]: array([10, 11, 12, 13, 14, 15]) #使用正数作为索引 In [3]: a[3] Out[3]: 13 #还可以使用负数作为索引 In [4]: a[-4] Out[4]: 12 #方括号中传入多数索引值,可同时选择多个

numpy数组 拼接

转载自:https://blog.csdn.net/zyl1042635242/article/details/43162031 数组拼接方法一 首先将数组转成列表,然后利用列表的拼接函数append().extend()等进行拼接处理,最后将列表转成数组. 例1: >>> import numpy as np>>> a=np.array([1,2,5])>>> b=np.array([10,12,15])>>> a_list=lis

Python数据分析与展示(1)-数据分析之表示(1)-NumPy数据存取与函数

NumPy数据存取与函数 数据的CSV文件存取 CSV文件 CSV(Comma-Separated Value,逗号分隔值) CSV是一种常见的文件格式,用来存储批量数据. 将数据写入CSV文件 np.savetxt(frame, array, fmt='%.18e', delimiter=None) -frame: 文件.字符串或产生器,可以是.gz或.bz2的压缩文件 -array: 存入文件的数组 -fmt: 写入文件的格式,例如:%d %.2f %.18e -delimiter:分割字符

numpy数组的排序,搜索,元素抽取

排序 numpy的排序函数 sort函数返回排序后的数组 lexsort函数根据键值的字典序进行排序 argsort函数返回数组排序后的下标 ndarray类的sort方法可以对数组进行原地排序 msort函数沿着第一个轴排序 sort_complex函数对复数按照先实部后虚部的顺序进行排序 Key_Function lexsort函数根据键值的字典序进行排序 将两个数组构成的元组, 分别取出对应下标的元素, 第一个数组的看做key, 第二个数组看做value 然后按照value进行排序, 返回

numpy数组转置与轴变换

numpy数组转置与轴变换 矩阵的转置 >>> import numpy as np >>> arr=np.arange(15).reshape((3,5)) >>> arr array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>> arr.T array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 1