背景:
我是 Python 和一般编程的新手。我想知道我的实现方法是否正确,或者是否应该以更好的方式完成。
数据:
我有一个 csv,大约有 400 种股票,即
Date, SH Ltd, Date, QS Ltd, Date, WX Ltd ...
26/02/18, 34, 16/06/13, 5634, 15/06/17, 100
27/02/18, 33, 17/06/13, 5763, 16/06/17, 100
28/02/18 ,35, 18/06/13, 6139, 17/06/17, 100
...
所以每一列都有一些随机的开始日期,但所有日期都将在昨天结束。现在假设我想做 3 件事,
1) 计算过去 252 天的交易量 2) 计算东部股票最差的三个2天缺口。
我的方法
我目前正在考虑遍历 CSV 的每一列,创建一个时间序列向量。然后我可以对其运行一个方法来计算从开始日期 + 2 到今天的 3 天间隔。然后创建一个向量,将这个向量从大到小排序并吐出 3 个最小的。然后我用最后 252 天计算出 stdev 并乘以 252 的平方根。
在此之后我有 2 个输出
1) 最差 2 天表现的向量(5 最差) 2) 卷的最后 252 天的数字。
此时,我将这些数据放入 2D perf 的 csv 和波动率 csv 中。然后我继续遍历所有其他列,直到它有数据并添加到上面的 csv 文件中。
我的问题:
这是一个非常低效的方法吗?与仅使用单个向量进行一次计算相比,这种持续使用多个向量是否会大大降低我的程序速度?
最佳答案
让我们从对问题和简短答案的一些清晰解释开始,然后讨论一般优化问题。
我创建了一个包含更多行的文件,并且还删除了列名中的空格(以简化操作)。
Date,SH,Date,QS,Date,WX
26/02/18, 34, 16/06/13, 5634, 15/06/17, 100
27/02/18, 33, 17/06/13, 5763, 16/06/17, 100
1/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
2/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
3/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
4/03/18 ,39, 18/06/13, 6139, 17/06/17, 100
5/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
6/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
7/03/18 ,35, 18/06/13, 6114, 17/06/17, 100
8/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
9/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
19/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
import pandas as pd
fn = "testlogs" WINDOW = 3
df = pd.read_csv(fn)
print(df.SH.rolling(WINDOW).std(ddof=0))
0 NaN
1 NaN
2 0.816497
3 0.942809
4 0.000000
5 1.885618
6 1.885618
7 1.885618
8 0.000000
9 0.000000
10 0.000000
11 0.000000
Name: SH, dtype: float64
有关 VOL 的更多信息,请参阅 here
现在,关于效率,“过早的优化是万恶之源”(Knuth)。在你的例子中,如果你只有 400 只股票,每天只有一条线,那么 100 年的数据不到 14MB,而便宜的智能手机通常有 16GB 的内存。因此,您的所有数据都将位于 ram 中,即使您多次读取每个值,VOL 的计算也应该只需要几分之一秒,而且 CPU 使用率非常低。
更多关于我的具体实现——我用的是pandas,有以下优点: (1) 简短的代码 (2) 向量计算的效率
缺点: 需要学习这个库,这对初学者来说可能会让人不知所措。
关于python - python中每列的高效多重计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54942385/