我正试图将以下代码从ThinkScript (TD Ameritrade代码)翻译为Python,并且我无法将其输出正确的形状。
ThinkScript:
TDA中的代码输出以"lengtha
", - 10,10;使用";fold
",它迭代前10个开盘价,并将它们与当前收盘价进行比较。根据迭代输出,循环从"增加或减少1;s
",其中;s
";初始值默认为0。
例如oa
的最后10个值ca > GetValue(oa, i)
为true
,则输出为10。
我想把它翻译成python,其中oa
和ca
是numpy数组。并且,其中输出是另一个numpy数组,与oa
和ca
具有相同的滞留时间。
input lengtha = 10;
def oa = open();
def ca = close();
def data = fold i = 0 to lengtha
with s
do s + (if ca > GetValue(oa, i)
then 1
else if ca < GetValue(oa, i)
then - 1
else 0);
我试过了:
这是我尝试过的许多版本之一。这个特殊的例子似乎确实按照我期望的方式(可能)进行了数学运算。但是,它输出一个数组的数组,我想简单地为ca
中的每个值返回1个值。
oa = np.array(open)
ca = np.array(close)
window_size = 10
running_count = 0
result = []
for i in range(window_size):
oa_window = oa[i:i+window_size]
ca_window = ca
window_result = np.where(ca_window > oa_window, running_count+1, running_count-1)
running_count += np.sum(np.where(ca_window > oa_window, 1, -1))
running_count = min(max(running_count, -10), 10)
result.append(window_result)
result = np.array(result)
print(result)
输出:
- 我不确定这是如何导致-11的。
- 我不确定如何返回结果为1由
X
(1D)数组,而不是这10由X
由10。(其中X
是ca
和oa
的大小)
[[[ -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 -1]
[ -1 -1 -1 ... -1 -1 -1]]
[[ -9 -11 -11 ... -9 -11 -11]
[ -9 -11 -9 ... -9 -9 -9]
[ -9 -11 -9 ... -9 -9 -11]
...
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]]
[[-11 -11 -9 ... -11 -11 -9]
[-11 -9 -9 ... -9 -9 -9]
[-11 -9 -9 ... -9 -11 -9]
...
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]]
...
[[ -9 -9 -11 ... -9 -9 -9]
[ -9 -9 -9 ... -9 -9 -9]
[ -9 -9 -9 ... -9 -9 -9]
...
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]]
[[ -9 -11 -11 ... -9 -9 -9]
[ -9 -9 -9 ... -9 -9 -9]
[ -9 -9 -11 ... -9 -9 -9]
...
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]]
[[-11 -11 -9 ... -9 -9 -9]
[ -9 -9 -9 ... -9 -9 -9]
[ -9 -11 -9 ... -9 -9 -9]
...
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]
[-11 -11 -11 ... -11 -11 -11]]]
所期望的输出:(随机的例子)
[ 1
-8
3
9
10
0
. . .
-10
-9 ]
可能的解决方案
在这上面花了一些时间,这个公式看起来可能是我想要的:
这并没有得到我想要的输出。似乎它会在-10度停留很长一段时间。
for j in range(i-10, i):
sum += np.where(ca > oa[j], 1, np.where(ca < oa[j], -1, 0))
我想我明白了。np.roll()
的加入让它回到了家。
for j in range(0, 10):
sum += np.where(ca > np.roll(oa,j), 1, np.where(ca < np.roll(oa,j), -1, 0))