They are probably just strings in your input file. If you don't control the input file, you'll just have to fix them up on import.
When I deal with data normalization, I'll have a "parse" function where I put the knowledge about formats, like which fields are strings and need to be numbers.
I'd probably write something like this, that handles a single record:
parseEconomicData[{date_, rest__}] :=
Prepend[Map[parseNumericText, {rest}], date]
parseNumericText[""] := 0 (* what to fill in for empty fields *)
(* add other definitions to match other patterns you want to handle separately *)
parseNumericText[n_String] := Interpreter["Number"][n]
Then with this, if I'm reading your code rightly, I'd make SP500 this way (First on ecodata because it has an extra outer layer, then Rest to skip the header row; I wasn't sure the last number on your Range is a magic number that cuts off something from the end, or if it was just meant to go to the end; note you can use -1 to indicate the last entry):
SP500 = parseEconomicData[Rest[First[ecodata]]]
This is just one way to structure the code. I find it helpful to split things up logically like this with nice names, comments etc. to help me think clearly about the problem and decompose it into nice separable, logical, testable chunks. If something turns out to be especially slow using this approach I can always go back and optimize.