股票回测

时间:2014-12-14 03:53:40

标签: mysql sql

我对MYSQL很新,但我有使用VBA编程的经验。我试图创建一个存储过程,它将根据历史股票价格数据表对策略进行回溯测试。程序将计算收盘价格的20天移动平均线然后如果所选日期CLOSE的价格高于他的价格比移动平均线a"买"启动。如果目前正在进行交易,则没有新的"买入"如果所选日期CLOSE低于20天移动平均线,则可以放置"出售"启动。每次进行买入或卖出时,数据都会记录在一个名为backtest结果的表中。我使用的数据来自http://finance.yahoo.com/q/hp?s=AAPL+Historical+Prices,我将其放入表格中。正如您所看到的那样,数据是按降序排列的,所以为了让我能够进行测试,我必须从最早的日期开始,这个日期恰好位于底部。我遇到的问题是没有数据输入到这个新创建的表中(购买日期,购买价格,销售日期,卖出价格)。谁能发现为什么会这样? mysql也适合逐行处理吗?谢谢!

  `Begin

      DECLARE total_count int;
      DECLARE moving_average decimal;
      DECLARE move_up int;
      DECLARE current_price decimal;
      DECLARE count_var int;
      DECLARE buy_price decimal;
      DECLARE sell_price decimal;
      DECLARE trade_on tinyint;
      DECLARE account_balance decimal;
      DECLARE start_row int;
      DECLARE trade_date date;
      SET @trade_on = 0;
      SELECT @trade_on;


      DROP TABLE IF EXISTS backtestresults; 
      CREATE TABLE backtestresults (buydate date,buyprice decimal, selldate date, sellprice decimal, accountbalance decimal);
      SELECT COUNT(*) INTO @total_count FROM AAPL_Prices;
      SELECT * FROM AAPL_Prices WHERE Special_ID = @total_count;
      SET @start_row = @total_count -19;
      SET @account_balance = 100000;


     Loop1: WHILE (start_row > 1) DO
     SELECT FORMAT(AVG(SClose),2) FROM AAPL_Prices WHERE Special_ID < @start_row + 19 AND Special_ID > @start_row INTO @moving_average; 

     SELECT SClose FROM AAPL_Prices WHERE Special_ID = @start_row -19 INTO @current_price;
     SELECT TradeDate FROM  AAPL_Prices WHERE special_ID = @start_row -19 INTO @trade_date;

  IF @trade_on = 0 THEN 
    IF @current_price > @moving_average THEN 
      SET @buy_price = @current_price;
      SET @trade_on = 1;
      SET @account_balance = @account_balance - @buy_price;
      INSERT INTO backtestresults (buyprice) values (@buy_price);
      INSERT INTO backtestresults (buydate) values (@trade_date);
      INSERT INTO backtestresults (balance) values (@account_balance);
    End If;
  END IF;

  IF trade_on = 1 THEN 
    IF @current_price < @moving_average THEN
      SET @sell_price = @current_price;
      SET @trade_on = 0;
      SET @account_balance = @account_balance + @buy_price;
      INSERT INTO backtestresults(sellprice) values (@sell_price);
      INSERT INTO backtestresults(selldate) values (@trade_date);
      INSERT INTO backtestresults(balance) values (@account_balance); 
    END IF;
  END IF; 

    SET @start_row = @start_row - 1;

  END WHILE Loop1;

        SELECT @account_balance;
         DESCRIBE backtestresults; 
         SELECT @start_row;
  End`

0 个答案:

没有答案