基于事件结果0/1跟踪总变化的Pythonic方式

时间:2016-04-28 13:18:47

标签: python algorithm

我正在建立一些跟踪赌注的东西。 我有一系列这样的价格:

prices = [Decimal('4.42'), Decimal('2.93'), Decimal('7.47'), Decimal('6.80'), Decimal('23.00'), Decimal('6.47'), Decimal('12.50'), Decimal('4.95'), Decimal('16.19'), Decimal('17.00'), Decimal('12.32'), Decimal('7.15'), Decimal('9.93'), Decimal('6.60'), Decimal('6.68'), Decimal('12.38'), Decimal('18.68'), Decimal('19.00'), Decimal('6.79'), Decimal('4.50'), Decimal('6.90'), Decimal('30.00'), Decimal('140.00'), Decimal('4.80'), Decimal('2.37'), Decimal('199.72'), Decimal('3.08'), Decimal('11.00'), Decimal('9.31'), Decimal('17.50'), Decimal('5.50'), Decimal('19.00'), Decimal('23.00'), Decimal('3.45'), Decimal('38.00'), Decimal('38.00'), Decimal('6.52'), Decimal('15.23'), Decimal('8.67'), Decimal('3.85'), Decimal('6.24'), Decimal('15.68'), Decimal('34.99'), Decimal('5.50'), Decimal('10.74'), Decimal('8.60'), Decimal('7.80'), Decimal('19.69'), Decimal('9.96'), Decimal('6.71'), Decimal('15.48'), Decimal('5.70'), Decimal('11.38'), Decimal('47.36'), Decimal('9.91'), Decimal('11.50'), Decimal('15.26'), Decimal('5.10'), Decimal('17.50'), Decimal('5.40'), Decimal('8.92'), Decimal('16.41'), Decimal('5.64'), Decimal('56.11'), Decimal('8.21'), Decimal('14.57'), Decimal('8.60'), Decimal('4.50'), Decimal('23.00'), Decimal('4.10'), Decimal('2.52'), Decimal('5.68'), Decimal('10.98'), Decimal('11.16'), Decimal('22.00'), Decimal('7.50'), Decimal('4.90'), Decimal('5.70'), Decimal('12.50'), Decimal('5.42'), Decimal('20.17'), Decimal('10.92'), Decimal('8.60'), Decimal('27.00'), Decimal('44.00'), Decimal('10.95'), Decimal('12.39'), Decimal('6.04'), Decimal('3.70'), Decimal('84.93'), Decimal('10.55'), Decimal('12.50'), Decimal('14.92'), Decimal('7.86'), Decimal('7.40'), Decimal('4.56'), Decimal('33.59'), Decimal('3.75'), Decimal('2.71'), Decimal('8.02'), Decimal('5.77'), Decimal('7.39'), Decimal('1.94'), Decimal('8.03'), Decimal('3.90'), Decimal('14.00'), Decimal('16.00'), Decimal('2.54'), Decimal('8.86'), Decimal('5.46'), Decimal('16.64'), Decimal('5.90'), Decimal('144.19'), Decimal('26.00'), Decimal('60.00'), Decimal('1.95'), Decimal('4.10'), Decimal('22.40'), Decimal('7.18'), Decimal('4.80'), Decimal('9.20'), Decimal('5.43'), Decimal('9.00'), Decimal('15.00'), Decimal('198.20'), Decimal('8.00'), Decimal('37.43'), Decimal('4.60'), Decimal('10.50'), Decimal('50.46'), Decimal('18.50'), Decimal('425.39'), Decimal('9.04'), Decimal('2.52'), Decimal('6.00'), Decimal('110.00'), Decimal('8.60'), Decimal('6.00'), Decimal('2.88'), Decimal('8.54'), Decimal('26.00'), Decimal('10.00'), Decimal('7.21'), Decimal('48.00'), Decimal('10.51'), Decimal('6.40'), Decimal('12.96'), Decimal('150.35'), Decimal('29.26'), Decimal('14.57'), Decimal('25.00'), Decimal('3.73'), Decimal('10.50'), Decimal('14.32'), Decimal('8.42'), Decimal('16.58'), Decimal('12.00'), Decimal('17.21')]

我还有一系列代表赢/输的比特。索引按日期顺序从左到右对应:

results = '01011000010011110000000111100010010000011000010000010010000100000001011000000001000001010000000100010110101100010001100000100100000000100010010000100000001000'

initial_balance = 500

我希望像这样查看价格序列:

if results[current_index_in_prices] == 1 
 current_balance = 0.05*value*current balance 

else:
  # ie 0= loss 
   current_balance =- 0.05 *balance 

随时跟踪余额。

balance_list.append(current_balance)

我想知道在我们浏览列表时是否有一种聪明的方式在内存中执行此操作,而不是我尝试绘制的方法。

2 个答案:

答案 0 :(得分:2)

for bit, value in zip(results, prices):
    diff = 0.05 * value * current_balance
    if bit == '1':
        current_balance += diff
    else:
        current_balance -= diff

或者如果您愿意:

signs = {'0': -1, '1': 1}
for bit, value in zip(results, prices):
    current_value += signs[bit] * 0.05 * value * current_balance

答案 1 :(得分:0)

您应该使用zip,如下所示

initial_balance = 500
current_balance = initial_balance
for flag, price in zip(results, prices):
    diff = Decimal(0.05)*price*current_balance*(1 if int(flag) else -1)
    current_balance += diff

但是你可以使它更具有功能性,因此不那么难看,而且如下所示:[/ p>

from functools import reduce
from operator import mul
g = (1 + Decimal(0.05)*price*(1 if int(flag) else -1) 
        for flag, price in zip(results, prices))
current_balance = initial_balance*reduce(mul, g)

以上代码给出正确的结果。增量逻辑有问题。但这个想法是实现

x_ = x*(1 + r)**n
# in this case, the following
x_ = x*(1+r0)*(1+r2)...*(1+r157)

其中rri是累积变化的费率。