|
@@ -22,7 +22,7 @@ def main() -> None:
|
|
|
top_movers = sorted(movers.values(), key=lambda m: m[0].score, reverse=True)
|
|
top_movers = sorted(movers.values(), key=lambda m: m[0].score, reverse=True)
|
|
|
|
|
|
|
|
for commodity in top_movers:
|
|
for commodity in top_movers:
|
|
|
- print(f'{commodity[0].score:9,.0f}', ' '.join(f'{mover.ticker}.{mover.exchange_code}' for mover in commodity))
|
|
|
|
|
|
|
+ print(f'{commodity[0].price_change:5,.2f}', ' '.join(f'{mover.ticker}.{mover.exchange_code}' for mover in commodity))
|
|
|
|
|
|
|
|
def get_old_prices() -> typing.Mapping[str, RawPrice]:
|
|
def get_old_prices() -> typing.Mapping[str, RawPrice]:
|
|
|
week_ago = datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=14)
|
|
week_ago = datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=14)
|
|
@@ -35,9 +35,10 @@ def analyze_raw_price(current_price: RawPrice, old_price: RawPrice) -> Mover | N
|
|
|
return
|
|
return
|
|
|
if (current_vwap7d := current_price['VWAP7D']) is None or (old_vwap7d := old_price['VWAP7D']) is None:
|
|
if (current_vwap7d := current_price['VWAP7D']) is None or (old_vwap7d := old_price['VWAP7D']) is None:
|
|
|
return
|
|
return
|
|
|
- diff = abs(current_vwap7d - old_vwap7d)
|
|
|
|
|
- if diff / min(current_vwap7d, old_vwap7d) > 0.15:
|
|
|
|
|
- return Mover(current_price['ExchangeCode'], current_price['MaterialTicker'], diff * traded)
|
|
|
|
|
|
|
+ diff = current_vwap7d - old_vwap7d
|
|
|
|
|
+ if abs(diff) / min(current_vwap7d, old_vwap7d) > 0.15:
|
|
|
|
|
+ return Mover(current_price['ExchangeCode'], current_price['MaterialTicker'], abs(diff) * traded,
|
|
|
|
|
+ diff / old_vwap7d)
|
|
|
|
|
|
|
|
class RawPrice(typing.TypedDict):
|
|
class RawPrice(typing.TypedDict):
|
|
|
FullTicker: str
|
|
FullTicker: str
|
|
@@ -51,6 +52,7 @@ class Mover:
|
|
|
exchange_code: str
|
|
exchange_code: str
|
|
|
ticker: str
|
|
ticker: str
|
|
|
score: float
|
|
score: float
|
|
|
|
|
+ price_change: float
|
|
|
|
|
|
|
|
def __lt__(self, other: Mover) -> bool:
|
|
def __lt__(self, other: Mover) -> bool:
|
|
|
return self.score < other.score
|
|
return self.score < other.score
|