-
Notifications
You must be signed in to change notification settings - Fork 0
/
back_test.py
99 lines (70 loc) · 2.58 KB
/
back_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import datetime
import math
import os
from typing import Any, Callable, Dict, List, Optional, Union, Tuple
import csv
import pandas as pd
from utils import choose
from bit_manipulations import nums_to_bits, bits_to_nums, popcount64d
# Need to figure out how to have one file for bit manip.
CASH5_FIELD_COUNT = 43
CASH5_PICKED_COUNT = 5
CASH5_PRIZE = 100000.0
MAX_BITS = 63
CASH5_ODDS_DICT = {CASH5_PICKED_COUNT - i:
choose(CASH5_PICKED_COUNT, CASH5_PICKED_COUNT - i) *
choose(CASH5_FIELD_COUNT - CASH5_PICKED_COUNT, i)
/ choose(CASH5_FIELD_COUNT, CASH5_PICKED_COUNT)
for i in range(CASH5_PICKED_COUNT + 1)}
CASH5_PRIZE_DICT = {5: 100000, 4: 250, 3: 5, 2: 1, 1: 0}
def back_test(nums: str,
cash5_df: pd.DataFrame,
date: str = "") -> pd.DataFrame:
bits = nums_to_bits(nums=nums,
bit_length=MAX_BITS,
max_num=CASH5_FIELD_COUNT + 1,
delim=", ")[0]
if (date != ""):
_date = datetime.datetime.strptime(date, "%m/%d/%Y")
epoch = int(_date.strftime("%s"))
pos = (cash5_df["epoch"] == epoch).argmax()
else:
pos = 0
winnings = []
def propagate_win(n: int, cash5_df: pd.DataFrame) -> float:
propagated = True
prize = CASH5_PRIZE
n0 = n
won = cash5_df.loc[n0, "jackpot"]
while (cash5_df.loc[n, "prize_5"] == "Rollover"):
prize += CASH5_PRIZE / 10
n += 1
cash5_df.loc[n0, "prize_5"] = won
cash5_df.loc[n, "prize_5"] = prize
return won
for n, x in cash5_df.iloc[pos:, ].iterrows():
match = x["bits"] & bits
if (match):
count = popcount64d(match)
prize = 0.0
if (count == CASH5_PICKED_COUNT):
if (x["prize_5"] == "Rollover"):
prize = propagate_win(n, cash5_df)
else:
prize = float(x["prize_5"]) * x["winners_5"]
x["winners_5"] += 1
prize /= x["winners_5"]
else:
prize = CASH5_PRIZE_DICT[count]
x = x.append(
pd.Series({"count": count,
"prize": prize}))
winnings.append(x)
winnings_df = pd.DataFrame(winnings)
return winnings_df
cash5_path = "cash345/data/cash5_winnings_1.csv"
cash5_df = pd.read_csv(cash5_path)
nums = "1, 2, 3, 4, 5"
date = "10/08/2007"
winnings = back_test(nums, cash5_df, date)
winnings.to_csv("cash345/data/tmp.csv")