Skip to content

Commit

Permalink
Merge pull request #500 from bounswe/feature/BE-stock-price-range
Browse files Browse the repository at this point in the history
Stock Price Range Refactor
  • Loading branch information
hikasap authored Dec 15, 2024
2 parents bd898f0 + 1bd6c56 commit 3946ccb
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 24 deletions.
24 changes: 12 additions & 12 deletions backend/marketfeed/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,20 @@ def __init__(self, *args, **kwargs):


class StockHistoricDataSerializer(serializers.Serializer):
start_date = serializers.DateField() # Start date of the interval
end_date = serializers.DateField() # End date of the interval
start_date = serializers.DateField(required=False, default=None) # Start date of the interval
end_date = serializers.DateField(required=False, default=None) # End date of the interval
period = serializers.CharField(
required=False,
max_length=3, # Adjust based on the maximum length of your options
help_text="'1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max'."
)
interval = serializers.CharField(
max_length=3, # Adjust based on the maximum length of your options
help_text="'1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1wk', '1mo', '3mo"
)


def validate_date(self, value):
two_years_ago = datetime.now() - timedelta(days=365*2)
today = datetime.now().date()
range = self.end_date - self.start_date
if self.start_date < two_years_ago or self.end_date < two_years_ago:
raise serializers.ValidationError("The given date/s cannot be older than 2 years.")
elif self.start_date > today or self.end_date > today:
raise serializers.ValidationError("The given date cannot be later than the current date.")
elif range.days > 365:
raise serializers.ValidationError("The date range must be less than or equal to one year.")

return value

class StockPatternSearchSerializer(serializers.Serializer):
Expand Down
53 changes: 41 additions & 12 deletions backend/marketfeed/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,31 +117,61 @@ def search(self, request):
serializer = StockSerializer(stocks, many=True)
return Response(serializer.data)

@swagger_auto_schema(request_body=StockHistoricDataSerializer)
@swagger_auto_schema(request_body=StockHistoricDataSerializer, operation_summary='''
Submit a request for historic stock data.
Available time ranges:
'1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max',
Available intervals:
'1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1wk', '1mo', '3mo'.
''',
operation_description=(
'''
Submit a request for historic stock data.
Available time ranges:
'1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max',
Available intervals:
'1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1wk', '1mo', '3mo'.
'''
))
@action(detail=True, methods=['post'], serializer_class=StockHistoricDataSerializer)
def get_historical_data(self, request, pk=None):
stock = self.get_object()
stock_symbol = stock.symbol
serializer = StockHistoricDataSerializer(data=request.data)

serializer.is_valid(raise_exception=True)

start_date = serializer.validated_data['start_date']
end_date = serializer.validated_data['end_date']
period = serializer.validated_data['period']
interval = serializer.validated_data['interval']

if stock.currency.code == 'TRY':
stock_symbol += '.IS'

if not start_date or not end_date:
return Response({"error": "Start date and end date are required."}, status=status.HTTP_400_BAD_REQUEST)
try:
data = yf.Ticker(stock_symbol).history(period=period,interval=interval)
# download(tickers=stock_symbol, period=serializer.validated_data['period'], interval=serializer.validated_data['interval'])
data = data.drop(columns=['Dividends', 'Stock Splits'])
data = data.round(2)
data['Date'] = data.index

data = data.reset_index(drop=True)

return Response(data, status=status.HTTP_200_OK)
except Exception as e:
return Response({"error": f"An error occurred while fetching data: {str(e)}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

if stock.currency.code == 'TRY':
stock_symbol += '.IS'
try:
# Fetch stock data using yfinance
stock_data = yf.Ticker(stock_symbol)
data = stock_data.history(start=start_date, end=end_date)
data = data.drop(columns=['Volume', 'Dividends', 'Stock Splits'])
data['Date'] = data.index.date
data = yf.Ticker(stock_symbol).history(interval=interval, start=start_date, end=end_date)
data = data.drop(columns=['Dividends', 'Stock Splits'])

data = data.round(2)
data['Date'] = data.index
data = data.reset_index(drop=True)
data['Stock'] = stock.symbol


return Response(data, status=status.HTTP_200_OK)

except Exception as e:
Expand Down Expand Up @@ -458,7 +488,6 @@ def list(self, request):

for index in serializerData:
index['price'] = prices[index['symbol']]
print(serializerData)
return Response(serializer.data)


Expand Down

0 comments on commit 3946ccb

Please sign in to comment.